Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #15864 - Young-Flash:find_self, r=lnicola
fix: find `Self` reference
took a lot of time to debug to find the problem, here should compare the actual `Adt` type
close https://github.com/rust-lang/rust-analyzer/issues/12693
| -rw-r--r-- | crates/ide-db/src/search.rs | 2 | ||||
| -rw-r--r-- | crates/ide/src/references.rs | 26 |
2 files changed, 27 insertions, 1 deletions
diff --git a/crates/ide-db/src/search.rs b/crates/ide-db/src/search.rs index 9c4f0ac8c9..22438a203b 100644 --- a/crates/ide-db/src/search.rs +++ b/crates/ide-db/src/search.rs @@ -584,7 +584,7 @@ impl<'a> FindUsages<'a> { ) -> bool { match NameRefClass::classify(self.sema, name_ref) { Some(NameRefClass::Definition(Definition::SelfType(impl_))) - if impl_.self_ty(self.sema.db) == *self_ty => + if impl_.self_ty(self.sema.db).as_adt() == self_ty.as_adt() => { let FileRange { file_id, range } = self.sema.original_range(name_ref.syntax()); let reference = FileReference { diff --git a/crates/ide/src/references.rs b/crates/ide/src/references.rs index 2d0295692a..f387bbf6b0 100644 --- a/crates/ide/src/references.rs +++ b/crates/ide/src/references.rs @@ -684,6 +684,32 @@ enum Foo { } #[test] + fn test_self() { + check( + r#" +struct S$0<T> { + t: PhantomData<T>, +} + +impl<T> S<T> { + fn new() -> Self { + Self { + t: Default::default(), + } + } +} +"#, + expect![[r#" + S Struct FileId(0) 0..38 7..8 + + FileId(0) 48..49 + FileId(0) 71..75 + FileId(0) 86..90 + "#]], + ) + } + + #[test] fn test_find_all_refs_two_modules() { check( r#" |