fix(resolve): report unresolved imports firstly
This commit is contained in:
parent
b95fd857fe
commit
1b18e2a176
3 changed files with 64 additions and 23 deletions
|
@ -475,15 +475,15 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
let indeterminate_imports = mem::take(&mut self.indeterminate_imports);
|
let indeterminate_imports = mem::take(&mut self.indeterminate_imports);
|
||||||
|
|
||||||
for (is_indeterminate, import) in determined_imports
|
for (is_indeterminate, import) in determined_imports
|
||||||
.into_iter()
|
.iter()
|
||||||
.map(|i| (false, i))
|
.map(|i| (false, i))
|
||||||
.chain(indeterminate_imports.into_iter().map(|i| (true, i)))
|
.chain(indeterminate_imports.iter().map(|i| (true, i)))
|
||||||
{
|
{
|
||||||
let unresolved_import_error = self.finalize_import(import);
|
let unresolved_import_error = self.finalize_import(*import);
|
||||||
|
|
||||||
// If this import is unresolved then create a dummy import
|
// If this import is unresolved then create a dummy import
|
||||||
// resolution for it so that later resolve stages won't complain.
|
// resolution for it so that later resolve stages won't complain.
|
||||||
self.import_dummy_binding(import, is_indeterminate);
|
self.import_dummy_binding(*import, is_indeterminate);
|
||||||
|
|
||||||
if let Some(err) = unresolved_import_error {
|
if let Some(err) = unresolved_import_error {
|
||||||
if let ImportKind::Single { source, ref source_bindings, .. } = import.kind {
|
if let ImportKind::Single { source, ref source_bindings, .. } = import.kind {
|
||||||
|
@ -505,27 +505,34 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
|
||||||
errors = vec![];
|
errors = vec![];
|
||||||
}
|
}
|
||||||
if seen_spans.insert(err.span) {
|
if seen_spans.insert(err.span) {
|
||||||
errors.push((import, err));
|
errors.push((*import, err));
|
||||||
prev_root_id = import.root_id;
|
prev_root_id = import.root_id;
|
||||||
}
|
}
|
||||||
} else if is_indeterminate {
|
}
|
||||||
let path = import_path_to_string(
|
}
|
||||||
&import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
|
|
||||||
&import.kind,
|
if !errors.is_empty() {
|
||||||
import.span,
|
self.throw_unresolved_import_error(errors);
|
||||||
);
|
return;
|
||||||
let err = UnresolvedImportError {
|
}
|
||||||
span: import.span,
|
|
||||||
label: None,
|
for import in &indeterminate_imports {
|
||||||
note: None,
|
let path = import_path_to_string(
|
||||||
suggestion: None,
|
&import.module_path.iter().map(|seg| seg.ident).collect::<Vec<_>>(),
|
||||||
candidates: None,
|
&import.kind,
|
||||||
};
|
import.span,
|
||||||
// FIXME: there should be a better way of doing this than
|
);
|
||||||
// formatting this as a string then checking for `::`
|
let err = UnresolvedImportError {
|
||||||
if path.contains("::") {
|
span: import.span,
|
||||||
errors.push((import, err))
|
label: None,
|
||||||
}
|
note: None,
|
||||||
|
suggestion: None,
|
||||||
|
candidates: None,
|
||||||
|
};
|
||||||
|
// FIXME: there should be a better way of doing this than
|
||||||
|
// formatting this as a string then checking for `::`
|
||||||
|
if path.contains("::") {
|
||||||
|
errors.push((*import, err))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
23
tests/ui/imports/issue-81413.rs
Normal file
23
tests/ui/imports/issue-81413.rs
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
pub const ITEM: Item = Item;
|
||||||
|
|
||||||
|
pub struct Item;
|
||||||
|
|
||||||
|
pub fn item() {}
|
||||||
|
|
||||||
|
pub use doesnt_exist::*;
|
||||||
|
//~^ ERROR unresolved import `doesnt_exist`
|
||||||
|
mod a {
|
||||||
|
use crate::{item, Item, ITEM};
|
||||||
|
}
|
||||||
|
|
||||||
|
mod b {
|
||||||
|
use crate::item;
|
||||||
|
use crate::Item;
|
||||||
|
use crate::ITEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
mod c {
|
||||||
|
use crate::item;
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() {}
|
11
tests/ui/imports/issue-81413.stderr
Normal file
11
tests/ui/imports/issue-81413.stderr
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
error[E0432]: unresolved import `doesnt_exist`
|
||||||
|
--> $DIR/issue-81413.rs:7:9
|
||||||
|
|
|
||||||
|
LL | pub use doesnt_exist::*;
|
||||||
|
| ^^^^^^^^^^^^ maybe a missing crate `doesnt_exist`?
|
||||||
|
|
|
||||||
|
= help: consider adding `extern crate doesnt_exist` to use the `doesnt_exist` crate
|
||||||
|
|
||||||
|
error: aborting due to previous error
|
||||||
|
|
||||||
|
For more information about this error, try `rustc --explain E0432`.
|
Loading…
Add table
Add a link
Reference in a new issue