diff options
Diffstat (limited to 'crates/ra_hir_def/src')
-rw-r--r-- | crates/ra_hir_def/src/lib.rs | 75 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres.rs | 42 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/collector.rs | 47 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/path_resolution.rs | 9 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/raw.rs | 34 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests.rs | 4 | ||||
-rw-r--r-- | crates/ra_hir_def/src/nameres/tests/mod_resolution.rs | 2 | ||||
-rw-r--r-- | crates/ra_hir_def/src/per_ns.rs (renamed from crates/ra_hir_def/src/nameres/per_ns.rs) | 0 | ||||
-rw-r--r-- | crates/ra_hir_def/src/resolver.rs | 15 |
9 files changed, 80 insertions, 148 deletions
diff --git a/crates/ra_hir_def/src/lib.rs b/crates/ra_hir_def/src/lib.rs index 1b2bc6f45..1d195d65d 100644 --- a/crates/ra_hir_def/src/lib.rs +++ b/crates/ra_hir_def/src/lib.rs | |||
@@ -21,95 +21,40 @@ pub mod resolver; | |||
21 | pub mod data; | 21 | pub mod data; |
22 | pub mod lang_item; | 22 | pub mod lang_item; |
23 | pub mod docs; | 23 | pub mod docs; |
24 | pub mod per_ns; | ||
24 | 25 | ||
25 | mod trace; | 26 | mod trace; |
27 | mod nameres; | ||
26 | 28 | ||
27 | #[cfg(test)] | 29 | #[cfg(test)] |
28 | mod test_db; | 30 | mod test_db; |
29 | #[cfg(test)] | 31 | #[cfg(test)] |
30 | mod marks; | 32 | mod marks; |
31 | 33 | ||
32 | // FIXME: this should be private | ||
33 | pub mod nameres; | ||
34 | |||
35 | use std::hash::{Hash, Hasher}; | 34 | use std::hash::{Hash, Hasher}; |
36 | 35 | ||
37 | use hir_expand::{ast_id_map::FileAstId, db::AstDatabase, AstId, HirFileId, MacroDefId, Source}; | 36 | use hir_expand::{ast_id_map::FileAstId, db::AstDatabase, AstId, HirFileId, MacroDefId, Source}; |
38 | use ra_arena::{impl_arena_id, map::ArenaMap, RawId}; | 37 | use ra_arena::{impl_arena_id, map::ArenaMap, RawId}; |
39 | use ra_db::{salsa, CrateId, FileId}; | 38 | use ra_db::{salsa, CrateId}; |
40 | use ra_syntax::{ast, AstNode, SyntaxNode}; | 39 | use ra_syntax::{ast, AstNode}; |
41 | 40 | ||
42 | use crate::{builtin_type::BuiltinType, db::InternDatabase}; | 41 | use crate::{builtin_type::BuiltinType, db::InternDatabase}; |
43 | 42 | ||
44 | pub enum ModuleSource { | 43 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
45 | SourceFile(ast::SourceFile), | 44 | pub struct LocalImportId(RawId); |
46 | Module(ast::Module), | 45 | impl_arena_id!(LocalImportId); |
47 | } | ||
48 | |||
49 | impl ModuleSource { | ||
50 | pub fn new( | ||
51 | db: &impl db::DefDatabase, | ||
52 | file_id: Option<FileId>, | ||
53 | decl_id: Option<AstId<ast::Module>>, | ||
54 | ) -> ModuleSource { | ||
55 | match (file_id, decl_id) { | ||
56 | (Some(file_id), _) => { | ||
57 | let source_file = db.parse(file_id).tree(); | ||
58 | ModuleSource::SourceFile(source_file) | ||
59 | } | ||
60 | (None, Some(item_id)) => { | ||
61 | let module = item_id.to_node(db); | ||
62 | assert!(module.item_list().is_some(), "expected inline module"); | ||
63 | ModuleSource::Module(module) | ||
64 | } | ||
65 | (None, None) => panic!(), | ||
66 | } | ||
67 | } | ||
68 | |||
69 | // FIXME: this methods do not belong here | ||
70 | pub fn from_position(db: &impl db::DefDatabase, position: ra_db::FilePosition) -> ModuleSource { | ||
71 | let parse = db.parse(position.file_id); | ||
72 | match &ra_syntax::algo::find_node_at_offset::<ast::Module>( | ||
73 | parse.tree().syntax(), | ||
74 | position.offset, | ||
75 | ) { | ||
76 | Some(m) if !m.has_semi() => ModuleSource::Module(m.clone()), | ||
77 | _ => { | ||
78 | let source_file = parse.tree(); | ||
79 | ModuleSource::SourceFile(source_file) | ||
80 | } | ||
81 | } | ||
82 | } | ||
83 | |||
84 | pub fn from_child_node(db: &impl db::DefDatabase, child: Source<&SyntaxNode>) -> ModuleSource { | ||
85 | if let Some(m) = | ||
86 | child.value.ancestors().filter_map(ast::Module::cast).find(|it| !it.has_semi()) | ||
87 | { | ||
88 | ModuleSource::Module(m) | ||
89 | } else { | ||
90 | let file_id = child.file_id.original_file(db); | ||
91 | let source_file = db.parse(file_id).tree(); | ||
92 | ModuleSource::SourceFile(source_file) | ||
93 | } | ||
94 | } | ||
95 | |||
96 | pub fn from_file_id(db: &impl db::DefDatabase, file_id: FileId) -> ModuleSource { | ||
97 | let source_file = db.parse(file_id).tree(); | ||
98 | ModuleSource::SourceFile(source_file) | ||
99 | } | ||
100 | } | ||
101 | 46 | ||
102 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | 47 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
103 | pub struct ModuleId { | 48 | pub struct ModuleId { |
104 | pub krate: CrateId, | 49 | pub krate: CrateId, |
105 | pub module_id: CrateModuleId, | 50 | pub module_id: LocalModuleId, |
106 | } | 51 | } |
107 | 52 | ||
108 | /// An ID of a module, **local** to a specific crate | 53 | /// An ID of a module, **local** to a specific crate |
109 | // FIXME: rename to `LocalModuleId`. | 54 | // FIXME: rename to `LocalModuleId`. |
110 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] | 55 | #[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)] |
111 | pub struct CrateModuleId(RawId); | 56 | pub struct LocalModuleId(RawId); |
112 | impl_arena_id!(CrateModuleId); | 57 | impl_arena_id!(LocalModuleId); |
113 | 58 | ||
114 | macro_rules! impl_intern_key { | 59 | macro_rules! impl_intern_key { |
115 | ($name:ident) => { | 60 | ($name:ident) => { |
diff --git a/crates/ra_hir_def/src/nameres.rs b/crates/ra_hir_def/src/nameres.rs index 101203b7b..3b2e99647 100644 --- a/crates/ra_hir_def/src/nameres.rs +++ b/crates/ra_hir_def/src/nameres.rs | |||
@@ -47,8 +47,7 @@ | |||
47 | //! path and, upon success, we run macro expansion and "collect module" phase on | 47 | //! path and, upon success, we run macro expansion and "collect module" phase on |
48 | //! the result | 48 | //! the result |
49 | 49 | ||
50 | pub mod raw; | 50 | pub(crate) mod raw; |
51 | pub mod per_ns; | ||
52 | mod collector; | 51 | mod collector; |
53 | mod mod_resolution; | 52 | mod mod_resolution; |
54 | mod path_resolution; | 53 | mod path_resolution; |
@@ -72,11 +71,10 @@ use rustc_hash::{FxHashMap, FxHashSet}; | |||
72 | use crate::{ | 71 | use crate::{ |
73 | builtin_type::BuiltinType, | 72 | builtin_type::BuiltinType, |
74 | db::DefDatabase, | 73 | db::DefDatabase, |
75 | nameres::{ | 74 | nameres::{diagnostics::DefDiagnostic, path_resolution::ResolveMode}, |
76 | diagnostics::DefDiagnostic, path_resolution::ResolveMode, per_ns::PerNs, raw::ImportId, | ||
77 | }, | ||
78 | path::Path, | 75 | path::Path, |
79 | AstId, CrateModuleId, FunctionId, ImplId, ModuleDefId, ModuleId, TraitId, | 76 | per_ns::PerNs, |
77 | AstId, FunctionId, ImplId, LocalImportId, LocalModuleId, ModuleDefId, ModuleId, TraitId, | ||
80 | }; | 78 | }; |
81 | 79 | ||
82 | /// Contains all top-level defs from a macro-expanded crate | 80 | /// Contains all top-level defs from a macro-expanded crate |
@@ -89,8 +87,8 @@ pub struct CrateDefMap { | |||
89 | /// a dependency (`std` or `core`). | 87 | /// a dependency (`std` or `core`). |
90 | prelude: Option<ModuleId>, | 88 | prelude: Option<ModuleId>, |
91 | extern_prelude: FxHashMap<Name, ModuleDefId>, | 89 | extern_prelude: FxHashMap<Name, ModuleDefId>, |
92 | root: CrateModuleId, | 90 | root: LocalModuleId, |
93 | modules: Arena<CrateModuleId, ModuleData>, | 91 | modules: Arena<LocalModuleId, ModuleData>, |
94 | 92 | ||
95 | /// Some macros are not well-behavior, which leads to infinite loop | 93 | /// Some macros are not well-behavior, which leads to infinite loop |
96 | /// e.g. macro_rules! foo { ($ty:ty) => { foo!($ty); } } | 94 | /// e.g. macro_rules! foo { ($ty:ty) => { foo!($ty); } } |
@@ -107,17 +105,17 @@ pub struct CrateDefMap { | |||
107 | diagnostics: Vec<DefDiagnostic>, | 105 | diagnostics: Vec<DefDiagnostic>, |
108 | } | 106 | } |
109 | 107 | ||
110 | impl std::ops::Index<CrateModuleId> for CrateDefMap { | 108 | impl std::ops::Index<LocalModuleId> for CrateDefMap { |
111 | type Output = ModuleData; | 109 | type Output = ModuleData; |
112 | fn index(&self, id: CrateModuleId) -> &ModuleData { | 110 | fn index(&self, id: LocalModuleId) -> &ModuleData { |
113 | &self.modules[id] | 111 | &self.modules[id] |
114 | } | 112 | } |
115 | } | 113 | } |
116 | 114 | ||
117 | #[derive(Default, Debug, PartialEq, Eq)] | 115 | #[derive(Default, Debug, PartialEq, Eq)] |
118 | pub struct ModuleData { | 116 | pub struct ModuleData { |
119 | pub parent: Option<CrateModuleId>, | 117 | pub parent: Option<LocalModuleId>, |
120 | pub children: FxHashMap<Name, CrateModuleId>, | 118 | pub children: FxHashMap<Name, LocalModuleId>, |
121 | pub scope: ModuleScope, | 119 | pub scope: ModuleScope, |
122 | 120 | ||
123 | // FIXME: these can't be both null, we need a three-state enum here. | 121 | // FIXME: these can't be both null, we need a three-state enum here. |
@@ -213,7 +211,7 @@ pub struct Resolution { | |||
213 | /// None for unresolved | 211 | /// None for unresolved |
214 | pub def: PerNs, | 212 | pub def: PerNs, |
215 | /// ident by which this is imported into local scope. | 213 | /// ident by which this is imported into local scope. |
216 | pub import: Option<ImportId>, | 214 | pub import: Option<LocalImportId>, |
217 | } | 215 | } |
218 | 216 | ||
219 | impl CrateDefMap { | 217 | impl CrateDefMap { |
@@ -227,7 +225,7 @@ impl CrateDefMap { | |||
227 | let def_map = { | 225 | let def_map = { |
228 | let crate_graph = db.crate_graph(); | 226 | let crate_graph = db.crate_graph(); |
229 | let edition = crate_graph.edition(krate); | 227 | let edition = crate_graph.edition(krate); |
230 | let mut modules: Arena<CrateModuleId, ModuleData> = Arena::default(); | 228 | let mut modules: Arena<LocalModuleId, ModuleData> = Arena::default(); |
231 | let root = modules.alloc(ModuleData::default()); | 229 | let root = modules.alloc(ModuleData::default()); |
232 | CrateDefMap { | 230 | CrateDefMap { |
233 | krate, | 231 | krate, |
@@ -248,7 +246,7 @@ impl CrateDefMap { | |||
248 | self.krate | 246 | self.krate |
249 | } | 247 | } |
250 | 248 | ||
251 | pub fn root(&self) -> CrateModuleId { | 249 | pub fn root(&self) -> LocalModuleId { |
252 | self.root | 250 | self.root |
253 | } | 251 | } |
254 | 252 | ||
@@ -263,7 +261,7 @@ impl CrateDefMap { | |||
263 | pub fn add_diagnostics( | 261 | pub fn add_diagnostics( |
264 | &self, | 262 | &self, |
265 | db: &impl DefDatabase, | 263 | db: &impl DefDatabase, |
266 | module: CrateModuleId, | 264 | module: LocalModuleId, |
267 | sink: &mut DiagnosticSink, | 265 | sink: &mut DiagnosticSink, |
268 | ) { | 266 | ) { |
269 | self.diagnostics.iter().for_each(|it| it.add_to(db, module, sink)) | 267 | self.diagnostics.iter().for_each(|it| it.add_to(db, module, sink)) |
@@ -272,18 +270,18 @@ impl CrateDefMap { | |||
272 | pub fn resolve_path( | 270 | pub fn resolve_path( |
273 | &self, | 271 | &self, |
274 | db: &impl DefDatabase, | 272 | db: &impl DefDatabase, |
275 | original_module: CrateModuleId, | 273 | original_module: LocalModuleId, |
276 | path: &Path, | 274 | path: &Path, |
277 | ) -> (PerNs, Option<usize>) { | 275 | ) -> (PerNs, Option<usize>) { |
278 | let res = self.resolve_path_fp_with_macro(db, ResolveMode::Other, original_module, path); | 276 | let res = self.resolve_path_fp_with_macro(db, ResolveMode::Other, original_module, path); |
279 | (res.resolved_def, res.segment_index) | 277 | (res.resolved_def, res.segment_index) |
280 | } | 278 | } |
281 | 279 | ||
282 | pub fn modules(&self) -> impl Iterator<Item = CrateModuleId> + '_ { | 280 | pub fn modules(&self) -> impl Iterator<Item = LocalModuleId> + '_ { |
283 | self.modules.iter().map(|(id, _data)| id) | 281 | self.modules.iter().map(|(id, _data)| id) |
284 | } | 282 | } |
285 | 283 | ||
286 | pub fn modules_for_file(&self, file_id: FileId) -> impl Iterator<Item = CrateModuleId> + '_ { | 284 | pub fn modules_for_file(&self, file_id: FileId) -> impl Iterator<Item = LocalModuleId> + '_ { |
287 | self.modules | 285 | self.modules |
288 | .iter() | 286 | .iter() |
289 | .filter(move |(_id, data)| data.definition == Some(file_id)) | 287 | .filter(move |(_id, data)| data.definition == Some(file_id)) |
@@ -319,12 +317,12 @@ mod diagnostics { | |||
319 | use ra_db::RelativePathBuf; | 317 | use ra_db::RelativePathBuf; |
320 | use ra_syntax::{ast, AstPtr}; | 318 | use ra_syntax::{ast, AstPtr}; |
321 | 319 | ||
322 | use crate::{db::DefDatabase, diagnostics::UnresolvedModule, nameres::CrateModuleId, AstId}; | 320 | use crate::{db::DefDatabase, diagnostics::UnresolvedModule, nameres::LocalModuleId, AstId}; |
323 | 321 | ||
324 | #[derive(Debug, PartialEq, Eq)] | 322 | #[derive(Debug, PartialEq, Eq)] |
325 | pub(super) enum DefDiagnostic { | 323 | pub(super) enum DefDiagnostic { |
326 | UnresolvedModule { | 324 | UnresolvedModule { |
327 | module: CrateModuleId, | 325 | module: LocalModuleId, |
328 | declaration: AstId<ast::Module>, | 326 | declaration: AstId<ast::Module>, |
329 | candidate: RelativePathBuf, | 327 | candidate: RelativePathBuf, |
330 | }, | 328 | }, |
@@ -334,7 +332,7 @@ mod diagnostics { | |||
334 | pub(super) fn add_to( | 332 | pub(super) fn add_to( |
335 | &self, | 333 | &self, |
336 | db: &impl DefDatabase, | 334 | db: &impl DefDatabase, |
337 | target_module: CrateModuleId, | 335 | target_module: LocalModuleId, |
338 | sink: &mut DiagnosticSink, | 336 | sink: &mut DiagnosticSink, |
339 | ) { | 337 | ) { |
340 | match self { | 338 | match self { |
diff --git a/crates/ra_hir_def/src/nameres/collector.rs b/crates/ra_hir_def/src/nameres/collector.rs index 1894b072a..b02364e86 100644 --- a/crates/ra_hir_def/src/nameres/collector.rs +++ b/crates/ra_hir_def/src/nameres/collector.rs | |||
@@ -16,11 +16,12 @@ use crate::{ | |||
16 | db::DefDatabase, | 16 | db::DefDatabase, |
17 | nameres::{ | 17 | nameres::{ |
18 | diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, | 18 | diagnostics::DefDiagnostic, mod_resolution::ModDir, path_resolution::ReachedFixedPoint, |
19 | per_ns::PerNs, raw, CrateDefMap, ModuleData, Resolution, ResolveMode, | 19 | raw, CrateDefMap, ModuleData, Resolution, ResolveMode, |
20 | }, | 20 | }, |
21 | path::{Path, PathKind}, | 21 | path::{Path, PathKind}, |
22 | AdtId, AstId, AstItemDef, ConstLoc, ContainerId, CrateModuleId, EnumId, EnumVariantId, | 22 | per_ns::PerNs, |
23 | FunctionLoc, ImplId, Intern, LocationCtx, ModuleDefId, ModuleId, StaticId, StructId, | 23 | AdtId, AstId, AstItemDef, ConstLoc, ContainerId, EnumId, EnumVariantId, FunctionLoc, ImplId, |
24 | Intern, LocalImportId, LocalModuleId, LocationCtx, ModuleDefId, ModuleId, StaticId, StructId, | ||
24 | StructOrUnionId, TraitId, TypeAliasLoc, UnionId, | 25 | StructOrUnionId, TraitId, TypeAliasLoc, UnionId, |
25 | }; | 26 | }; |
26 | 27 | ||
@@ -94,10 +95,10 @@ impl MacroStackMonitor { | |||
94 | struct DefCollector<'a, DB> { | 95 | struct DefCollector<'a, DB> { |
95 | db: &'a DB, | 96 | db: &'a DB, |
96 | def_map: CrateDefMap, | 97 | def_map: CrateDefMap, |
97 | glob_imports: FxHashMap<CrateModuleId, Vec<(CrateModuleId, raw::ImportId)>>, | 98 | glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, LocalImportId)>>, |
98 | unresolved_imports: Vec<(CrateModuleId, raw::ImportId, raw::ImportData)>, | 99 | unresolved_imports: Vec<(LocalModuleId, LocalImportId, raw::ImportData)>, |
99 | unexpanded_macros: Vec<(CrateModuleId, AstId<ast::MacroCall>, Path)>, | 100 | unexpanded_macros: Vec<(LocalModuleId, AstId<ast::MacroCall>, Path)>, |
100 | mod_dirs: FxHashMap<CrateModuleId, ModDir>, | 101 | mod_dirs: FxHashMap<LocalModuleId, ModDir>, |
101 | 102 | ||
102 | /// Some macro use `$tt:tt which mean we have to handle the macro perfectly | 103 | /// Some macro use `$tt:tt which mean we have to handle the macro perfectly |
103 | /// To prevent stack overflow, we add a deep counter here for prevent that. | 104 | /// To prevent stack overflow, we add a deep counter here for prevent that. |
@@ -173,7 +174,7 @@ where | |||
173 | /// ``` | 174 | /// ``` |
174 | fn define_macro( | 175 | fn define_macro( |
175 | &mut self, | 176 | &mut self, |
176 | module_id: CrateModuleId, | 177 | module_id: LocalModuleId, |
177 | name: Name, | 178 | name: Name, |
178 | macro_: MacroDefId, | 179 | macro_: MacroDefId, |
179 | export: bool, | 180 | export: bool, |
@@ -200,7 +201,7 @@ where | |||
200 | /// the definition of current module. | 201 | /// the definition of current module. |
201 | /// And also, `macro_use` on a module will import all legacy macros visable inside to | 202 | /// And also, `macro_use` on a module will import all legacy macros visable inside to |
202 | /// current legacy scope, with possible shadowing. | 203 | /// current legacy scope, with possible shadowing. |
203 | fn define_legacy_macro(&mut self, module_id: CrateModuleId, name: Name, macro_: MacroDefId) { | 204 | fn define_legacy_macro(&mut self, module_id: LocalModuleId, name: Name, macro_: MacroDefId) { |
204 | // Always shadowing | 205 | // Always shadowing |
205 | self.def_map.modules[module_id].scope.legacy_macros.insert(name, macro_); | 206 | self.def_map.modules[module_id].scope.legacy_macros.insert(name, macro_); |
206 | } | 207 | } |
@@ -208,7 +209,7 @@ where | |||
208 | /// Import macros from `#[macro_use] extern crate`. | 209 | /// Import macros from `#[macro_use] extern crate`. |
209 | fn import_macros_from_extern_crate( | 210 | fn import_macros_from_extern_crate( |
210 | &mut self, | 211 | &mut self, |
211 | current_module_id: CrateModuleId, | 212 | current_module_id: LocalModuleId, |
212 | import: &raw::ImportData, | 213 | import: &raw::ImportData, |
213 | ) { | 214 | ) { |
214 | log::debug!( | 215 | log::debug!( |
@@ -235,7 +236,7 @@ where | |||
235 | /// Exported macros are just all macros in the root module scope. | 236 | /// Exported macros are just all macros in the root module scope. |
236 | /// Note that it contains not only all `#[macro_export]` macros, but also all aliases | 237 | /// Note that it contains not only all `#[macro_export]` macros, but also all aliases |
237 | /// created by `use` in the root module, ignoring the visibility of `use`. | 238 | /// created by `use` in the root module, ignoring the visibility of `use`. |
238 | fn import_all_macros_exported(&mut self, current_module_id: CrateModuleId, krate: CrateId) { | 239 | fn import_all_macros_exported(&mut self, current_module_id: LocalModuleId, krate: CrateId) { |
239 | let def_map = self.db.crate_def_map(krate); | 240 | let def_map = self.db.crate_def_map(krate); |
240 | for (name, def) in def_map[def_map.root].scope.macros() { | 241 | for (name, def) in def_map[def_map.root].scope.macros() { |
241 | // `macro_use` only bring things into legacy scope. | 242 | // `macro_use` only bring things into legacy scope. |
@@ -265,7 +266,7 @@ where | |||
265 | 266 | ||
266 | fn resolve_import( | 267 | fn resolve_import( |
267 | &self, | 268 | &self, |
268 | module_id: CrateModuleId, | 269 | module_id: LocalModuleId, |
269 | import: &raw::ImportData, | 270 | import: &raw::ImportData, |
270 | ) -> (PerNs, ReachedFixedPoint) { | 271 | ) -> (PerNs, ReachedFixedPoint) { |
271 | log::debug!("resolving import: {:?} ({:?})", import, self.def_map.edition); | 272 | log::debug!("resolving import: {:?} ({:?})", import, self.def_map.edition); |
@@ -291,9 +292,9 @@ where | |||
291 | 292 | ||
292 | fn record_resolved_import( | 293 | fn record_resolved_import( |
293 | &mut self, | 294 | &mut self, |
294 | module_id: CrateModuleId, | 295 | module_id: LocalModuleId, |
295 | def: PerNs, | 296 | def: PerNs, |
296 | import_id: raw::ImportId, | 297 | import_id: LocalImportId, |
297 | import: &raw::ImportData, | 298 | import: &raw::ImportData, |
298 | ) { | 299 | ) { |
299 | if import.is_glob { | 300 | if import.is_glob { |
@@ -387,8 +388,8 @@ where | |||
387 | 388 | ||
388 | fn update( | 389 | fn update( |
389 | &mut self, | 390 | &mut self, |
390 | module_id: CrateModuleId, | 391 | module_id: LocalModuleId, |
391 | import: Option<raw::ImportId>, | 392 | import: Option<LocalImportId>, |
392 | resolutions: &[(Name, Resolution)], | 393 | resolutions: &[(Name, Resolution)], |
393 | ) { | 394 | ) { |
394 | self.update_recursive(module_id, import, resolutions, 0) | 395 | self.update_recursive(module_id, import, resolutions, 0) |
@@ -396,8 +397,8 @@ where | |||
396 | 397 | ||
397 | fn update_recursive( | 398 | fn update_recursive( |
398 | &mut self, | 399 | &mut self, |
399 | module_id: CrateModuleId, | 400 | module_id: LocalModuleId, |
400 | import: Option<raw::ImportId>, | 401 | import: Option<LocalImportId>, |
401 | resolutions: &[(Name, Resolution)], | 402 | resolutions: &[(Name, Resolution)], |
402 | depth: usize, | 403 | depth: usize, |
403 | ) { | 404 | ) { |
@@ -484,7 +485,7 @@ where | |||
484 | 485 | ||
485 | fn collect_macro_expansion( | 486 | fn collect_macro_expansion( |
486 | &mut self, | 487 | &mut self, |
487 | module_id: CrateModuleId, | 488 | module_id: LocalModuleId, |
488 | macro_call_id: MacroCallId, | 489 | macro_call_id: MacroCallId, |
489 | macro_def_id: MacroDefId, | 490 | macro_def_id: MacroDefId, |
490 | ) { | 491 | ) { |
@@ -522,7 +523,7 @@ where | |||
522 | /// Walks a single module, populating defs, imports and macros | 523 | /// Walks a single module, populating defs, imports and macros |
523 | struct ModCollector<'a, D> { | 524 | struct ModCollector<'a, D> { |
524 | def_collector: D, | 525 | def_collector: D, |
525 | module_id: CrateModuleId, | 526 | module_id: LocalModuleId, |
526 | file_id: HirFileId, | 527 | file_id: HirFileId, |
527 | raw_items: &'a raw::RawItems, | 528 | raw_items: &'a raw::RawItems, |
528 | mod_dir: ModDir, | 529 | mod_dir: ModDir, |
@@ -647,7 +648,7 @@ where | |||
647 | name: Name, | 648 | name: Name, |
648 | declaration: AstId<ast::Module>, | 649 | declaration: AstId<ast::Module>, |
649 | definition: Option<FileId>, | 650 | definition: Option<FileId>, |
650 | ) -> CrateModuleId { | 651 | ) -> LocalModuleId { |
651 | let modules = &mut self.def_collector.def_map.modules; | 652 | let modules = &mut self.def_collector.def_map.modules; |
652 | let res = modules.alloc(ModuleData::default()); | 653 | let res = modules.alloc(ModuleData::default()); |
653 | modules[res].parent = Some(self.module_id); | 654 | modules[res].parent = Some(self.module_id); |
@@ -772,7 +773,7 @@ where | |||
772 | self.def_collector.unexpanded_macros.push((self.module_id, ast_id, path)); | 773 | self.def_collector.unexpanded_macros.push((self.module_id, ast_id, path)); |
773 | } | 774 | } |
774 | 775 | ||
775 | fn import_all_legacy_macros(&mut self, module_id: CrateModuleId) { | 776 | fn import_all_legacy_macros(&mut self, module_id: LocalModuleId) { |
776 | let macros = self.def_collector.def_map[module_id].scope.legacy_macros.clone(); | 777 | let macros = self.def_collector.def_map[module_id].scope.legacy_macros.clone(); |
777 | for (name, macro_) in macros { | 778 | for (name, macro_) in macros { |
778 | self.def_collector.define_legacy_macro(self.module_id, name.clone(), macro_); | 779 | self.def_collector.define_legacy_macro(self.module_id, name.clone(), macro_); |
@@ -827,7 +828,7 @@ mod tests { | |||
827 | 828 | ||
828 | let def_map = { | 829 | let def_map = { |
829 | let edition = db.crate_graph().edition(krate); | 830 | let edition = db.crate_graph().edition(krate); |
830 | let mut modules: Arena<CrateModuleId, ModuleData> = Arena::default(); | 831 | let mut modules: Arena<LocalModuleId, ModuleData> = Arena::default(); |
831 | let root = modules.alloc(ModuleData::default()); | 832 | let root = modules.alloc(ModuleData::default()); |
832 | CrateDefMap { | 833 | CrateDefMap { |
833 | krate, | 834 | krate, |
diff --git a/crates/ra_hir_def/src/nameres/path_resolution.rs b/crates/ra_hir_def/src/nameres/path_resolution.rs index 102009ac7..9455f22bb 100644 --- a/crates/ra_hir_def/src/nameres/path_resolution.rs +++ b/crates/ra_hir_def/src/nameres/path_resolution.rs | |||
@@ -16,9 +16,10 @@ use test_utils::tested_by; | |||
16 | 16 | ||
17 | use crate::{ | 17 | use crate::{ |
18 | db::DefDatabase, | 18 | db::DefDatabase, |
19 | nameres::{per_ns::PerNs, CrateDefMap}, | 19 | nameres::CrateDefMap, |
20 | path::{Path, PathKind}, | 20 | path::{Path, PathKind}, |
21 | AdtId, CrateModuleId, EnumVariantId, ModuleDefId, ModuleId, | 21 | per_ns::PerNs, |
22 | AdtId, EnumVariantId, LocalModuleId, ModuleDefId, ModuleId, | ||
22 | }; | 23 | }; |
23 | 24 | ||
24 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] | 25 | #[derive(Debug, Clone, Copy, PartialEq, Eq)] |
@@ -65,7 +66,7 @@ impl CrateDefMap { | |||
65 | &self, | 66 | &self, |
66 | db: &impl DefDatabase, | 67 | db: &impl DefDatabase, |
67 | mode: ResolveMode, | 68 | mode: ResolveMode, |
68 | original_module: CrateModuleId, | 69 | original_module: LocalModuleId, |
69 | path: &Path, | 70 | path: &Path, |
70 | ) -> ResolvePathResult { | 71 | ) -> ResolvePathResult { |
71 | let mut segments = path.segments.iter().enumerate(); | 72 | let mut segments = path.segments.iter().enumerate(); |
@@ -217,7 +218,7 @@ impl CrateDefMap { | |||
217 | fn resolve_name_in_module( | 218 | fn resolve_name_in_module( |
218 | &self, | 219 | &self, |
219 | db: &impl DefDatabase, | 220 | db: &impl DefDatabase, |
220 | module: CrateModuleId, | 221 | module: LocalModuleId, |
221 | name: &Name, | 222 | name: &Name, |
222 | ) -> PerNs { | 223 | ) -> PerNs { |
223 | // Resolve in: | 224 | // Resolve in: |
diff --git a/crates/ra_hir_def/src/nameres/raw.rs b/crates/ra_hir_def/src/nameres/raw.rs index 7618cb059..552cbe544 100644 --- a/crates/ra_hir_def/src/nameres/raw.rs +++ b/crates/ra_hir_def/src/nameres/raw.rs | |||
@@ -12,7 +12,7 @@ use hir_expand::{ | |||
12 | use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId}; | 12 | use ra_arena::{impl_arena_id, map::ArenaMap, Arena, RawId}; |
13 | use ra_syntax::{ | 13 | use ra_syntax::{ |
14 | ast::{self, AttrsOwner, NameOwner}, | 14 | ast::{self, AttrsOwner, NameOwner}, |
15 | AstNode, AstPtr, SourceFile, | 15 | AstNode, AstPtr, |
16 | }; | 16 | }; |
17 | use test_utils::tested_by; | 17 | use test_utils::tested_by; |
18 | 18 | ||
@@ -20,7 +20,7 @@ use crate::{ | |||
20 | attr::{Attr, Attrs}, | 20 | attr::{Attr, Attrs}, |
21 | db::DefDatabase, | 21 | db::DefDatabase, |
22 | path::Path, | 22 | path::Path, |
23 | FileAstId, HirFileId, ModuleSource, Source, | 23 | FileAstId, HirFileId, LocalImportId, Source, |
24 | }; | 24 | }; |
25 | 25 | ||
26 | /// `RawItems` is a set of top-level items in a file (except for impls). | 26 | /// `RawItems` is a set of top-level items in a file (except for impls). |
@@ -30,7 +30,7 @@ use crate::{ | |||
30 | #[derive(Debug, Default, PartialEq, Eq)] | 30 | #[derive(Debug, Default, PartialEq, Eq)] |
31 | pub struct RawItems { | 31 | pub struct RawItems { |
32 | modules: Arena<Module, ModuleData>, | 32 | modules: Arena<Module, ModuleData>, |
33 | imports: Arena<ImportId, ImportData>, | 33 | imports: Arena<LocalImportId, ImportData>, |
34 | defs: Arena<Def, DefData>, | 34 | defs: Arena<Def, DefData>, |
35 | macros: Arena<Macro, MacroData>, | 35 | macros: Arena<Macro, MacroData>, |
36 | impls: Arena<Impl, ImplData>, | 36 | impls: Arena<Impl, ImplData>, |
@@ -40,28 +40,18 @@ pub struct RawItems { | |||
40 | 40 | ||
41 | #[derive(Debug, Default, PartialEq, Eq)] | 41 | #[derive(Debug, Default, PartialEq, Eq)] |
42 | pub struct ImportSourceMap { | 42 | pub struct ImportSourceMap { |
43 | map: ArenaMap<ImportId, ImportSourcePtr>, | 43 | map: ArenaMap<LocalImportId, ImportSourcePtr>, |
44 | } | 44 | } |
45 | 45 | ||
46 | type ImportSourcePtr = Either<AstPtr<ast::UseTree>, AstPtr<ast::ExternCrateItem>>; | 46 | type ImportSourcePtr = Either<AstPtr<ast::UseTree>, AstPtr<ast::ExternCrateItem>>; |
47 | type ImportSource = Either<ast::UseTree, ast::ExternCrateItem>; | ||
48 | |||
49 | fn to_node(ptr: ImportSourcePtr, file: &SourceFile) -> ImportSource { | ||
50 | ptr.map(|ptr| ptr.to_node(file.syntax()), |ptr| ptr.to_node(file.syntax())) | ||
51 | } | ||
52 | 47 | ||
53 | impl ImportSourceMap { | 48 | impl ImportSourceMap { |
54 | fn insert(&mut self, import: ImportId, ptr: ImportSourcePtr) { | 49 | fn insert(&mut self, import: LocalImportId, ptr: ImportSourcePtr) { |
55 | self.map.insert(import, ptr) | 50 | self.map.insert(import, ptr) |
56 | } | 51 | } |
57 | 52 | ||
58 | pub fn get(&self, source: &ModuleSource, import: ImportId) -> ImportSource { | 53 | pub fn get(&self, import: LocalImportId) -> ImportSourcePtr { |
59 | let file = match source { | 54 | self.map[import].clone() |
60 | ModuleSource::SourceFile(file) => file.clone(), | ||
61 | ModuleSource::Module(m) => m.syntax().ancestors().find_map(SourceFile::cast).unwrap(), | ||
62 | }; | ||
63 | |||
64 | to_node(self.map[import], &file) | ||
65 | } | 55 | } |
66 | } | 56 | } |
67 | 57 | ||
@@ -106,9 +96,9 @@ impl Index<Module> for RawItems { | |||
106 | } | 96 | } |
107 | } | 97 | } |
108 | 98 | ||
109 | impl Index<ImportId> for RawItems { | 99 | impl Index<LocalImportId> for RawItems { |
110 | type Output = ImportData; | 100 | type Output = ImportData; |
111 | fn index(&self, idx: ImportId) -> &ImportData { | 101 | fn index(&self, idx: LocalImportId) -> &ImportData { |
112 | &self.imports[idx] | 102 | &self.imports[idx] |
113 | } | 103 | } |
114 | } | 104 | } |
@@ -143,7 +133,7 @@ pub(super) struct RawItem { | |||
143 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] | 133 | #[derive(Debug, PartialEq, Eq, Clone, Copy)] |
144 | pub(super) enum RawItemKind { | 134 | pub(super) enum RawItemKind { |
145 | Module(Module), | 135 | Module(Module), |
146 | Import(ImportId), | 136 | Import(LocalImportId), |
147 | Def(Def), | 137 | Def(Def), |
148 | Macro(Macro), | 138 | Macro(Macro), |
149 | Impl(Impl), | 139 | Impl(Impl), |
@@ -159,10 +149,6 @@ pub(super) enum ModuleData { | |||
159 | Definition { name: Name, ast_id: FileAstId<ast::Module>, items: Vec<RawItem> }, | 149 | Definition { name: Name, ast_id: FileAstId<ast::Module>, items: Vec<RawItem> }, |
160 | } | 150 | } |
161 | 151 | ||
162 | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] | ||
163 | pub struct ImportId(RawId); | ||
164 | impl_arena_id!(ImportId); | ||
165 | |||
166 | #[derive(Debug, Clone, PartialEq, Eq)] | 152 | #[derive(Debug, Clone, PartialEq, Eq)] |
167 | pub struct ImportData { | 153 | pub struct ImportData { |
168 | pub(super) path: Path, | 154 | pub(super) path: Path, |
diff --git a/crates/ra_hir_def/src/nameres/tests.rs b/crates/ra_hir_def/src/nameres/tests.rs index b5053ba20..f0b86af7c 100644 --- a/crates/ra_hir_def/src/nameres/tests.rs +++ b/crates/ra_hir_def/src/nameres/tests.rs | |||
@@ -10,7 +10,7 @@ use insta::assert_snapshot; | |||
10 | use ra_db::{fixture::WithFixture, SourceDatabase}; | 10 | use ra_db::{fixture::WithFixture, SourceDatabase}; |
11 | use test_utils::covers; | 11 | use test_utils::covers; |
12 | 12 | ||
13 | use crate::{db::DefDatabase, nameres::*, test_db::TestDB, CrateModuleId}; | 13 | use crate::{db::DefDatabase, nameres::*, test_db::TestDB, LocalModuleId}; |
14 | 14 | ||
15 | fn def_map(fixtute: &str) -> String { | 15 | fn def_map(fixtute: &str) -> String { |
16 | let dm = compute_crate_def_map(fixtute); | 16 | let dm = compute_crate_def_map(fixtute); |
@@ -28,7 +28,7 @@ fn render_crate_def_map(map: &CrateDefMap) -> String { | |||
28 | go(&mut buf, map, "\ncrate", map.root()); | 28 | go(&mut buf, map, "\ncrate", map.root()); |
29 | return buf.trim().to_string(); | 29 | return buf.trim().to_string(); |
30 | 30 | ||
31 | fn go(buf: &mut String, map: &CrateDefMap, path: &str, module: CrateModuleId) { | 31 | fn go(buf: &mut String, map: &CrateDefMap, path: &str, module: LocalModuleId) { |
32 | *buf += path; | 32 | *buf += path; |
33 | *buf += "\n"; | 33 | *buf += "\n"; |
34 | 34 | ||
diff --git a/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs b/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs index eb7b85c07..e11530062 100644 --- a/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs +++ b/crates/ra_hir_def/src/nameres/tests/mod_resolution.rs | |||
@@ -665,7 +665,7 @@ fn unresolved_module_diagnostics() { | |||
665 | @r###" | 665 | @r###" |
666 | [ | 666 | [ |
667 | UnresolvedModule { | 667 | UnresolvedModule { |
668 | module: CrateModuleId( | 668 | module: LocalModuleId( |
669 | 0, | 669 | 0, |
670 | ), | 670 | ), |
671 | declaration: AstId { | 671 | declaration: AstId { |
diff --git a/crates/ra_hir_def/src/nameres/per_ns.rs b/crates/ra_hir_def/src/per_ns.rs index 717ed1ef9..717ed1ef9 100644 --- a/crates/ra_hir_def/src/nameres/per_ns.rs +++ b/crates/ra_hir_def/src/per_ns.rs | |||
diff --git a/crates/ra_hir_def/src/resolver.rs b/crates/ra_hir_def/src/resolver.rs index 48a836a20..b56de44dd 100644 --- a/crates/ra_hir_def/src/resolver.rs +++ b/crates/ra_hir_def/src/resolver.rs | |||
@@ -14,11 +14,12 @@ use crate::{ | |||
14 | db::DefDatabase, | 14 | db::DefDatabase, |
15 | expr::{ExprId, PatId}, | 15 | expr::{ExprId, PatId}, |
16 | generics::GenericParams, | 16 | generics::GenericParams, |
17 | nameres::{per_ns::PerNs, CrateDefMap}, | 17 | nameres::CrateDefMap, |
18 | path::{Path, PathKind}, | 18 | path::{Path, PathKind}, |
19 | AdtId, AstItemDef, ConstId, ContainerId, CrateModuleId, DefWithBodyId, EnumId, EnumVariantId, | 19 | per_ns::PerNs, |
20 | FunctionId, GenericDefId, ImplId, Lookup, ModuleDefId, ModuleId, StaticId, StructId, TraitId, | 20 | AdtId, AstItemDef, ConstId, ContainerId, DefWithBodyId, EnumId, EnumVariantId, FunctionId, |
21 | TypeAliasId, | 21 | GenericDefId, ImplId, LocalModuleId, Lookup, ModuleDefId, ModuleId, StaticId, StructId, |
22 | TraitId, TypeAliasId, | ||
22 | }; | 23 | }; |
23 | 24 | ||
24 | #[derive(Debug, Clone, Default)] | 25 | #[derive(Debug, Clone, Default)] |
@@ -30,7 +31,7 @@ pub struct Resolver { | |||
30 | #[derive(Debug, Clone)] | 31 | #[derive(Debug, Clone)] |
31 | pub(crate) struct ModuleItemMap { | 32 | pub(crate) struct ModuleItemMap { |
32 | crate_def_map: Arc<CrateDefMap>, | 33 | crate_def_map: Arc<CrateDefMap>, |
33 | module_id: CrateModuleId, | 34 | module_id: LocalModuleId, |
34 | } | 35 | } |
35 | 36 | ||
36 | #[derive(Debug, Clone)] | 37 | #[derive(Debug, Clone)] |
@@ -330,7 +331,7 @@ impl Resolver { | |||
330 | traits | 331 | traits |
331 | } | 332 | } |
332 | 333 | ||
333 | fn module(&self) -> Option<(&CrateDefMap, CrateModuleId)> { | 334 | fn module(&self) -> Option<(&CrateDefMap, LocalModuleId)> { |
334 | self.scopes.iter().rev().find_map(|scope| match scope { | 335 | self.scopes.iter().rev().find_map(|scope| match scope { |
335 | Scope::ModuleScope(m) => Some((&*m.crate_def_map, m.module_id)), | 336 | Scope::ModuleScope(m) => Some((&*m.crate_def_map, m.module_id)), |
336 | 337 | ||
@@ -466,7 +467,7 @@ impl Resolver { | |||
466 | fn push_module_scope( | 467 | fn push_module_scope( |
467 | self, | 468 | self, |
468 | crate_def_map: Arc<CrateDefMap>, | 469 | crate_def_map: Arc<CrateDefMap>, |
469 | module_id: CrateModuleId, | 470 | module_id: LocalModuleId, |
470 | ) -> Resolver { | 471 | ) -> Resolver { |
471 | self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id })) | 472 | self.push_scope(Scope::ModuleScope(ModuleItemMap { crate_def_map, module_id })) |
472 | } | 473 | } |