]> git.lizzy.rs Git - rust.git/commitdiff
Correct completions in items tests
authorLukas Wirth <lukastw97@gmail.com>
Thu, 17 Jun 2021 13:43:21 +0000 (15:43 +0200)
committerLukas Wirth <lukastw97@gmail.com>
Thu, 17 Jun 2021 13:43:21 +0000 (15:43 +0200)
crates/ide_completion/src/completions/keyword.rs
crates/ide_completion/src/completions/snippet.rs
crates/ide_completion/src/completions/unqualified_path.rs
crates/ide_completion/src/context.rs
crates/ide_completion/src/tests/items.rs

index c5cd3c2f7e9c507109d0bce41ddb6761434021ba..c99fdef05c0b73e2e0b935a3c99b65bbe859aace 100644 (file)
@@ -69,6 +69,9 @@ pub(crate) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
 
     if ctx.has_impl_or_trait_prev_sibling() {
         add_keyword("where", "where ");
+        if ctx.has_impl_prev_sibling() {
+            add_keyword("for", "for ");
+        }
         return;
     }
     if ctx.previous_token_is(T![unsafe]) {
index 81ddfa34fdc35f01f730b73d63874da2102adf6c..cbc20cc2c39717c722a460e80b6cf3ef03d36dba 100644 (file)
@@ -36,7 +36,11 @@ 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() || ctx.previous_token_is(T![unsafe]) || ctx.path_qual().is_some() {
+    if !ctx.expects_item()
+        || ctx.previous_token_is(T![unsafe])
+        || ctx.path_qual().is_some()
+        || ctx.has_impl_or_trait_prev_sibling()
+    {
         return;
     }
     if ctx.has_visibility_prev_sibling() {
index 1864bfbccbda96ebd9b3f2ccd0952cbcd3f925d8..8ea5a2d5b9b7ba0253552cbd3e0321968029fa9d 100644 (file)
@@ -6,7 +6,7 @@
 use crate::{patterns::ImmediateLocation, CompletionContext, Completions};
 
 pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) {
-    if ctx.is_path_disallowed() || !ctx.is_trivial_path() {
+    if ctx.is_path_disallowed() || !ctx.is_trivial_path() || ctx.has_impl_or_trait_prev_sibling() {
         return;
     }
 
@@ -68,6 +68,9 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
             return;
         }
         let add_resolution = match res {
+            ScopeDef::ImplSelfType(_) => {
+                !ctx.previous_token_is(syntax::T![impl]) && !ctx.previous_token_is(syntax::T![for])
+            }
             // Don't suggest attribute macros and derives.
             ScopeDef::MacroDef(mac) => mac.is_fn_like(),
             // no values in type places
index 240cac1de0973931cdfa5b07eef8f6b08c89be16..d7a7e9cca84519916d9ba786fb9b09b71d70a916 100644 (file)
@@ -305,6 +305,10 @@ pub(crate) fn has_impl_or_trait_prev_sibling(&self) -> bool {
         )
     }
 
+    pub(crate) fn has_impl_prev_sibling(&self) -> bool {
+        matches!(self.prev_sibling, Some(ImmediatePrevSibling::ImplDefType))
+    }
+
     pub(crate) fn has_visibility_prev_sibling(&self) -> bool {
         matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility))
     }
index dd4ba3864e985ccaf9d9814d9f5e4da7648ed540..8dfb8221bda95c7c63f817be8eb28b501c035abe 100644 (file)
@@ -23,13 +23,11 @@ trait Trait {}
 
 #[test]
 fn target_type_or_trait_in_impl_block() {
-    // FIXME: should not complete `Self`
     check(
         r#"
-impl My$0
+impl Tra$0
 "#,
         expect![[r##"
-            sp Self
             tt Trait
             en Enum
             st Struct
@@ -58,36 +56,57 @@ impl My$0
 }
 
 #[test]
-fn after_trait_name_in_trait_def() {
-    // FIXME: should only complete `where`
+fn target_type_in_trait_impl_block() {
     check(
-        r"trait A $0",
+        r#"
+impl Trait for Str$0
+"#,
         expect![[r##"
-            kw where
-            sn tmod (Test module)
-            sn tfn (Test function)
-            sn macro_rules
+            tt Trait
+            en Enum
+            st Struct
             md bar
-            ma foo!(…)          #[macro_export] macro_rules! foo
-            ma foo!(…)          #[macro_export] macro_rules! foo
+            ma foo!(…) #[macro_export] macro_rules! foo
+            ma foo!(…) #[macro_export] macro_rules! foo
+            bt u32
+            bt bool
+            bt u8
+            bt isize
+            bt u16
+            bt u64
+            bt u128
+            bt f32
+            bt i128
+            bt i16
+            bt str
+            bt i64
+            bt char
+            bt f64
+            bt i32
+            bt i8
+            bt usize
         "##]],
+    )
+}
+
+#[test]
+fn after_trait_name_in_trait_def() {
+    check(
+        r"trait A $0",
+        expect![[r#"
+            kw where
+        "#]],
     );
 }
 
 #[test]
 fn after_trait_or_target_name_in_impl() {
-    // FIXME: should only complete `for` and `where`
     check(
-        r"impl A $0",
-        expect![[r##"
+        r"impl Trait $0",
+        expect![[r#"
             kw where
-            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
-        "##]],
+            kw for
+        "#]],
     );
 }