Unnamed repository; edit this file 'description' to name the repository.
| -rw-r--r-- | crates/ide/src/goto_definition.rs | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/crates/ide/src/goto_definition.rs b/crates/ide/src/goto_definition.rs index e44b5020c3..fb88d1ec84 100644 --- a/crates/ide/src/goto_definition.rs +++ b/crates/ide/src/goto_definition.rs @@ -1,4 +1,4 @@ -use std::convert::TryInto; +use std::{convert::TryInto, mem::discriminant}; use crate::{doc_links::token_as_doc_comment, FilePosition, NavigationTarget, RangeInfo, TryToNav}; use hir::{AsAssocItem, AssocItem, Semantics}; @@ -126,9 +126,11 @@ fn try_filter_trait_item_definition( }; let trait_ = imp.trait_(db)?; let name = def.name(db)?; + let discri_value = discriminant(&assoc); trait_ .items(db) .iter() + .filter(|itm| discriminant(*itm) == discri_value) .find_map(|itm| (itm.name(db)? == name).then(|| itm.try_to_nav(db)).flatten()) .map(|it| vec![it]) } @@ -176,6 +178,23 @@ mod tests { } #[test] + fn goto_def_if_items_same_name() { + check( + r#" +trait Trait { + type A; + const A: i32; + //^ +} + +struct T; +impl Trait for T { + type A = i32; + const A$0: i32 = -9; +}"#, + ); + } + #[test] fn goto_def_in_mac_call_in_attr_invoc() { check( r#" |