From 9ea6ee6b2785da02ff1963fbbc2eea340450905c Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Wed, 16 Jun 2021 17:56:04 +0200 Subject: Don't show incorrect completions after unsafe or visiblity node --- crates/ide_completion/src/completions/keyword.rs | 22 ++++++++------- crates/ide_completion/src/completions/snippet.rs | 7 ++++- crates/ide_completion/src/context.rs | 17 +++++++----- crates/ide_completion/src/tests/item_list.rs | 34 +++++++----------------- 4 files changed, 38 insertions(+), 42 deletions(-) (limited to 'crates') diff --git a/crates/ide_completion/src/completions/keyword.rs b/crates/ide_completion/src/completions/keyword.rs index 0bfdf9603..7970e75c7 100644 --- a/crates/ide_completion/src/completions/keyword.rs +++ b/crates/ide_completion/src/completions/keyword.rs @@ -90,11 +90,13 @@ pub(crate) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte } if expects_item || has_block_expr_parent { + if !ctx.has_visibility_prev_sibling() { + add_keyword("impl", "impl $1 {\n $0\n}"); + add_keyword("extern", "extern $0"); + } add_keyword("use", "use $0"); - add_keyword("impl", "impl $1 {\n $0\n}"); add_keyword("trait", "trait $1 {\n $0\n}"); add_keyword("static", "static $0"); - add_keyword("extern", "extern $0"); add_keyword("mod", "mod $0"); } @@ -241,11 +243,11 @@ mod tests { kw fn kw const kw type - kw use kw impl + kw extern + kw use kw trait kw static - kw extern kw mod kw match kw while @@ -269,11 +271,11 @@ mod tests { kw fn kw const kw type - kw use kw impl + kw extern + kw use kw trait kw static - kw extern kw mod kw match kw while @@ -297,11 +299,11 @@ mod tests { kw fn kw const kw type - kw use kw impl + kw extern + kw use kw trait kw static - kw extern kw mod kw match kw while @@ -399,11 +401,11 @@ fn quux() -> i32 { kw fn kw const kw type - kw use kw impl + kw extern + kw use kw trait kw static - kw extern kw mod kw match kw while diff --git a/crates/ide_completion/src/completions/snippet.rs b/crates/ide_completion/src/completions/snippet.rs index 5560f1acf..4e64a0090 100644 --- a/crates/ide_completion/src/completions/snippet.rs +++ b/crates/ide_completion/src/completions/snippet.rs @@ -1,6 +1,7 @@ //! This file provides snippet completions, like `pd` => `eprintln!(...)`. use ide_db::helpers::SnippetCap; +use syntax::T; use crate::{ context::PathCompletionContext, item::Builder, CompletionContext, CompletionItem, @@ -35,9 +36,13 @@ pub(crate) fn complete_expr_snippet(acc: &mut Completions, ctx: &CompletionConte } pub(crate) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionContext) { - if !ctx.expects_item() { + if !ctx.expects_item() || ctx.previous_token_is(T![unsafe]) { return; } + if ctx.has_visibility_prev_sibling() { + return; // technically we could do some of these snippet completions if we were to put the + // attributes before the vis node. + } let cap = match ctx.config.snippet_cap { Some(it) => it, None => return, diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs index 3885db702..907ffdc7a 100644 --- a/crates/ide_completion/src/context.rs +++ b/crates/ide_completion/src/context.rs @@ -311,13 +311,16 @@ impl<'a> CompletionContext<'a> { } pub(crate) fn is_path_disallowed(&self) -> bool { - matches!( - self.completion_location, - Some(ImmediateLocation::Attribute(_)) - | Some(ImmediateLocation::ModDeclaration(_)) - | Some(ImmediateLocation::RecordPat(_)) - | Some(ImmediateLocation::RecordExpr(_)) - ) || self.attribute_under_caret.is_some() + self.attribute_under_caret.is_some() + || self.previous_token_is(T![unsafe]) + || self.has_visibility_prev_sibling() + || matches!( + self.completion_location, + Some(ImmediateLocation::Attribute(_)) + | Some(ImmediateLocation::ModDeclaration(_)) + | Some(ImmediateLocation::RecordPat(_)) + | Some(ImmediateLocation::RecordExpr(_)) + ) } pub(crate) fn expects_expression(&self) -> bool { diff --git a/crates/ide_completion/src/tests/item_list.rs b/crates/ide_completion/src/tests/item_list.rs index e7b77d7e7..c8aa44d88 100644 --- a/crates/ide_completion/src/tests/item_list.rs +++ b/crates/ide_completion/src/tests/item_list.rs @@ -16,11 +16,11 @@ fn in_mod_item_list() { kw fn kw const kw type - kw use kw impl + kw extern + kw use kw trait kw static - kw extern kw mod kw enum kw struct @@ -51,11 +51,11 @@ $0"#, kw fn kw const kw type - kw use kw impl + kw extern + kw use kw trait kw static - kw extern kw mod kw enum kw struct @@ -89,11 +89,11 @@ crate::$0"#, kw fn kw const kw type - kw use kw impl + kw extern + kw use kw trait kw static - kw extern kw mod kw enum kw struct @@ -119,17 +119,11 @@ mod bar {} const CONST: () = (); unsafe $0"#, - expect![[r##" + expect![[r#" kw fn kw trait kw impl - sn tmod (Test module) - sn tfn (Test function) - sn macro_rules - md bar - ma foo!(…) #[macro_export] macro_rules! foo - ma foo!(…) #[macro_export] macro_rules! foo - "##]], + "#]], ); } @@ -145,26 +139,18 @@ mod bar {} const CONST: () = (); pub $0"#, - expect![[r##" + expect![[r#" kw unsafe kw fn kw const kw type kw use - kw impl kw trait kw static - kw extern kw mod kw enum kw struct kw union - sn tmod (Test module) - sn tfn (Test function) - sn macro_rules - md bar - ma foo!(…) #[macro_export] macro_rules! foo - ma foo!(…) #[macro_export] macro_rules! foo - "##]], + "#]], ); } -- cgit v1.2.3