Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/hir-def/src/nameres/collector.rs')
-rw-r--r--crates/hir-def/src/nameres/collector.rs43
1 files changed, 30 insertions, 13 deletions
diff --git a/crates/hir-def/src/nameres/collector.rs b/crates/hir-def/src/nameres/collector.rs
index 96db3db8f0..e09ef4f205 100644
--- a/crates/hir-def/src/nameres/collector.rs
+++ b/crates/hir-def/src/nameres/collector.rs
@@ -221,7 +221,7 @@ struct DefCollector<'a> {
deps: FxHashMap<Name, Dependency>,
glob_imports: FxHashMap<LocalModuleId, Vec<(LocalModuleId, Visibility, UseId)>>,
unresolved_imports: Vec<ImportDirective>,
- indeterminate_imports: Vec<ImportDirective>,
+ indeterminate_imports: Vec<(ImportDirective, PerNs)>,
unresolved_macros: Vec<MacroDirective>,
mod_dirs: FxHashMap<LocalModuleId, ModDir>,
cfg_options: &'a CfgOptions,
@@ -415,16 +415,6 @@ impl DefCollector<'_> {
self.resolution_loop();
- // Resolve all indeterminate resolved imports again
- // As some of the macros will expand newly import shadowing partial resolved imports
- // FIXME: We maybe could skip this, if we handle the indeterminate imports in `resolve_imports`
- // correctly
- let partial_resolved = self.indeterminate_imports.drain(..).map(|directive| {
- ImportDirective { status: PartialResolvedImport::Unresolved, ..directive }
- });
- self.unresolved_imports.extend(partial_resolved);
- self.resolve_imports();
-
let unresolved_imports = mem::take(&mut self.unresolved_imports);
// show unresolved imports in completion, etc
for directive in &unresolved_imports {
@@ -749,9 +739,9 @@ impl DefCollector<'_> {
.filter_map(|mut directive| {
directive.status = self.resolve_import(directive.module_id, &directive.import);
match directive.status {
- PartialResolvedImport::Indeterminate(_) => {
+ PartialResolvedImport::Indeterminate(resolved) => {
self.record_resolved_import(&directive);
- self.indeterminate_imports.push(directive);
+ self.indeterminate_imports.push((directive, resolved));
res = ReachedFixedPoint::No;
None
}
@@ -764,6 +754,33 @@ impl DefCollector<'_> {
}
})
.collect();
+
+ // Resolve all indeterminate resolved imports again
+ // As some of the macros will expand newly import shadowing partial resolved imports
+ // FIXME: We maybe could skip this, if we handle the indeterminate imports in `resolve_imports`
+ // correctly
+ let mut indeterminate_imports = std::mem::take(&mut self.indeterminate_imports);
+ indeterminate_imports.retain_mut(|(directive, partially_resolved)| {
+ let partially_resolved = partially_resolved.availability();
+ directive.status = self.resolve_import(directive.module_id, &directive.import);
+ match directive.status {
+ PartialResolvedImport::Indeterminate(import)
+ if partially_resolved != import.availability() =>
+ {
+ self.record_resolved_import(directive);
+ res = ReachedFixedPoint::No;
+ false
+ }
+ PartialResolvedImport::Resolved(_) => {
+ self.record_resolved_import(directive);
+ res = ReachedFixedPoint::No;
+ false
+ }
+ _ => true,
+ }
+ });
+ self.indeterminate_imports = indeterminate_imports;
+
res
}