From 947e3350e045aab1db9b232542425a3faa856907 Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 4 Dec 2018 23:01:53 +0300 Subject: module-scoped defloc --- crates/ra_hir/src/lib.rs | 27 +++++++++++++++------------ crates/ra_hir/src/module/mod.rs | 17 ++++++++++++----- crates/ra_hir/src/module/nameres.rs | 23 ++++++++++++++++------- 3 files changed, 43 insertions(+), 24 deletions(-) diff --git a/crates/ra_hir/src/lib.rs b/crates/ra_hir/src/lib.rs index 0f84b2d61..ffc99fd5f 100644 --- a/crates/ra_hir/src/lib.rs +++ b/crates/ra_hir/src/lib.rs @@ -61,15 +61,18 @@ impl FnId { pub struct DefId(u32); ra_db::impl_numeric_id!(DefId); +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub(crate) enum DefKind { + Module, + Item, +} + #[derive(Clone, Debug, PartialEq, Eq, Hash)] -pub enum DefLoc { - Module { - id: ModuleId, - source_root: SourceRootId, - }, - Item { - source_item_id: SourceItemId, - }, +pub struct DefLoc { + pub(crate) kind: DefKind, + source_root_id: SourceRootId, + module_id: ModuleId, + source_item_id: SourceItemId, } impl DefId { @@ -92,12 +95,12 @@ pub enum Def { impl DefId { pub fn resolve(self, db: &impl HirDatabase) -> Cancelable { let loc = self.loc(db); - let res = match loc { - DefLoc::Module { id, source_root } => { - let descr = Module::new(db, source_root, id)?; + let res = match loc.kind { + DefKind::Module => { + let descr = Module::new(db, loc.source_root_id, loc.module_id)?; Def::Module(descr) } - DefLoc::Item { .. } => Def::Item, + DefKind::Item => Def::Item, }; Ok(res) } diff --git a/crates/ra_hir/src/module/mod.rs b/crates/ra_hir/src/module/mod.rs index fa9ee94eb..08ce7c8d1 100644 --- a/crates/ra_hir/src/module/mod.rs +++ b/crates/ra_hir/src/module/mod.rs @@ -14,7 +14,7 @@ use ra_db::{SourceRootId, FileId, FilePosition, Cancelable}; use relative_path::RelativePathBuf; use crate::{ - DefLoc, DefId, Path, PathKind, HirDatabase, SourceItemId, SourceFileItemId, + DefKind, DefLoc, DefId, Path, PathKind, HirDatabase, SourceItemId, SourceFileItemId, arena::{Arena, Id}, }; @@ -127,9 +127,11 @@ impl Module { } pub fn def_id(&self, db: &impl HirDatabase) -> DefId { - let def_loc = DefLoc::Module { - id: self.module_id, - source_root: self.source_root_id, + let def_loc = DefLoc { + kind: DefKind::Module, + source_root_id: self.source_root_id, + module_id: self.module_id, + source_item_id: self.module_id.source(&self.tree).0, }; def_loc.id(db) } @@ -161,7 +163,12 @@ impl Module { let segments = path.segments; for name in segments.iter() { let module = match curr.loc(db) { - DefLoc::Module { id, source_root } => Module::new(db, source_root, id)?, + DefLoc { + kind: DefKind::Module, + source_root_id, + module_id, + .. + } => Module::new(db, source_root_id, module_id)?, _ => return Ok(None), }; let scope = module.scope(db)?; diff --git a/crates/ra_hir/src/module/nameres.rs b/crates/ra_hir/src/module/nameres.rs index 8529e16b3..c2b380a80 100644 --- a/crates/ra_hir/src/module/nameres.rs +++ b/crates/ra_hir/src/module/nameres.rs @@ -28,7 +28,7 @@ use ra_db::SourceRootId; use crate::{ Cancelable, FileId, - DefId, DefLoc, + DefId, DefLoc, DefKind, SourceItemId, SourceFileItemId, SourceFileItems, Path, PathKind, HirDatabase, @@ -247,7 +247,10 @@ where // handle submodules separatelly continue; } - let def_loc = DefLoc::Item { + let def_loc = DefLoc { + kind: DefKind::Item, + source_root_id: self.source_root, + module_id, source_item_id: SourceItemId { file_id, item_id: item.id, @@ -261,10 +264,12 @@ where module_items.items.insert(item.name.clone(), resolution); } - for (name, mod_id) in module_id.children(&self.module_tree) { - let def_loc = DefLoc::Module { - id: mod_id, - source_root: self.source_root, + for (name, module_id) in module_id.children(&self.module_tree) { + let def_loc = DefLoc { + kind: DefKind::Module, + source_root_id: self.source_root, + module_id, + source_item_id: module_id.source(&self.module_tree).0, }; let def_id = def_loc.id(self.db); let resolution = Resolution { @@ -316,7 +321,11 @@ where if !is_last { curr = match def_id.loc(self.db) { - DefLoc::Module { id, .. } => id, + DefLoc { + kind: DefKind::Module, + module_id, + .. + } => module_id, _ => return, } } else { -- cgit v1.2.3