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.rs44
1 files changed, 24 insertions, 20 deletions
diff --git a/crates/ra_hir/src/nameres.rs b/crates/ra_hir/src/nameres.rs
index aea95e08c..ab0a9041d 100644
--- a/crates/ra_hir/src/nameres.rs
+++ b/crates/ra_hir/src/nameres.rs
@@ -60,7 +60,7 @@ pub struct Resolution {
60 /// None for unresolved 60 /// None for unresolved
61 pub def_id: PerNs<DefId>, 61 pub def_id: PerNs<DefId>,
62 /// ident by whitch this is imported into local scope. 62 /// ident by whitch this is imported into local scope.
63 pub import: Option<NamedImport>, 63 pub import: Option<LoweredImport>,
64} 64}
65 65
66#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] 66#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
@@ -151,10 +151,10 @@ impl<T> PerNs<T> {
151 151
152pub(crate) struct Resolver<'a, DB> { 152pub(crate) struct Resolver<'a, DB> {
153 db: &'a DB, 153 db: &'a DB,
154 input: &'a FxHashMap<ModuleId, Arc<InputModuleItems>>, 154 input: &'a FxHashMap<ModuleId, Arc<LoweredModule>>,
155 source_root: SourceRootId, 155 source_root: SourceRootId,
156 module_tree: Arc<ModuleTree>, 156 module_tree: Arc<ModuleTree>,
157 processed_imports: FxHashSet<(ModuleId, usize)>, 157 processed_imports: FxHashSet<(ModuleId, LoweredImport)>,
158 result: ItemMap, 158 result: ItemMap,
159} 159}
160 160
@@ -164,7 +164,7 @@ where
164{ 164{
165 pub(crate) fn new( 165 pub(crate) fn new(
166 db: &'a DB, 166 db: &'a DB,
167 input: &'a FxHashMap<ModuleId, Arc<InputModuleItems>>, 167 input: &'a FxHashMap<ModuleId, Arc<LoweredModule>>,
168 source_root: SourceRootId, 168 source_root: SourceRootId,
169 module_tree: Arc<ModuleTree>, 169 module_tree: Arc<ModuleTree>,
170 ) -> Resolver<'a, DB> { 170 ) -> Resolver<'a, DB> {
@@ -197,7 +197,7 @@ where
197 self.result 197 self.result
198 } 198 }
199 199
200 fn populate_module(&mut self, module_id: ModuleId, input: Arc<InputModuleItems>) { 200 fn populate_module(&mut self, module_id: ModuleId, input: Arc<LoweredModule>) {
201 let mut module_items = ModuleScope::default(); 201 let mut module_items = ModuleScope::default();
202 202
203 // Populate extern crates prelude 203 // Populate extern crates prelude
@@ -220,14 +220,14 @@ where
220 } 220 }
221 }; 221 };
222 } 222 }
223 for import in input.imports.iter() { 223 for (import_id, import_data) in input.imports.iter() {
224 if let Some(name) = import.path.segments.iter().last() { 224 if let Some(name) = import_data.path.segments.iter().last() {
225 if let ImportKind::Named(import) = import.kind { 225 if !import_data.is_glob {
226 module_items.items.insert( 226 module_items.items.insert(
227 name.clone(), 227 name.clone(),
228 Resolution { 228 Resolution {
229 def_id: PerNs::none(), 229 def_id: PerNs::none(),
230 import: Some(import), 230 import: Some(import_id),
231 }, 231 },
232 ); 232 );
233 } 233 }
@@ -281,23 +281,27 @@ where
281 } 281 }
282 282
283 fn resolve_imports(&mut self, module_id: ModuleId) { 283 fn resolve_imports(&mut self, module_id: ModuleId) {
284 for (i, import) in self.input[&module_id].imports.iter().enumerate() { 284 for (import_id, import_data) in self.input[&module_id].imports.iter() {
285 if self.processed_imports.contains(&(module_id, i)) { 285 if self.processed_imports.contains(&(module_id, import_id)) {
286 // already done 286 // already done
287 continue; 287 continue;
288 } 288 }
289 if self.resolve_import(module_id, import) { 289 if self.resolve_import(module_id, import_id, import_data) {
290 log::debug!("import {:?} resolved (or definite error)", import); 290 log::debug!("import {:?} resolved (or definite error)", import_id);
291 self.processed_imports.insert((module_id, i)); 291 self.processed_imports.insert((module_id, import_id));
292 } 292 }
293 } 293 }
294 } 294 }
295 295
296 fn resolve_import(&mut self, module_id: ModuleId, import: &Import) -> bool { 296 fn resolve_import(
297 &mut self,
298 module_id: ModuleId,
299 import_id: LoweredImport,
300 import: &ImportData,
301 ) -> bool {
297 log::debug!("resolving import: {:?}", import); 302 log::debug!("resolving import: {:?}", import);
298 let ptr = match import.kind { 303 if import.is_glob {
299 ImportKind::Glob => return false, 304 return false;
300 ImportKind::Named(ptr) => ptr,
301 }; 305 };
302 306
303 let mut curr: ModuleId = match import.path.kind { 307 let mut curr: ModuleId = match import.path.kind {
@@ -358,7 +362,7 @@ where
358 self.update(module_id, |items| { 362 self.update(module_id, |items| {
359 let res = Resolution { 363 let res = Resolution {
360 def_id, 364 def_id,
361 import: Some(ptr), 365 import: Some(import_id),
362 }; 366 };
363 items.items.insert(name.clone(), res); 367 items.items.insert(name.clone(), res);
364 }); 368 });
@@ -394,7 +398,7 @@ where
394 self.update(module_id, |items| { 398 self.update(module_id, |items| {
395 let res = Resolution { 399 let res = Resolution {
396 def_id, 400 def_id,
397 import: Some(ptr), 401 import: Some(import_id),
398 }; 402 };
399 items.items.insert(name.clone(), res); 403 items.items.insert(name.clone(), res);
400 }) 404 })