Merge pull request #2396 from dtolnay/msg

Rearrange parts of attr.rs that rustfmt has been refusing to format
This commit is contained in:
David Tolnay 2023-03-09 20:29:50 -08:00 committed by GitHub
commit 0e70f59021
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -375,48 +375,43 @@ impl Container {
syn::Fields::Named(_) => { syn::Fields::Named(_) => {
default.set(word, Default::Default); default.set(word, Default::Default);
} }
syn::Fields::Unnamed(_) | syn::Fields::Unit => cx.error_spanned_by( syn::Fields::Unnamed(_) | syn::Fields::Unit => {
fields, let msg =
"#[serde(default)] can only be used on structs with named fields", "#[serde(default)] can only be used on structs with named fields";
), cx.error_spanned_by(fields, msg);
}
}, },
syn::Data::Enum(syn::DataEnum { enum_token, .. }) => cx.error_spanned_by( syn::Data::Enum(syn::DataEnum { enum_token, .. }) => {
enum_token, let msg = "#[serde(default)] can only be used on structs with named fields";
"#[serde(default)] can only be used on structs with named fields", cx.error_spanned_by(enum_token, msg);
), }
syn::Data::Union(syn::DataUnion { union_token, .. }) => cx.error_spanned_by( syn::Data::Union(syn::DataUnion { union_token, .. }) => {
union_token, let msg = "#[serde(default)] can only be used on structs with named fields";
"#[serde(default)] can only be used on structs with named fields", cx.error_spanned_by(union_token, msg);
), }
}, },
// Parse `#[serde(default = "...")]` // Parse `#[serde(default = "...")]`
Meta(NameValue(m)) if m.path == DEFAULT => { Meta(NameValue(m)) if m.path == DEFAULT => {
if let Ok(path) = parse_lit_into_expr_path(cx, DEFAULT, &m.lit) { if let Ok(path) = parse_lit_into_expr_path(cx, DEFAULT, &m.lit) {
match &item.data { match &item.data {
syn::Data::Struct(syn::DataStruct { fields, .. }) => { syn::Data::Struct(syn::DataStruct { fields, .. }) => match fields {
match fields { syn::Fields::Named(_) => {
syn::Fields::Named(_) => { default.set(&m.path, Default::Path(path));
default.set(&m.path, Default::Path(path));
}
syn::Fields::Unnamed(_) | syn::Fields::Unit => cx
.error_spanned_by(
fields,
"#[serde(default = \"...\")] can only be used on structs with named fields",
),
} }
syn::Fields::Unnamed(_) | syn::Fields::Unit => {
let msg = "#[serde(default = \"...\")] can only be used on structs with named fields";
cx.error_spanned_by(fields, msg);
}
},
syn::Data::Enum(syn::DataEnum { enum_token, .. }) => {
let msg = "#[serde(default = \"...\")] can only be used on structs with named fields";
cx.error_spanned_by(enum_token, msg);
}
syn::Data::Union(syn::DataUnion { union_token, .. }) => {
let msg = "#[serde(default = \"...\")] can only be used on structs with named fields";
cx.error_spanned_by(union_token, msg);
} }
syn::Data::Enum(syn::DataEnum { enum_token, .. }) => cx
.error_spanned_by(
enum_token,
"#[serde(default = \"...\")] can only be used on structs with named fields",
),
syn::Data::Union(syn::DataUnion {
union_token, ..
}) => cx.error_spanned_by(
union_token,
"#[serde(default = \"...\")] can only be used on structs with named fields",
),
} }
} }
} }
@ -443,16 +438,12 @@ impl Container {
untagged.set_true(word); untagged.set_true(word);
} }
syn::Data::Struct(syn::DataStruct { struct_token, .. }) => { syn::Data::Struct(syn::DataStruct { struct_token, .. }) => {
cx.error_spanned_by( let msg = "#[serde(untagged)] can only be used on enums";
struct_token, cx.error_spanned_by(struct_token, msg);
"#[serde(untagged)] can only be used on enums",
);
} }
syn::Data::Union(syn::DataUnion { union_token, .. }) => { syn::Data::Union(syn::DataUnion { union_token, .. }) => {
cx.error_spanned_by( let msg = "#[serde(untagged)] can only be used on enums";
union_token, cx.error_spanned_by(union_token, msg);
"#[serde(untagged)] can only be used on enums",
);
} }
}, },
@ -468,17 +459,13 @@ impl Container {
internal_tag.set(&m.path, s.value()); internal_tag.set(&m.path, s.value());
} }
syn::Fields::Unnamed(_) | syn::Fields::Unit => { syn::Fields::Unnamed(_) | syn::Fields::Unit => {
cx.error_spanned_by( let msg = "#[serde(tag = \"...\")] can only be used on enums and structs with named fields";
fields, cx.error_spanned_by(fields, msg);
"#[serde(tag = \"...\")] can only be used on enums and structs with named fields",
);
} }
}, },
syn::Data::Union(syn::DataUnion { union_token, .. }) => { syn::Data::Union(syn::DataUnion { union_token, .. }) => {
cx.error_spanned_by( let msg = "#[serde(tag = \"...\")] can only be used on enums and structs with named fields";
union_token, cx.error_spanned_by(union_token, msg);
"#[serde(tag = \"...\")] can only be used on enums and structs with named fields",
);
} }
} }
} }
@ -492,16 +479,12 @@ impl Container {
content.set(&m.path, s.value()); content.set(&m.path, s.value());
} }
syn::Data::Struct(syn::DataStruct { struct_token, .. }) => { syn::Data::Struct(syn::DataStruct { struct_token, .. }) => {
cx.error_spanned_by( let msg = "#[serde(content = \"...\")] can only be used on enums";
struct_token, cx.error_spanned_by(struct_token, msg);
"#[serde(content = \"...\")] can only be used on enums",
);
} }
syn::Data::Union(syn::DataUnion { union_token, .. }) => { syn::Data::Union(syn::DataUnion { union_token, .. }) => {
cx.error_spanned_by( let msg = "#[serde(content = \"...\")] can only be used on enums";
union_token, cx.error_spanned_by(union_token, msg);
"#[serde(content = \"...\")] can only be used on enums",
);
} }
} }
} }
@ -569,14 +552,13 @@ impl Container {
.into_token_stream() .into_token_stream()
.to_string() .to_string()
.replace(' ', ""); .replace(' ', "");
cx.error_spanned_by( let msg = format!("unknown serde container attribute `{}`", path);
meta_item.path(), cx.error_spanned_by(meta_item.path(), msg);
format!("unknown serde container attribute `{}`", path),
);
} }
Lit(lit) => { Lit(lit) => {
cx.error_spanned_by(lit, "unexpected literal in serde container attribute"); let msg = "unexpected literal in serde container attribute";
cx.error_spanned_by(lit, msg);
} }
} }
} }
@ -721,10 +703,9 @@ fn decide_tag(
syn::Fields::Named(_) | syn::Fields::Unit => {} syn::Fields::Named(_) | syn::Fields::Unit => {}
syn::Fields::Unnamed(fields) => { syn::Fields::Unnamed(fields) => {
if fields.unnamed.len() != 1 { if fields.unnamed.len() != 1 {
cx.error_spanned_by( let msg =
variant, "#[serde(tag = \"...\")] cannot be used with tuple variants";
"#[serde(tag = \"...\")] cannot be used with tuple variants", cx.error_spanned_by(variant, msg);
);
break; break;
} }
} }
@ -740,10 +721,8 @@ fn decide_tag(
TagType::External // doesn't matter, will error TagType::External // doesn't matter, will error
} }
(None, None, Some((content_tokens, _))) => { (None, None, Some((content_tokens, _))) => {
cx.error_spanned_by( let msg = "#[serde(tag = \"...\", content = \"...\")] must be used together";
content_tokens, cx.error_spanned_by(content_tokens, msg);
"#[serde(tag = \"...\", content = \"...\")] must be used together",
);
TagType::External TagType::External
} }
(Some((untagged_tokens, _)), None, Some((content_tokens, _))) => { (Some((untagged_tokens, _)), None, Some((content_tokens, _))) => {
@ -785,31 +764,23 @@ fn decide_identifier(
(syn::Data::Enum(_), Some(_), None) => Identifier::Field, (syn::Data::Enum(_), Some(_), None) => Identifier::Field,
(syn::Data::Enum(_), None, Some(_)) => Identifier::Variant, (syn::Data::Enum(_), None, Some(_)) => Identifier::Variant,
(syn::Data::Struct(syn::DataStruct { struct_token, .. }), Some(_), None) => { (syn::Data::Struct(syn::DataStruct { struct_token, .. }), Some(_), None) => {
cx.error_spanned_by( let msg = "#[serde(field_identifier)] can only be used on an enum";
struct_token, cx.error_spanned_by(struct_token, msg);
"#[serde(field_identifier)] can only be used on an enum",
);
Identifier::No Identifier::No
} }
(syn::Data::Union(syn::DataUnion { union_token, .. }), Some(_), None) => { (syn::Data::Union(syn::DataUnion { union_token, .. }), Some(_), None) => {
cx.error_spanned_by( let msg = "#[serde(field_identifier)] can only be used on an enum";
union_token, cx.error_spanned_by(union_token, msg);
"#[serde(field_identifier)] can only be used on an enum",
);
Identifier::No Identifier::No
} }
(syn::Data::Struct(syn::DataStruct { struct_token, .. }), None, Some(_)) => { (syn::Data::Struct(syn::DataStruct { struct_token, .. }), None, Some(_)) => {
cx.error_spanned_by( let msg = "#[serde(variant_identifier)] can only be used on an enum";
struct_token, cx.error_spanned_by(struct_token, msg);
"#[serde(variant_identifier)] can only be used on an enum",
);
Identifier::No Identifier::No
} }
(syn::Data::Union(syn::DataUnion { union_token, .. }), None, Some(_)) => { (syn::Data::Union(syn::DataUnion { union_token, .. }), None, Some(_)) => {
cx.error_spanned_by( let msg = "#[serde(variant_identifier)] can only be used on an enum";
union_token, cx.error_spanned_by(union_token, msg);
"#[serde(variant_identifier)] can only be used on an enum",
);
Identifier::No Identifier::No
} }
} }
@ -985,10 +956,8 @@ impl Variant {
borrow.set(m.path(), m.clone()); borrow.set(m.path(), m.clone());
} }
_ => { _ => {
cx.error_spanned_by( let msg = "#[serde(borrow)] may only be used on newtype variants";
variant, cx.error_spanned_by(variant, msg);
"#[serde(borrow)] may only be used on newtype variants",
);
} }
}, },
@ -998,14 +967,13 @@ impl Variant {
.into_token_stream() .into_token_stream()
.to_string() .to_string()
.replace(' ', ""); .replace(' ', "");
cx.error_spanned_by( let msg = format!("unknown serde variant attribute `{}`", path);
meta_item.path(), cx.error_spanned_by(meta_item.path(), msg);
format!("unknown serde variant attribute `{}`", path),
);
} }
Lit(lit) => { Lit(lit) => {
cx.error_spanned_by(lit, "unexpected literal in serde variant attribute"); let msg = "unexpected literal in serde variant attribute";
cx.error_spanned_by(lit, msg);
} }
} }
} }
@ -1277,13 +1245,11 @@ impl Field {
if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) { if let Ok(borrowable) = borrowable_lifetimes(cx, &ident, field) {
for lifetime in &lifetimes { for lifetime in &lifetimes {
if !borrowable.contains(lifetime) { if !borrowable.contains(lifetime) {
cx.error_spanned_by( let msg = format!(
field, "field `{}` does not have lifetime {}",
format!( ident, lifetime,
"field `{}` does not have lifetime {}",
ident, lifetime
),
); );
cx.error_spanned_by(field, msg);
} }
} }
borrowed_lifetimes.set(&m.path, lifetimes); borrowed_lifetimes.set(&m.path, lifetimes);
@ -1309,14 +1275,13 @@ impl Field {
.into_token_stream() .into_token_stream()
.to_string() .to_string()
.replace(' ', ""); .replace(' ', "");
cx.error_spanned_by( let msg = format!("unknown serde field attribute `{}`", path);
meta_item.path(), cx.error_spanned_by(meta_item.path(), msg);
format!("unknown serde field attribute `{}`", path),
);
} }
Lit(lit) => { Lit(lit) => {
cx.error_spanned_by(lit, "unexpected literal in serde field attribute"); let msg = "unexpected literal in serde field attribute";
cx.error_spanned_by(lit, msg);
} }
} }
} }
@ -1499,13 +1464,11 @@ where
} }
_ => { _ => {
cx.error_spanned_by( let msg = format!(
meta, "malformed {0} attribute, expected `{0}(serialize = ..., deserialize = ...)`",
format!( attr_name,
"malformed {0} attribute, expected `{0}(serialize = ..., deserialize = ...)`",
attr_name
),
); );
cx.error_spanned_by(meta, msg);
return Err(()); return Err(());
} }
} }
@ -1569,13 +1532,11 @@ fn get_lit_str2<'a>(
if let syn::Lit::Str(lit) = lit { if let syn::Lit::Str(lit) = lit {
Ok(lit) Ok(lit)
} else { } else {
cx.error_spanned_by( let msg = format!(
lit, "expected serde {} attribute to be a string: `{} = \"...\"`",
format!( attr_name, meta_item_name,
"expected serde {} attribute to be a string: `{} = \"...\"`",
attr_name, meta_item_name
),
); );
cx.error_spanned_by(lit, msg);
Err(()) Err(())
} }
} }
@ -1583,7 +1544,8 @@ fn get_lit_str2<'a>(
fn parse_lit_into_path(cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit) -> Result<syn::Path, ()> { fn parse_lit_into_path(cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit) -> Result<syn::Path, ()> {
let string = get_lit_str(cx, attr_name, lit)?; let string = get_lit_str(cx, attr_name, lit)?;
string.parse().map_err(|_| { string.parse().map_err(|_| {
cx.error_spanned_by(lit, format!("failed to parse path: {:?}", string.value())); let msg = format!("failed to parse path: {:?}", string.value());
cx.error_spanned_by(lit, msg);
}) })
} }
@ -1594,7 +1556,8 @@ fn parse_lit_into_expr_path(
) -> Result<syn::ExprPath, ()> { ) -> Result<syn::ExprPath, ()> {
let string = get_lit_str(cx, attr_name, lit)?; let string = get_lit_str(cx, attr_name, lit)?;
string.parse().map_err(|_| { string.parse().map_err(|_| {
cx.error_spanned_by(lit, format!("failed to parse path: {:?}", string.value())); let msg = format!("failed to parse path: {:?}", string.value());
cx.error_spanned_by(lit, msg);
}) })
} }
@ -1616,10 +1579,8 @@ fn parse_lit_into_ty(cx: &Ctxt, attr_name: Symbol, lit: &syn::Lit) -> Result<syn
let string = get_lit_str(cx, attr_name, lit)?; let string = get_lit_str(cx, attr_name, lit)?;
string.parse().map_err(|_| { string.parse().map_err(|_| {
cx.error_spanned_by( let msg = format!("failed to parse type: {} = {:?}", attr_name, string.value());
lit, cx.error_spanned_by(lit, msg);
format!("failed to parse type: {} = {:?}", attr_name, string.value()),
);
}) })
} }
@ -1637,7 +1598,8 @@ fn parse_lit_into_lifetimes(
while !input.is_empty() { while !input.is_empty() {
let lifetime: Lifetime = input.parse()?; let lifetime: Lifetime = input.parse()?;
if !set.insert(lifetime.clone()) { if !set.insert(lifetime.clone()) {
cx.error_spanned_by(lit, format!("duplicate borrowed lifetime `{}`", lifetime)); let msg = format!("duplicate borrowed lifetime `{}`", lifetime);
cx.error_spanned_by(lit, msg);
} }
if input.is_empty() { if input.is_empty() {
break; break;
@ -1647,17 +1609,16 @@ fn parse_lit_into_lifetimes(
Ok(set) Ok(set)
}) { }) {
return if lifetimes.is_empty() { return if lifetimes.is_empty() {
cx.error_spanned_by(lit, "at least one lifetime must be borrowed"); let msg = "at least one lifetime must be borrowed";
cx.error_spanned_by(lit, msg);
Err(()) Err(())
} else { } else {
Ok(lifetimes) Ok(lifetimes)
}; };
} }
cx.error_spanned_by( let msg = format!("failed to parse borrowed lifetimes: {:?}", string.value());
lit, cx.error_spanned_by(lit, msg);
format!("failed to parse borrowed lifetimes: {:?}", string.value()),
);
Err(()) Err(())
} }
@ -1812,10 +1773,8 @@ fn borrowable_lifetimes(
let mut lifetimes = BTreeSet::new(); let mut lifetimes = BTreeSet::new();
collect_lifetimes(&field.ty, &mut lifetimes); collect_lifetimes(&field.ty, &mut lifetimes);
if lifetimes.is_empty() { if lifetimes.is_empty() {
cx.error_spanned_by( let msg = format!("field `{}` has no lifetimes to borrow", name);
field, cx.error_spanned_by(field, msg);
format!("field `{}` has no lifetimes to borrow", name),
);
Err(()) Err(())
} else { } else {
Ok(lifetimes) Ok(lifetimes)