diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2020-10-17 23:45:32 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2020-10-17 23:45:32 +0100 |
commit | aed7b6d98aab8c222124d336b69f83ed4f1dfb2d (patch) | |
tree | 425f5c6dda7b123b0654534387cb6dd351868847 | |
parent | 63956e509eea1aba1a303c58bf60d068863a61dd (diff) | |
parent | 13451d3dc4477cc1dab38d6d66643de4bd4aa59e (diff) |
Merge #6271
6271: Complete methods when receiver is a macro r=matklad a=matklad
bors r+
🤖
Co-authored-by: Aleksey Kladov <[email protected]>
-rw-r--r-- | crates/hir_def/src/body.rs | 6 | ||||
-rw-r--r-- | crates/hir_expand/src/db.rs | 1 | ||||
-rw-r--r-- | crates/ide/src/completion/complete_dot.rs | 15 |
3 files changed, 20 insertions, 2 deletions
diff --git a/crates/hir_def/src/body.rs b/crates/hir_def/src/body.rs index 9a9a605dd..d51036e4f 100644 --- a/crates/hir_def/src/body.rs +++ b/crates/hir_def/src/body.rs | |||
@@ -105,14 +105,16 @@ impl Expander { | |||
105 | 105 | ||
106 | let macro_call = InFile::new(self.current_file_id, ¯o_call); | 106 | let macro_call = InFile::new(self.current_file_id, ¯o_call); |
107 | 107 | ||
108 | if let Some(call_id) = macro_call.as_call_id(db, self.crate_def_map.krate, |path| { | 108 | let resolver = |path: ModPath| -> Option<MacroDefId> { |
109 | if let Some(local_scope) = local_scope { | 109 | if let Some(local_scope) = local_scope { |
110 | if let Some(def) = path.as_ident().and_then(|n| local_scope.get_legacy_macro(n)) { | 110 | if let Some(def) = path.as_ident().and_then(|n| local_scope.get_legacy_macro(n)) { |
111 | return Some(def); | 111 | return Some(def); |
112 | } | 112 | } |
113 | } | 113 | } |
114 | self.resolve_path_as_macro(db, &path) | 114 | self.resolve_path_as_macro(db, &path) |
115 | }) { | 115 | }; |
116 | |||
117 | if let Some(call_id) = macro_call.as_call_id(db, self.crate_def_map.krate, resolver) { | ||
116 | let file_id = call_id.as_file(); | 118 | let file_id = call_id.as_file(); |
117 | if let Some(node) = db.parse_or_expand(file_id) { | 119 | if let Some(node) = db.parse_or_expand(file_id) { |
118 | if let Some(expr) = T::cast(node) { | 120 | if let Some(expr) = T::cast(node) { |
diff --git a/crates/hir_expand/src/db.rs b/crates/hir_expand/src/db.rs index b591130ca..ade57ac1b 100644 --- a/crates/hir_expand/src/db.rs +++ b/crates/hir_expand/src/db.rs | |||
@@ -389,6 +389,7 @@ fn to_fragment_kind(db: &dyn AstDatabase, id: MacroCallId) -> FragmentKind { | |||
389 | CALL_EXPR => FragmentKind::Expr, | 389 | CALL_EXPR => FragmentKind::Expr, |
390 | INDEX_EXPR => FragmentKind::Expr, | 390 | INDEX_EXPR => FragmentKind::Expr, |
391 | METHOD_CALL_EXPR => FragmentKind::Expr, | 391 | METHOD_CALL_EXPR => FragmentKind::Expr, |
392 | FIELD_EXPR => FragmentKind::Expr, | ||
392 | AWAIT_EXPR => FragmentKind::Expr, | 393 | AWAIT_EXPR => FragmentKind::Expr, |
393 | CAST_EXPR => FragmentKind::Expr, | 394 | CAST_EXPR => FragmentKind::Expr, |
394 | REF_EXPR => FragmentKind::Expr, | 395 | REF_EXPR => FragmentKind::Expr, |
diff --git a/crates/ide/src/completion/complete_dot.rs b/crates/ide/src/completion/complete_dot.rs index 0b9f1798a..f0f9a7f1d 100644 --- a/crates/ide/src/completion/complete_dot.rs +++ b/crates/ide/src/completion/complete_dot.rs | |||
@@ -413,4 +413,19 @@ fn foo() { | |||
413 | "#]], | 413 | "#]], |
414 | ); | 414 | ); |
415 | } | 415 | } |
416 | |||
417 | #[test] | ||
418 | fn completes_method_call_when_receiver_is_a_macro_call() { | ||
419 | check( | ||
420 | r#" | ||
421 | struct S; | ||
422 | impl S { fn foo(&self) {} } | ||
423 | macro_rules! make_s { () => { S }; } | ||
424 | fn main() { make_s!().f<|>; } | ||
425 | "#, | ||
426 | expect![[r#" | ||
427 | me foo() fn foo(&self) | ||
428 | "#]], | ||
429 | ) | ||
430 | } | ||
416 | } | 431 | } |