aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--crates/ide_completion/src/completions/keyword.rs3
-rw-r--r--crates/ide_completion/src/completions/snippet.rs6
-rw-r--r--crates/ide_completion/src/completions/unqualified_path.rs5
-rw-r--r--crates/ide_completion/src/context.rs4
-rw-r--r--crates/ide_completion/src/tests/items.rs63
5 files changed, 57 insertions, 24 deletions
diff --git a/crates/ide_completion/src/completions/keyword.rs b/crates/ide_completion/src/completions/keyword.rs
index c5cd3c2f7..c99fdef05 100644
--- a/crates/ide_completion/src/completions/keyword.rs
+++ b/crates/ide_completion/src/completions/keyword.rs
@@ -69,6 +69,9 @@ pub(crate) fn complete_expr_keyword(acc: &mut Completions, ctx: &CompletionConte
69 69
70 if ctx.has_impl_or_trait_prev_sibling() { 70 if ctx.has_impl_or_trait_prev_sibling() {
71 add_keyword("where", "where "); 71 add_keyword("where", "where ");
72 if ctx.has_impl_prev_sibling() {
73 add_keyword("for", "for ");
74 }
72 return; 75 return;
73 } 76 }
74 if ctx.previous_token_is(T![unsafe]) { 77 if ctx.previous_token_is(T![unsafe]) {
diff --git a/crates/ide_completion/src/completions/snippet.rs b/crates/ide_completion/src/completions/snippet.rs
index 81ddfa34f..cbc20cc2c 100644
--- a/crates/ide_completion/src/completions/snippet.rs
+++ b/crates/ide_completion/src/completions/snippet.rs
@@ -36,7 +36,11 @@ pub(crate) fn complete_expr_snippet(acc: &mut Completions, ctx: &CompletionConte
36} 36}
37 37
38pub(crate) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionContext) { 38pub(crate) fn complete_item_snippet(acc: &mut Completions, ctx: &CompletionContext) {
39 if !ctx.expects_item() || ctx.previous_token_is(T![unsafe]) || ctx.path_qual().is_some() { 39 if !ctx.expects_item()
40 || ctx.previous_token_is(T![unsafe])
41 || ctx.path_qual().is_some()
42 || ctx.has_impl_or_trait_prev_sibling()
43 {
40 return; 44 return;
41 } 45 }
42 if ctx.has_visibility_prev_sibling() { 46 if ctx.has_visibility_prev_sibling() {
diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs
index 1864bfbcc..8ea5a2d5b 100644
--- a/crates/ide_completion/src/completions/unqualified_path.rs
+++ b/crates/ide_completion/src/completions/unqualified_path.rs
@@ -6,7 +6,7 @@ use syntax::{ast, AstNode};
6use crate::{patterns::ImmediateLocation, CompletionContext, Completions}; 6use crate::{patterns::ImmediateLocation, CompletionContext, Completions};
7 7
8pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) { 8pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) {
9 if ctx.is_path_disallowed() || !ctx.is_trivial_path() { 9 if ctx.is_path_disallowed() || !ctx.is_trivial_path() || ctx.has_impl_or_trait_prev_sibling() {
10 return; 10 return;
11 } 11 }
12 12
@@ -68,6 +68,9 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC
68 return; 68 return;
69 } 69 }
70 let add_resolution = match res { 70 let add_resolution = match res {
71 ScopeDef::ImplSelfType(_) => {
72 !ctx.previous_token_is(syntax::T![impl]) && !ctx.previous_token_is(syntax::T![for])
73 }
71 // Don't suggest attribute macros and derives. 74 // Don't suggest attribute macros and derives.
72 ScopeDef::MacroDef(mac) => mac.is_fn_like(), 75 ScopeDef::MacroDef(mac) => mac.is_fn_like(),
73 // no values in type places 76 // no values in type places
diff --git a/crates/ide_completion/src/context.rs b/crates/ide_completion/src/context.rs
index 240cac1de..d7a7e9cca 100644
--- a/crates/ide_completion/src/context.rs
+++ b/crates/ide_completion/src/context.rs
@@ -305,6 +305,10 @@ impl<'a> CompletionContext<'a> {
305 ) 305 )
306 } 306 }
307 307
308 pub(crate) fn has_impl_prev_sibling(&self) -> bool {
309 matches!(self.prev_sibling, Some(ImmediatePrevSibling::ImplDefType))
310 }
311
308 pub(crate) fn has_visibility_prev_sibling(&self) -> bool { 312 pub(crate) fn has_visibility_prev_sibling(&self) -> bool {
309 matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility)) 313 matches!(self.prev_sibling, Some(ImmediatePrevSibling::Visibility))
310 } 314 }
diff --git a/crates/ide_completion/src/tests/items.rs b/crates/ide_completion/src/tests/items.rs
index dd4ba3864..8dfb8221b 100644
--- a/crates/ide_completion/src/tests/items.rs
+++ b/crates/ide_completion/src/tests/items.rs
@@ -23,13 +23,11 @@ trait Trait {}
23 23
24#[test] 24#[test]
25fn target_type_or_trait_in_impl_block() { 25fn target_type_or_trait_in_impl_block() {
26 // FIXME: should not complete `Self`
27 check( 26 check(
28 r#" 27 r#"
29impl My$0 28impl Tra$0
30"#, 29"#,
31 expect![[r##" 30 expect![[r##"
32 sp Self
33 tt Trait 31 tt Trait
34 en Enum 32 en Enum
35 st Struct 33 st Struct
@@ -58,36 +56,57 @@ impl My$0
58} 56}
59 57
60#[test] 58#[test]
61fn after_trait_name_in_trait_def() { 59fn target_type_in_trait_impl_block() {
62 // FIXME: should only complete `where`
63 check( 60 check(
64 r"trait A $0", 61 r#"
62impl Trait for Str$0
63"#,
65 expect![[r##" 64 expect![[r##"
66 kw where 65 tt Trait
67 sn tmod (Test module) 66 en Enum
68 sn tfn (Test function) 67 st Struct
69 sn macro_rules
70 md bar 68 md bar
71 ma foo!(…) #[macro_export] macro_rules! foo 69 ma foo!(…) #[macro_export] macro_rules! foo
72 ma foo!(…) #[macro_export] macro_rules! foo 70 ma foo!(…) #[macro_export] macro_rules! foo
71 bt u32
72 bt bool
73 bt u8
74 bt isize
75 bt u16
76 bt u64
77 bt u128
78 bt f32
79 bt i128
80 bt i16
81 bt str
82 bt i64
83 bt char
84 bt f64
85 bt i32
86 bt i8
87 bt usize
73 "##]], 88 "##]],
89 )
90}
91
92#[test]
93fn after_trait_name_in_trait_def() {
94 check(
95 r"trait A $0",
96 expect![[r#"
97 kw where
98 "#]],
74 ); 99 );
75} 100}
76 101
77#[test] 102#[test]
78fn after_trait_or_target_name_in_impl() { 103fn after_trait_or_target_name_in_impl() {
79 // FIXME: should only complete `for` and `where`
80 check( 104 check(
81 r"impl A $0", 105 r"impl Trait $0",
82 expect![[r##" 106 expect![[r#"
83 kw where 107 kw where
84 sn tmod (Test module) 108 kw for
85 sn tfn (Test function) 109 "#]],
86 sn macro_rules
87 md bar
88 ma foo!(…) #[macro_export] macro_rules! foo
89 ma foo!(…) #[macro_export] macro_rules! foo
90 "##]],
91 ); 110 );
92} 111}
93 112