aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs36
1 files changed, 14 insertions, 22 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index 67adcfa28..b325979f5 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -56,8 +56,9 @@ mod tests;
56 56
57use std::sync::Arc; 57use std::sync::Arc;
58 58
59use hir_def::CrateModuleId;
59use once_cell::sync::Lazy; 60use once_cell::sync::Lazy;
60use ra_arena::{impl_arena_id, Arena, RawId}; 61use ra_arena::Arena;
61use ra_db::{Edition, FileId}; 62use ra_db::{Edition, FileId};
62use ra_prof::profile; 63use ra_prof::profile;
63use ra_syntax::ast; 64use ra_syntax::ast;
@@ -115,13 +116,8 @@ impl std::ops::Index<CrateModuleId> for CrateDefMap {
115 } 116 }
116} 117}
117 118
118/// An ID of a module, **local** to a specific crate
119#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
120pub(crate) struct CrateModuleId(RawId);
121impl_arena_id!(CrateModuleId);
122
123#[derive(Default, Debug, PartialEq, Eq)] 119#[derive(Default, Debug, PartialEq, Eq)]
124pub(crate) struct ModuleData { 120pub struct ModuleData {
125 pub(crate) parent: Option<CrateModuleId>, 121 pub(crate) parent: Option<CrateModuleId>,
126 pub(crate) children: FxHashMap<Name, CrateModuleId>, 122 pub(crate) children: FxHashMap<Name, CrateModuleId>,
127 pub(crate) scope: ModuleScope, 123 pub(crate) scope: ModuleScope,
@@ -335,7 +331,7 @@ impl CrateDefMap {
335 PathKind::DollarCrate(krate) => { 331 PathKind::DollarCrate(krate) => {
336 if krate == self.krate { 332 if krate == self.krate {
337 tested_by!(macro_dollar_crate_self); 333 tested_by!(macro_dollar_crate_self);
338 PerNs::types(Module { krate: self.krate, module_id: self.root }.into()) 334 PerNs::types(Module::new(self.krate, self.root).into())
339 } else { 335 } else {
340 match krate.root_module(db) { 336 match krate.root_module(db) {
341 Some(module) => { 337 Some(module) => {
@@ -346,12 +342,8 @@ impl CrateDefMap {
346 } 342 }
347 } 343 }
348 } 344 }
349 PathKind::Crate => { 345 PathKind::Crate => PerNs::types(Module::new(self.krate, self.root).into()),
350 PerNs::types(Module { krate: self.krate, module_id: self.root }.into()) 346 PathKind::Self_ => PerNs::types(Module::new(self.krate, original_module).into()),
351 }
352 PathKind::Self_ => {
353 PerNs::types(Module { krate: self.krate, module_id: original_module }.into())
354 }
355 // plain import or absolute path in 2015: crate-relative with 347 // plain import or absolute path in 2015: crate-relative with
356 // fallback to extern prelude (with the simplification in 348 // fallback to extern prelude (with the simplification in
357 // rust-lang/rust#57745) 349 // rust-lang/rust#57745)
@@ -377,7 +369,7 @@ impl CrateDefMap {
377 } 369 }
378 PathKind::Super => { 370 PathKind::Super => {
379 if let Some(p) = self.modules[original_module].parent { 371 if let Some(p) = self.modules[original_module].parent {
380 PerNs::types(Module { krate: self.krate, module_id: p }.into()) 372 PerNs::types(Module::new(self.krate, p).into())
381 } else { 373 } else {
382 log::debug!("super path in root module"); 374 log::debug!("super path in root module");
383 return ResolvePathResult::empty(ReachedFixedPoint::Yes); 375 return ResolvePathResult::empty(ReachedFixedPoint::Yes);
@@ -419,12 +411,12 @@ impl CrateDefMap {
419 411
420 curr_per_ns = match curr { 412 curr_per_ns = match curr {
421 ModuleDef::Module(module) => { 413 ModuleDef::Module(module) => {
422 if module.krate != self.krate { 414 if module.krate() != self.krate {
423 let path = 415 let path =
424 Path { segments: path.segments[i..].to_vec(), kind: PathKind::Self_ }; 416 Path { segments: path.segments[i..].to_vec(), kind: PathKind::Self_ };
425 log::debug!("resolving {:?} in other crate", path); 417 log::debug!("resolving {:?} in other crate", path);
426 let defp_map = db.crate_def_map(module.krate); 418 let defp_map = db.crate_def_map(module.krate());
427 let (def, s) = defp_map.resolve_path(db, module.module_id, &path); 419 let (def, s) = defp_map.resolve_path(db, module.id.module_id, &path);
428 return ResolvePathResult::with( 420 return ResolvePathResult::with(
429 def, 421 def,
430 ReachedFixedPoint::Yes, 422 ReachedFixedPoint::Yes,
@@ -433,7 +425,7 @@ impl CrateDefMap {
433 } 425 }
434 426
435 // Since it is a qualified path here, it should not contains legacy macros 427 // Since it is a qualified path here, it should not contains legacy macros
436 match self[module.module_id].scope.get(&segment.name) { 428 match self[module.id.module_id].scope.get(&segment.name) {
437 Some(res) => res.def, 429 Some(res) => res.def,
438 _ => { 430 _ => {
439 log::debug!("path segment {:?} not found", segment.name); 431 log::debug!("path segment {:?} not found", segment.name);
@@ -511,14 +503,14 @@ impl CrateDefMap {
511 fn resolve_in_prelude(&self, db: &impl DefDatabase, name: &Name) -> PerNs { 503 fn resolve_in_prelude(&self, db: &impl DefDatabase, name: &Name) -> PerNs {
512 if let Some(prelude) = self.prelude { 504 if let Some(prelude) = self.prelude {
513 let keep; 505 let keep;
514 let def_map = if prelude.krate == self.krate { 506 let def_map = if prelude.krate() == self.krate {
515 self 507 self
516 } else { 508 } else {
517 // Extend lifetime 509 // Extend lifetime
518 keep = db.crate_def_map(prelude.krate); 510 keep = db.crate_def_map(prelude.krate());
519 &keep 511 &keep
520 }; 512 };
521 def_map[prelude.module_id].scope.get(name).map_or_else(PerNs::none, |res| res.def) 513 def_map[prelude.id.module_id].scope.get(name).map_or_else(PerNs::none, |res| res.def)
522 } else { 514 } else {
523 PerNs::none() 515 PerNs::none()
524 } 516 }