@@ -25,7 +25,7 @@ use crate::backtrace::Backtrace;
25
25
use crate :: borrow:: Cow ;
26
26
use crate :: cell;
27
27
use crate :: char;
28
- use crate :: fmt:: { self , Debug , Display } ;
28
+ use crate :: fmt:: { self , Debug , Display , Write } ;
29
29
use crate :: mem:: transmute;
30
30
use crate :: num;
31
31
use crate :: str;
@@ -63,7 +63,7 @@ pub trait Error: Debug + Display {
63
63
///
64
64
/// #[derive(Debug)]
65
65
/// struct SuperError {
66
- /// side : SuperErrorSideKick,
66
+ /// source : SuperErrorSideKick,
67
67
/// }
68
68
///
69
69
/// impl fmt::Display for SuperError {
@@ -74,7 +74,7 @@ pub trait Error: Debug + Display {
74
74
///
75
75
/// impl Error for SuperError {
76
76
/// fn source(&self) -> Option<&(dyn Error + 'static)> {
77
- /// Some(&self.side )
77
+ /// Some(&self.source )
78
78
/// }
79
79
/// }
80
80
///
@@ -90,7 +90,7 @@ pub trait Error: Debug + Display {
90
90
/// impl Error for SuperErrorSideKick {}
91
91
///
92
92
/// fn get_super_error() -> Result<(), SuperError> {
93
- /// Err(SuperError { side : SuperErrorSideKick })
93
+ /// Err(SuperError { source : SuperErrorSideKick })
94
94
/// }
95
95
///
96
96
/// fn main() {
@@ -836,10 +836,6 @@ impl dyn Error + Send + Sync {
836
836
///
837
837
/// impl<'a> Error for SuperError<'a> {}
838
838
///
839
- /// // Note that the error doesn't need to be `Send` or `Sync`.
840
- /// impl<'a> !Send for SuperError<'a> {}
841
- /// impl<'a> !Sync for SuperError<'a> {}
842
- ///
843
839
/// fn main() {
844
840
/// let msg = String::from("Huzzah!");
845
841
/// let error = SuperError { side: &msg };
@@ -883,6 +879,19 @@ where
883
879
self
884
880
}
885
881
882
+ fn backtrace ( & self ) -> Option < & Backtrace > {
883
+ // have to grab the backtrace on the first error directly since that error may not be
884
+ // 'static
885
+ let backtrace = self . error . backtrace ( ) ;
886
+ let backtrace = backtrace. or_else ( || {
887
+ self . error
888
+ . source ( )
889
+ . map ( |source| source. chain ( ) . find_map ( |source| source. backtrace ( ) ) )
890
+ . flatten ( )
891
+ } ) ;
892
+ backtrace
893
+ }
894
+
886
895
/// Format the report as a single line.
887
896
#[ unstable( feature = "error_reporter" , issue = "90172" ) ]
888
897
fn fmt_singleline ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -911,17 +920,17 @@ where
911
920
912
921
for ( ind, error) in cause. chain ( ) . enumerate ( ) {
913
922
writeln ! ( f) ?;
914
-
915
- if multiple {
916
- write ! ( f , "{: >4}: {}" , ind, Indented { source : error } ) ? ;
917
- } else {
918
- write ! ( f , " {}" , error ) ? ;
919
- }
923
+ let mut indented = Indented {
924
+ inner : f ,
925
+ number : if multiple { Some ( ind) } else { None } ,
926
+ started : false ,
927
+ } ;
928
+ write ! ( indented , "{}" , error ) ? ;
920
929
}
921
930
}
922
931
923
932
if self . show_backtrace {
924
- let backtrace = error . backtrace ( ) ;
933
+ let backtrace = self . backtrace ( ) ;
925
934
926
935
if let Some ( backtrace) = backtrace {
927
936
let backtrace = backtrace. to_string ( ) ;
@@ -968,23 +977,34 @@ where
968
977
}
969
978
970
979
/// Wrapper type for indenting the inner source.
971
- struct Indented < D > {
972
- source : D ,
980
+ struct Indented < ' a , D > {
981
+ inner : & ' a mut D ,
982
+ number : Option < usize > ,
983
+ started : bool ,
973
984
}
974
985
975
- impl < D > fmt :: Display for Indented < D >
986
+ impl < T > Write for Indented < ' _ , T >
976
987
where
977
- D : fmt :: Display ,
988
+ T : Write ,
978
989
{
979
- fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
980
- let source = self . source . to_string ( ) ;
981
-
982
- for ( ind, line) in source. trim ( ) . split ( '\n' ) . filter ( |l| !l. is_empty ( ) ) . enumerate ( ) {
983
- if ind > 0 {
984
- write ! ( f, "\n {}" , line) ?;
985
- } else {
986
- write ! ( f, "{}" , line) ?;
990
+ fn write_str ( & mut self , s : & str ) -> fmt:: Result {
991
+ for ( i, line) in s. split ( '\n' ) . enumerate ( ) {
992
+ if !self . started {
993
+ self . started = true ;
994
+ match self . number {
995
+ Some ( number) => write ! ( self . inner, "{: >5}: " , number) ?,
996
+ None => self . inner . write_str ( " " ) ?,
997
+ }
998
+ } else if i > 0 {
999
+ self . inner . write_char ( '\n' ) ?;
1000
+ if self . number . is_some ( ) {
1001
+ self . inner . write_str ( " " ) ?;
1002
+ } else {
1003
+ self . inner . write_str ( " " ) ?;
1004
+ }
987
1005
}
1006
+
1007
+ self . inner . write_str ( line) ?;
988
1008
}
989
1009
990
1010
Ok ( ( ) )
0 commit comments