@@ -703,7 +703,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
703703 }
704704 }
705705 } ) ;
706- } else if let Some ( ( span, err) ) = error {
706+ } else if let Some ( ( span, err, note ) ) = error {
707707 errors = true ;
708708
709709 if let SingleImport { source, ref result, .. } = import. subclass {
@@ -733,7 +733,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
733733 & import. subclass ,
734734 span,
735735 ) ;
736- error_vec. push ( ( span, path, err) ) ;
736+ error_vec. push ( ( span, path, err, note ) ) ;
737737 seen_spans. insert ( span) ;
738738 prev_root_id = import. root_id ;
739739 }
@@ -825,27 +825,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
825825 }
826826 }
827827
828- fn throw_unresolved_import_error ( & self , error_vec : Vec < ( Span , String , String ) > ,
829- span : Option < MultiSpan > ) {
828+ fn throw_unresolved_import_error (
829+ & self ,
830+ error_vec : Vec < ( Span , String , String , Option < String > ) > ,
831+ span : Option < MultiSpan > ,
832+ ) {
830833 let max_span_label_msg_count = 10 ; // upper limit on number of span_label message.
831- let ( span, msg) = if error_vec. is_empty ( ) {
832- ( span. unwrap ( ) , "unresolved import" . to_string ( ) )
834+ let ( span, msg, note ) = if error_vec. is_empty ( ) {
835+ ( span. unwrap ( ) , "unresolved import" . to_string ( ) , None )
833836 } else {
834- let span = MultiSpan :: from_spans ( error_vec. clone ( ) . into_iter ( )
835- . map ( |elem : ( Span , String , String ) | { elem. 0 } )
836- . collect ( ) ) ;
837+ let span = MultiSpan :: from_spans (
838+ error_vec. clone ( ) . into_iter ( )
839+ . map ( |elem : ( Span , String , String , Option < String > ) | elem. 0 )
840+ . collect ( )
841+ ) ;
842+
843+ let note: Option < String > = error_vec. clone ( ) . into_iter ( )
844+ . filter_map ( |elem : ( Span , String , String , Option < String > ) | elem. 3 )
845+ . last ( ) ;
846+
837847 let path_vec: Vec < String > = error_vec. clone ( ) . into_iter ( )
838- . map ( |elem : ( Span , String , String ) | { format ! ( "`{}`" , elem. 1 ) } )
848+ . map ( |elem : ( Span , String , String , Option < String > ) | format ! ( "`{}`" , elem. 1 ) )
839849 . collect ( ) ;
840850 let path = path_vec. join ( ", " ) ;
841- let msg = format ! ( "unresolved import{} {}" ,
842- if path_vec. len( ) > 1 { "s" } else { "" } , path) ;
843- ( span, msg)
851+ let msg = format ! (
852+ "unresolved import{} {}" ,
853+ if path_vec. len( ) > 1 { "s" } else { "" } ,
854+ path
855+ ) ;
856+
857+ ( span, msg, note)
844858 } ;
859+
845860 let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
846861 for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
847862 err. span_label ( span_error. 0 , span_error. 2 ) ;
848863 }
864+ if let Some ( note) = note {
865+ err. note ( & note) ;
866+ }
849867 err. emit ( ) ;
850868 }
851869
@@ -941,7 +959,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
941959 }
942960
943961 // If appropriate, returns an error to report.
944- fn finalize_import ( & mut self , directive : & ' b ImportDirective < ' b > ) -> Option < ( Span , String ) > {
962+ fn finalize_import (
963+ & mut self ,
964+ directive : & ' b ImportDirective < ' b >
965+ ) -> Option < ( Span , String , Option < String > ) > {
945966 self . current_module = directive. parent ;
946967 let ImportDirective { ref module_path, span, .. } = * directive;
947968
@@ -964,15 +985,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
964985 return None ;
965986 }
966987 PathResult :: Failed ( span, msg, true ) => {
967- return if let Some ( suggested_path) = self . make_path_suggestion (
988+ return if let Some ( ( suggested_path, note ) ) = self . make_path_suggestion (
968989 span, module_path. clone ( )
969990 ) {
970991 Some ( (
971992 span,
972- format ! ( "Did you mean `{}`?" , Segment :: names_to_string( & suggested_path) )
993+ format ! ( "Did you mean `{}`?" , Segment :: names_to_string( & suggested_path) ) ,
994+ note,
973995 ) )
974996 } else {
975- Some ( ( span, msg) )
997+ Some ( ( span, msg, None ) )
976998 } ;
977999 } ,
9781000 _ => return None ,
@@ -997,8 +1019,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
9971019 if let ModuleOrUniformRoot :: Module ( module) = module {
9981020 if module. def_id ( ) == directive. parent . def_id ( ) {
9991021 // Importing a module into itself is not allowed.
1000- return Some ( ( directive. span ,
1001- "Cannot glob-import a module into itself." . to_string ( ) ) ) ;
1022+ return Some ( (
1023+ directive. span ,
1024+ "Cannot glob-import a module into itself." . to_string ( ) ,
1025+ None ,
1026+ ) ) ;
10021027 }
10031028 }
10041029 if !is_prelude &&
@@ -1096,7 +1121,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
10961121 }
10971122 }
10981123 } ;
1099- Some ( ( span, msg) )
1124+ Some ( ( span, msg, None ) )
11001125 } else {
11011126 // `resolve_ident_in_module` reported a privacy error.
11021127 self . import_dummy_binding ( directive) ;
0 commit comments