about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors[bot] <26634292+bors[bot]@users.noreply.github.com>2021-11-14 09:20:59 +0000
committerGitHub <noreply@github.com>2021-11-14 09:20:59 +0000
commit212095a07dd95269265e81fd523ecabb5c8dc5ad (patch)
tree75757d73a96896c52cb6cb2fa14ea01066152a65
parent766b52b598ad1639e5b815b87dbd3fa3be155219 (diff)
parent5666046ec9f9365669bf36b957656b0fc0cfe4d0 (diff)
downloadrust-212095a07dd95269265e81fd523ecabb5c8dc5ad.tar.gz
rust-212095a07dd95269265e81fd523ecabb5c8dc5ad.zip
Merge #10762
10762: Fix: trigger flyimport on enum variants r=lnicola a=XFFXFF

fixes #10749 

Co-authored-by: zhoufan <1247714429@qq.com>
-rw-r--r--crates/ide_completion/src/completions/flyimport.rs1
-rw-r--r--crates/ide_completion/src/context.rs4
-rw-r--r--crates/ide_completion/src/patterns.rs2
-rw-r--r--crates/ide_completion/src/tests/flyimport.rs31
4 files changed, 38 insertions, 0 deletions
diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs
index 47036f2e132..784a1a0637c 100644
--- a/crates/ide_completion/src/completions/flyimport.rs
+++ b/crates/ide_completion/src/completions/flyimport.rs
@@ -113,6 +113,7 @@ pub(crate) fn import_on_the_fly(acc: &mut Completions, ctx: &CompletionContext)
         || ctx.is_path_disallowed()
         || ctx.expects_item()
         || ctx.expects_assoc_item()
+        || ctx.expects_variant()
     {
         return None;
     }
diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs
index 05ae95769b0..8759e2d108c 100644
--- a/crates/ide_completion/src/context.rs
+++ b/crates/ide_completion/src/context.rs
@@ -171,6 +171,10 @@ impl<'a> CompletionContext<'a> {
         matches!(self.completion_location, Some(ImmediateLocation::Trait | ImmediateLocation::Impl))
     }
 
+    pub(crate) fn expects_variant(&self) -> bool {
+        matches!(self.completion_location, Some(ImmediateLocation::Variant))
+    }
+
     pub(crate) fn expects_non_trait_assoc_item(&self) -> bool {
         matches!(self.completion_location, Some(ImmediateLocation::Impl))
     }
diff --git a/crates/ide_completion/src/patterns.rs b/crates/ide_completion/src/patterns.rs
index 4c2e704a7fb..13c739325c8 100644
--- a/crates/ide_completion/src/patterns.rs
+++ b/crates/ide_completion/src/patterns.rs
@@ -45,6 +45,7 @@ pub(crate) enum ImmediateLocation {
     StmtList,
     ItemList,
     TypeBound,
+    Variant,
     /// Fake file ast node
     Attribute(ast::Attr),
     /// Fake file ast node
@@ -213,6 +214,7 @@ pub(crate) fn determine_location(
             ast::SourceFile(_it) => ImmediateLocation::ItemList,
             ast::ItemList(_it) => ImmediateLocation::ItemList,
             ast::RefExpr(_it) => ImmediateLocation::RefExpr,
+            ast::Variant(_it) => ImmediateLocation::Variant,
             ast::RecordField(it) => if it.ty().map_or(false, |it| it.syntax().text_range().contains(offset)) {
                 return None;
             } else {
diff --git a/crates/ide_completion/src/tests/flyimport.rs b/crates/ide_completion/src/tests/flyimport.rs
index 201443e10c2..18880a67aa6 100644
--- a/crates/ide_completion/src/tests/flyimport.rs
+++ b/crates/ide_completion/src/tests/flyimport.rs
@@ -1012,3 +1012,34 @@ use self as Str$0;
         expect![[r#""#]],
     );
 }
+
+#[test]
+fn flyimport_enum_variant() {
+    check(
+        r#"
+mod foo {
+    pub struct Barbara;
+}
+
+enum Foo {
+    Barba$0()
+}
+}"#,
+        expect![[r#""#]],
+    );
+
+    check(
+        r#"
+mod foo {
+    pub struct Barbara;
+}
+
+enum Foo {
+    Barba(Barba$0)
+}
+}"#,
+        expect![[r#"
+            st Barbara (use foo::Barbara)
+        "#]],
+    )
+}