]> git.lizzy.rs Git - rust.git/commitdiff
Don't complete visibility accessors after existing ones
authorLukas Wirth <lukastw97@gmail.com>
Wed, 16 Jun 2021 15:45:58 +0000 (17:45 +0200)
committerLukas Wirth <lukastw97@gmail.com>
Wed, 16 Jun 2021 19:51:20 +0000 (21:51 +0200)
crates/ide_completion/src/completions/keyword.rs
crates/ide_completion/src/context.rs
crates/ide_completion/src/patterns.rs
crates/ide_completion/src/tests/item_list.rs

index 2c42438d66c513f18cb32eaf5ec5bbd88484d301..0bfdf9603e5a592e79c6c7148c5653e83a85a411 100644 (file)
@@ -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 ");
     }
index a8437d81c7336a0700231d05332b7afe34ee24b3..3885db70214a8f3a4f8684153e6dff340aa8d363 100644 (file)
@@ -302,6 +302,10 @@ pub(crate) fn has_impl_or_trait_prev_sibling(&self) -> bool {
         )
     }
 
+    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))
     }
index 72e67e3c4cd5967fe7bd907d273394e776a7b195..345977d48bfc2c399603a2005a6892d50bc12814 100644 (file)
@@ -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<Immedi
         _ => 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 @@ fn test_if_expr_prev_sibling() {
         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);
+    }
 }
index bd060a63237b344ef5d0520381f97d67a422fedc..e7b77d7e7bade12ee3899ce1cd9f20d686d382f4 100644 (file)
@@ -146,8 +146,6 @@ mod bar {}
 
 pub $0"#,
         expect![[r##"
-            kw pub(crate)
-            kw pub
             kw unsafe
             kw fn
             kw const