mirror of
https://github.com/rust-lang/rust-analyzer
synced 2025-01-14 14:13:58 +00:00
merge imports assist always applies to covering use item except for nested use tree selections
This commit is contained in:
parent
a8a18f3ccf
commit
b241593f36
1 changed files with 23 additions and 76 deletions
|
@ -32,24 +32,13 @@ use Edit::*;
|
|||
pub(crate) fn merge_imports(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> {
|
||||
let (target, edits) = if ctx.has_empty_selection() {
|
||||
// Merge a neighbor
|
||||
let mut tree: ast::UseTree = ctx.find_node_at_offset()?;
|
||||
if ctx.config.insert_use.granularity == ImportGranularity::One
|
||||
&& tree.parent_use_tree_list().is_some()
|
||||
{
|
||||
cov_mark::hit!(resolve_top_use_tree_for_import_one);
|
||||
tree = tree.top_use_tree();
|
||||
}
|
||||
cov_mark::hit!(merge_with_use_item_neighbors);
|
||||
let tree = ctx.find_node_at_offset::<ast::UseTree>()?.top_use_tree();
|
||||
let target = tree.syntax().text_range();
|
||||
|
||||
let edits = if let Some(use_item) = tree.syntax().parent().and_then(ast::Use::cast) {
|
||||
cov_mark::hit!(merge_with_use_item_neighbors);
|
||||
let mut neighbor = next_prev().find_map(|dir| neighbor(&use_item, dir)).into_iter();
|
||||
use_item.try_merge_from(&mut neighbor, &ctx.config.insert_use)
|
||||
} else {
|
||||
cov_mark::hit!(merge_with_use_tree_neighbors);
|
||||
let mut neighbor = next_prev().find_map(|dir| neighbor(&tree, dir)).into_iter();
|
||||
tree.clone().try_merge_from(&mut neighbor, &ctx.config.insert_use)
|
||||
};
|
||||
let use_item = tree.syntax().parent().and_then(ast::Use::cast)?;
|
||||
let mut neighbor = next_prev().find_map(|dir| neighbor(&use_item, dir)).into_iter();
|
||||
let edits = use_item.try_merge_from(&mut neighbor, &ctx.config.insert_use);
|
||||
(target, edits?)
|
||||
} else {
|
||||
// Merge selected
|
||||
|
@ -159,10 +148,7 @@ impl Edit {
|
|||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::tests::{
|
||||
check_assist, check_assist_import_one, check_assist_not_applicable,
|
||||
check_assist_not_applicable_for_import_one,
|
||||
};
|
||||
use crate::tests::{check_assist, check_assist_import_one, check_assist_not_applicable};
|
||||
|
||||
use super::*;
|
||||
|
||||
|
@ -206,10 +192,7 @@ use std::fmt::{Debug, Display};
|
|||
);
|
||||
|
||||
// The assist macro below calls `check_assist_import_one` 4 times with different input
|
||||
// use item variations based on the first 2 input parameters, but only 2 calls
|
||||
// contain `use {std::fmt$0::{Display, Debug}};` for which the top use tree will need
|
||||
// to be resolved.
|
||||
cov_mark::check_count!(resolve_top_use_tree_for_import_one, 2);
|
||||
// use item variations based on the first 2 input parameters.
|
||||
cov_mark::check_count!(merge_with_use_item_neighbors, 4);
|
||||
check_assist_import_one_variations!(
|
||||
"std::fmt$0::{Display, Debug}",
|
||||
|
@ -257,7 +240,7 @@ use std::fmt::{Debug, Display};
|
|||
}
|
||||
|
||||
#[test]
|
||||
fn merge_self1() {
|
||||
fn merge_self() {
|
||||
check_assist(
|
||||
merge_imports,
|
||||
r"
|
||||
|
@ -275,28 +258,6 @@ use std::fmt::{self, Display};
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn merge_self2() {
|
||||
check_assist(
|
||||
merge_imports,
|
||||
r"
|
||||
use std::{fmt, $0fmt::Display};
|
||||
",
|
||||
r"
|
||||
use std::{fmt::{self, Display}};
|
||||
",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn not_applicable_to_single_one_style_import() {
|
||||
cov_mark::check!(resolve_top_use_tree_for_import_one);
|
||||
check_assist_not_applicable_for_import_one(
|
||||
merge_imports,
|
||||
"use {std::{fmt, $0fmt::Display}};",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn skip_pub1() {
|
||||
check_assist_not_applicable(
|
||||
|
@ -385,14 +346,14 @@ pub(in this::path) use std::fmt::{Debug, Display};
|
|||
|
||||
#[test]
|
||||
fn test_merge_nested() {
|
||||
cov_mark::check!(merge_with_use_tree_neighbors);
|
||||
check_assist(
|
||||
merge_imports,
|
||||
r"
|
||||
use std::{fmt$0::Debug, fmt::Display};
|
||||
use std::{fmt$0::Debug, fmt::Error};
|
||||
use std::{fmt::Write, fmt::Display};
|
||||
",
|
||||
r"
|
||||
use std::{fmt::{Debug, Display}};
|
||||
use std::fmt::{Debug, Display, Error, Write};
|
||||
",
|
||||
);
|
||||
}
|
||||
|
@ -402,10 +363,11 @@ use std::{fmt::{Debug, Display}};
|
|||
check_assist(
|
||||
merge_imports,
|
||||
r"
|
||||
use std::{fmt::Debug, fmt$0::Display};
|
||||
use std::{fmt::Debug, fmt$0::Error};
|
||||
use std::{fmt::Write, fmt::Display};
|
||||
",
|
||||
r"
|
||||
use std::{fmt::{Debug, Display}};
|
||||
use std::fmt::{Debug, Display, Error, Write};
|
||||
",
|
||||
);
|
||||
}
|
||||
|
@ -448,19 +410,6 @@ use std::fmt::{self, Debug, Display, Write};
|
|||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_merge_self_with_nested_self_item() {
|
||||
check_assist(
|
||||
merge_imports,
|
||||
r"
|
||||
use std::{fmt$0::{self, Debug}, fmt::{Write, Display}};
|
||||
",
|
||||
r"
|
||||
use std::{fmt::{self, Debug, Display, Write}};
|
||||
",
|
||||
);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_merge_nested_self_and_empty() {
|
||||
check_assist(
|
||||
|
@ -579,29 +528,27 @@ use foo::{bar, baz};
|
|||
check_assist(
|
||||
merge_imports,
|
||||
r"
|
||||
use {
|
||||
foo$0::bar,
|
||||
foo::baz,
|
||||
use foo$0::{
|
||||
bar, baz,
|
||||
};
|
||||
use foo::qux;
|
||||
",
|
||||
r"
|
||||
use {
|
||||
foo::{bar, baz},
|
||||
use foo::{
|
||||
bar, baz, qux,
|
||||
};
|
||||
",
|
||||
);
|
||||
check_assist(
|
||||
merge_imports,
|
||||
r"
|
||||
use {
|
||||
foo::baz,
|
||||
foo$0::bar,
|
||||
use foo::{
|
||||
baz, bar,
|
||||
};
|
||||
use foo$0::qux;
|
||||
",
|
||||
r"
|
||||
use {
|
||||
foo::{bar, baz},
|
||||
};
|
||||
use foo::{bar, baz, qux};
|
||||
",
|
||||
);
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue