Merge pull request #2396 from dtolnay/msg
Rearrange parts of attr.rs that rustfmt has been refusing to format
This commit is contained in:
commit
0e70f59021
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user