From 1a8f76a224aff472cf29bab828f313c19e31eb02 Mon Sep 17 00:00:00 2001 From: Lukas Wirth Date: Wed, 16 Jun 2021 17:45:58 +0200 Subject: Don't complete visibility accessors after existing ones --- crates/ide_completion/src/completions/keyword.rs | 4 +++- crates/ide_completion/src/context.rs | 4 ++++ crates/ide_completion/src/patterns.rs | 17 +++++++++++++++++ crates/ide_completion/src/tests/item_list.rs | 2 -- 4 files changed, 24 insertions(+), 3 deletions(-) (limited to 'crates/ide_completion/src') diff --git a/crates/ide_completion/src/completions/keyword.rs b/crates/ide_completion/src/completions/keyword.rs index 2c42438d6..0bfdf9603 100644 --- a/crates/ide_completion/src/completions/keyword.rs +++ b/crates/ide_completion/src/completions/keyword.rs @@ -75,7 +75,9 @@ pub(crate) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte return; } - if expects_item || ctx.expects_non_trait_assoc_item() || ctx.expect_record_field() { + if !ctx.has_visibility_prev_sibling() + && (expects_item || ctx.expects_non_trait_assoc_item() || ctx.expect_record_field()) + { add_keyword("pub(crate)", "pub(crate) "); add_keyword("pub", "pub "); } diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs index a8437d81c..3885db702 100644 --- a/crates/ide_completion/src/context.rs +++ b/crates/ide_completion/src/context.rs @@ -302,6 +302,10 @@ impl<'a> CompletionContext<'a> { ) } + pub(crate) fn has_visibility_prev_sibling(&self) -> bool { + matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility)) + } + pub(crate) fn after_if(&self) -> bool { matches!(self.prev_sibling, Some(ImmediatePrevSibling::IfExpr)) } diff --git a/crates/ide_completion/src/patterns.rs b/crates/ide_completion/src/patterns.rs index 72e67e3c4..345977d48 100644 --- a/crates/ide_completion/src/patterns.rs +++ b/crates/ide_completion/src/patterns.rs @@ -19,6 +19,7 @@ pub(crate) enum ImmediatePrevSibling { IfExpr, TraitDefName, ImplDefType, + Visibility, } /// Direct parent "thing" of what we are currently completing. @@ -79,6 +80,17 @@ pub(crate) fn determine_prev_sibling(name_like: &ast::NameLike) -> Option node, }; let prev_sibling = non_trivia_sibling(node.into(), Direction::Prev)?.into_node()?; + if prev_sibling.kind() == ERROR { + let prev_sibling = prev_sibling.first_child()?; + let res = match_ast! { + match prev_sibling { + // vis followed by random ident will always error the parser + ast::Visibility(_it) => ImmediatePrevSibling::Visibility, + _ => return None, + } + }; + return Some(res); + } let res = match_ast! { match prev_sibling { ast::ExprStmt(it) => { @@ -421,4 +433,9 @@ mod tests { check_prev_sibling(r"fn foo() { if true {} w$0", ImmediatePrevSibling::IfExpr); check_prev_sibling(r"fn foo() { if true {}; w$0", None); } + + #[test] + fn test_vis_prev_sibling() { + check_prev_sibling(r"pub w$0", ImmediatePrevSibling::Visibility); + } } diff --git a/crates/ide_completion/src/tests/item_list.rs b/crates/ide_completion/src/tests/item_list.rs index bd060a632..e7b77d7e7 100644 --- a/crates/ide_completion/src/tests/item_list.rs +++ b/crates/ide_completion/src/tests/item_list.rs @@ -146,8 +146,6 @@ const CONST: () = (); pub $0"#, expect![[r##" - kw pub(crate) - kw pub kw unsafe kw fn kw const -- cgit v1.2.3