mirror of
https://github.com/danog/strum.git
synced 2024-11-26 20:14:40 +01:00
Update syn to v2 (#261)
This commit is contained in:
parent
67f0d1947d
commit
2b71e10120
@ -23,7 +23,7 @@ heck = "0.4.1"
|
|||||||
proc-macro2 = "1.0"
|
proc-macro2 = "1.0"
|
||||||
quote = "1.0"
|
quote = "1.0"
|
||||||
rustversion = "1.0"
|
rustversion = "1.0"
|
||||||
syn = { version = "1.0", features = ["parsing", "extra-traits"] }
|
syn = { version = "2.0", features = ["parsing", "extra-traits"] }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
strum = "0.24"
|
strum = "0.24"
|
||||||
|
@ -1,12 +1,11 @@
|
|||||||
use proc_macro2::{Span, TokenStream};
|
use proc_macro2::TokenStream;
|
||||||
use syn::{
|
use syn::{
|
||||||
parenthesized,
|
parenthesized,
|
||||||
parse::{Parse, ParseStream},
|
parse::{Parse, ParseStream},
|
||||||
parse2, parse_str,
|
parse2, parse_str,
|
||||||
punctuated::Punctuated,
|
punctuated::Punctuated,
|
||||||
spanned::Spanned,
|
Attribute, DeriveInput, Expr, ExprLit, Ident, Lit, LitBool, LitStr, Meta, MetaNameValue, Path,
|
||||||
Attribute, DeriveInput, Ident, Lit, LitBool, LitStr, Meta, MetaNameValue, Path, Token, Variant,
|
Token, Variant, Visibility,
|
||||||
Visibility,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
use super::case_style::CaseStyle;
|
use super::case_style::CaseStyle;
|
||||||
@ -76,17 +75,6 @@ impl Parse for EnumMeta {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Spanned for EnumMeta {
|
|
||||||
fn span(&self) -> Span {
|
|
||||||
match self {
|
|
||||||
EnumMeta::SerializeAll { kw, .. } => kw.span(),
|
|
||||||
EnumMeta::AsciiCaseInsensitive(kw) => kw.span(),
|
|
||||||
EnumMeta::Crate { kw, .. } => kw.span(),
|
|
||||||
EnumMeta::UsePhf(use_phf) => use_phf.span(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub enum EnumDiscriminantsMeta {
|
pub enum EnumDiscriminantsMeta {
|
||||||
Derive { kw: kw::derive, paths: Vec<Path> },
|
Derive { kw: kw::derive, paths: Vec<Path> },
|
||||||
Name { kw: kw::name, name: Ident },
|
Name { kw: kw::name, name: Ident },
|
||||||
@ -100,7 +88,7 @@ impl Parse for EnumDiscriminantsMeta {
|
|||||||
let kw = input.parse()?;
|
let kw = input.parse()?;
|
||||||
let content;
|
let content;
|
||||||
parenthesized!(content in input);
|
parenthesized!(content in input);
|
||||||
let paths = content.parse_terminated::<_, Token![,]>(Path::parse)?;
|
let paths = content.parse_terminated(Path::parse, Token![,])?;
|
||||||
Ok(EnumDiscriminantsMeta::Derive {
|
Ok(EnumDiscriminantsMeta::Derive {
|
||||||
kw,
|
kw,
|
||||||
paths: paths.into_iter().collect(),
|
paths: paths.into_iter().collect(),
|
||||||
@ -127,17 +115,6 @@ impl Parse for EnumDiscriminantsMeta {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Spanned for EnumDiscriminantsMeta {
|
|
||||||
fn span(&self) -> Span {
|
|
||||||
match self {
|
|
||||||
EnumDiscriminantsMeta::Derive { kw, .. } => kw.span,
|
|
||||||
EnumDiscriminantsMeta::Name { kw, .. } => kw.span,
|
|
||||||
EnumDiscriminantsMeta::Vis { kw, .. } => kw.span,
|
|
||||||
EnumDiscriminantsMeta::Other { path, .. } => path.span(),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait DeriveInputExt {
|
pub trait DeriveInputExt {
|
||||||
/// Get all the strum metadata associated with an enum.
|
/// Get all the strum metadata associated with an enum.
|
||||||
fn get_metadata(&self) -> syn::Result<Vec<EnumMeta>>;
|
fn get_metadata(&self) -> syn::Result<Vec<EnumMeta>>;
|
||||||
@ -228,7 +205,7 @@ impl Parse for VariantMeta {
|
|||||||
let kw = input.parse()?;
|
let kw = input.parse()?;
|
||||||
let content;
|
let content;
|
||||||
parenthesized!(content in input);
|
parenthesized!(content in input);
|
||||||
let props = content.parse_terminated::<_, Token![,]>(Prop::parse)?;
|
let props = content.parse_terminated(Prop::parse, Token![,])?;
|
||||||
Ok(VariantMeta::Props {
|
Ok(VariantMeta::Props {
|
||||||
kw,
|
kw,
|
||||||
props: props
|
props: props
|
||||||
@ -256,22 +233,6 @@ impl Parse for Prop {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Spanned for VariantMeta {
|
|
||||||
fn span(&self) -> Span {
|
|
||||||
match self {
|
|
||||||
VariantMeta::Message { kw, .. } => kw.span,
|
|
||||||
VariantMeta::DetailedMessage { kw, .. } => kw.span,
|
|
||||||
VariantMeta::Documentation { value } => value.span(),
|
|
||||||
VariantMeta::Serialize { kw, .. } => kw.span,
|
|
||||||
VariantMeta::ToString { kw, .. } => kw.span,
|
|
||||||
VariantMeta::Disabled(kw) => kw.span,
|
|
||||||
VariantMeta::Default(kw) => kw.span,
|
|
||||||
VariantMeta::AsciiCaseInsensitive { kw, .. } => kw.span,
|
|
||||||
VariantMeta::Props { kw, .. } => kw.span,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
pub trait VariantExt {
|
pub trait VariantExt {
|
||||||
/// Get all the metadata associated with an enum variant.
|
/// Get all the metadata associated with an enum variant.
|
||||||
fn get_metadata(&self) -> syn::Result<Vec<VariantMeta>>;
|
fn get_metadata(&self) -> syn::Result<Vec<VariantMeta>>;
|
||||||
@ -282,26 +243,32 @@ impl VariantExt for Variant {
|
|||||||
let result = get_metadata_inner("strum", &self.attrs)?;
|
let result = get_metadata_inner("strum", &self.attrs)?;
|
||||||
self.attrs
|
self.attrs
|
||||||
.iter()
|
.iter()
|
||||||
.filter(|attr| attr.path.is_ident("doc"))
|
.filter(|attr| attr.path().is_ident("doc"))
|
||||||
.try_fold(result, |mut vec, attr| {
|
.try_fold(result, |mut vec, attr| {
|
||||||
if let Meta::NameValue(MetaNameValue {
|
if let Meta::NameValue(MetaNameValue {
|
||||||
lit: Lit::Str(value),
|
value:
|
||||||
|
Expr::Lit(ExprLit {
|
||||||
|
lit: Lit::Str(value),
|
||||||
|
..
|
||||||
|
}),
|
||||||
..
|
..
|
||||||
}) = attr.parse_meta()?
|
}) = &attr.meta
|
||||||
{
|
{
|
||||||
vec.push(VariantMeta::Documentation { value })
|
vec.push(VariantMeta::Documentation {
|
||||||
|
value: value.clone(),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
Ok(vec)
|
Ok(vec)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_metadata_inner<'a, T: Parse + Spanned>(
|
fn get_metadata_inner<'a, T: Parse>(
|
||||||
ident: &str,
|
ident: &str,
|
||||||
it: impl IntoIterator<Item = &'a Attribute>,
|
it: impl IntoIterator<Item = &'a Attribute>,
|
||||||
) -> syn::Result<Vec<T>> {
|
) -> syn::Result<Vec<T>> {
|
||||||
it.into_iter()
|
it.into_iter()
|
||||||
.filter(|attr| attr.path.is_ident(ident))
|
.filter(|attr| attr.path().is_ident(ident))
|
||||||
.try_fold(Vec::new(), |mut vec, attr| {
|
.try_fold(Vec::new(), |mut vec, attr| {
|
||||||
vec.extend(attr.parse_args_with(Punctuated::<T, Token![,]>::parse_terminated)?);
|
vec.extend(attr.parse_args_with(Punctuated::<T, Token![,]>::parse_terminated)?);
|
||||||
Ok(vec)
|
Ok(vec)
|
||||||
|
@ -53,14 +53,16 @@ pub fn enum_discriminants_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
|
|||||||
.filter(|attr| {
|
.filter(|attr| {
|
||||||
ATTRIBUTES_TO_COPY
|
ATTRIBUTES_TO_COPY
|
||||||
.iter()
|
.iter()
|
||||||
.any(|attr_whitelisted| attr.path.is_ident(attr_whitelisted))
|
.any(|attr_whitelisted| attr.path().is_ident(attr_whitelisted))
|
||||||
})
|
})
|
||||||
.map(|attr| {
|
.map(|attr| {
|
||||||
if attr.path.is_ident("strum_discriminants") {
|
if attr.path().is_ident("strum_discriminants") {
|
||||||
let passthrough_group = attr
|
let mut ts = attr.meta.require_list()?.to_token_stream().into_iter();
|
||||||
.tokens
|
|
||||||
.clone()
|
// Discard strum_discriminants(...)
|
||||||
.into_iter()
|
let _ = ts.next();
|
||||||
|
|
||||||
|
let passthrough_group = ts
|
||||||
.next()
|
.next()
|
||||||
.ok_or_else(|| strum_discriminants_passthrough_error(attr))?;
|
.ok_or_else(|| strum_discriminants_passthrough_error(attr))?;
|
||||||
let passthrough_attribute = match passthrough_group {
|
let passthrough_attribute = match passthrough_group {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use heck::ToShoutySnakeCase;
|
use heck::ToShoutySnakeCase;
|
||||||
use proc_macro2::{Span, TokenStream};
|
use proc_macro2::{Span, TokenStream};
|
||||||
use quote::{format_ident, quote};
|
use quote::{format_ident, quote, ToTokens};
|
||||||
use syn::{Data, DeriveInput, Fields, PathArguments, Type, TypeParen};
|
use syn::{Data, DeriveInput, Fields, PathArguments, Type, TypeParen};
|
||||||
|
|
||||||
use crate::helpers::{non_enum_error, HasStrumVariantProperties};
|
use crate::helpers::{non_enum_error, HasStrumVariantProperties};
|
||||||
@ -14,8 +14,13 @@ pub fn from_repr_inner(ast: &DeriveInput) -> syn::Result<TokenStream> {
|
|||||||
|
|
||||||
let mut discriminant_type: Type = syn::parse("usize".parse().unwrap()).unwrap();
|
let mut discriminant_type: Type = syn::parse("usize".parse().unwrap()).unwrap();
|
||||||
for attr in attrs {
|
for attr in attrs {
|
||||||
let path = &attr.path;
|
let path = attr.path();
|
||||||
let tokens = &attr.tokens;
|
|
||||||
|
let mut ts = attr.meta.require_list()?.to_token_stream().into_iter();
|
||||||
|
// Discard the path
|
||||||
|
let _ = ts.next();
|
||||||
|
let tokens: TokenStream = ts.collect();
|
||||||
|
|
||||||
if path.leading_colon.is_some() {
|
if path.leading_colon.is_some() {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -80,7 +80,7 @@ pub fn as_static_str_inner(
|
|||||||
let mut generics = ast.generics.clone();
|
let mut generics = ast.generics.clone();
|
||||||
generics
|
generics
|
||||||
.params
|
.params
|
||||||
.push(syn::GenericParam::Lifetime(syn::LifetimeDef::new(
|
.push(syn::GenericParam::Lifetime(syn::LifetimeParam::new(
|
||||||
parse_quote!('_derivative_strum),
|
parse_quote!('_derivative_strum),
|
||||||
)));
|
)));
|
||||||
let (impl_generics2, _, _) = generics.split_for_impl();
|
let (impl_generics2, _, _) = generics.split_for_impl();
|
||||||
|
Loading…
Reference in New Issue
Block a user