diff options
Diffstat (limited to 'crates/ide_completion/src/completions')
-rw-r--r-- | crates/ide_completion/src/completions/dot.rs | 24 | ||||
-rw-r--r-- | crates/ide_completion/src/completions/flyimport.rs | 8 | ||||
-rw-r--r-- | crates/ide_completion/src/completions/fn_param.rs | 2 | ||||
-rw-r--r-- | crates/ide_completion/src/completions/pattern.rs | 116 | ||||
-rw-r--r-- | crates/ide_completion/src/completions/qualified_path.rs | 56 | ||||
-rw-r--r-- | crates/ide_completion/src/completions/trait_impl.rs | 7 | ||||
-rw-r--r-- | crates/ide_completion/src/completions/unqualified_path.rs | 138 |
7 files changed, 176 insertions, 175 deletions
diff --git a/crates/ide_completion/src/completions/dot.rs b/crates/ide_completion/src/completions/dot.rs index 5ee9a9f07..cec2d0c3a 100644 --- a/crates/ide_completion/src/completions/dot.rs +++ b/crates/ide_completion/src/completions/dot.rs | |||
@@ -81,7 +81,7 @@ fn foo(s: S) { s.$0 } | |||
81 | "#, | 81 | "#, |
82 | expect![[r#" | 82 | expect![[r#" |
83 | fd foo u32 | 83 | fd foo u32 |
84 | me bar() -> () | 84 | me bar() fn(&self) |
85 | "#]], | 85 | "#]], |
86 | ); | 86 | ); |
87 | } | 87 | } |
@@ -97,7 +97,7 @@ impl S { | |||
97 | "#, | 97 | "#, |
98 | expect![[r#" | 98 | expect![[r#" |
99 | fd the_field (u32,) | 99 | fd the_field (u32,) |
100 | me foo() -> () | 100 | me foo() fn(self) |
101 | "#]], | 101 | "#]], |
102 | ) | 102 | ) |
103 | } | 103 | } |
@@ -113,7 +113,7 @@ impl A { | |||
113 | "#, | 113 | "#, |
114 | expect![[r#" | 114 | expect![[r#" |
115 | fd the_field (u32, i32) | 115 | fd the_field (u32, i32) |
116 | me foo() -> () | 116 | me foo() fn(&self) |
117 | "#]], | 117 | "#]], |
118 | ) | 118 | ) |
119 | } | 119 | } |
@@ -163,7 +163,7 @@ mod m { | |||
163 | fn foo(a: A) { a.$0 } | 163 | fn foo(a: A) { a.$0 } |
164 | "#, | 164 | "#, |
165 | expect![[r#" | 165 | expect![[r#" |
166 | me the_method() -> () | 166 | me the_method() fn(&self) |
167 | "#]], | 167 | "#]], |
168 | ); | 168 | ); |
169 | } | 169 | } |
@@ -196,7 +196,7 @@ impl A<i32> { | |||
196 | fn foo(a: A<u32>) { a.$0 } | 196 | fn foo(a: A<u32>) { a.$0 } |
197 | "#, | 197 | "#, |
198 | expect![[r#" | 198 | expect![[r#" |
199 | me the_method() -> () | 199 | me the_method() fn(&self) |
200 | "#]], | 200 | "#]], |
201 | ) | 201 | ) |
202 | } | 202 | } |
@@ -211,7 +211,7 @@ impl Trait for A {} | |||
211 | fn foo(a: A) { a.$0 } | 211 | fn foo(a: A) { a.$0 } |
212 | "#, | 212 | "#, |
213 | expect![[r#" | 213 | expect![[r#" |
214 | me the_method() -> () | 214 | me the_method() fn(&self) |
215 | "#]], | 215 | "#]], |
216 | ); | 216 | ); |
217 | } | 217 | } |
@@ -226,7 +226,7 @@ impl<T> Trait for T {} | |||
226 | fn foo(a: &A) { a.$0 } | 226 | fn foo(a: &A) { a.$0 } |
227 | ", | 227 | ", |
228 | expect![[r#" | 228 | expect![[r#" |
229 | me the_method() -> () | 229 | me the_method() fn(&self) |
230 | "#]], | 230 | "#]], |
231 | ); | 231 | ); |
232 | } | 232 | } |
@@ -244,7 +244,7 @@ impl Trait for A {} | |||
244 | fn foo(a: A) { a.$0 } | 244 | fn foo(a: A) { a.$0 } |
245 | ", | 245 | ", |
246 | expect![[r#" | 246 | expect![[r#" |
247 | me the_method() -> () | 247 | me the_method() fn(&self) |
248 | "#]], | 248 | "#]], |
249 | ); | 249 | ); |
250 | } | 250 | } |
@@ -298,7 +298,7 @@ impl T { | |||
298 | } | 298 | } |
299 | "#, | 299 | "#, |
300 | expect![[r#" | 300 | expect![[r#" |
301 | me blah() -> () | 301 | me blah() fn(&self) |
302 | "#]], | 302 | "#]], |
303 | ); | 303 | ); |
304 | } | 304 | } |
@@ -407,7 +407,7 @@ fn foo() { | |||
407 | } | 407 | } |
408 | "#, | 408 | "#, |
409 | expect![[r#" | 409 | expect![[r#" |
410 | me the_method() -> () | 410 | me the_method() fn(&self) |
411 | "#]], | 411 | "#]], |
412 | ); | 412 | ); |
413 | } | 413 | } |
@@ -422,7 +422,7 @@ macro_rules! make_s { () => { S }; } | |||
422 | fn main() { make_s!().f$0; } | 422 | fn main() { make_s!().f$0; } |
423 | "#, | 423 | "#, |
424 | expect![[r#" | 424 | expect![[r#" |
425 | me foo() -> () | 425 | me foo() fn(&self) |
426 | "#]], | 426 | "#]], |
427 | ) | 427 | ) |
428 | } | 428 | } |
@@ -450,7 +450,7 @@ mod foo { | |||
450 | } | 450 | } |
451 | "#, | 451 | "#, |
452 | expect![[r#" | 452 | expect![[r#" |
453 | me private() -> () | 453 | me private() fn(&self) |
454 | "#]], | 454 | "#]], |
455 | ); | 455 | ); |
456 | } | 456 | } |
diff --git a/crates/ide_completion/src/completions/flyimport.rs b/crates/ide_completion/src/completions/flyimport.rs index 391a11c91..08df2df3f 100644 --- a/crates/ide_completion/src/completions/flyimport.rs +++ b/crates/ide_completion/src/completions/flyimport.rs | |||
@@ -402,7 +402,7 @@ fn main() { | |||
402 | check( | 402 | check( |
403 | fixture, | 403 | fixture, |
404 | expect![[r#" | 404 | expect![[r#" |
405 | fn weird_function() (dep::test_mod::TestTrait) -> () | 405 | fn weird_function() (dep::test_mod::TestTrait) fn() |
406 | "#]], | 406 | "#]], |
407 | ); | 407 | ); |
408 | 408 | ||
@@ -495,7 +495,7 @@ fn main() { | |||
495 | check( | 495 | check( |
496 | fixture, | 496 | fixture, |
497 | expect![[r#" | 497 | expect![[r#" |
498 | me random_method() (dep::test_mod::TestTrait) -> () | 498 | me random_method() (dep::test_mod::TestTrait) fn(&self) |
499 | "#]], | 499 | "#]], |
500 | ); | 500 | ); |
501 | 501 | ||
@@ -665,7 +665,7 @@ fn main() { | |||
665 | } | 665 | } |
666 | "#, | 666 | "#, |
667 | expect![[r#" | 667 | expect![[r#" |
668 | me random_method() (dep::test_mod::TestTrait) -> () DEPRECATED | 668 | me random_method() (dep::test_mod::TestTrait) fn(&self) DEPRECATED |
669 | "#]], | 669 | "#]], |
670 | ); | 670 | ); |
671 | 671 | ||
@@ -696,7 +696,7 @@ fn main() { | |||
696 | "#, | 696 | "#, |
697 | expect![[r#" | 697 | expect![[r#" |
698 | ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED | 698 | ct SPECIAL_CONST (dep::test_mod::TestTrait) DEPRECATED |
699 | fn weird_function() (dep::test_mod::TestTrait) -> () DEPRECATED | 699 | fn weird_function() (dep::test_mod::TestTrait) fn() DEPRECATED |
700 | "#]], | 700 | "#]], |
701 | ); | 701 | ); |
702 | } | 702 | } |
diff --git a/crates/ide_completion/src/completions/fn_param.rs b/crates/ide_completion/src/completions/fn_param.rs index 0243dce56..0ea558489 100644 --- a/crates/ide_completion/src/completions/fn_param.rs +++ b/crates/ide_completion/src/completions/fn_param.rs | |||
@@ -33,7 +33,7 @@ pub(crate) fn complete_fn_param(acc: &mut Completions, ctx: &CompletionContext) | |||
33 | }); | 33 | }); |
34 | }; | 34 | }; |
35 | 35 | ||
36 | for node in ctx.token.parent().ancestors() { | 36 | for node in ctx.token.ancestors() { |
37 | match_ast! { | 37 | match_ast! { |
38 | match node { | 38 | match node { |
39 | ast::SourceFile(it) => it.items().filter_map(|item| match item { | 39 | ast::SourceFile(it) => it.items().filter_map(|item| match item { |
diff --git a/crates/ide_completion/src/completions/pattern.rs b/crates/ide_completion/src/completions/pattern.rs index 9282c3827..46cef58f0 100644 --- a/crates/ide_completion/src/completions/pattern.rs +++ b/crates/ide_completion/src/completions/pattern.rs | |||
@@ -11,10 +11,13 @@ pub(crate) fn complete_pattern(acc: &mut Completions, ctx: &CompletionContext) { | |||
11 | return; | 11 | return; |
12 | } | 12 | } |
13 | 13 | ||
14 | if let Some(ty) = &ctx.expected_type { | 14 | if !ctx.is_irrefutable_pat_binding { |
15 | super::complete_enum_variants(acc, ctx, ty, |acc, ctx, variant, path| { | 15 | if let Some(ty) = ctx.expected_type.as_ref() { |
16 | acc.add_qualified_variant_pat(ctx, variant, path) | 16 | super::complete_enum_variants(acc, ctx, ty, |acc, ctx, variant, path| { |
17 | }); | 17 | acc.add_qualified_variant_pat(ctx, variant, path.clone()); |
18 | acc.add_qualified_enum_variant(ctx, variant, path); | ||
19 | }); | ||
20 | } | ||
18 | } | 21 | } |
19 | 22 | ||
20 | // FIXME: ideally, we should look at the type we are matching against and | 23 | // FIXME: ideally, we should look at the type we are matching against and |
@@ -85,7 +88,7 @@ static FOO: E = E::X; | |||
85 | struct Bar { f: u32 } | 88 | struct Bar { f: u32 } |
86 | 89 | ||
87 | fn foo() { | 90 | fn foo() { |
88 | match E::X { $0 } | 91 | match E::X { a$0 } |
89 | } | 92 | } |
90 | "#, | 93 | "#, |
91 | expect![[r#" | 94 | expect![[r#" |
@@ -106,10 +109,11 @@ macro_rules! m { ($e:expr) => { $e } } | |||
106 | enum E { X } | 109 | enum E { X } |
107 | 110 | ||
108 | fn foo() { | 111 | fn foo() { |
109 | m!(match E::X { $0 }) | 112 | m!(match E::X { a$0 }) |
110 | } | 113 | } |
111 | "#, | 114 | "#, |
112 | expect![[r#" | 115 | expect![[r#" |
116 | ev E::X () | ||
113 | en E | 117 | en E |
114 | ma m!(…) macro_rules! m | 118 | ma m!(…) macro_rules! m |
115 | "#]], | 119 | "#]], |
@@ -129,7 +133,7 @@ static FOO: E = E::X; | |||
129 | struct Bar { f: u32 } | 133 | struct Bar { f: u32 } |
130 | 134 | ||
131 | fn foo() { | 135 | fn foo() { |
132 | let $0 | 136 | let a$0 |
133 | } | 137 | } |
134 | "#, | 138 | "#, |
135 | expect![[r#" | 139 | expect![[r#" |
@@ -147,7 +151,7 @@ enum E { X } | |||
147 | static FOO: E = E::X; | 151 | static FOO: E = E::X; |
148 | struct Bar { f: u32 } | 152 | struct Bar { f: u32 } |
149 | 153 | ||
150 | fn foo($0) { | 154 | fn foo(a$0) { |
151 | } | 155 | } |
152 | "#, | 156 | "#, |
153 | expect![[r#" | 157 | expect![[r#" |
@@ -163,7 +167,7 @@ fn foo($0) { | |||
163 | struct Bar { f: u32 } | 167 | struct Bar { f: u32 } |
164 | 168 | ||
165 | fn foo() { | 169 | fn foo() { |
166 | let $0 | 170 | let a$0 |
167 | } | 171 | } |
168 | "#, | 172 | "#, |
169 | expect![[r#" | 173 | expect![[r#" |
@@ -179,7 +183,7 @@ fn foo() { | |||
179 | struct Foo { bar: String, baz: String } | 183 | struct Foo { bar: String, baz: String } |
180 | struct Bar(String, String); | 184 | struct Bar(String, String); |
181 | struct Baz; | 185 | struct Baz; |
182 | fn outer($0) {} | 186 | fn outer(a$0) {} |
183 | "#, | 187 | "#, |
184 | expect![[r#" | 188 | expect![[r#" |
185 | bn Foo Foo { bar$1, baz$2 }: Foo$0 | 189 | bn Foo Foo { bar$1, baz$2 }: Foo$0 |
@@ -196,7 +200,7 @@ struct Foo { bar: String, baz: String } | |||
196 | struct Bar(String, String); | 200 | struct Bar(String, String); |
197 | struct Baz; | 201 | struct Baz; |
198 | fn outer() { | 202 | fn outer() { |
199 | let $0 | 203 | let a$0 |
200 | } | 204 | } |
201 | "#, | 205 | "#, |
202 | expect![[r#" | 206 | expect![[r#" |
@@ -215,7 +219,7 @@ struct Bar(String, String); | |||
215 | struct Baz; | 219 | struct Baz; |
216 | fn outer() { | 220 | fn outer() { |
217 | match () { | 221 | match () { |
218 | $0 | 222 | a$0 |
219 | } | 223 | } |
220 | } | 224 | } |
221 | "#, | 225 | "#, |
@@ -239,7 +243,7 @@ use foo::*; | |||
239 | 243 | ||
240 | fn outer() { | 244 | fn outer() { |
241 | match () { | 245 | match () { |
242 | $0 | 246 | a$0 |
243 | } | 247 | } |
244 | } | 248 | } |
245 | "#, | 249 | "#, |
@@ -258,7 +262,7 @@ fn outer() { | |||
258 | struct Foo(i32); | 262 | struct Foo(i32); |
259 | fn main() { | 263 | fn main() { |
260 | match Foo(92) { | 264 | match Foo(92) { |
261 | $0(92) => (), | 265 | a$0(92) => (), |
262 | } | 266 | } |
263 | } | 267 | } |
264 | "#, | 268 | "#, |
@@ -281,7 +285,7 @@ struct Foo(i32); | |||
281 | impl Foo { | 285 | impl Foo { |
282 | fn foo() { | 286 | fn foo() { |
283 | match () { | 287 | match () { |
284 | $0 | 288 | a$0 |
285 | } | 289 | } |
286 | } | 290 | } |
287 | } | 291 | } |
@@ -314,4 +318,86 @@ impl Foo { | |||
314 | "#]], | 318 | "#]], |
315 | ) | 319 | ) |
316 | } | 320 | } |
321 | |||
322 | #[test] | ||
323 | fn completes_enum_variant_matcharm() { | ||
324 | check( | ||
325 | r#" | ||
326 | enum Foo { Bar, Baz, Quux } | ||
327 | |||
328 | fn main() { | ||
329 | let foo = Foo::Quux; | ||
330 | match foo { Qu$0 } | ||
331 | } | ||
332 | "#, | ||
333 | expect![[r#" | ||
334 | ev Foo::Bar () | ||
335 | ev Foo::Baz () | ||
336 | ev Foo::Quux () | ||
337 | en Foo | ||
338 | "#]], | ||
339 | ) | ||
340 | } | ||
341 | |||
342 | #[test] | ||
343 | fn completes_enum_variant_matcharm_ref() { | ||
344 | check( | ||
345 | r#" | ||
346 | enum Foo { Bar, Baz, Quux } | ||
347 | |||
348 | fn main() { | ||
349 | let foo = Foo::Quux; | ||
350 | match &foo { Qu$0 } | ||
351 | } | ||
352 | "#, | ||
353 | expect![[r#" | ||
354 | ev Foo::Bar () | ||
355 | ev Foo::Baz () | ||
356 | ev Foo::Quux () | ||
357 | en Foo | ||
358 | "#]], | ||
359 | ) | ||
360 | } | ||
361 | |||
362 | #[test] | ||
363 | fn completes_enum_variant_iflet() { | ||
364 | check( | ||
365 | r#" | ||
366 | enum Foo { Bar, Baz, Quux } | ||
367 | |||
368 | fn main() { | ||
369 | let foo = Foo::Quux; | ||
370 | if let Qu$0 = foo { } | ||
371 | } | ||
372 | "#, | ||
373 | expect![[r#" | ||
374 | ev Foo::Bar () | ||
375 | ev Foo::Baz () | ||
376 | ev Foo::Quux () | ||
377 | en Foo | ||
378 | "#]], | ||
379 | ) | ||
380 | } | ||
381 | |||
382 | #[test] | ||
383 | fn completes_enum_variant_impl() { | ||
384 | check( | ||
385 | r#" | ||
386 | enum Foo { Bar, Baz, Quux } | ||
387 | impl Foo { | ||
388 | fn foo() { match Foo::Bar { Q$0 } } | ||
389 | } | ||
390 | "#, | ||
391 | expect![[r#" | ||
392 | ev Self::Bar () | ||
393 | ev Self::Baz () | ||
394 | ev Self::Quux () | ||
395 | ev Foo::Bar () | ||
396 | ev Foo::Baz () | ||
397 | ev Foo::Quux () | ||
398 | sp Self | ||
399 | en Foo | ||
400 | "#]], | ||
401 | ) | ||
402 | } | ||
317 | } | 403 | } |
diff --git a/crates/ide_completion/src/completions/qualified_path.rs b/crates/ide_completion/src/completions/qualified_path.rs index df74b739e..105ff6013 100644 --- a/crates/ide_completion/src/completions/qualified_path.rs +++ b/crates/ide_completion/src/completions/qualified_path.rs | |||
@@ -359,8 +359,8 @@ impl S { | |||
359 | fn foo() { let _ = S::$0 } | 359 | fn foo() { let _ = S::$0 } |
360 | "#, | 360 | "#, |
361 | expect![[r#" | 361 | expect![[r#" |
362 | fn a() -> () | 362 | fn a() fn() |
363 | me b(…) -> () | 363 | me b(…) fn(&self) |
364 | ct C const C: i32 = 42; | 364 | ct C const C: i32 = 42; |
365 | ta T type T = i32; | 365 | ta T type T = i32; |
366 | "#]], | 366 | "#]], |
@@ -387,7 +387,7 @@ mod m { | |||
387 | fn foo() { let _ = S::$0 } | 387 | fn foo() { let _ = S::$0 } |
388 | "#, | 388 | "#, |
389 | expect![[r#" | 389 | expect![[r#" |
390 | fn public_method() -> () | 390 | fn public_method() fn() |
391 | ct PUBLIC_CONST pub(crate) const PUBLIC_CONST: u32 = 1; | 391 | ct PUBLIC_CONST pub(crate) const PUBLIC_CONST: u32 = 1; |
392 | ta PublicType pub(crate) type PublicType = u32; | 392 | ta PublicType pub(crate) type PublicType = u32; |
393 | "#]], | 393 | "#]], |
@@ -404,7 +404,7 @@ impl E { fn m() { } } | |||
404 | fn foo() { let _ = E::$0 } | 404 | fn foo() { let _ = E::$0 } |
405 | "#, | 405 | "#, |
406 | expect![[r#" | 406 | expect![[r#" |
407 | fn m() -> () | 407 | fn m() fn() |
408 | "#]], | 408 | "#]], |
409 | ); | 409 | ); |
410 | } | 410 | } |
@@ -419,7 +419,7 @@ impl U { fn m() { } } | |||
419 | fn foo() { let _ = U::$0 } | 419 | fn foo() { let _ = U::$0 } |
420 | "#, | 420 | "#, |
421 | expect![[r#" | 421 | expect![[r#" |
422 | fn m() -> () | 422 | fn m() fn() |
423 | "#]], | 423 | "#]], |
424 | ); | 424 | ); |
425 | } | 425 | } |
@@ -449,7 +449,7 @@ trait Trait { fn m(); } | |||
449 | fn foo() { let _ = Trait::$0 } | 449 | fn foo() { let _ = Trait::$0 } |
450 | "#, | 450 | "#, |
451 | expect![[r#" | 451 | expect![[r#" |
452 | fn m() -> () | 452 | fn m() fn() |
453 | "#]], | 453 | "#]], |
454 | ); | 454 | ); |
455 | } | 455 | } |
@@ -466,7 +466,7 @@ impl Trait for S {} | |||
466 | fn foo() { let _ = S::$0 } | 466 | fn foo() { let _ = S::$0 } |
467 | "#, | 467 | "#, |
468 | expect![[r#" | 468 | expect![[r#" |
469 | fn m() -> () | 469 | fn m() fn() |
470 | "#]], | 470 | "#]], |
471 | ); | 471 | ); |
472 | } | 472 | } |
@@ -483,7 +483,7 @@ impl Trait for S {} | |||
483 | fn foo() { let _ = <S as Trait>::$0 } | 483 | fn foo() { let _ = <S as Trait>::$0 } |
484 | "#, | 484 | "#, |
485 | expect![[r#" | 485 | expect![[r#" |
486 | fn m() -> () | 486 | fn m() fn() |
487 | "#]], | 487 | "#]], |
488 | ); | 488 | ); |
489 | } | 489 | } |
@@ -512,11 +512,11 @@ fn foo<T: Sub>() { T::$0 } | |||
512 | ta SubTy type SubTy; | 512 | ta SubTy type SubTy; |
513 | ta Ty type Ty; | 513 | ta Ty type Ty; |
514 | ct C2 const C2: (); | 514 | ct C2 const C2: (); |
515 | fn subfunc() -> () | 515 | fn subfunc() fn() |
516 | me submethod(…) -> () | 516 | me submethod(…) fn(&self) |
517 | ct CONST const CONST: u8; | 517 | ct CONST const CONST: u8; |
518 | fn func() -> () | 518 | fn func() fn() |
519 | me method(…) -> () | 519 | me method(…) fn(&self) |
520 | "#]], | 520 | "#]], |
521 | ); | 521 | ); |
522 | } | 522 | } |
@@ -552,11 +552,11 @@ impl<T> Sub for Wrap<T> { | |||
552 | ta SubTy type SubTy; | 552 | ta SubTy type SubTy; |
553 | ta Ty type Ty; | 553 | ta Ty type Ty; |
554 | ct CONST const CONST: u8 = 0; | 554 | ct CONST const CONST: u8 = 0; |
555 | fn func() -> () | 555 | fn func() fn() |
556 | me method(…) -> () | 556 | me method(…) fn(&self) |
557 | ct C2 const C2: () = (); | 557 | ct C2 const C2: () = (); |
558 | fn subfunc() -> () | 558 | fn subfunc() fn() |
559 | me submethod(…) -> () | 559 | me submethod(…) fn(&self) |
560 | "#]], | 560 | "#]], |
561 | ); | 561 | ); |
562 | } | 562 | } |
@@ -573,8 +573,8 @@ impl T { fn bar() {} } | |||
573 | fn main() { T::$0; } | 573 | fn main() { T::$0; } |
574 | "#, | 574 | "#, |
575 | expect![[r#" | 575 | expect![[r#" |
576 | fn foo() -> () | 576 | fn foo() fn() |
577 | fn bar() -> () | 577 | fn bar() fn() |
578 | "#]], | 578 | "#]], |
579 | ); | 579 | ); |
580 | } | 580 | } |
@@ -589,7 +589,7 @@ macro_rules! foo { () => {} } | |||
589 | fn main() { let _ = crate::$0 } | 589 | fn main() { let _ = crate::$0 } |
590 | "#, | 590 | "#, |
591 | expect![[r##" | 591 | expect![[r##" |
592 | fn main() -> () | 592 | fn main() fn() |
593 | ma foo!(…) #[macro_export] macro_rules! foo | 593 | ma foo!(…) #[macro_export] macro_rules! foo |
594 | "##]], | 594 | "##]], |
595 | ); | 595 | ); |
@@ -633,7 +633,7 @@ mod p { | |||
633 | "#, | 633 | "#, |
634 | expect![[r#" | 634 | expect![[r#" |
635 | ct RIGHT_CONST | 635 | ct RIGHT_CONST |
636 | fn right_fn() -> () | 636 | fn right_fn() fn() |
637 | st RightType | 637 | st RightType |
638 | "#]], | 638 | "#]], |
639 | ); | 639 | ); |
@@ -680,8 +680,8 @@ fn main() { m!(self::f$0); } | |||
680 | fn foo() {} | 680 | fn foo() {} |
681 | "#, | 681 | "#, |
682 | expect![[r#" | 682 | expect![[r#" |
683 | fn main() -> () | 683 | fn main() fn() |
684 | fn foo() -> () | 684 | fn foo() fn() |
685 | "#]], | 685 | "#]], |
686 | ); | 686 | ); |
687 | } | 687 | } |
@@ -699,7 +699,7 @@ mod m { | |||
699 | "#, | 699 | "#, |
700 | expect![[r#" | 700 | expect![[r#" |
701 | md z | 701 | md z |
702 | fn z() -> () | 702 | fn z() fn() |
703 | "#]], | 703 | "#]], |
704 | ); | 704 | ); |
705 | } | 705 | } |
@@ -719,7 +719,7 @@ fn foo() { | |||
719 | } | 719 | } |
720 | "#, | 720 | "#, |
721 | expect![[r#" | 721 | expect![[r#" |
722 | fn new() -> HashMap<K, V, RandomState> | 722 | fn new() fn() -> HashMap<K, V, RandomState> |
723 | "#]], | 723 | "#]], |
724 | ); | 724 | ); |
725 | } | 725 | } |
@@ -752,8 +752,8 @@ fn main() { | |||
752 | } | 752 | } |
753 | "#, | 753 | "#, |
754 | expect![[r#" | 754 | expect![[r#" |
755 | fn main() -> () | 755 | fn main() fn() |
756 | fn foo(…) -> () | 756 | fn foo(…) fn(i32, i32) |
757 | "#]], | 757 | "#]], |
758 | ); | 758 | ); |
759 | } | 759 | } |
@@ -776,7 +776,7 @@ impl Foo { | |||
776 | expect![[r#" | 776 | expect![[r#" |
777 | ev Bar () | 777 | ev Bar () |
778 | ev Baz () | 778 | ev Baz () |
779 | me foo(…) -> () | 779 | me foo(…) fn(self) |
780 | "#]], | 780 | "#]], |
781 | ); | 781 | ); |
782 | } | 782 | } |
@@ -800,7 +800,7 @@ impl u8 { | |||
800 | "#, | 800 | "#, |
801 | expect![[r#" | 801 | expect![[r#" |
802 | ct MAX pub const MAX: Self = 255; | 802 | ct MAX pub const MAX: Self = 255; |
803 | me func(…) -> () | 803 | me func(…) fn(self) |
804 | "#]], | 804 | "#]], |
805 | ); | 805 | ); |
806 | } | 806 | } |
diff --git a/crates/ide_completion/src/completions/trait_impl.rs b/crates/ide_completion/src/completions/trait_impl.rs index 5a7361f8e..a26fe7c6c 100644 --- a/crates/ide_completion/src/completions/trait_impl.rs +++ b/crates/ide_completion/src/completions/trait_impl.rs | |||
@@ -82,13 +82,14 @@ pub(crate) fn complete_trait_impl(acc: &mut Completions, ctx: &CompletionContext | |||
82 | 82 | ||
83 | fn completion_match(ctx: &CompletionContext) -> Option<(ImplCompletionKind, SyntaxNode, Impl)> { | 83 | fn completion_match(ctx: &CompletionContext) -> Option<(ImplCompletionKind, SyntaxNode, Impl)> { |
84 | let mut token = ctx.token.clone(); | 84 | let mut token = ctx.token.clone(); |
85 | // For keywork without name like `impl .. { fn $0 }`, the current position is inside | 85 | // For keyword without name like `impl .. { fn $0 }`, the current position is inside |
86 | // the whitespace token, which is outside `FN` syntax node. | 86 | // the whitespace token, which is outside `FN` syntax node. |
87 | // We need to follow the previous token in this case. | 87 | // We need to follow the previous token in this case. |
88 | if token.kind() == SyntaxKind::WHITESPACE { | 88 | if token.kind() == SyntaxKind::WHITESPACE { |
89 | token = token.prev_token()?; | 89 | token = token.prev_token()?; |
90 | } | 90 | } |
91 | 91 | ||
92 | let parent_kind = token.parent().map_or(SyntaxKind::EOF, |it| it.kind()); | ||
92 | let impl_item_offset = match token.kind() { | 93 | let impl_item_offset = match token.kind() { |
93 | // `impl .. { const $0 }` | 94 | // `impl .. { const $0 }` |
94 | // ERROR 0 | 95 | // ERROR 0 |
@@ -102,14 +103,14 @@ fn completion_match(ctx: &CompletionContext) -> Option<(ImplCompletionKind, Synt | |||
102 | // FN/TYPE_ALIAS/CONST 1 | 103 | // FN/TYPE_ALIAS/CONST 1 |
103 | // NAME 0 | 104 | // NAME 0 |
104 | // IDENT <- * | 105 | // IDENT <- * |
105 | SyntaxKind::IDENT if token.parent().kind() == SyntaxKind::NAME => 1, | 106 | SyntaxKind::IDENT if parent_kind == SyntaxKind::NAME => 1, |
106 | // `impl .. { foo$0 }` | 107 | // `impl .. { foo$0 }` |
107 | // MACRO_CALL 3 | 108 | // MACRO_CALL 3 |
108 | // PATH 2 | 109 | // PATH 2 |
109 | // PATH_SEGMENT 1 | 110 | // PATH_SEGMENT 1 |
110 | // NAME_REF 0 | 111 | // NAME_REF 0 |
111 | // IDENT <- * | 112 | // IDENT <- * |
112 | SyntaxKind::IDENT if token.parent().kind() == SyntaxKind::NAME_REF => 3, | 113 | SyntaxKind::IDENT if parent_kind == SyntaxKind::NAME_REF => 3, |
113 | _ => return None, | 114 | _ => return None, |
114 | }; | 115 | }; |
115 | 116 | ||
diff --git a/crates/ide_completion/src/completions/unqualified_path.rs b/crates/ide_completion/src/completions/unqualified_path.rs index 044dfd160..1b8b063e7 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::AstNode; | |||
6 | use crate::{CompletionContext, Completions}; | 6 | use crate::{CompletionContext, Completions}; |
7 | 7 | ||
8 | pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) { | 8 | pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionContext) { |
9 | if !(ctx.is_trivial_path || ctx.is_pat_binding_or_const) { | 9 | if !ctx.is_trivial_path { |
10 | return; | 10 | return; |
11 | } | 11 | } |
12 | if ctx.record_lit_syntax.is_some() | 12 | if ctx.record_lit_syntax.is_some() |
@@ -23,10 +23,6 @@ pub(crate) fn complete_unqualified_path(acc: &mut Completions, ctx: &CompletionC | |||
23 | }); | 23 | }); |
24 | } | 24 | } |
25 | 25 | ||
26 | if ctx.is_pat_binding_or_const { | ||
27 | return; | ||
28 | } | ||
29 | |||
30 | ctx.scope.process_all_names(&mut |name, res| { | 26 | ctx.scope.process_all_names(&mut |name, res| { |
31 | if let ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) = res { | 27 | if let ScopeDef::GenericParam(hir::GenericParam::LifetimeParam(_)) = res { |
32 | cov_mark::hit!(skip_lifetime_completion); | 28 | cov_mark::hit!(skip_lifetime_completion); |
@@ -139,7 +135,7 @@ fn quux(x: i32) { | |||
139 | expect![[r#" | 135 | expect![[r#" |
140 | lc y i32 | 136 | lc y i32 |
141 | lc x i32 | 137 | lc x i32 |
142 | fn quux(…) -> () | 138 | fn quux(…) fn(i32) |
143 | "#]], | 139 | "#]], |
144 | ); | 140 | ); |
145 | } | 141 | } |
@@ -161,7 +157,7 @@ fn quux() { | |||
161 | expect![[r#" | 157 | expect![[r#" |
162 | lc b i32 | 158 | lc b i32 |
163 | lc a | 159 | lc a |
164 | fn quux() -> () | 160 | fn quux() fn() |
165 | "#]], | 161 | "#]], |
166 | ); | 162 | ); |
167 | } | 163 | } |
@@ -176,7 +172,7 @@ fn quux() { | |||
176 | "#, | 172 | "#, |
177 | expect![[r#" | 173 | expect![[r#" |
178 | lc x | 174 | lc x |
179 | fn quux() -> () | 175 | fn quux() fn() |
180 | "#]], | 176 | "#]], |
181 | ); | 177 | ); |
182 | } | 178 | } |
@@ -207,14 +203,14 @@ fn main() { | |||
207 | r#"fn quux<T>() { $0 }"#, | 203 | r#"fn quux<T>() { $0 }"#, |
208 | expect![[r#" | 204 | expect![[r#" |
209 | tp T | 205 | tp T |
210 | fn quux() -> () | 206 | fn quux() fn() |
211 | "#]], | 207 | "#]], |
212 | ); | 208 | ); |
213 | check( | 209 | check( |
214 | r#"fn quux<const C: usize>() { $0 }"#, | 210 | r#"fn quux<const C: usize>() { $0 }"#, |
215 | expect![[r#" | 211 | expect![[r#" |
216 | cp C | 212 | cp C |
217 | fn quux() -> () | 213 | fn quux() fn() |
218 | "#]], | 214 | "#]], |
219 | ); | 215 | ); |
220 | } | 216 | } |
@@ -225,7 +221,7 @@ fn main() { | |||
225 | check( | 221 | check( |
226 | r#"fn quux<'a>() { $0 }"#, | 222 | r#"fn quux<'a>() { $0 }"#, |
227 | expect![[r#" | 223 | expect![[r#" |
228 | fn quux() -> () | 224 | fn quux() fn() |
229 | "#]], | 225 | "#]], |
230 | ); | 226 | ); |
231 | } | 227 | } |
@@ -263,7 +259,7 @@ fn quux() { $0 } | |||
263 | "#, | 259 | "#, |
264 | expect![[r#" | 260 | expect![[r#" |
265 | st S | 261 | st S |
266 | fn quux() -> () | 262 | fn quux() fn() |
267 | en E | 263 | en E |
268 | "#]], | 264 | "#]], |
269 | ); | 265 | ); |
@@ -316,7 +312,7 @@ mod m { | |||
316 | } | 312 | } |
317 | "#, | 313 | "#, |
318 | expect![[r#" | 314 | expect![[r#" |
319 | fn quux() -> () | 315 | fn quux() fn() |
320 | st Bar | 316 | st Bar |
321 | "#]], | 317 | "#]], |
322 | ); | 318 | ); |
@@ -331,7 +327,7 @@ fn x() -> $0 | |||
331 | "#, | 327 | "#, |
332 | expect![[r#" | 328 | expect![[r#" |
333 | st Foo | 329 | st Foo |
334 | fn x() -> () | 330 | fn x() fn() |
335 | "#]], | 331 | "#]], |
336 | ); | 332 | ); |
337 | } | 333 | } |
@@ -352,7 +348,7 @@ fn foo() { | |||
352 | expect![[r#" | 348 | expect![[r#" |
353 | lc bar i32 | 349 | lc bar i32 |
354 | lc bar i32 | 350 | lc bar i32 |
355 | fn foo() -> () | 351 | fn foo() fn() |
356 | "#]], | 352 | "#]], |
357 | ); | 353 | ); |
358 | } | 354 | } |
@@ -382,7 +378,7 @@ use prelude::*; | |||
382 | mod prelude { struct Option; } | 378 | mod prelude { struct Option; } |
383 | "#, | 379 | "#, |
384 | expect![[r#" | 380 | expect![[r#" |
385 | fn foo() -> () | 381 | fn foo() fn() |
386 | md std | 382 | md std |
387 | st Option | 383 | st Option |
388 | "#]], | 384 | "#]], |
@@ -412,7 +408,7 @@ mod macros { | |||
412 | } | 408 | } |
413 | "#, | 409 | "#, |
414 | expect![[r##" | 410 | expect![[r##" |
415 | fn f() -> () | 411 | fn f() fn() |
416 | ma concat!(…) #[macro_export] macro_rules! concat | 412 | ma concat!(…) #[macro_export] macro_rules! concat |
417 | md std | 413 | md std |
418 | "##]], | 414 | "##]], |
@@ -439,7 +435,7 @@ use prelude::*; | |||
439 | mod prelude { struct String; } | 435 | mod prelude { struct String; } |
440 | "#, | 436 | "#, |
441 | expect![[r#" | 437 | expect![[r#" |
442 | fn foo() -> () | 438 | fn foo() fn() |
443 | md std | 439 | md std |
444 | md core | 440 | md core |
445 | st String | 441 | st String |
@@ -470,7 +466,7 @@ fn main() { let v = $0 } | |||
470 | expect![[r##" | 466 | expect![[r##" |
471 | md m1 | 467 | md m1 |
472 | ma baz!(…) #[macro_export] macro_rules! baz | 468 | ma baz!(…) #[macro_export] macro_rules! baz |
473 | fn main() -> () | 469 | fn main() fn() |
474 | md m2 | 470 | md m2 |
475 | ma bar!(…) macro_rules! bar | 471 | ma bar!(…) macro_rules! bar |
476 | ma foo!(…) macro_rules! foo | 472 | ma foo!(…) macro_rules! foo |
@@ -486,7 +482,7 @@ macro_rules! foo { () => {} } | |||
486 | fn foo() { $0 } | 482 | fn foo() { $0 } |
487 | "#, | 483 | "#, |
488 | expect![[r#" | 484 | expect![[r#" |
489 | fn foo() -> () | 485 | fn foo() fn() |
490 | ma foo!(…) macro_rules! foo | 486 | ma foo!(…) macro_rules! foo |
491 | "#]], | 487 | "#]], |
492 | ); | 488 | ); |
@@ -500,7 +496,7 @@ macro_rules! foo { () => {} } | |||
500 | fn main() { let x: $0 } | 496 | fn main() { let x: $0 } |
501 | "#, | 497 | "#, |
502 | expect![[r#" | 498 | expect![[r#" |
503 | fn main() -> () | 499 | fn main() fn() |
504 | ma foo!(…) macro_rules! foo | 500 | ma foo!(…) macro_rules! foo |
505 | "#]], | 501 | "#]], |
506 | ); | 502 | ); |
@@ -514,7 +510,7 @@ macro_rules! foo { () => {} } | |||
514 | fn main() { $0 } | 510 | fn main() { $0 } |
515 | "#, | 511 | "#, |
516 | expect![[r#" | 512 | expect![[r#" |
517 | fn main() -> () | 513 | fn main() fn() |
518 | ma foo!(…) macro_rules! foo | 514 | ma foo!(…) macro_rules! foo |
519 | "#]], | 515 | "#]], |
520 | ); | 516 | ); |
@@ -530,8 +526,8 @@ fn main() { | |||
530 | } | 526 | } |
531 | "#, | 527 | "#, |
532 | expect![[r#" | 528 | expect![[r#" |
533 | fn frobnicate() -> () | 529 | fn frobnicate() fn() |
534 | fn main() -> () | 530 | fn main() fn() |
535 | "#]], | 531 | "#]], |
536 | ); | 532 | ); |
537 | } | 533 | } |
@@ -549,7 +545,7 @@ fn quux(x: i32) { | |||
549 | expect![[r#" | 545 | expect![[r#" |
550 | lc y i32 | 546 | lc y i32 |
551 | lc x i32 | 547 | lc x i32 |
552 | fn quux(…) -> () | 548 | fn quux(…) fn(i32) |
553 | ma m!(…) macro_rules! m | 549 | ma m!(…) macro_rules! m |
554 | "#]], | 550 | "#]], |
555 | ); | 551 | ); |
@@ -568,7 +564,7 @@ fn quux(x: i32) { | |||
568 | expect![[r#" | 564 | expect![[r#" |
569 | lc y i32 | 565 | lc y i32 |
570 | lc x i32 | 566 | lc x i32 |
571 | fn quux(…) -> () | 567 | fn quux(…) fn(i32) |
572 | ma m!(…) macro_rules! m | 568 | ma m!(…) macro_rules! m |
573 | "#]], | 569 | "#]], |
574 | ); | 570 | ); |
@@ -587,7 +583,7 @@ fn quux(x: i32) { | |||
587 | expect![[r#" | 583 | expect![[r#" |
588 | lc y i32 | 584 | lc y i32 |
589 | lc x i32 | 585 | lc x i32 |
590 | fn quux(…) -> () | 586 | fn quux(…) fn(i32) |
591 | ma m!(…) macro_rules! m | 587 | ma m!(…) macro_rules! m |
592 | "#]], | 588 | "#]], |
593 | ); | 589 | ); |
@@ -602,73 +598,13 @@ use spam::Quux; | |||
602 | fn main() { $0 } | 598 | fn main() { $0 } |
603 | "#, | 599 | "#, |
604 | expect![[r#" | 600 | expect![[r#" |
605 | fn main() -> () | 601 | fn main() fn() |
606 | ?? Quux | 602 | ?? Quux |
607 | "#]], | 603 | "#]], |
608 | ); | 604 | ); |
609 | } | 605 | } |
610 | 606 | ||
611 | #[test] | 607 | #[test] |
612 | fn completes_enum_variant_matcharm() { | ||
613 | check( | ||
614 | r#" | ||
615 | enum Foo { Bar, Baz, Quux } | ||
616 | |||
617 | fn main() { | ||
618 | let foo = Foo::Quux; | ||
619 | match foo { Qu$0 } | ||
620 | } | ||
621 | "#, | ||
622 | expect![[r#" | ||
623 | ev Foo::Bar () | ||
624 | ev Foo::Baz () | ||
625 | ev Foo::Quux () | ||
626 | en Foo | ||
627 | "#]], | ||
628 | ) | ||
629 | } | ||
630 | |||
631 | #[test] | ||
632 | fn completes_enum_variant_matcharm_ref() { | ||
633 | check( | ||
634 | r#" | ||
635 | enum Foo { Bar, Baz, Quux } | ||
636 | |||
637 | fn main() { | ||
638 | let foo = Foo::Quux; | ||
639 | match &foo { Qu$0 } | ||
640 | } | ||
641 | "#, | ||
642 | expect![[r#" | ||
643 | ev Foo::Bar () | ||
644 | ev Foo::Baz () | ||
645 | ev Foo::Quux () | ||
646 | en Foo | ||
647 | "#]], | ||
648 | ) | ||
649 | } | ||
650 | |||
651 | #[test] | ||
652 | fn completes_enum_variant_iflet() { | ||
653 | check( | ||
654 | r#" | ||
655 | enum Foo { Bar, Baz, Quux } | ||
656 | |||
657 | fn main() { | ||
658 | let foo = Foo::Quux; | ||
659 | if let Qu$0 = foo { } | ||
660 | } | ||
661 | "#, | ||
662 | expect![[r#" | ||
663 | ev Foo::Bar () | ||
664 | ev Foo::Baz () | ||
665 | ev Foo::Quux () | ||
666 | en Foo | ||
667 | "#]], | ||
668 | ) | ||
669 | } | ||
670 | |||
671 | #[test] | ||
672 | fn completes_enum_variant_basic_expr() { | 608 | fn completes_enum_variant_basic_expr() { |
673 | check( | 609 | check( |
674 | r#" | 610 | r#" |
@@ -680,7 +616,7 @@ fn main() { let foo: Foo = Q$0 } | |||
680 | ev Foo::Baz () | 616 | ev Foo::Baz () |
681 | ev Foo::Quux () | 617 | ev Foo::Quux () |
682 | en Foo | 618 | en Foo |
683 | fn main() -> () | 619 | fn main() fn() |
684 | "#]], | 620 | "#]], |
685 | ) | 621 | ) |
686 | } | 622 | } |
@@ -695,29 +631,7 @@ fn f() -> m::E { V$0 } | |||
695 | expect![[r#" | 631 | expect![[r#" |
696 | ev m::E::V () | 632 | ev m::E::V () |
697 | md m | 633 | md m |
698 | fn f() -> E | 634 | fn f() fn() -> E |
699 | "#]], | ||
700 | ) | ||
701 | } | ||
702 | |||
703 | #[test] | ||
704 | fn completes_enum_variant_impl() { | ||
705 | check( | ||
706 | r#" | ||
707 | enum Foo { Bar, Baz, Quux } | ||
708 | impl Foo { | ||
709 | fn foo() { match Foo::Bar { Q$0 } } | ||
710 | } | ||
711 | "#, | ||
712 | expect![[r#" | ||
713 | ev Self::Bar () | ||
714 | ev Self::Baz () | ||
715 | ev Self::Quux () | ||
716 | ev Foo::Bar () | ||
717 | ev Foo::Baz () | ||
718 | ev Foo::Quux () | ||
719 | sp Self | ||
720 | en Foo | ||
721 | "#]], | 635 | "#]], |
722 | ) | 636 | ) |
723 | } | 637 | } |