Update to syn 2
Some checks failed
Build / build (push) Has been cancelled

This commit is contained in:
2025-10-30 16:41:02 +01:00
parent ce1fb4a11e
commit a33a5e80a4
3 changed files with 39 additions and 65 deletions

View File

@@ -18,7 +18,7 @@ proc-macro = true
miniserde = "0.1"
[dependencies]
syn = { version = "1.0", features = ["derive", "full"] }
syn = { version = "2", features = ["derive", "full"] }
quote = "1.0"
proc-macro2 = "1.0"
miniserde = "0.1" # TODO: remove

View File

@@ -1,5 +1,5 @@
use crate::TagType;
use syn::{Attribute, DataEnum, Error, Field, Fields, Lit, Meta, NestedMeta, Result, Variant};
use syn::{Attribute, DataEnum, Error, Field, Fields, LitStr, Result, Variant};
pub(crate) fn tag_type(attrs: &[Attribute], enumeration: &DataEnum) -> Result<TagType> {
let mut tag_type = None;
@@ -7,52 +7,35 @@ pub(crate) fn tag_type(attrs: &[Attribute], enumeration: &DataEnum) -> Result<Ta
let mut content = None;
for attr in attrs {
if !attr.path.is_ident("serde") {
if !attr.path().is_ident("serde") {
continue;
}
let list = match attr.parse_meta()? {
Meta::List(list) => list,
other => return Err(Error::new_spanned(other, "unsupported attribute")),
};
for meta in &list.nested {
match meta {
NestedMeta::Meta(Meta::NameValue(value)) => {
if value.path.is_ident("tag") {
if let Lit::Str(s) = &value.lit {
if tag.is_some() {
return Err(Error::new_spanned(meta, "duplicate tag attribute"));
}
tag = Some(s.value());
continue;
}
} else if value.path.is_ident("content") {
if let Lit::Str(s) = &value.lit {
if content.is_some() {
return Err(Error::new_spanned(
meta,
"duplicate content attribute",
));
}
content = Some(s.value());
continue;
}
}
attr.parse_nested_meta(|meta| {
if meta.path.is_ident("tag") {
let value: LitStr = meta.value()?.parse()?;
if tag.is_some() {
return Err(meta.error("duplicate tag attribute"));
}
NestedMeta::Meta(Meta::Path(path)) => {
if path.is_ident("untagged") {
if tag_type.is_some() {
return Err(Error::new_spanned(meta, "duplicate tag attribute"));
}
tag_type = Some(TagType::Untagged);
continue;
}
}
_ => (),
tag = Some(value.value());
return Ok(());
}
return Err(Error::new_spanned(meta, "unsupported attribute"));
}
if meta.path.is_ident("content") {
let value: LitStr = meta.value()?.parse()?;
if content.is_some() {
return Err(meta.error("duplicate content attribute"));
}
content = Some(value.value());
return Ok(());
}
if meta.path.is_ident("untagged") {
if tag_type.is_some() {
return Err(meta.error("duplicate tag attribute"));
}
tag_type = Some(TagType::Untagged);
return Ok(());
}
Err(meta.error("unsupported attribute"))
})?;
}
if let Some(ty) = tag_type {
return Ok(ty);
@@ -84,29 +67,20 @@ fn attr_rename(attrs: &[Attribute]) -> Result<Option<String>> {
let mut rename = None;
for attr in attrs {
if !attr.path.is_ident("serde") {
if !attr.path().is_ident("serde") {
continue;
}
let list = match attr.parse_meta()? {
Meta::List(list) => list,
other => return Err(Error::new_spanned(other, "unsupported attribute")),
};
for meta in &list.nested {
if let NestedMeta::Meta(Meta::NameValue(value)) = meta {
if value.path.is_ident("rename") {
if let Lit::Str(s) = &value.lit {
if rename.is_some() {
return Err(Error::new_spanned(meta, "duplicate rename attribute"));
}
rename = Some(s.value());
continue;
}
attr.parse_nested_meta(|meta| {
if meta.path.is_ident("rename") {
let value: LitStr = meta.value()?.parse()?;
if rename.is_some() {
return Err(meta.error("duplicate rename attribute"));
}
rename = Some(value.value());
return Ok(());
}
return Err(Error::new_spanned(meta, "unsupported attribute"));
}
Err(meta.error("unsupported attribute"))
})?;
}
Ok(rename)

View File

@@ -1,13 +1,13 @@
use proc_macro2::{Span, TokenStream};
use syn::punctuated::Punctuated;
use syn::{
parse_quote, GenericParam, Generics, Lifetime, LifetimeDef, TypeParamBound, WhereClause,
parse_quote, GenericParam, Generics, Lifetime, LifetimeParam, TypeParamBound, WhereClause,
WherePredicate,
};
pub fn with_lifetime_bound(generics: &Generics, lifetime: &str) -> Generics {
let bound = Lifetime::new(lifetime, Span::call_site());
let def = LifetimeDef {
let def = LifetimeParam {
attrs: Vec::new(),
lifetime: bound.clone(),
colon_token: None,