diff options
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 36 |
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 | ||
57 | use std::sync::Arc; | 57 | use std::sync::Arc; |
58 | 58 | ||
59 | use hir_def::CrateModuleId; | ||
59 | use once_cell::sync::Lazy; | 60 | use once_cell::sync::Lazy; |
60 | use ra_arena::{impl_arena_id, Arena, RawId}; | 61 | use ra_arena::Arena; |
61 | use ra_db::{Edition, FileId}; | 62 | use ra_db::{Edition, FileId}; |
62 | use ra_prof::profile; | 63 | use ra_prof::profile; |
63 | use ra_syntax::ast; | 64 | use 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)] | ||
120 | pub(crate) struct CrateModuleId(RawId); | ||
121 | impl_arena_id!(CrateModuleId); | ||
122 | |||
123 | #[derive(Default, Debug, PartialEq, Eq)] | 119 | #[derive(Default, Debug, PartialEq, Eq)] |
124 | pub(crate) struct ModuleData { | 120 | pub 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 | } |