@@ -703,7 +703,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
703
703
}
704
704
}
705
705
} ) ;
706
- } else if let Some ( ( span, err) ) = error {
706
+ } else if let Some ( ( span, err, note ) ) = error {
707
707
errors = true ;
708
708
709
709
if let SingleImport { source, ref result, .. } = import. subclass {
@@ -733,7 +733,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
733
733
& import. subclass ,
734
734
span,
735
735
) ;
736
- error_vec. push ( ( span, path, err) ) ;
736
+ error_vec. push ( ( span, path, err, note ) ) ;
737
737
seen_spans. insert ( span) ;
738
738
prev_root_id = import. root_id ;
739
739
}
@@ -825,27 +825,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
825
825
}
826
826
}
827
827
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
+ ) {
830
833
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 )
833
836
} 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
+
837
847
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 ) )
839
849
. collect ( ) ;
840
850
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)
844
858
} ;
859
+
845
860
let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
846
861
for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
847
862
err. span_label ( span_error. 0 , span_error. 2 ) ;
848
863
}
864
+ if let Some ( note) = note {
865
+ err. note ( & note) ;
866
+ }
849
867
err. emit ( ) ;
850
868
}
851
869
@@ -941,7 +959,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
941
959
}
942
960
943
961
// 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 > ) > {
945
966
self . current_module = directive. parent ;
946
967
let ImportDirective { ref module_path, span, .. } = * directive;
947
968
@@ -964,15 +985,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
964
985
return None ;
965
986
}
966
987
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 (
968
989
span, module_path. clone ( )
969
990
) {
970
991
Some ( (
971
992
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,
973
995
) )
974
996
} else {
975
- Some ( ( span, msg) )
997
+ Some ( ( span, msg, None ) )
976
998
} ;
977
999
} ,
978
1000
_ => return None ,
@@ -997,8 +1019,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
997
1019
if let ModuleOrUniformRoot :: Module ( module) = module {
998
1020
if module. def_id ( ) == directive. parent . def_id ( ) {
999
1021
// 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
+ ) ) ;
1002
1027
}
1003
1028
}
1004
1029
if !is_prelude &&
@@ -1096,7 +1121,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
1096
1121
}
1097
1122
}
1098
1123
} ;
1099
- Some ( ( span, msg) )
1124
+ Some ( ( span, msg, None ) )
1100
1125
} else {
1101
1126
// `resolve_ident_in_module` reported a privacy error.
1102
1127
self . import_dummy_binding ( directive) ;
0 commit comments