aboutsummaryrefslogtreecommitdiff
path: root/crates/ra_hir/src/nameres.rs
diff options
context:
space:
mode:
authorSeivan Heidari <[email protected]>2019-10-31 08:43:20 +0000
committerSeivan Heidari <[email protected]>2019-10-31 08:43:20 +0000
commit8edda0e7b164009d6c03bb3d4be603fb38ad2e2a (patch)
tree744cf81075d394e2f9c06afb07642a2601800dda /crates/ra_hir/src/nameres.rs
parent49562d36b97ddde34cf7585a8c2e8f232519b657 (diff)
parentd067afb064a7fa67b172abf561b7d80740cd6f18 (diff)
Merge branch 'master' into feature/themes
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r--crates/ra_hir/src/nameres.rs51
1 files changed, 19 insertions, 32 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index 67adcfa28..7ba031827 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -48,16 +48,15 @@
48//! on the result 48//! on the result
49 49
50mod per_ns; 50mod per_ns;
51mod raw;
52mod collector; 51mod collector;
53mod mod_resolution;
54#[cfg(test)] 52#[cfg(test)]
55mod tests; 53mod tests;
56 54
57use std::sync::Arc; 55use std::sync::Arc;
58 56
57use hir_def::{builtin_type::BuiltinType, CrateModuleId};
59use once_cell::sync::Lazy; 58use once_cell::sync::Lazy;
60use ra_arena::{impl_arena_id, Arena, RawId}; 59use ra_arena::Arena;
61use ra_db::{Edition, FileId}; 60use ra_db::{Edition, FileId};
62use ra_prof::profile; 61use ra_prof::profile;
63use ra_syntax::ast; 62use ra_syntax::ast;
@@ -69,16 +68,12 @@ use crate::{
69 diagnostics::DiagnosticSink, 68 diagnostics::DiagnosticSink,
70 ids::MacroDefId, 69 ids::MacroDefId,
71 nameres::diagnostics::DefDiagnostic, 70 nameres::diagnostics::DefDiagnostic,
72 Adt, AstId, BuiltinType, Crate, HirFileId, MacroDef, Module, ModuleDef, Name, Path, PathKind, 71 Adt, AstId, Crate, HirFileId, MacroDef, Module, ModuleDef, Name, Path, PathKind, Trait,
73 Trait,
74}; 72};
75 73
76pub(crate) use self::raw::{ImportSourceMap, RawItems}; 74pub use self::per_ns::{Namespace, PerNs};
77 75
78pub use self::{ 76pub use hir_def::nameres::raw::ImportId;
79 per_ns::{Namespace, PerNs},
80 raw::ImportId,
81};
82 77
83/// Contains all top-level defs from a macro-expanded crate 78/// Contains all top-level defs from a macro-expanded crate
84#[derive(Debug, PartialEq, Eq)] 79#[derive(Debug, PartialEq, Eq)]
@@ -115,13 +110,8 @@ impl std::ops::Index<CrateModuleId> for CrateDefMap {
115 } 110 }
116} 111}
117 112
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)] 113#[derive(Default, Debug, PartialEq, Eq)]
124pub(crate) struct ModuleData { 114pub struct ModuleData {
125 pub(crate) parent: Option<CrateModuleId>, 115 pub(crate) parent: Option<CrateModuleId>,
126 pub(crate) children: FxHashMap<Name, CrateModuleId>, 116 pub(crate) children: FxHashMap<Name, CrateModuleId>,
127 pub(crate) scope: ModuleScope, 117 pub(crate) scope: ModuleScope,
@@ -332,10 +322,11 @@ impl CrateDefMap {
332 ) -> ResolvePathResult { 322 ) -> ResolvePathResult {
333 let mut segments = path.segments.iter().enumerate(); 323 let mut segments = path.segments.iter().enumerate();
334 let mut curr_per_ns: PerNs = match path.kind { 324 let mut curr_per_ns: PerNs = match path.kind {
335 PathKind::DollarCrate(krate) => { 325 PathKind::DollarCrate(crate_id) => {
326 let krate = Crate { crate_id };
336 if krate == self.krate { 327 if krate == self.krate {
337 tested_by!(macro_dollar_crate_self); 328 tested_by!(macro_dollar_crate_self);
338 PerNs::types(Module { krate: self.krate, module_id: self.root }.into()) 329 PerNs::types(Module::new(self.krate, self.root).into())
339 } else { 330 } else {
340 match krate.root_module(db) { 331 match krate.root_module(db) {
341 Some(module) => { 332 Some(module) => {
@@ -346,12 +337,8 @@ impl CrateDefMap {
346 } 337 }
347 } 338 }
348 } 339 }
349 PathKind::Crate => { 340 PathKind::Crate => PerNs::types(Module::new(self.krate, self.root).into()),
350 PerNs::types(Module { krate: self.krate, module_id: self.root }.into()) 341 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 342 // plain import or absolute path in 2015: crate-relative with
356 // fallback to extern prelude (with the simplification in 343 // fallback to extern prelude (with the simplification in
357 // rust-lang/rust#57745) 344 // rust-lang/rust#57745)
@@ -377,7 +364,7 @@ impl CrateDefMap {
377 } 364 }
378 PathKind::Super => { 365 PathKind::Super => {
379 if let Some(p) = self.modules[original_module].parent { 366 if let Some(p) = self.modules[original_module].parent {
380 PerNs::types(Module { krate: self.krate, module_id: p }.into()) 367 PerNs::types(Module::new(self.krate, p).into())
381 } else { 368 } else {
382 log::debug!("super path in root module"); 369 log::debug!("super path in root module");
383 return ResolvePathResult::empty(ReachedFixedPoint::Yes); 370 return ResolvePathResult::empty(ReachedFixedPoint::Yes);
@@ -419,12 +406,12 @@ impl CrateDefMap {
419 406
420 curr_per_ns = match curr { 407 curr_per_ns = match curr {
421 ModuleDef::Module(module) => { 408 ModuleDef::Module(module) => {
422 if module.krate != self.krate { 409 if module.krate() != self.krate {
423 let path = 410 let path =
424 Path { segments: path.segments[i..].to_vec(), kind: PathKind::Self_ }; 411 Path { segments: path.segments[i..].to_vec(), kind: PathKind::Self_ };
425 log::debug!("resolving {:?} in other crate", path); 412 log::debug!("resolving {:?} in other crate", path);
426 let defp_map = db.crate_def_map(module.krate); 413 let defp_map = db.crate_def_map(module.krate());
427 let (def, s) = defp_map.resolve_path(db, module.module_id, &path); 414 let (def, s) = defp_map.resolve_path(db, module.id.module_id, &path);
428 return ResolvePathResult::with( 415 return ResolvePathResult::with(
429 def, 416 def,
430 ReachedFixedPoint::Yes, 417 ReachedFixedPoint::Yes,
@@ -433,7 +420,7 @@ impl CrateDefMap {
433 } 420 }
434 421
435 // Since it is a qualified path here, it should not contains legacy macros 422 // Since it is a qualified path here, it should not contains legacy macros
436 match self[module.module_id].scope.get(&segment.name) { 423 match self[module.id.module_id].scope.get(&segment.name) {
437 Some(res) => res.def, 424 Some(res) => res.def,
438 _ => { 425 _ => {
439 log::debug!("path segment {:?} not found", segment.name); 426 log::debug!("path segment {:?} not found", segment.name);
@@ -511,14 +498,14 @@ impl CrateDefMap {
511 fn resolve_in_prelude(&self, db: &impl DefDatabase, name: &Name) -> PerNs { 498 fn resolve_in_prelude(&self, db: &impl DefDatabase, name: &Name) -> PerNs {
512 if let Some(prelude) = self.prelude { 499 if let Some(prelude) = self.prelude {
513 let keep; 500 let keep;
514 let def_map = if prelude.krate == self.krate { 501 let def_map = if prelude.krate() == self.krate {
515 self 502 self
516 } else { 503 } else {
517 // Extend lifetime 504 // Extend lifetime
518 keep = db.crate_def_map(prelude.krate); 505 keep = db.crate_def_map(prelude.krate());
519 &keep 506 &keep
520 }; 507 };
521 def_map[prelude.module_id].scope.get(name).map_or_else(PerNs::none, |res| res.def) 508 def_map[prelude.id.module_id].scope.get(name).map_or_else(PerNs::none, |res| res.def)
522 } else { 509 } else {
523 PerNs::none() 510 PerNs::none()
524 } 511 }