diff options
author | Lukas Wirth <[email protected]> | 2021-06-16 16:45:58 +0100 |
---|---|---|
committer | Lukas Wirth <[email protected]> | 2021-06-16 20:51:20 +0100 |
commit | 1a8f76a224aff472cf29bab828f313c19e31eb02 (patch) | |
tree | bf7b7c157e632be799980ed18e60b8a584b854ed /crates/ide_completion/src | |
parent | d338a803941c2b0ac83decfcdfac33c09dfaa971 (diff) |
Don't complete visibility accessors after existing ones
Diffstat (limited to 'crates/ide_completion/src')
-rw-r--r-- | crates/ide_completion/src/completions/keyword.rs | 4 | ||||
-rw-r--r-- | crates/ide_completion/src/context.rs | 4 | ||||
-rw-r--r-- | crates/ide_completion/src/patterns.rs | 17 | ||||
-rw-r--r-- | crates/ide_completion/src/tests/item_list.rs | 2 |
4 files changed, 24 insertions, 3 deletions
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 | |||
75 | return; | 75 | return; |
76 | } | 76 | } |
77 | 77 | ||
78 | if expects_item || ctx.expects_non_trait_assoc_item() || ctx.expect_record_field() { | 78 | if !ctx.has_visibility_prev_sibling() |
79 | && (expects_item || ctx.expects_non_trait_assoc_item() || ctx.expect_record_field()) | ||
80 | { | ||
79 | add_keyword("pub(crate)", "pub(crate) "); | 81 | add_keyword("pub(crate)", "pub(crate) "); |
80 | add_keyword("pub", "pub "); | 82 | add_keyword("pub", "pub "); |
81 | } | 83 | } |
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> { | |||
302 | ) | 302 | ) |
303 | } | 303 | } |
304 | 304 | ||
305 | pub(crate) fn has_visibility_prev_sibling(&self) -> bool { | ||
306 | matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility)) | ||
307 | } | ||
308 | |||
305 | pub(crate) fn after_if(&self) -> bool { | 309 | pub(crate) fn after_if(&self) -> bool { |
306 | matches!(self.prev_sibling, Some(ImmediatePrevSibling::IfExpr)) | 310 | matches!(self.prev_sibling, Some(ImmediatePrevSibling::IfExpr)) |
307 | } | 311 | } |
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 { | |||
19 | IfExpr, | 19 | IfExpr, |
20 | TraitDefName, | 20 | TraitDefName, |
21 | ImplDefType, | 21 | ImplDefType, |
22 | Visibility, | ||
22 | } | 23 | } |
23 | 24 | ||
24 | /// Direct parent "thing" of what we are currently completing. | 25 | /// Direct parent "thing" of what we are currently completing. |
@@ -79,6 +80,17 @@ pub(crate) fn determine_prev_sibling(name_like: &ast::NameLike) -> Option<Immedi | |||
79 | _ => node, | 80 | _ => node, |
80 | }; | 81 | }; |
81 | let prev_sibling = non_trivia_sibling(node.into(), Direction::Prev)?.into_node()?; | 82 | let prev_sibling = non_trivia_sibling(node.into(), Direction::Prev)?.into_node()?; |
83 | if prev_sibling.kind() == ERROR { | ||
84 | let prev_sibling = prev_sibling.first_child()?; | ||
85 | let res = match_ast! { | ||
86 | match prev_sibling { | ||
87 | // vis followed by random ident will always error the parser | ||
88 | ast::Visibility(_it) => ImmediatePrevSibling::Visibility, | ||
89 | _ => return None, | ||
90 | } | ||
91 | }; | ||
92 | return Some(res); | ||
93 | } | ||
82 | let res = match_ast! { | 94 | let res = match_ast! { |
83 | match prev_sibling { | 95 | match prev_sibling { |
84 | ast::ExprStmt(it) => { | 96 | ast::ExprStmt(it) => { |
@@ -421,4 +433,9 @@ mod tests { | |||
421 | check_prev_sibling(r"fn foo() { if true {} w$0", ImmediatePrevSibling::IfExpr); | 433 | check_prev_sibling(r"fn foo() { if true {} w$0", ImmediatePrevSibling::IfExpr); |
422 | check_prev_sibling(r"fn foo() { if true {}; w$0", None); | 434 | check_prev_sibling(r"fn foo() { if true {}; w$0", None); |
423 | } | 435 | } |
436 | |||
437 | #[test] | ||
438 | fn test_vis_prev_sibling() { | ||
439 | check_prev_sibling(r"pub w$0", ImmediatePrevSibling::Visibility); | ||
440 | } | ||
424 | } | 441 | } |
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: () = (); | |||
146 | 146 | ||
147 | pub $0"#, | 147 | pub $0"#, |
148 | expect![[r##" | 148 | expect![[r##" |
149 | kw pub(crate) | ||
150 | kw pub | ||
151 | kw unsafe | 149 | kw unsafe |
152 | kw fn | 150 | kw fn |
153 | kw const | 151 | kw const |