Skip to content

Commit 1386a15

Browse files
committed
Update std::error::Report based on feedback
1 parent 32bcb81 commit 1386a15

File tree

2 files changed

+171
-81
lines changed

2 files changed

+171
-81
lines changed

library/std/src/error.rs

+47-27
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ use crate::backtrace::Backtrace;
2525
use crate::borrow::Cow;
2626
use crate::cell;
2727
use crate::char;
28-
use crate::fmt::{self, Debug, Display};
28+
use crate::fmt::{self, Debug, Display, Write};
2929
use crate::mem::transmute;
3030
use crate::num;
3131
use 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>
976987
where
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

Comments
 (0)