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/patterns.rs | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) (limited to 'crates/ide_completion/src/patterns.rs') 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); + } } -- cgit v1.2.3