mirror of
https://github.com/rust-lang/rust-analyzer
synced 2024-12-28 14:03:35 +00:00
Auto merge of #12188 - Veykril:auto-import, r=Veykril
fix: Allow auto importing starting segments of use items
This commit is contained in:
commit
bfb241afa3
3 changed files with 84 additions and 29 deletions
|
@ -373,19 +373,6 @@ mod baz {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn not_applicable_in_import_statements() {
|
|
||||||
check_assist_not_applicable(
|
|
||||||
auto_import,
|
|
||||||
r"
|
|
||||||
use PubStruct$0;
|
|
||||||
|
|
||||||
pub mod PubMod {
|
|
||||||
pub struct PubStruct;
|
|
||||||
}",
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn function_import() {
|
fn function_import() {
|
||||||
check_assist(
|
check_assist(
|
||||||
|
@ -1121,4 +1108,43 @@ struct Foo;
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn works_in_use_start() {
|
||||||
|
check_assist(
|
||||||
|
auto_import,
|
||||||
|
r#"
|
||||||
|
mod bar {
|
||||||
|
pub mod foo {
|
||||||
|
pub struct Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
use foo$0::Foo;
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
mod bar {
|
||||||
|
pub mod foo {
|
||||||
|
pub struct Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
use bar::foo;
|
||||||
|
use foo::Foo;
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn not_applicable_in_non_start_use() {
|
||||||
|
check_assist_not_applicable(
|
||||||
|
auto_import,
|
||||||
|
r"
|
||||||
|
mod bar {
|
||||||
|
pub mod foo {
|
||||||
|
pub struct Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
use foo::Foo$0;
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -381,20 +381,6 @@ pub mod PubMod {
|
||||||
check_assist_not_applicable(qualify_path, r#"PubStruct$0"#);
|
check_assist_not_applicable(qualify_path, r#"PubStruct$0"#);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
|
||||||
fn not_applicable_in_import_statements() {
|
|
||||||
check_assist_not_applicable(
|
|
||||||
qualify_path,
|
|
||||||
r#"
|
|
||||||
use PubStruct$0;
|
|
||||||
|
|
||||||
pub mod PubMod {
|
|
||||||
pub struct PubStruct;
|
|
||||||
}
|
|
||||||
"#,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn qualify_function() {
|
fn qualify_function() {
|
||||||
check_assist(
|
check_assist(
|
||||||
|
@ -1270,4 +1256,42 @@ struct Foo;
|
||||||
"#,
|
"#,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn works_in_use_start() {
|
||||||
|
check_assist(
|
||||||
|
qualify_path,
|
||||||
|
r#"
|
||||||
|
mod bar {
|
||||||
|
pub mod foo {
|
||||||
|
pub struct Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
use foo$0::Foo;
|
||||||
|
"#,
|
||||||
|
r#"
|
||||||
|
mod bar {
|
||||||
|
pub mod foo {
|
||||||
|
pub struct Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
use bar::foo::Foo;
|
||||||
|
"#,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn not_applicable_in_non_start_use() {
|
||||||
|
check_assist_not_applicable(
|
||||||
|
qualify_path,
|
||||||
|
r"
|
||||||
|
mod bar {
|
||||||
|
pub mod foo {
|
||||||
|
pub struct Foo;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
use foo::Foo$0;
|
||||||
|
",
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -114,9 +114,14 @@ impl ImportAssets {
|
||||||
sema: &Semantics<RootDatabase>,
|
sema: &Semantics<RootDatabase>,
|
||||||
) -> Option<Self> {
|
) -> Option<Self> {
|
||||||
let candidate_node = fully_qualified_path.syntax().clone();
|
let candidate_node = fully_qualified_path.syntax().clone();
|
||||||
if candidate_node.ancestors().find_map(ast::Use::cast).is_some() {
|
if let Some(use_tree) = candidate_node.ancestors().find_map(ast::UseTree::cast) {
|
||||||
|
// Path is inside a use tree, then only continue if it is the first segment of a use statement.
|
||||||
|
if use_tree.syntax().parent().and_then(ast::Use::cast).is_none()
|
||||||
|
|| fully_qualified_path.qualifier().is_some()
|
||||||
|
{
|
||||||
return None;
|
return None;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
Some(Self {
|
Some(Self {
|
||||||
import_candidate: ImportCandidate::for_regular_path(sema, fully_qualified_path)?,
|
import_candidate: ImportCandidate::for_regular_path(sema, fully_qualified_path)?,
|
||||||
module_with_candidate: sema.scope(&candidate_node)?.module(),
|
module_with_candidate: sema.scope(&candidate_node)?.module(),
|
||||||
|
|
Loading…
Reference in a new issue