File tree Expand file tree Collapse file tree 5 files changed +109
-1
lines changed
compiler/rustc_resolve/src Expand file tree Collapse file tree 5 files changed +109
-1
lines changed Original file line number Diff line number Diff line change @@ -1277,6 +1277,34 @@ impl<'a> Resolver<'a> {
12771277
12781278 err. emit ( ) ;
12791279 }
1280+
1281+ crate fn find_similarly_named_module_or_crate (
1282+ & mut self ,
1283+ ident : Symbol ,
1284+ current_module : & Module < ' a > ,
1285+ ) -> Option < Symbol > {
1286+ let mut candidates = self
1287+ . extern_prelude
1288+ . iter ( )
1289+ . map ( |( ident, _) | ident. name )
1290+ . chain (
1291+ self . module_map
1292+ . iter ( )
1293+ . filter ( |( _, module) | {
1294+ current_module. is_ancestor_of ( module) && !ptr:: eq ( current_module, * module)
1295+ } )
1296+ . map ( |( _, module) | module. kind . name ( ) )
1297+ . flatten ( ) ,
1298+ )
1299+ . filter ( |c| !c. to_string ( ) . is_empty ( ) )
1300+ . collect :: < Vec < _ > > ( ) ;
1301+ candidates. sort ( ) ;
1302+ candidates. dedup ( ) ;
1303+ match find_best_match_for_name ( & candidates, ident, None ) {
1304+ Some ( sugg) if sugg == ident => None ,
1305+ sugg => sugg,
1306+ }
1307+ }
12801308}
12811309
12821310impl < ' a , ' b > ImportResolver < ' a , ' b > {
Original file line number Diff line number Diff line change @@ -2555,7 +2555,22 @@ impl<'a> Resolver<'a> {
25552555
25562556 ( format ! ( "use of undeclared type `{}`" , ident) , suggestion)
25572557 } else {
2558- ( format ! ( "use of undeclared crate or module `{}`" , ident) , None )
2558+ (
2559+ format ! ( "use of undeclared crate or module `{}`" , ident) ,
2560+ self . find_similarly_named_module_or_crate (
2561+ ident. name ,
2562+ & parent_scope. module ,
2563+ )
2564+ . map ( |sugg| {
2565+ (
2566+ vec ! [ ( ident. span, sugg. to_string( ) ) ] ,
2567+ String :: from (
2568+ "there is a crate or module with a similar name" ,
2569+ ) ,
2570+ Applicability :: MaybeIncorrect ,
2571+ )
2572+ } ) ,
2573+ )
25592574 }
25602575 } else {
25612576 let parent = path[ i - 1 ] . ident . name ;
Original file line number Diff line number Diff line change @@ -3,6 +3,11 @@ error[E0433]: failed to resolve: use of undeclared crate or module `a`
33 |
44LL | a::bar();
55 | ^ use of undeclared crate or module `a`
6+ |
7+ help: there is a crate or module with a similar name
8+ |
9+ LL | b::bar();
10+ | ~
611
712error: aborting due to previous error
813
Original file line number Diff line number Diff line change 1+ // edition:2018
2+
3+ use st:: cell:: Cell ; //~ ERROR failed to resolve: use of undeclared crate or module `st`
4+
5+ mod bar {
6+ pub fn bar ( ) { bar:: baz ( ) ; } //~ ERROR failed to resolve: use of undeclared crate or module `bar`
7+
8+ fn baz ( ) { }
9+ }
10+
11+ use bas:: bar; //~ ERROR unresolved import `bas`
12+
13+ struct Foo {
14+ bar : st:: cell:: Cell < bool > //~ ERROR failed to resolve: use of undeclared crate or module `st`
15+ }
16+
17+ fn main ( ) { }
Original file line number Diff line number Diff line change 1+ error[E0433]: failed to resolve: use of undeclared crate or module `st`
2+ --> $DIR/crate-or-module-typo.rs:3:5
3+ |
4+ LL | use st::cell::Cell;
5+ | ^^ use of undeclared crate or module `st`
6+ |
7+ help: there is a crate or module with a similar name
8+ |
9+ LL | use std::cell::Cell;
10+ | ~~~
11+
12+ error[E0432]: unresolved import `bas`
13+ --> $DIR/crate-or-module-typo.rs:11:5
14+ |
15+ LL | use bas::bar;
16+ | ^^^ use of undeclared crate or module `bas`
17+ |
18+ help: there is a crate or module with a similar name
19+ |
20+ LL | use bar::bar;
21+ | ~~~
22+
23+ error[E0433]: failed to resolve: use of undeclared crate or module `bar`
24+ --> $DIR/crate-or-module-typo.rs:6:20
25+ |
26+ LL | pub fn bar() { bar::baz(); }
27+ | ^^^ use of undeclared crate or module `bar`
28+
29+ error[E0433]: failed to resolve: use of undeclared crate or module `st`
30+ --> $DIR/crate-or-module-typo.rs:14:10
31+ |
32+ LL | bar: st::cell::Cell<bool>
33+ | ^^ use of undeclared crate or module `st`
34+ |
35+ help: there is a crate or module with a similar name
36+ |
37+ LL | bar: std::cell::Cell<bool>
38+ | ~~~
39+
40+ error: aborting due to 4 previous errors
41+
42+ Some errors have detailed explanations: E0432, E0433.
43+ For more information about an error, try `rustc --explain E0432`.
You can’t perform that action at this time.
0 commit comments