Skip to content

Commit

Permalink
Update to syn 2
Browse files Browse the repository at this point in the history
  • Loading branch information
bash authored and JelteF committed Jun 15, 2024
1 parent ea4fa94 commit 57b6e17
Show file tree
Hide file tree
Showing 6 changed files with 247 additions and 46 deletions.
26 changes: 13 additions & 13 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ proc-macro = true
[dependencies]
proc-macro2 = "1.0"
quote = "1.0"
syn = "1.0.3"
syn = "2"
convert_case = { version = "0.4", optional = true}

[build-dependencies]
Expand Down
60 changes: 38 additions & 22 deletions src/display.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
use std::{fmt::Display, str::FromStr as _};

use crate::syn_compat::{AttributeExt as _, NestedMeta, ParsedMeta};
use proc_macro2::{Ident, Span, TokenStream};
use quote::{quote, quote_spanned};
use syn::{
parse::Parser as _, punctuated::Punctuated, spanned::Spanned as _, Error, Result,
};
use syn::{Expr, ExprLit};

use crate::utils;
use utils::{HashMap, HashSet};
Expand Down Expand Up @@ -220,21 +222,20 @@ impl<'a, 'b> State<'a, 'b> {
&self,
attrs: &[syn::Attribute],
meta_key: &str,
) -> Result<Option<syn::Meta>> {
) -> Result<Option<ParsedMeta>> {
let mut metas = Vec::new();
for meta in attrs.iter().filter_map(|attr| attr.parse_meta().ok()) {
let meta_list = match &meta {
syn::Meta::List(meta) => meta,
ParsedMeta::List(meta) => meta,
_ => continue,
};

if !meta_list.path.is_ident(self.trait_attr) {
continue;
}

use syn::{Meta, NestedMeta};
let meta_nv = match meta_list.nested.first() {
Some(NestedMeta::Meta(Meta::NameValue(meta_nv))) => meta_nv,
Some(NestedMeta::Meta(ParsedMeta::NameValue(meta_nv))) => meta_nv,
_ => {
// If the given attribute is not MetaNameValue, it most likely implies that the
// user is writing an incorrect format. For example:
Expand Down Expand Up @@ -337,20 +338,24 @@ impl<'a, 'b> State<'a, 'b> {
}
fn parse_meta_fmt(
&self,
meta: &syn::Meta,
meta: &ParsedMeta,
outer_enum: bool,
) -> Result<(TokenStream, bool)> {
let list = match meta {
syn::Meta::List(list) => list,
ParsedMeta::List(list) => list,
_ => {
return Err(Error::new(meta.span(), self.get_proper_fmt_syntax()));
}
};

match &list.nested[0] {
syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue {
NestedMeta::Meta(ParsedMeta::NameValue(syn::MetaNameValue {
path,
lit: syn::Lit::Str(fmt),
value:
Expr::Lit(ExprLit {
lit: syn::Lit::Str(fmt),
..
}),
..
})) => match path {
op if op.segments.first().expect("path shouldn't be empty").ident
Expand All @@ -366,10 +371,14 @@ impl<'a, 'b> State<'a, 'b> {
}
// TODO: Check for a single `Display` group?
let fmt_string = match &list.nested[0] {
syn::NestedMeta::Meta(syn::Meta::NameValue(
NestedMeta::Meta(ParsedMeta::NameValue(
syn::MetaNameValue {
path,
lit: syn::Lit::Str(s),
value:
Expr::Lit(ExprLit {
lit: syn::Lit::Str(s),
..
}),
..
},
)) if path
Expand Down Expand Up @@ -403,8 +412,8 @@ impl<'a, 'b> State<'a, 'b> {
.skip(1) // skip fmt = "..."
.try_fold(TokenStream::new(), |args, arg| {
let arg = match arg {
syn::NestedMeta::Lit(syn::Lit::Str(s)) => s,
syn::NestedMeta::Meta(syn::Meta::Path(i)) => {
NestedMeta::Lit(syn::Lit::Str(s)) => s,
NestedMeta::Meta(ParsedMeta::Path(i)) => {
return Ok(quote_spanned!(list.span()=> #args #i,));
}
_ => {
Expand Down Expand Up @@ -586,7 +595,7 @@ impl<'a, 'b> State<'a, 'b> {
let span = meta.span();

let meta = match meta {
syn::Meta::List(meta) => meta.nested,
ParsedMeta::List(meta) => meta.nested,
_ => return Err(Error::new(span, self.get_proper_bound_syntax())),
};

Expand All @@ -595,12 +604,15 @@ impl<'a, 'b> State<'a, 'b> {
}

let meta = match &meta[0] {
syn::NestedMeta::Meta(syn::Meta::NameValue(meta)) => meta,
NestedMeta::Meta(ParsedMeta::NameValue(meta)) => meta,
_ => return Err(Error::new(span, self.get_proper_bound_syntax())),
};

let extra_bounds = match &meta.lit {
syn::Lit::Str(extra_bounds) => extra_bounds,
let extra_bounds = match &meta.value {
Expr::Lit(ExprLit {
lit: syn::Lit::Str(extra_bounds),
..
}) => extra_bounds,
_ => return Err(Error::new(span, self.get_proper_bound_syntax())),
};

Expand All @@ -615,7 +627,7 @@ impl<'a, 'b> State<'a, 'b> {
fn get_used_type_params_bounds(
&self,
fields: &syn::Fields,
meta: &syn::Meta,
meta: &ParsedMeta,
) -> HashMap<syn::Type, HashSet<syn::TraitBound>> {
if self.type_params.is_empty() {
return HashMap::default();
Expand Down Expand Up @@ -645,7 +657,7 @@ impl<'a, 'b> State<'a, 'b> {
}

let list = match meta {
syn::Meta::List(list) => list,
ParsedMeta::List(list) => list,
// This one has been checked already in get_meta_fmt() method.
_ => unreachable!(),
};
Expand All @@ -655,10 +667,10 @@ impl<'a, 'b> State<'a, 'b> {
.skip(1) // skip fmt = "..."
.enumerate()
.filter_map(|(i, arg)| match arg {
syn::NestedMeta::Lit(syn::Lit::Str(ref s)) => {
NestedMeta::Lit(syn::Lit::Str(ref s)) => {
syn::parse_str(&s.value()).ok().map(|id| (i, id))
}
syn::NestedMeta::Meta(syn::Meta::Path(ref id)) => Some((i, id.clone())),
NestedMeta::Meta(ParsedMeta::Path(ref id)) => Some((i, id.clone())),
// This one has been checked already in get_meta_fmt() method.
_ => unreachable!(),
})
Expand All @@ -667,9 +679,13 @@ impl<'a, 'b> State<'a, 'b> {
return HashMap::default();
}
let fmt_string = match &list.nested[0] {
syn::NestedMeta::Meta(syn::Meta::NameValue(syn::MetaNameValue {
NestedMeta::Meta(ParsedMeta::NameValue(syn::MetaNameValue {
path,
lit: syn::Lit::Str(s),
value:
Expr::Lit(ExprLit {
lit: syn::Lit::Str(s),
..
}),
..
})) if path
.segments
Expand Down
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ extern crate proc_macro;
use proc_macro::TokenStream;
use syn::parse::Error as ParseError;

mod syn_compat;
mod utils;

#[cfg(any(feature = "add_assign", feature = "mul_assign"))]
Expand Down
Loading

0 comments on commit 57b6e17

Please sign in to comment.