aboutsummaryrefslogtreecommitdiff
path: root/crates/completion/src
diff options
context:
space:
mode:
authorLukas Wirth <[email protected]>2021-02-09 18:47:21 +0000
committerLukas Wirth <[email protected]>2021-02-09 18:47:21 +0000
commite92180a1d8c964d386fc5ffb80bfb05abdb6c153 (patch)
treebe07005b873aaf0931099bccef0bf4ceb3dab9d2 /crates/completion/src
parent2f171ca78d306d105a9e36f8e509039d6a034c8e (diff)
Show Self pattern completions for Adts if inside impls
Diffstat (limited to 'crates/completion/src')
-rw-r--r--crates/completion/src/completions/pattern.rs28
-rw-r--r--crates/completion/src/completions/unqualified_path.rs2
-rw-r--r--crates/completion/src/context.rs16
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#"
274struct Foo(i32);
275impl 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#"
747enum Foo { Bar, Baz, Quux } 747enum Foo { Bar, Baz, Quux }
748impl Foo { 748impl 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()