diff options
author | Lukas Wirth <[email protected]> | 2021-02-09 18:47:21 +0000 |
---|---|---|
committer | Lukas Wirth <[email protected]> | 2021-02-09 18:47:21 +0000 |
commit | e92180a1d8c964d386fc5ffb80bfb05abdb6c153 (patch) | |
tree | be07005b873aaf0931099bccef0bf4ceb3dab9d2 | |
parent | 2f171ca78d306d105a9e36f8e509039d6a034c8e (diff) |
Show Self pattern completions for Adts if inside impls
-rw-r--r-- | crates/completion/src/completions/pattern.rs | 28 | ||||
-rw-r--r-- | crates/completion/src/completions/unqualified_path.rs | 2 | ||||
-rw-r--r-- | crates/completion/src/context.rs | 16 |
3 files changed, 40 insertions, 6 deletions
diff --git a/crates/completion/src/completions/pattern.rs b/crates/completion/src/completions/pattern.rs index 595160ff5..43a5160cb 100644 --- a/crates/completion/src/completions/pattern.rs +++ b/crates/completion/src/completions/pattern.rs | |||
@@ -31,6 +31,14 @@ pub(crate) fn complete_pattern(acc: &mut Completions, ctx: &CompletionContext) { | |||
31 | _ => false, | 31 | _ => false, |
32 | }, | 32 | }, |
33 | hir::ScopeDef::MacroDef(_) => true, | 33 | hir::ScopeDef::MacroDef(_) => true, |
34 | hir::ScopeDef::ImplSelfType(impl_) => match impl_.target_ty(ctx.db).as_adt() { | ||
35 | Some(hir::Adt::Struct(strukt)) => { | ||
36 | acc.add_struct_pat(ctx, strukt, Some(name.clone())); | ||
37 | true | ||
38 | } | ||
39 | Some(hir::Adt::Enum(_)) => !ctx.is_irrefutable_pat_binding, | ||
40 | _ => true, | ||
41 | }, | ||
34 | _ => false, | 42 | _ => false, |
35 | }; | 43 | }; |
36 | if add_resolution { | 44 | if add_resolution { |
@@ -258,4 +266,24 @@ fn main() { | |||
258 | "#, | 266 | "#, |
259 | ); | 267 | ); |
260 | } | 268 | } |
269 | |||
270 | #[test] | ||
271 | fn completes_self_pats() { | ||
272 | check_snippet( | ||
273 | r#" | ||
274 | struct Foo(i32); | ||
275 | impl Foo { | ||
276 | fn foo() { | ||
277 | match () { | ||
278 | $0 | ||
279 | } | ||
280 | } | ||
281 | } | ||
282 | "#, | ||
283 | expect![[r#" | ||
284 | bn Self Self($1)$0 | ||
285 | bn Foo Foo($1)$0 | ||
286 | "#]], | ||
287 | ) | ||
288 | } | ||
261 | } | 289 | } |
diff --git a/crates/completion/src/completions/unqualified_path.rs b/crates/completion/src/completions/unqualified_path.rs index fb67756bb..5112ecc2d 100644 --- a/crates/completion/src/completions/unqualified_path.rs +++ b/crates/completion/src/completions/unqualified_path.rs | |||
@@ -746,7 +746,7 @@ fn f() -> m::E { V$0 } | |||
746 | r#" | 746 | r#" |
747 | enum Foo { Bar, Baz, Quux } | 747 | enum Foo { Bar, Baz, Quux } |
748 | impl Foo { | 748 | impl Foo { |
749 | fn foo() { let foo: Foo = Q$0 } | 749 | fn foo() { match Foo::Bar { Q$0 } } |
750 | } | 750 | } |
751 | "#, | 751 | "#, |
752 | expect![[r#" | 752 | expect![[r#" |
diff --git a/crates/completion/src/context.rs b/crates/completion/src/context.rs index b1e8eba85..3db357855 100644 --- a/crates/completion/src/context.rs +++ b/crates/completion/src/context.rs | |||
@@ -276,6 +276,14 @@ impl<'a> CompletionContext<'a> { | |||
276 | }); | 276 | }); |
277 | } | 277 | } |
278 | 278 | ||
279 | fn fill_impl_def(&mut self) { | ||
280 | self.impl_def = self | ||
281 | .sema | ||
282 | .ancestors_with_macros(self.token.parent()) | ||
283 | .take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE) | ||
284 | .find_map(ast::Impl::cast); | ||
285 | } | ||
286 | |||
279 | fn fill( | 287 | fn fill( |
280 | &mut self, | 288 | &mut self, |
281 | original_file: &SyntaxNode, | 289 | original_file: &SyntaxNode, |
@@ -345,6 +353,8 @@ impl<'a> CompletionContext<'a> { | |||
345 | self.is_irrefutable_pat_binding = true; | 353 | self.is_irrefutable_pat_binding = true; |
346 | } | 354 | } |
347 | } | 355 | } |
356 | |||
357 | self.fill_impl_def(); | ||
348 | } | 358 | } |
349 | if is_node::<ast::Param>(name.syntax()) { | 359 | if is_node::<ast::Param>(name.syntax()) { |
350 | self.is_param = true; | 360 | self.is_param = true; |
@@ -372,11 +382,7 @@ impl<'a> CompletionContext<'a> { | |||
372 | self.sema.find_node_at_offset_with_macros(&original_file, offset); | 382 | self.sema.find_node_at_offset_with_macros(&original_file, offset); |
373 | } | 383 | } |
374 | 384 | ||
375 | self.impl_def = self | 385 | self.fill_impl_def(); |
376 | .sema | ||
377 | .ancestors_with_macros(self.token.parent()) | ||
378 | .take_while(|it| it.kind() != SOURCE_FILE && it.kind() != MODULE) | ||
379 | .find_map(ast::Impl::cast); | ||
380 | 386 | ||
381 | let top_node = name_ref | 387 | let top_node = name_ref |
382 | .syntax() | 388 | .syntax() |