mirror of
https://github.com/dtolnay/thiserror.git
synced 2025-04-04 13:27:38 +03:00
more clear duplicate backtrace field logic
This commit is contained in:
parent
5195f7ccfa
commit
7c13c352cd
2 changed files with 25 additions and 5 deletions
|
@ -159,6 +159,7 @@ fn check_field_attrs(fields: &[Field]) -> Result<()> {
|
||||||
let mut source_field = None;
|
let mut source_field = None;
|
||||||
let mut backtrace_field = None;
|
let mut backtrace_field = None;
|
||||||
let mut first_implicit_field = None;
|
let mut first_implicit_field = None;
|
||||||
|
let mut backtrace_type_field = None;
|
||||||
for field in fields {
|
for field in fields {
|
||||||
if let Some(from) = field.attrs.from {
|
if let Some(from) = field.attrs.from {
|
||||||
if from_field.is_some() {
|
if from_field.is_some() {
|
||||||
|
@ -187,6 +188,15 @@ fn check_field_attrs(fields: &[Field]) -> Result<()> {
|
||||||
}
|
}
|
||||||
backtrace_field = Some(field);
|
backtrace_field = Some(field);
|
||||||
}
|
}
|
||||||
|
if field.is_backtrace() {
|
||||||
|
if backtrace_type_field.is_some() {
|
||||||
|
return Err(Error::new_spanned(
|
||||||
|
field.original,
|
||||||
|
"duplicate field having type: `Backtrace`",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
backtrace_type_field = Some(field);
|
||||||
|
}
|
||||||
if let Some(transparent) = field.attrs.transparent {
|
if let Some(transparent) = field.attrs.transparent {
|
||||||
return Err(Error::new_spanned(
|
return Err(Error::new_spanned(
|
||||||
transparent.original,
|
transparent.original,
|
||||||
|
@ -205,6 +215,14 @@ fn check_field_attrs(fields: &[Field]) -> Result<()> {
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if let (Some(a), Some(b)) = (backtrace_field, backtrace_type_field) {
|
||||||
|
if a.member != b.member {
|
||||||
|
return Err(Error::new_spanned(
|
||||||
|
a.original,
|
||||||
|
"only one backtrace field is allowed; found field with #[backtrace] and field with type `Backtrace`",
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
if let Some(from_field) = from_field {
|
if let Some(from_field) = from_field {
|
||||||
let has_unexpected_fields = fields.iter().any(|field| {
|
let has_unexpected_fields = fields.iter().any(|field| {
|
||||||
field.attrs.from.is_none()
|
field.attrs.from.is_none()
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
error: deriving From requires no fields other than source and backtrace
|
error: only one backtrace field is allowed; found field with #[backtrace] and field with type `Backtrace`
|
||||||
--> tests/ui/from-backtrace-backtrace.rs:9:5
|
--> tests/ui/from-backtrace-backtrace.rs:9:5
|
||||||
|
|
|
|
||||||
9 | #[from]
|
9 | / #[from]
|
||||||
| ^^^^^^^
|
10 | | #[backtrace]
|
||||||
|
11 | | std::io::Error,
|
||||||
|
| |__________________^
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue