Skip to content

Commit

Permalink
suggestion for typoed crate or module
Browse files Browse the repository at this point in the history
avoid suggesting the same name

sort candidates

fix a message

use `opt_def_id` instead of `def_id`

move `find_similarly_named_module_or_crate` to rustc_resolve/src/diagnostics.rs
  • Loading branch information
TaKO8Ki committed Oct 13, 2021
1 parent d7539a6 commit f819e6d
Show file tree
Hide file tree
Showing 5 changed files with 109 additions and 1 deletion.
28 changes: 28 additions & 0 deletions compiler/rustc_resolve/src/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1277,6 +1277,34 @@ impl<'a> Resolver<'a> {

err.emit();
}

crate fn find_similarly_named_module_or_crate(
&mut self,
ident: Symbol,
current_module: &Module<'a>,
) -> Option<Symbol> {
let mut candidates = self
.extern_prelude
.iter()
.map(|(ident, _)| ident.name)
.chain(
self.module_map
.iter()
.filter(|(_, module)| {
current_module.is_ancestor_of(module) && !ptr::eq(current_module, *module)
})
.map(|(_, module)| module.kind.name())
.flatten(),
)
.filter(|c| !c.to_string().is_empty())
.collect::<Vec<_>>();
candidates.sort();
candidates.dedup();
match find_best_match_for_name(&candidates, ident, None) {
Some(sugg) if sugg == ident => None,
sugg => sugg,
}
}
}

impl<'a, 'b> ImportResolver<'a, 'b> {
Expand Down
17 changes: 16 additions & 1 deletion compiler/rustc_resolve/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2555,7 +2555,22 @@ impl<'a> Resolver<'a> {

(format!("use of undeclared type `{}`", ident), suggestion)
} else {
(format!("use of undeclared crate or module `{}`", ident), None)
(
format!("use of undeclared crate or module `{}`", ident),
self.find_similarly_named_module_or_crate(
ident.name,
&parent_scope.module,
)
.map(|sugg| {
(
vec![(ident.span, sugg.to_string())],
String::from(
"there is a crate or module with a similar name",
),
Applicability::MaybeIncorrect,
)
}),
)
}
} else {
let parent = path[i - 1].ident.name;
Expand Down
5 changes: 5 additions & 0 deletions src/test/ui/macros/macro-inner-attributes.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,11 @@ error[E0433]: failed to resolve: use of undeclared crate or module `a`
|
LL | a::bar();
| ^ use of undeclared crate or module `a`
|
help: there is a crate or module with a similar name
|
LL | b::bar();
| ~

error: aborting due to previous error

Expand Down
17 changes: 17 additions & 0 deletions src/test/ui/suggestions/crate-or-module-typo.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// edition:2018

use st::cell::Cell; //~ ERROR failed to resolve: use of undeclared crate or module `st`

mod bar {
pub fn bar() { bar::baz(); } //~ ERROR failed to resolve: use of undeclared crate or module `bar`

fn baz() {}
}

use bas::bar; //~ ERROR unresolved import `bas`

struct Foo {
bar: st::cell::Cell<bool> //~ ERROR failed to resolve: use of undeclared crate or module `st`
}

fn main() {}
43 changes: 43 additions & 0 deletions src/test/ui/suggestions/crate-or-module-typo.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
error[E0433]: failed to resolve: use of undeclared crate or module `st`
--> $DIR/crate-or-module-typo.rs:3:5
|
LL | use st::cell::Cell;
| ^^ use of undeclared crate or module `st`
|
help: there is a crate or module with a similar name
|
LL | use std::cell::Cell;
| ~~~

error[E0432]: unresolved import `bas`
--> $DIR/crate-or-module-typo.rs:11:5
|
LL | use bas::bar;
| ^^^ use of undeclared crate or module `bas`
|
help: there is a crate or module with a similar name
|
LL | use bar::bar;
| ~~~

error[E0433]: failed to resolve: use of undeclared crate or module `bar`
--> $DIR/crate-or-module-typo.rs:6:20
|
LL | pub fn bar() { bar::baz(); }
| ^^^ use of undeclared crate or module `bar`

error[E0433]: failed to resolve: use of undeclared crate or module `st`
--> $DIR/crate-or-module-typo.rs:14:10
|
LL | bar: st::cell::Cell<bool>
| ^^ use of undeclared crate or module `st`
|
help: there is a crate or module with a similar name
|
LL | bar: std::cell::Cell<bool>
| ~~~

error: aborting due to 4 previous errors

Some errors have detailed explanations: E0432, E0433.
For more information about an error, try `rustc --explain E0432`.

0 comments on commit f819e6d

Please sign in to comment.