Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide_db/src/famous_defs.rs')
| -rw-r--r-- | crates/ide_db/src/famous_defs.rs | 56 |
1 files changed, 35 insertions, 21 deletions
diff --git a/crates/ide_db/src/famous_defs.rs b/crates/ide_db/src/famous_defs.rs index cc9f2f9151..58d99ff9df 100644 --- a/crates/ide_db/src/famous_defs.rs +++ b/crates/ide_db/src/famous_defs.rs @@ -1,4 +1,6 @@ //! See [`FamousDefs`]. + +use base_db::{CrateOrigin, LangCrateOrigin, SourceDatabase}; use hir::{Crate, Enum, Macro, Module, ScopeDef, Semantics, Trait}; use crate::RootDatabase; @@ -16,16 +18,28 @@ use crate::RootDatabase; /// ``` /// //- minicore: iterator, ord, derive /// ``` -pub struct FamousDefs<'a, 'b>(pub &'a Semantics<'b, RootDatabase>, pub Option<Crate>); +pub struct FamousDefs<'a, 'b>(pub &'a Semantics<'b, RootDatabase>, pub Crate); #[allow(non_snake_case)] impl FamousDefs<'_, '_> { pub fn std(&self) -> Option<Crate> { - self.find_crate("std") + self.find_lang_crate(LangCrateOrigin::Std) } pub fn core(&self) -> Option<Crate> { - self.find_crate("core") + self.find_lang_crate(LangCrateOrigin::Core) + } + + pub fn alloc(&self) -> Option<Crate> { + self.find_lang_crate(LangCrateOrigin::Alloc) + } + + pub fn test(&self) -> Option<Crate> { + self.find_lang_crate(LangCrateOrigin::Test) + } + + pub fn proc_macro(&self) -> Option<Crate> { + self.find_lang_crate(LangCrateOrigin::ProcMacro) } pub fn core_cmp_Ord(&self) -> Option<Trait> { @@ -88,18 +102,6 @@ impl FamousDefs<'_, '_> { self.find_macro("core:macros:builtin:derive") } - pub fn alloc(&self) -> Option<Crate> { - self.find_crate("alloc") - } - - pub fn test(&self) -> Option<Crate> { - self.find_crate("test") - } - - pub fn proc_macro(&self) -> Option<Crate> { - self.find_crate("proc_macro") - } - pub fn builtin_crates(&self) -> impl Iterator<Item = Crate> { IntoIterator::into_iter([ self.std(), @@ -139,11 +141,15 @@ impl FamousDefs<'_, '_> { } } - fn find_crate(&self, name: &str) -> Option<Crate> { - let krate = self.1?; + fn find_lang_crate(&self, origin: LangCrateOrigin) -> Option<Crate> { + let krate = self.1; let db = self.0.db; - let res = - krate.dependencies(db).into_iter().find(|dep| dep.name.to_smol_str() == name)?.krate; + let crate_graph = self.0.db.crate_graph(); + let res = krate + .dependencies(db) + .into_iter() + .find(|dep| crate_graph[dep.krate.into()].origin == CrateOrigin::Lang(origin))? + .krate; Some(res) } @@ -151,8 +157,16 @@ impl FamousDefs<'_, '_> { let db = self.0.db; let mut path = path.split(':'); let trait_ = path.next_back()?; - let std_crate = path.next()?; - let std_crate = self.find_crate(std_crate)?; + let lang_crate = path.next()?; + let lang_crate = match lang_crate { + "core" => LangCrateOrigin::Core, + "alloc" => LangCrateOrigin::Alloc, + "test" => LangCrateOrigin::Test, + "proc_macro" => LangCrateOrigin::ProcMacro, + "std" => LangCrateOrigin::Std, + _ => return None, + }; + let std_crate = self.find_lang_crate(lang_crate)?; let mut module = std_crate.root_module(db); for segment in path { module = module.children(db).find_map(|child| { |