@@ -25,7 +25,7 @@ use crate::backtrace::Backtrace;
2525use crate :: borrow:: Cow ;
2626use crate :: cell;
2727use crate :: char;
28- use crate :: fmt:: { self , Debug , Display } ;
28+ use crate :: fmt:: { self , Debug , Display , Write } ;
2929use crate :: mem:: transmute;
3030use crate :: num;
3131use crate :: str;
@@ -63,7 +63,7 @@ pub trait Error: Debug + Display {
6363 ///
6464 /// #[derive(Debug)]
6565 /// struct SuperError {
66- /// side : SuperErrorSideKick,
66+ /// source : SuperErrorSideKick,
6767 /// }
6868 ///
6969 /// impl fmt::Display for SuperError {
@@ -74,7 +74,7 @@ pub trait Error: Debug + Display {
7474 ///
7575 /// impl Error for SuperError {
7676 /// fn source(&self) -> Option<&(dyn Error + 'static)> {
77- /// Some(&self.side )
77+ /// Some(&self.source )
7878 /// }
7979 /// }
8080 ///
@@ -90,7 +90,7 @@ pub trait Error: Debug + Display {
9090 /// impl Error for SuperErrorSideKick {}
9191 ///
9292 /// fn get_super_error() -> Result<(), SuperError> {
93- /// Err(SuperError { side : SuperErrorSideKick })
93+ /// Err(SuperError { source : SuperErrorSideKick })
9494 /// }
9595 ///
9696 /// fn main() {
@@ -836,10 +836,6 @@ impl dyn Error + Send + Sync {
836836///
837837/// impl<'a> Error for SuperError<'a> {}
838838///
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- ///
843839/// fn main() {
844840/// let msg = String::from("Huzzah!");
845841/// let error = SuperError { side: &msg };
@@ -883,6 +879,19 @@ where
883879 self
884880 }
885881
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+
886895 /// Format the report as a single line.
887896 #[ unstable( feature = "error_reporter" , issue = "90172" ) ]
888897 fn fmt_singleline ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
@@ -911,17 +920,17 @@ where
911920
912921 for ( ind, error) in cause. chain ( ) . enumerate ( ) {
913922 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 ) ? ;
920929 }
921930 }
922931
923932 if self . show_backtrace {
924- let backtrace = error . backtrace ( ) ;
933+ let backtrace = self . backtrace ( ) ;
925934
926935 if let Some ( backtrace) = backtrace {
927936 let backtrace = backtrace. to_string ( ) ;
@@ -968,23 +977,34 @@ where
968977}
969978
970979/// 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 ,
973984}
974985
975- impl < D > fmt :: Display for Indented < D >
986+ impl < T > Write for Indented < ' _ , T >
976987where
977- D : fmt :: Display ,
988+ T : Write ,
978989{
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+ }
9871005 }
1006+
1007+ self . inner . write_str ( line) ?;
9881008 }
9891009
9901010 Ok ( ( ) )
0 commit comments