diff options
author | Seivan Heidari <[email protected]> | 2019-10-31 08:43:20 +0000 |
---|---|---|
committer | Seivan Heidari <[email protected]> | 2019-10-31 08:43:20 +0000 |
commit | 8edda0e7b164009d6c03bb3d4be603fb38ad2e2a (patch) | |
tree | 744cf81075d394e2f9c06afb07642a2601800dda /crates/ra_hir/src/nameres.rs | |
parent | 49562d36b97ddde34cf7585a8c2e8f232519b657 (diff) | |
parent | d067afb064a7fa67b172abf561b7d80740cd6f18 (diff) |
Merge branch 'master' into feature/themes
Diffstat (limited to 'crates/ra_hir/src/nameres.rs')
-rw-r--r-- | crates/ra_hir/src/nameres.rs | 51 |
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 | ||
50 | mod per_ns; | 50 | mod per_ns; |
51 | mod raw; | ||
52 | mod collector; | 51 | mod collector; |
53 | mod mod_resolution; | ||
54 | #[cfg(test)] | 52 | #[cfg(test)] |
55 | mod tests; | 53 | mod tests; |
56 | 54 | ||
57 | use std::sync::Arc; | 55 | use std::sync::Arc; |
58 | 56 | ||
57 | use hir_def::{builtin_type::BuiltinType, CrateModuleId}; | ||
59 | use once_cell::sync::Lazy; | 58 | use once_cell::sync::Lazy; |
60 | use ra_arena::{impl_arena_id, Arena, RawId}; | 59 | use ra_arena::Arena; |
61 | use ra_db::{Edition, FileId}; | 60 | use ra_db::{Edition, FileId}; |
62 | use ra_prof::profile; | 61 | use ra_prof::profile; |
63 | use ra_syntax::ast; | 62 | use 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 | ||
76 | pub(crate) use self::raw::{ImportSourceMap, RawItems}; | 74 | pub use self::per_ns::{Namespace, PerNs}; |
77 | 75 | ||
78 | pub use self::{ | 76 | pub 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)] | ||
120 | pub(crate) struct CrateModuleId(RawId); | ||
121 | impl_arena_id!(CrateModuleId); | ||
122 | |||
123 | #[derive(Default, Debug, PartialEq, Eq)] | 113 | #[derive(Default, Debug, PartialEq, Eq)] |
124 | pub(crate) struct ModuleData { | 114 | pub 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 | } |