From 192e2bbb0e5c772d43ec61d36de56a0f7062610e Mon Sep 17 00:00:00 2001 From: Aleksey Kladov Date: Tue, 27 Nov 2018 19:56:03 +0300 Subject: resolve_path works with DefIds --- crates/ra_analysis/src/descriptors/module/mod.rs | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) (limited to 'crates/ra_analysis/src/descriptors/module') diff --git a/crates/ra_analysis/src/descriptors/module/mod.rs b/crates/ra_analysis/src/descriptors/module/mod.rs index 764e19ce0..78911d5d9 100644 --- a/crates/ra_analysis/src/descriptors/module/mod.rs +++ b/crates/ra_analysis/src/descriptors/module/mod.rs @@ -77,7 +77,7 @@ impl ModuleDescriptor { Ok(res) } - fn new( + pub(super) fn new( db: &impl DescriptorDatabase, source_root_id: SourceRootId, module_id: ModuleId, @@ -132,6 +132,14 @@ impl ModuleDescriptor { Some(link.name(&self.tree)) } + pub fn def_id(&self, db: &impl DescriptorDatabase) -> DefId { + let def_loc = DefLoc::Module { + id: self.module_id, + source_root: self.source_root_id, + }; + db.id_maps().def_id(def_loc) + } + /// Finds a child module with the specified name. pub fn child(&self, name: &str) -> Option { let child_id = self.module_id.child(&self.tree, name)?; @@ -152,23 +160,23 @@ impl ModuleDescriptor { &self, db: &impl DescriptorDatabase, path: Path, - ) -> Cancelable> { + ) -> Cancelable> { let mut curr = match path.kind { PathKind::Crate => self.crate_root(), PathKind::Self_ | PathKind::Plain => self.clone(), PathKind::Super => ctry!(self.parent()), - }; + } + .def_id(db); let segments = path.segments; - for name in segments { - let scope = curr.scope(db)?; - let def_id = ctry!(ctry!(scope.get(&name)).def_id); - curr = match db.id_maps().def_loc(def_id) { + for name in segments.iter() { + let module = match db.id_maps().def_loc(curr) { DefLoc::Module { id, source_root } => ModuleDescriptor::new(db, source_root, id)?, _ => return Ok(None), }; + let scope = module.scope(db)?; + curr = ctry!(ctry!(scope.get(&name)).def_id); } - Ok(Some(curr)) } -- cgit v1.2.3