@@ -707,7 +707,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
707
707
}
708
708
}
709
709
} ) ;
710
- } else if let Some ( ( span, err) ) = error {
710
+ } else if let Some ( ( span, err, note ) ) = error {
711
711
errors = true ;
712
712
713
713
if let SingleImport { source, ref result, .. } = import. subclass {
@@ -735,7 +735,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
735
735
let path = import_path_to_string ( & import. module_path [ ..] ,
736
736
& import. subclass ,
737
737
span) ;
738
- error_vec. push ( ( span, path, err) ) ;
738
+ error_vec. push ( ( span, path, err, note ) ) ;
739
739
seen_spans. insert ( span) ;
740
740
prev_root_id = import. root_id ;
741
741
}
@@ -827,27 +827,45 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
827
827
}
828
828
}
829
829
830
- fn throw_unresolved_import_error ( & self , error_vec : Vec < ( Span , String , String ) > ,
831
- span : Option < MultiSpan > ) {
830
+ fn throw_unresolved_import_error (
831
+ & self ,
832
+ error_vec : Vec < ( Span , String , String , Option < String > ) > ,
833
+ span : Option < MultiSpan > ,
834
+ ) {
832
835
let max_span_label_msg_count = 10 ; // upper limit on number of span_label message.
833
- let ( span, msg) = if error_vec. is_empty ( ) {
834
- ( span. unwrap ( ) , "unresolved import" . to_string ( ) )
836
+ let ( span, msg, note ) = if error_vec. is_empty ( ) {
837
+ ( span. unwrap ( ) , "unresolved import" . to_string ( ) , None )
835
838
} else {
836
- let span = MultiSpan :: from_spans ( error_vec. clone ( ) . into_iter ( )
837
- . map ( |elem : ( Span , String , String ) | { elem. 0 } )
838
- . collect ( ) ) ;
839
+ let span = MultiSpan :: from_spans (
840
+ error_vec. clone ( ) . into_iter ( )
841
+ . map ( |elem : ( Span , String , String , Option < String > ) | elem. 0 )
842
+ . collect ( )
843
+ ) ;
844
+
845
+ let note: Option < String > = error_vec. clone ( ) . into_iter ( )
846
+ . filter_map ( |elem : ( Span , String , String , Option < String > ) | elem. 3 )
847
+ . last ( ) ;
848
+
839
849
let path_vec: Vec < String > = error_vec. clone ( ) . into_iter ( )
840
- . map ( |elem : ( Span , String , String ) | { format ! ( "`{}`" , elem. 1 ) } )
850
+ . map ( |elem : ( Span , String , String , Option < String > ) | format ! ( "`{}`" , elem. 1 ) )
841
851
. collect ( ) ;
842
852
let path = path_vec. join ( ", " ) ;
843
- let msg = format ! ( "unresolved import{} {}" ,
844
- if path_vec. len( ) > 1 { "s" } else { "" } , path) ;
845
- ( span, msg)
853
+ let msg = format ! (
854
+ "unresolved import{} {}" ,
855
+ if path_vec. len( ) > 1 { "s" } else { "" } ,
856
+ path
857
+ ) ;
858
+
859
+ ( span, msg, note)
846
860
} ;
861
+
847
862
let mut err = struct_span_err ! ( self . resolver. session, span, E0432 , "{}" , & msg) ;
848
863
for span_error in error_vec. into_iter ( ) . take ( max_span_label_msg_count) {
849
864
err. span_label ( span_error. 0 , span_error. 2 ) ;
850
865
}
866
+ if let Some ( note) = note {
867
+ err. note ( & note) ;
868
+ }
851
869
err. emit ( ) ;
852
870
}
853
871
@@ -943,7 +961,10 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
943
961
}
944
962
945
963
// If appropriate, returns an error to report.
946
- fn finalize_import ( & mut self , directive : & ' b ImportDirective < ' b > ) -> Option < ( Span , String ) > {
964
+ fn finalize_import (
965
+ & mut self ,
966
+ directive : & ' b ImportDirective < ' b >
967
+ ) -> Option < ( Span , String , Option < String > ) > {
947
968
self . current_module = directive. parent_scope . module ;
948
969
let ImportDirective { ref module_path, span, .. } = * directive;
949
970
@@ -967,15 +988,16 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
967
988
return None ;
968
989
}
969
990
PathResult :: Failed ( span, msg, true ) => {
970
- return if let Some ( suggested_path) = self . make_path_suggestion (
991
+ return if let Some ( ( suggested_path, note ) ) = self . make_path_suggestion (
971
992
span, module_path. clone ( ) , & directive. parent_scope
972
993
) {
973
994
Some ( (
974
995
span,
975
996
format ! ( "Did you mean `{}`?" , names_to_string( & suggested_path[ ..] ) )
997
+ note,
976
998
) )
977
999
} else {
978
- Some ( ( span, msg) )
1000
+ Some ( ( span, msg, None ) )
979
1001
} ;
980
1002
} ,
981
1003
_ => return None ,
@@ -1000,8 +1022,11 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
1000
1022
if let ModuleOrUniformRoot :: Module ( module) = module {
1001
1023
if module. def_id ( ) == directive. parent_scope . module . def_id ( ) {
1002
1024
// Importing a module into itself is not allowed.
1003
- return Some ( ( directive. span ,
1004
- "Cannot glob-import a module into itself." . to_string ( ) ) ) ;
1025
+ return Some ( (
1026
+ directive. span ,
1027
+ "Cannot glob-import a module into itself." . to_string ( ) ,
1028
+ None ,
1029
+ ) ) ;
1005
1030
}
1006
1031
}
1007
1032
if !is_prelude &&
@@ -1099,7 +1124,7 @@ impl<'a, 'b:'a, 'c: 'b> ImportResolver<'a, 'b, 'c> {
1099
1124
}
1100
1125
}
1101
1126
} ;
1102
- Some ( ( span, msg) )
1127
+ Some ( ( span, msg, None ) )
1103
1128
} else {
1104
1129
// `resolve_ident_in_module` reported a privacy error.
1105
1130
self . import_dummy_binding ( directive) ;
0 commit comments