From 5666046ec9f9365669bf36b957656b0fc0cfe4d0 Mon Sep 17 00:00:00 2001 From: zhoufan <1247714429@qq.com> Date: Sun, 14 Nov 2021 12:16:21 +0800 Subject: [PATCH] fix: flyimport triggers on enum variant declarations --- .../src/completions/flyimport.rs | 1 + crates/ide_completion/src/context.rs | 4 +++ crates/ide_completion/src/patterns.rs | 2 ++ crates/ide_completion/src/tests/flyimport.rs | 31 +++++++++++++++++++ 4 files changed, 38 insertions(+) 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 @@ pub(crate) fn expects_assoc_item(&self) -> bool { 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 @@ mod module { 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) + "#]], + ) +} -- 2.44.0