@@ -700,7 +700,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
700
700
}
701
701
}
702
702
} ) ;
703
- } else if let Some ( ( span, err) ) = error {
703
+ } else if let Some ( ( span, err, note ) ) = error {
704
704
errors = true ;
705
705
706
706
if let SingleImport { source, ref result, .. } = import. subclass {
@@ -728,7 +728,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
728
728
let path = import_path_to_string ( & import. module_path [ ..] ,
729
729
& import. subclass ,
730
730
span) ;
731
- error_vec. push ( ( span, path, err) ) ;
731
+ error_vec. push ( ( span, path, err, note ) ) ;
732
732
seen_spans. insert ( span) ;
733
733
prev_root_id = import. root_id ;
734
734
}
@@ -821,27 +821,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
821
821
}
822
822
}
823
823
824
- fn throw_unresolved_import_error ( & self , error_vec : Vec < ( Span , String , String ) > ,
825
- span : Option < MultiSpan > ) {
824
+ fn throw_unresolved_import_error (
825
+ & self ,
826
+ error_vec : Vec < ( Span , String , String , Option < String > ) > ,
827
+ span : Option < MultiSpan > ,
828
+ ) {
826
829
let max_span_label_msg_count = 10 ; // upper limit on number of span_label message.
827
- let ( span, msg) = if error_vec. is_empty ( ) {
828
- ( span. unwrap ( ) , "unresolved import" . to_string ( ) )
830
+ let ( span, msg, note ) = if error_vec. is_empty ( ) {
831
+ ( span. unwrap ( ) , "unresolved import" . to_string ( ) , None )
829
832
} else {
830
- let span = MultiSpan :: from_spans ( error_vec. clone ( ) . into_iter ( )
831
- . map ( |elem : ( Span , String , String ) | { elem. 0 } )
832
- . collect ( ) ) ;
833
+ let span = MultiSpan :: from_spans (
834
+ error_vec. clone ( ) . into_iter ( )
835
+ . map ( |elem : ( Span , String , String , Option < String > ) | elem. 0 )
836
+ . collect ( )
837
+ ) ;
838
+
839
+ let note: Option < String > = error_vec. clone ( ) . into_iter ( )
840
+ . filter_map ( |elem : ( Span , String , String , Option < String > ) | elem. 3 )
841
+ . last ( ) ;
842
+
833
843
let path_vec: Vec < String > = error_vec. clone ( ) . into_iter ( )
834
- . map ( |elem : ( Span , String , String ) | { format ! ( "`{}`" , elem. 1 ) } )
844
+ . map ( |elem : ( Span , String , String , Option < String > ) | format ! ( "`{}`" , elem. 1 ) )
835
845
. collect ( ) ;
836
846
let path = path_vec. join ( ", " ) ;
837
- let msg = format ! ( "unresolved import{} {}" ,
838
- if path_vec. len( ) > 1 { "s" } else { "" } , path) ;
839
- ( span, msg)
847
+ let msg = format ! (
848
+ "unresolved import{} {}" ,
849
+ if path_vec. len( ) > 1 { "s" } else { "" } ,
850
+ path
851
+ ) ;
852
+
853
+ ( span, msg, note)
840
854
} ;
855
+
841
856
let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
842
857
for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
843
858
err. span_label ( span_error. 0 , span_error. 2 ) ;
844
859
}
860
+ if let Some ( note) = note {
861
+ err. note ( & note) ;
862
+ }
845
863
err. emit ( ) ;
846
864
}
847
865
@@ -936,7 +954,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
936
954
}
937
955
938
956
// If appropriate, returns an error to report.
939
- fn finalize_import ( & mut self , directive : & ' b ImportDirective < ' b > ) -> Option < ( Span , String ) > {
957
+ fn finalize_import (
958
+ & mut self ,
959
+ directive : & ' b ImportDirective < ' b >
960
+ ) -> Option < ( Span , String , Option < String > ) > {
940
961
self . current_module = directive. parent ;
941
962
let ImportDirective { ref module_path, span, .. } = * directive;
942
963
@@ -959,15 +980,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
959
980
return None ;
960
981
}
961
982
PathResult :: Failed ( span, msg, true ) => {
962
- return if let Some ( suggested_path) = self . make_path_suggestion (
983
+ return if let Some ( ( suggested_path, note ) ) = self . make_path_suggestion (
963
984
span, module_path. clone ( )
964
985
) {
965
986
Some ( (
966
987
span,
967
- format ! ( "Did you mean `{}`?" , names_to_string( & suggested_path[ ..] ) )
988
+ format ! ( "Did you mean `{}`?" , names_to_string( & suggested_path[ ..] ) ) ,
989
+ note,
968
990
) )
969
991
} else {
970
- Some ( ( span, msg) )
992
+ Some ( ( span, msg, None ) )
971
993
} ;
972
994
} ,
973
995
_ => return None ,
@@ -992,8 +1014,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
992
1014
if let ModuleOrUniformRoot :: Module ( module) = module {
993
1015
if module. def_id ( ) == directive. parent . def_id ( ) {
994
1016
// Importing a module into itself is not allowed.
995
- return Some ( ( directive. span ,
996
- "Cannot glob-import a module into itself." . to_string ( ) ) ) ;
1017
+ return Some ( (
1018
+ directive. span ,
1019
+ "Cannot glob-import a module into itself." . to_string ( ) ,
1020
+ None ,
1021
+ ) ) ;
997
1022
}
998
1023
}
999
1024
if !is_prelude &&
@@ -1084,7 +1109,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
1084
1109
}
1085
1110
}
1086
1111
} ;
1087
- Some ( ( span, msg) )
1112
+ Some ( ( span, msg, None ) )
1088
1113
} else {
1089
1114
// `resolve_ident_in_module` reported a privacy error.
1090
1115
self . import_dummy_binding ( directive) ;
0 commit comments