diff options
| author | Chayim Refael Friedman <chayimfr@gmail.com> | 2025-07-03 15:27:07 +0000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-03 15:27:07 +0000 |
| commit | 59e25a03a68474494793afc2805bfa41858b1489 (patch) | |
| tree | b64a268cf18279ec5e0efbcad48290223b2accaa | |
| parent | 60a13592b739c8de3931e14f3682ceb0b9088e44 (diff) | |
| parent | b007ecb46763a1287e955c07aeb38a22798e3fe2 (diff) | |
| download | rust-59e25a03a68474494793afc2805bfa41858b1489.tar.gz rust-59e25a03a68474494793afc2805bfa41858b1489.zip | |
Merge pull request #20120 from Hmikihiro/match_bind_not_type
fix: resolve item in match bind
| -rw-r--r-- | src/tools/rust-analyzer/crates/hir/src/source_analyzer.rs | 3 | ||||
| -rw-r--r-- | src/tools/rust-analyzer/crates/ide/src/goto_definition.rs | 72 |
2 files changed, 74 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/hir/src/source_analyzer.rs b/src/tools/rust-analyzer/crates/hir/src/source_analyzer.rs index f18ca7cb201..cbd472f87aa 100644 --- a/src/tools/rust-analyzer/crates/hir/src/source_analyzer.rs +++ b/src/tools/rust-analyzer/crates/hir/src/source_analyzer.rs @@ -765,7 +765,8 @@ impl<'db> SourceAnalyzer<'db> { }, }; - let res = resolve_hir_path(db, &self.resolver, path, HygieneId::ROOT, Some(store))?; + let body_owner = self.resolver.body_owner(); + let res = resolve_hir_value_path(db, &self.resolver, body_owner, path, HygieneId::ROOT)?; match res { PathResolution::Def(def) => Some(def), _ => None, diff --git a/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs b/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs index e77e9c5eef8..29fc68bb50f 100644 --- a/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs +++ b/src/tools/rust-analyzer/crates/ide/src/goto_definition.rs @@ -3851,4 +3851,76 @@ fn main() { "#, ); } + + #[test] + fn goto_const_from_match_pat_with_tuple_struct() { + check( + r#" +struct Tag(u8); +struct Path {} + +const Path: u8 = 0; + // ^^^^ +fn main() { + match Tag(Path) { + Tag(Path$0) => {} + _ => {} + } +} + +"#, + ); + } + + #[test] + fn goto_const_from_match_pat() { + check( + r#" +type T1 = u8; +const T1: u8 = 0; + // ^^ +fn main() { + let x = 0; + match x { + T1$0 => {} + _ => {} + } +} +"#, + ); + } + + #[test] + fn goto_struct_from_match_pat() { + check( + r#" +struct T1; + // ^^ +fn main() { + let x = 0; + match x { + T1$0 => {} + _ => {} + } +} +"#, + ); + } + + #[test] + fn no_goto_trait_from_match_pat() { + check( + r#" +trait T1 {} +fn main() { + let x = 0; + match x { + T1$0 => {} + // ^^ + _ => {} + } +} +"#, + ); + } } |
