From 147b0f94e60f66c73ee1ca1726de97d76721bfda Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Sat, 5 Jan 2019 01:37:40 +0300 Subject: Start code_model::Module --- crates/ra_hir/src/code_model_impl.rs | 59 ++++++++++++++++++++++++++++++++++-- 1 file changed, 57 insertions(+), 2 deletions(-) (limited to 'crates/ra_hir/src/code_model_impl.rs') diff --git a/crates/ra_hir/src/code_model_impl.rs b/crates/ra_hir/src/code_model_impl.rs index 75d4e04c1..22079ba33 100644 --- a/crates/ra_hir/src/code_model_impl.rs +++ b/crates/ra_hir/src/code_model_impl.rs @@ -1,6 +1,9 @@ use ra_db::{CrateId, Cancelable}; -use crate::{Module, HirFileId, db::HirDatabase, Crate, CrateDependency, AsName}; +use crate::{HirFileId, db::HirDatabase, Crate, CrateDependency, AsName, DefId, DefLoc, DefKind, Name}; + +use crate::code_model_api::Module; + impl Crate { pub(crate) fn new(crate_id: CrateId) -> Crate { @@ -28,7 +31,59 @@ impl Crate { .modules_with_sources() .find(|(_, src)| src.file_id() == file_id)); - let module = Module::new(db, source_root_id, module_id)?; + let def_loc = DefLoc { + kind: DefKind::Module, + source_root_id, + module_id, + source_item_id: module_id.source(&module_tree).0, + }; + let def_id = def_loc.id(db); + + let module = Module::new(def_id); + Ok(Some(module)) + } +} + +impl Module { + fn new(def_id: DefId) -> Self { + crate::code_model_api::Module { def_id } + } + + pub(crate) fn krate_impl(&self, db: &impl HirDatabase) -> Cancelable> { + let root = self.crate_root(db)?; + let loc = root.def_id.loc(db); + let file_id = loc.source_item_id.file_id.as_original_file(); + + let crate_graph = db.crate_graph(); + let crate_id = ctry!(crate_graph.crate_id_for_crate_root(file_id)); + Ok(Some(Crate::new(crate_id))) + } + + pub(crate) fn crate_root_impl(&self, db: &impl HirDatabase) -> Cancelable { + let loc = self.def_id.loc(db); + let module_tree = db.module_tree(loc.source_root_id)?; + let module_id = loc.module_id.crate_root(&module_tree); + let def_loc = DefLoc { + module_id, + source_item_id: module_id.source(&module_tree).0, + ..loc + }; + let def_id = def_loc.id(db); + let module = Module::new(def_id); + Ok(module) + } + /// Finds a child module with the specified name. + pub fn child_impl(&self, db: &impl HirDatabase, name: &Name) -> Cancelable> { + let loc = self.def_id.loc(db); + let module_tree = db.module_tree(loc.source_root_id)?; + let child_id = ctry!(loc.module_id.child(&module_tree, name)); + let def_loc = DefLoc { + module_id: child_id, + source_item_id: child_id.source(&module_tree).0, + ..loc + }; + let def_id = def_loc.id(db); + let module = Module::new(def_id); Ok(Some(module)) } } -- cgit v1.2.3