@@ -19,6 +19,7 @@ use rustc_data_structures::fx::FxHashSet;
1919use rustc_data_structures:: intern:: Interned ;
2020use rustc_errors:: { codes:: * , pluralize, struct_span_code_err, Applicability , MultiSpan } ;
2121use rustc_hir:: def:: { self , DefKind , PartialRes } ;
22+ use rustc_hir:: def_id:: DefId ;
2223use rustc_middle:: metadata:: ModChild ;
2324use rustc_middle:: metadata:: Reexport ;
2425use rustc_middle:: span_bug;
@@ -250,6 +251,9 @@ struct UnresolvedImportError {
250251 note : Option < String > ,
251252 suggestion : Option < Suggestion > ,
252253 candidates : Option < Vec < ImportSuggestion > > ,
254+ segment : Option < Symbol > ,
255+ /// comes from `PathRes::Failed { module }`
256+ module : Option < DefId > ,
253257}
254258
255259// Reexports of the form `pub use foo as bar;` where `foo` is `extern crate foo;`
@@ -579,16 +583,18 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
579583 & import. kind ,
580584 import. span ,
581585 ) ;
582- let err = UnresolvedImportError {
583- span : import. span ,
584- label : None ,
585- note : None ,
586- suggestion : None ,
587- candidates : None ,
588- } ;
589586 // FIXME: there should be a better way of doing this than
590587 // formatting this as a string then checking for `::`
591588 if path. contains ( "::" ) {
589+ let err = UnresolvedImportError {
590+ span : import. span ,
591+ label : None ,
592+ note : None ,
593+ suggestion : None ,
594+ candidates : None ,
595+ segment : None ,
596+ module : None ,
597+ } ;
592598 errors. push ( ( * import, err) )
593599 }
594600 }
@@ -738,15 +744,11 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
738744 }
739745 }
740746
741- match & import. kind {
742- ImportKind :: Single { source, .. } => {
743- if let Some ( ModuleOrUniformRoot :: Module ( module) ) = import. imported_module . get ( )
744- && let Some ( module) = module. opt_def_id ( )
745- {
746- self . find_cfg_stripped ( & mut diag, & source. name , module)
747- }
748- }
749- _ => { }
747+ if matches ! ( import. kind, ImportKind :: Single { .. } )
748+ && let Some ( segment) = err. segment
749+ && let Some ( module) = err. module
750+ {
751+ self . find_cfg_stripped ( & mut diag, & segment, module)
750752 }
751753 }
752754
@@ -916,10 +918,17 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
916918 span,
917919 label,
918920 suggestion,
921+ module,
922+ segment_name,
919923 ..
920924 } => {
921925 if no_ambiguity {
922926 assert ! ( import. imported_module. get( ) . is_none( ) ) ;
927+ let module = if let Some ( ModuleOrUniformRoot :: Module ( m) ) = module {
928+ m. opt_def_id ( )
929+ } else {
930+ None
931+ } ;
923932 let err = match self . make_path_suggestion (
924933 span,
925934 import. module_path . clone ( ) ,
@@ -935,13 +944,17 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
935944 Applicability :: MaybeIncorrect ,
936945 ) ) ,
937946 candidates : None ,
947+ segment : Some ( segment_name) ,
948+ module,
938949 } ,
939950 None => UnresolvedImportError {
940951 span,
941952 label : Some ( label) ,
942953 note : None ,
943954 suggestion,
944955 candidates : None ,
956+ segment : Some ( segment_name) ,
957+ module,
945958 } ,
946959 } ;
947960 return Some ( err) ;
@@ -990,6 +1003,8 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
9901003 note : None ,
9911004 suggestion : None ,
9921005 candidates : None ,
1006+ segment : None ,
1007+ module : None ,
9931008 } ) ;
9941009 }
9951010 }
@@ -1199,6 +1214,14 @@ impl<'a, 'tcx> Resolver<'a, 'tcx> {
11991214 } else {
12001215 None
12011216 } ,
1217+ module : import. imported_module . get ( ) . and_then ( |module| {
1218+ if let ModuleOrUniformRoot :: Module ( m) = module {
1219+ m. opt_def_id ( )
1220+ } else {
1221+ None
1222+ }
1223+ } ) ,
1224+ segment : Some ( ident. name ) ,
12021225 } )
12031226 } else {
12041227 // `resolve_ident_in_module` reported a privacy error.
0 commit comments