From 10d1f640da2ea687c6675f1f79aaf8aae08e26ee Mon Sep 17 00:00:00 2001 From: David Tolnay Date: Sat, 12 Oct 2019 13:35:25 -0700 Subject: [PATCH] Reject source attribute not on a field --- impl/src/valid.rs | 14 ++++++++++++++ tests/ui/unexpected-struct-source.rs | 7 +++++++ tests/ui/unexpected-struct-source.stderr | 5 +++++ 3 files changed, 26 insertions(+) create mode 100644 tests/ui/unexpected-struct-source.rs create mode 100644 tests/ui/unexpected-struct-source.stderr diff --git a/impl/src/valid.rs b/impl/src/valid.rs index d420d04..fca3063 100644 --- a/impl/src/valid.rs +++ b/impl/src/valid.rs @@ -1,4 +1,5 @@ use crate::ast::{Enum, Field, Input, Struct, Variant}; +use crate::attr::Attrs; use syn::{Error, Result}; pub(crate) const CHECKED: &str = "checked in validation"; @@ -14,6 +15,7 @@ impl Input<'_> { impl Struct<'_> { fn validate(&self) -> Result<()> { + check_no_source(&self.attrs)?; find_duplicate_source(&self.fields)?; Ok(()) } @@ -21,6 +23,7 @@ impl Struct<'_> { impl Enum<'_> { fn validate(&self) -> Result<()> { + check_no_source(&self.attrs)?; let has_display = self.has_display(); for variant in &self.variants { variant.validate()?; @@ -37,11 +40,22 @@ impl Enum<'_> { impl Variant<'_> { fn validate(&self) -> Result<()> { + check_no_source(&self.attrs)?; find_duplicate_source(&self.fields)?; Ok(()) } } +fn check_no_source(attrs: &Attrs) -> Result<()> { + if let Some(source) = &attrs.source { + return Err(Error::new_spanned( + source.original, + "not expected here; the #[source] attribute belongs on a specific field", + )); + } + Ok(()) +} + fn find_duplicate_source(fields: &[Field]) -> Result<()> { let mut has_source = false; for field in fields { diff --git a/tests/ui/unexpected-struct-source.rs b/tests/ui/unexpected-struct-source.rs new file mode 100644 index 0000000..f396494 --- /dev/null +++ b/tests/ui/unexpected-struct-source.rs @@ -0,0 +1,7 @@ +use thiserror::Error; + +#[derive(Error, Debug)] +#[source] +pub struct Error; + +fn main() {} diff --git a/tests/ui/unexpected-struct-source.stderr b/tests/ui/unexpected-struct-source.stderr new file mode 100644 index 0000000..f48d554 --- /dev/null +++ b/tests/ui/unexpected-struct-source.stderr @@ -0,0 +1,5 @@ +error: not expected here; the #[source] attribute belongs on a specific field + --> $DIR/unexpected-struct-source.rs:4:1 + | +4 | #[source] + | ^^^^^^^^^