diff options
| author | TJ DeVries <devries.timothyj@gmail.com> | 2021-12-01 11:43:52 -0500 |
|---|---|---|
| committer | TJ DeVries <devries.timothyj@gmail.com> | 2021-12-01 11:43:52 -0500 |
| commit | d50f18fb65b2a4e991e765df0fcdfd8852a63eb1 (patch) | |
| tree | 9bdad171d12e3eefd8173427673d552fd16be1f9 | |
| parent | 09c7e22ec2705a91ee9da28c9e38810fab97eb3d (diff) | |
| download | rust-d50f18fb65b2a4e991e765df0fcdfd8852a63eb1.tar.gz rust-d50f18fb65b2a4e991e765df0fcdfd8852a63eb1.zip | |
fixup: properly handle all associated items
| -rw-r--r-- | crates/ide/src/moniker.rs | 55 |
1 files changed, 33 insertions, 22 deletions
diff --git a/crates/ide/src/moniker.rs b/crates/ide/src/moniker.rs index 5802dd10e5b..e691bfb06f1 100644 --- a/crates/ide/src/moniker.rs +++ b/crates/ide/src/moniker.rs @@ -107,18 +107,16 @@ pub(crate) fn def_to_moniker( let mut path = vec![]; path.extend(module.path_to_root(db).into_iter().filter_map(|x| x.name(db))); - match def { - Definition::Field(it) => path.push(it.parent_def(db).name(db)), - Definition::Function(it) => { - // Ensure that trait functions are properly namespaced with the trait name - if let Some(assoc) = it.as_assoc_item(db) { - let container = assoc.container(db); - if let AssocItemContainer::Trait(parent_trait) = container { - path.push(parent_trait.name(db)); - } - } + // Handle associated items within a trait + if let Some(assoc) = def.as_assoc_item(db) { + let container = assoc.container(db); + if let AssocItemContainer::Trait(parent_trait) = container { + path.push(parent_trait.name(db)); } - _ => (), + } + + if let Definition::Field(it) = def { + path.push(it.parent_def(db).name(db)); } path.push(def.name(db)?); @@ -208,11 +206,6 @@ pub mod module { fn moniker_for_trait() { check_moniker( r#" -//- /lib.rs crate:main deps:foo -use foo::module::func; -fn main() { - func(); -} //- /foo/lib.rs crate:foo@CratesIo:0.1.0,https://a.b/foo.git pub mod module { pub trait MyTrait { @@ -224,19 +217,37 @@ pub mod module { r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, MonikerKind::Export, ); + } + + #[test] + fn moniker_for_trait_constant() { check_moniker( r#" -//- /lib.rs crate:main deps:foo -use foo::module::func; -fn main() { - func(); +//- /foo/lib.rs crate:foo@CratesIo:0.1.0,https://a.b/foo.git +pub mod module { + pub trait MyTrait { + const MY_CONST$0: u8; + } } +"#, + "foo::module::MyTrait::MY_CONST", + r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, + MonikerKind::Export, + ); + } + + #[test] + fn moniker_for_trait_type() { + check_moniker( + r#" //- /foo/lib.rs crate:foo@CratesIo:0.1.0,https://a.b/foo.git pub mod module { - pub fn func$0() {} + pub trait MyTrait { + type MyType$0; + } } "#, - "foo::module::func", + "foo::module::MyTrait::MyType", r#"PackageInformation { name: "foo", repo: "https://a.b/foo.git", version: "0.1.0" }"#, MonikerKind::Export, ); |
