diff options
| author | Lukas Wirth <lukastw97@gmail.com> | 2022-05-23 16:09:56 +0200 |
|---|---|---|
| committer | Lukas Wirth <lukastw97@gmail.com> | 2022-05-23 16:09:56 +0200 |
| commit | ad537be194018f6b3f6ef91af575a4fde47561a6 (patch) | |
| tree | ad9574e494ce9aadc91e65b74520cd8a98eff225 | |
| parent | 038a71a201e8a47fed52c38473cec05498e00a16 (diff) | |
| download | rust-ad537be194018f6b3f6ef91af575a4fde47561a6.tar.gz rust-ad537be194018f6b3f6ef91af575a4fde47561a6.zip | |
fix: When reference searching macro inputs, don't search everything that was downmapped
| -rw-r--r-- | crates/hir/src/semantics.rs | 14 | ||||
| -rw-r--r-- | crates/ide/src/references.rs | 2 | ||||
| -rw-r--r-- | crates/syntax/src/ast/node_ext.rs | 7 |
3 files changed, 15 insertions, 8 deletions
diff --git a/crates/hir/src/semantics.rs b/crates/hir/src/semantics.rs index 48661ec4ebe..282e9c0a4bd 100644 --- a/crates/hir/src/semantics.rs +++ b/crates/hir/src/semantics.rs @@ -208,14 +208,14 @@ impl<'db, DB: HirDatabase> Semantics<'db, DB> { self.imp.descend_into_macros(token) } - /// Descend the token into macrocalls to all its mapped counterparts. + /// Descend the token into macrocalls to all its mapped counterparts that have the same text as the input token. /// - /// Returns the original non descended token if none of the mapped counterparts have the same syntax kind. - pub fn descend_into_macros_with_same_kind( + /// Returns the original non descended token if none of the mapped counterparts have the same text. + pub fn descend_into_macros_with_same_text( &self, token: SyntaxToken, ) -> SmallVec<[SyntaxToken; 1]> { - self.imp.descend_into_macros_with_same_kind(token) + self.imp.descend_into_macros_with_same_text(token) } /// Maps a node down by mapping its first and last token down. @@ -666,11 +666,11 @@ impl<'db> SemanticsImpl<'db> { res } - fn descend_into_macros_with_same_kind(&self, token: SyntaxToken) -> SmallVec<[SyntaxToken; 1]> { - let kind = token.kind(); + fn descend_into_macros_with_same_text(&self, token: SyntaxToken) -> SmallVec<[SyntaxToken; 1]> { + let text = token.text(); let mut res = smallvec![]; self.descend_into_macros_impl(token.clone(), &mut |InFile { value, .. }| { - if value.kind() == kind { + if value.text() == text { res.push(value); } false diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs index 0cd29c8432d..626e8fe34a9 100644 --- a/crates/ide/src/references.rs +++ b/crates/ide/src/references.rs @@ -122,7 +122,7 @@ pub(crate) fn find_defs<'a>( ) }); token.map(|token| { - sema.descend_into_macros_with_same_kind(token) + sema.descend_into_macros_with_same_text(token) .into_iter() .filter_map(|it| ast::NameLike::cast(it.parent()?)) .filter_map(move |name_like| { diff --git a/crates/syntax/src/ast/node_ext.rs b/crates/syntax/src/ast/node_ext.rs index f2153ca9211..b7bf45c04c9 100644 --- a/crates/syntax/src/ast/node_ext.rs +++ b/crates/syntax/src/ast/node_ext.rs @@ -432,6 +432,13 @@ impl NameLike { _ => None, } } + pub fn text(&self) -> TokenText { + match self { + NameLike::NameRef(name_ref) => name_ref.text(), + NameLike::Name(name) => name.text(), + NameLike::Lifetime(lifetime) => lifetime.text(), + } + } } impl ast::AstNode for NameLike { |
