From 8469829833277797a0343cd5a96a5346035bde77 Mon Sep 17 00:00:00 2001 From: Taiki Endo Date: Wed, 29 May 2019 19:50:28 +0900 Subject: [PATCH] Remove dependency on smallvec --- core/Cargo.toml | 1 - core/src/auto_enum/args.rs | 17 +++---- core/src/auto_enum/context.rs | 19 ++++--- core/src/auto_enum/traits.rs | 12 ++--- core/src/utils.rs | 3 -- derive/Cargo.toml | 1 - derive/src/derive/core/convert/as_mut.rs | 4 +- derive/src/derive/core/convert/as_ref.rs | 4 +- derive/src/derive/core/fmt/mod.rs | 4 +- derive/src/derive/core/fmt/write.rs | 4 +- derive/src/derive/core/future.rs | 4 +- .../derive/core/iter/double_ended_iterator.rs | 4 +- .../derive/core/iter/exact_size_iterator.rs | 4 +- derive/src/derive/core/iter/extend.rs | 4 +- derive/src/derive/core/iter/fused_iterator.rs | 4 +- derive/src/derive/core/iter/iterator.rs | 4 +- derive/src/derive/core/iter/trusted_len.rs | 4 +- derive/src/derive/core/ops/deref.rs | 4 +- derive/src/derive/core/ops/deref_mut.rs | 4 +- derive/src/derive/core/ops/fn_.rs | 18 +++---- derive/src/derive/core/ops/fn_mut.rs | 18 +++---- derive/src/derive/core/ops/fn_once.rs | 18 +++---- derive/src/derive/core/ops/generator.rs | 4 +- derive/src/derive/core/ops/index.rs | 4 +- derive/src/derive/core/ops/index_mut.rs | 4 +- derive/src/derive/core/ops/range_bounds.rs | 4 +- .../derive/external/futures/async_buf_read.rs | 4 +- .../src/derive/external/futures/async_read.rs | 4 +- .../src/derive/external/futures/async_seek.rs | 4 +- .../derive/external/futures/async_write.rs | 4 +- derive/src/derive/external/futures/sink.rs | 4 +- derive/src/derive/external/futures/stream.rs | 4 +- .../src/derive/external/futures01/future.rs | 4 +- derive/src/derive/external/futures01/sink.rs | 4 +- .../src/derive/external/futures01/stream.rs | 4 +- .../derive/external/proc_macro/to_tokens.rs | 4 +- .../derive/external/rayon/indexed_par_iter.rs | 4 +- .../src/derive/external/rayon/par_extend.rs | 4 +- derive/src/derive/external/rayon/par_iter.rs | 4 +- derive/src/derive/external/serde/serialize.rs | 4 +- derive/src/derive/std/error.rs | 10 ++-- derive/src/derive/std/io/buf_read.rs | 4 +- derive/src/derive/std/io/read.rs | 4 +- derive/src/derive/std/io/seek.rs | 4 +- derive/src/derive/std/io/write.rs | 4 +- derive/src/derive/ty_impls/transpose.rs | 50 +++++++++---------- derive/src/enum_derive/args.rs | 15 +++--- derive/src/enum_derive/mod.rs | 31 ++++++------ derive/src/utils.rs | 3 -- 49 files changed, 170 insertions(+), 186 deletions(-) diff --git a/core/Cargo.toml b/core/Cargo.toml index 7f28a731..8fd62f1f 100644 --- a/core/Cargo.toml +++ b/core/Cargo.toml @@ -21,7 +21,6 @@ proc-macro = true [dependencies] proc-macro2 = "0.4.13" quote = "0.6.8" -smallvec = "0.6.9" syn = { version = "0.15.29", features = ["full", "visit-mut"] } [features] diff --git a/core/src/auto_enum/args.rs b/core/src/auto_enum/args.rs index 32d88926..4a8578ec 100644 --- a/core/src/auto_enum/args.rs +++ b/core/src/auto_enum/args.rs @@ -1,10 +1,7 @@ use proc_macro2::{token_stream::IntoIter, Delimiter, Group, Ident, TokenStream, TokenTree}; use quote::ToTokens; -use smallvec::smallvec; use syn::{Path, Result}; -use crate::utils::Stack; - // ============================================================================= // Arg @@ -80,17 +77,17 @@ macro_rules! arg_err { }; } -pub(super) fn parse_group(group: TokenStream) -> Result<(Stack, Option, bool)> { +pub(super) fn parse_group(group: TokenStream) -> Result<(Vec, Option, bool)> { syn::parse2::(group) .map_err(|e| arg_err!(e)) .and_then(|group| parse_args(group.stream())) } -pub(super) fn parse_args(args: TokenStream) -> Result<(Stack, Option, bool)> { +pub(super) fn parse_args(args: TokenStream) -> Result<(Vec, Option, bool)> { const ERR: &str = "expected one of `,`, `::`, or identifier, found "; let mut iter = args.into_iter(); - let mut args = Stack::new(); + let mut args = Vec::new(); let mut marker = None; let mut never = false; while let Some(tt) = iter.next() { @@ -116,7 +113,7 @@ pub(super) fn parse_args(args: TokenStream) -> Result<(Stack, Option match p.as_char() { ',' => {} - ':' => args.push(parse_path(smallvec![p.into()], &mut iter)?), + ':' => args.push(parse_path(vec![p.into()], &mut iter)?), _ => arg_err!(p, "{}`{}`", ERR, p)?, }, _ => arg_err!(tt, "{}`{}`", ERR, tt)?, @@ -126,7 +123,7 @@ pub(super) fn parse_args(args: TokenStream) -> Result<(Stack, Option, iter: &mut IntoIter) -> Result { +fn parse_path(mut path: Vec, iter: &mut IntoIter) -> Result { for tt in iter { match tt { TokenTree::Punct(ref p) if p.as_char() == ',' => break, @@ -144,7 +141,7 @@ fn path_or_ident(ident: Ident, tt: Option, iter: &mut IntoIter) -> Re None => Ok(Arg::Ident(ident)), Some(TokenTree::Punct(p)) => match p.as_char() { ',' => Ok(Arg::Ident(ident)), - ':' => parse_path(smallvec![ident.into(), p.into()], iter), + ':' => parse_path(vec![ident.into(), p.into()], iter), _ => arg_err!(p, "{}`{}`", ERR, p), }, Some(tt) => arg_err!(tt, "{}`{}`", ERR, tt), @@ -154,7 +151,7 @@ fn path_or_ident(ident: Ident, tt: Option, iter: &mut IntoIter) -> Re fn marker_opt( ident: Ident, iter: &mut IntoIter, - args: &mut Stack, + args: &mut Vec, marker: &mut Option, ) -> Result<()> { match iter.next() { diff --git a/core/src/auto_enum/context.rs b/core/src/auto_enum/context.rs index 1d59397e..904f7c89 100644 --- a/core/src/auto_enum/context.rs +++ b/core/src/auto_enum/context.rs @@ -2,10 +2,9 @@ use std::cell::RefCell; use proc_macro2::{Ident, TokenStream}; use quote::ToTokens; -use smallvec::{smallvec, SmallVec}; use syn::{token, Attribute, Expr, ExprCall, ExprPath, ItemEnum, Macro, Result}; -use crate::utils::{ident, path, Stack}; +use crate::utils::{ident, path}; use super::{ visitor::{Dummy, FindTry, Visitor}, @@ -42,7 +41,7 @@ pub(super) enum VisitLastMode { pub(super) struct Context { /// Span passed to `syn::Error::new_spanned`. span: Option, - pub(super) args: Stack, + pub(super) args: Vec, builder: Builder, pub(super) marker: Marker, // pub(super) depth: usize, @@ -57,7 +56,7 @@ pub(super) struct Context { impl Context { fn new( span: T, - args: Stack, + args: Vec, marker: Option, never: bool, root: bool, @@ -78,14 +77,14 @@ impl Context { pub(super) fn root( span: T, - (args, marker, never): (Stack, Option, bool), + (args, marker, never): (Vec, Option, bool), ) -> Self { Self::new(span, args, marker, never, true) } pub(super) fn child( span: T, - (args, marker, never): (Stack, Option, bool), + (args, marker, never): (Vec, Option, bool), ) -> Self { Self::new(span, args, marker, never, false) } @@ -232,14 +231,14 @@ impl Marker { struct Builder { ident: String, - variants: Stack, + variants: Vec, } impl Builder { fn new() -> Self { Self { ident: format!("___Enum{}", RNG.with(|rng| rng.borrow_mut().next())), - variants: Stack::new(), + variants: Vec::new(), } } @@ -250,8 +249,8 @@ impl Builder { fn next_expr(&mut self, attrs: Vec, expr: Expr) -> Expr { let variant = format!("___Variant{}", self.variants.len()); - let segments: SmallVec<[_; 2]> = - smallvec![ident(&self.ident).into(), ident(&variant).into()]; + let segments = + Some(ident(&self.ident).into()).into_iter().chain(Some(ident(&variant).into())); self.variants.push(variant); diff --git a/core/src/auto_enum/traits.rs b/core/src/auto_enum/traits.rs index 70062dfa..a21a8db4 100644 --- a/core/src/auto_enum/traits.rs +++ b/core/src/auto_enum/traits.rs @@ -7,14 +7,14 @@ use crate::utils::*; use super::Arg; -pub(super) fn collect_impl_traits(args: &mut Stack, ty: &mut Type) { +pub(super) fn collect_impl_traits(args: &mut Vec, ty: &mut Type) { if let Some(traits) = collect(ty) { parse(args, traits); } } -fn collect(ty: &mut Type) -> Option> { - let mut traits = Stack::new(); +fn collect(ty: &mut Type) -> Option> { + let mut traits = Vec::new(); ImplTraits::new(&mut traits).visit_type_mut(ty); if traits.is_empty() { @@ -24,7 +24,7 @@ fn collect(ty: &mut Type) -> Option> { } } -fn parse(args: &mut Stack, traits: Stack) { +fn parse(args: &mut Vec, traits: Vec) { traits.into_iter().map(Arg::from).for_each(|t| { if !args.contains(&t) && TRAITS.contains(&&*t.to_trimed_string()) { args.push(t); @@ -33,11 +33,11 @@ fn parse(args: &mut Stack, traits: Stack) { } struct ImplTraits<'a> { - traits: &'a mut Stack, + traits: &'a mut Vec, } impl<'a> ImplTraits<'a> { - fn new(traits: &'a mut Stack) -> Self { + fn new(traits: &'a mut Vec) -> Self { Self { traits } } } diff --git a/core/src/utils.rs b/core/src/utils.rs index 82b87827..5f4b7bd0 100644 --- a/core/src/utils.rs +++ b/core/src/utils.rs @@ -1,14 +1,11 @@ use std::mem; use proc_macro2::{Ident, Span, TokenStream}; -use smallvec::SmallVec; use syn::{ punctuated::Punctuated, token, Block, Expr, ExprBlock, ExprTuple, ExprVerbatim, Path, PathSegment, Stmt, }; -pub(crate) type Stack = SmallVec<[T; 4]>; - // ============================================================================= // Extension traits diff --git a/derive/Cargo.toml b/derive/Cargo.toml index b4acf7bc..3181fc16 100644 --- a/derive/Cargo.toml +++ b/derive/Cargo.toml @@ -23,7 +23,6 @@ derive_utils = { version = "0.7.1" } lazy_static = "1.2" proc-macro2 = "0.4.13" quote = "0.6.8" -smallvec = "0.6.9" syn = { version = "0.15.29", features = ["full"] } [features] diff --git a/derive/src/derive/core/convert/as_mut.rs b/derive/src/derive/core/convert/as_mut.rs index 8d87f1cd..ab1a3dd3 100644 --- a/derive/src/derive/core/convert/as_mut.rs +++ b/derive/src/derive/core/convert/as_mut.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["AsMut"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::convert::AsMut)?, @@ -13,5 +13,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/convert/as_ref.rs b/derive/src/derive/core/convert/as_ref.rs index f0e8f623..11cc4e76 100644 --- a/derive/src/derive/core/convert/as_ref.rs +++ b/derive/src/derive/core/convert/as_ref.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["AsRef"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::convert::AsRef)?, @@ -13,5 +13,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/fmt/mod.rs b/derive/src/derive/core/fmt/mod.rs index 05ae5431..09d4799b 100644 --- a/derive/src/derive/core/fmt/mod.rs +++ b/derive/src/derive/core/fmt/mod.rs @@ -5,7 +5,7 @@ macro_rules! fmt_impl { pub(crate) const NAME: &[&str] = &[$($name),*]; - pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { + pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::fmt::$Trait)?, @@ -16,7 +16,7 @@ macro_rules! fmt_impl { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } } }; diff --git a/derive/src/derive/core/fmt/write.rs b/derive/src/derive/core/fmt/write.rs index 939e8eb8..ef2220a3 100644 --- a/derive/src/derive/core/fmt/write.rs +++ b/derive/src/derive/core/fmt/write.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["fmt::Write"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::fmt::Write)?, @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/future.rs b/derive/src/derive/core/future.rs index 9501f350..59fa354c 100644 --- a/derive/src/derive/core/future.rs +++ b/derive/src/derive/core/future.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Future"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::future::Future)?, @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/iter/double_ended_iterator.rs b/derive/src/derive/core/iter/double_ended_iterator.rs index 1da43245..ee137737 100644 --- a/derive/src/derive/core/iter/double_ended_iterator.rs +++ b/derive/src/derive/core/iter/double_ended_iterator.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["DoubleEndedIterator"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { #[cfg(feature = "try_trait")] let try_trait = quote! { #[inline] @@ -36,5 +36,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/iter/exact_size_iterator.rs b/derive/src/derive/core/iter/exact_size_iterator.rs index 33006c15..1e45a142 100644 --- a/derive/src/derive/core/iter/exact_size_iterator.rs +++ b/derive/src/derive/core/iter/exact_size_iterator.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["ExactSizeIterator"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { #[cfg(not(feature = "exact_size_is_empty"))] let is_empty = quote!(); #[cfg(feature = "exact_size_is_empty")] @@ -23,5 +23,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/iter/extend.rs b/derive/src/derive/core/iter/extend.rs index 8db945dc..f0680235 100644 --- a/derive/src/derive/core/iter/extend.rs +++ b/derive/src/derive/core/iter/extend.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Extend"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::iter::Extend)?, @@ -13,5 +13,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/iter/fused_iterator.rs b/derive/src/derive/core/iter/fused_iterator.rs index a059c018..25afbfc1 100644 --- a/derive/src/derive/core/iter/fused_iterator.rs +++ b/derive/src/derive/core/iter/fused_iterator.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["FusedIterator"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, Some(ident("Item")), @@ -11,5 +11,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { trait FusedIterator: ::core::iter::Iterator {} }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/iter/iterator.rs b/derive/src/derive/core/iter/iterator.rs index a83774fb..0681cbd0 100644 --- a/derive/src/derive/core/iter/iterator.rs +++ b/derive/src/derive/core/iter/iterator.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Iterator"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { #[cfg(feature = "try_trait")] let try_trait = quote! { #[inline] @@ -68,5 +68,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/iter/trusted_len.rs b/derive/src/derive/core/iter/trusted_len.rs index 41ab9728..e6ed08f2 100644 --- a/derive/src/derive/core/iter/trusted_len.rs +++ b/derive/src/derive/core/iter/trusted_len.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["TrustedLen"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, Some(ident("Item")), @@ -11,5 +11,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { unsafe trait TrustedLen: ::core::iter::Iterator {} }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/ops/deref.rs b/derive/src/derive/core/ops/deref.rs index 66f4601b..c00830b4 100644 --- a/derive/src/derive/core/ops/deref.rs +++ b/derive/src/derive/core/ops/deref.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Deref"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::ops::Deref)?, @@ -14,5 +14,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/ops/deref_mut.rs b/derive/src/derive/core/ops/deref_mut.rs index c6df895c..19e926bc 100644 --- a/derive/src/derive/core/ops/deref_mut.rs +++ b/derive/src/derive/core/ops/deref_mut.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["DerefMut"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, Some(ident("Target")), @@ -14,5 +14,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/ops/fn_.rs b/derive/src/derive/core/ops/fn_.rs index 84e05a30..b6b819d0 100644 --- a/derive/src/derive/core/ops/fn_.rs +++ b/derive/src/derive/core/ops/fn_.rs @@ -2,29 +2,29 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Fn"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let trait_path = quote!(::core::ops::Fn); let trait_ = quote!(#trait_path(__T) -> __U); let fst = data.fields().iter().next(); - let mut impls = data.impl_with_capacity(1)?; + let mut impl_ = data.impl_with_capacity(1)?; - *impls.trait_() = + *impl_.trait_() = Some(Trait::new(syn::parse2(trait_path.clone())?, parse_quote!(#trait_path<(__T,)>)?)); - impls.push_generic_param(param_ident("__T")); - impls.push_generic_param(param_ident("__U")); + impl_.push_generic_param(param_ident("__T")); + impl_.push_generic_param(param_ident("__U")); - impls.push_where_predicate(parse_quote!(#fst: #trait_)?); + impl_.push_where_predicate(parse_quote!(#fst: #trait_)?); data.fields() .iter() .skip(1) - .try_for_each(|f| parse_quote!(#f: #trait_).map(|f| impls.push_where_predicate(f)))?; + .try_for_each(|f| parse_quote!(#f: #trait_).map(|f| impl_.push_where_predicate(f)))?; - impls.push_method(parse_quote! { + impl_.push_method(parse_quote! { #[inline] extern "rust-call" fn call(&self, args: (__T,)) -> Self::Output; }?)?; - stack.push(impls.build_item()); + items.push(impl_.build_item()); Ok(()) } diff --git a/derive/src/derive/core/ops/fn_mut.rs b/derive/src/derive/core/ops/fn_mut.rs index 3ab33300..539a2df5 100644 --- a/derive/src/derive/core/ops/fn_mut.rs +++ b/derive/src/derive/core/ops/fn_mut.rs @@ -2,29 +2,29 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["FnMut"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let trait_path = quote!(::core::ops::FnMut); let trait_ = quote!(#trait_path(__T) -> __U); let fst = data.fields().iter().next(); - let mut impls = data.impl_with_capacity(1)?; + let mut impl_ = data.impl_with_capacity(1)?; - *impls.trait_() = + *impl_.trait_() = Some(Trait::new(syn::parse2(trait_path.clone())?, parse_quote!(#trait_path<(__T,)>)?)); - impls.push_generic_param(param_ident("__T")); - impls.push_generic_param(param_ident("__U")); + impl_.push_generic_param(param_ident("__T")); + impl_.push_generic_param(param_ident("__U")); - impls.push_where_predicate(parse_quote!(#fst: #trait_)?); + impl_.push_where_predicate(parse_quote!(#fst: #trait_)?); data.fields() .iter() .skip(1) - .try_for_each(|f| parse_quote!(#f: #trait_).map(|f| impls.push_where_predicate(f)))?; + .try_for_each(|f| parse_quote!(#f: #trait_).map(|f| impl_.push_where_predicate(f)))?; - impls.push_method(parse_quote! { + impl_.push_method(parse_quote! { #[inline] extern "rust-call" fn call_mut(&mut self, args: (__T,)) -> Self::Output; }?)?; - stack.push(impls.build_item()); + items.push(impl_.build_item()); Ok(()) } diff --git a/derive/src/derive/core/ops/fn_once.rs b/derive/src/derive/core/ops/fn_once.rs index 264b7cc2..ca46ecc0 100644 --- a/derive/src/derive/core/ops/fn_once.rs +++ b/derive/src/derive/core/ops/fn_once.rs @@ -2,25 +2,25 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["FnOnce"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let trait_path = quote!(::core::ops::FnOnce); let trait_ = quote!(#trait_path(__T) -> __U); let fst = data.fields().iter().next(); - let mut impls = data.impl_with_capacity(2)?; + let mut impl_ = data.impl_with_capacity(2)?; - *impls.trait_() = + *impl_.trait_() = Some(Trait::new(syn::parse2(trait_path.clone())?, parse_quote!(#trait_path<(__T,)>)?)); - impls.push_generic_param(param_ident("__T")); - impls.push_generic_param(param_ident("__U")); + impl_.push_generic_param(param_ident("__T")); + impl_.push_generic_param(param_ident("__U")); - impls.push_where_predicate(parse_quote!(#fst: #trait_)?); + impl_.push_where_predicate(parse_quote!(#fst: #trait_)?); data.fields() .iter() .skip(1) - .try_for_each(|f| parse_quote!(#f: #trait_).map(|f| impls.push_where_predicate(f)))?; + .try_for_each(|f| parse_quote!(#f: #trait_).map(|f| impl_.push_where_predicate(f)))?; - impls.append_items_from_trait(parse_quote! { + impl_.append_items_from_trait(parse_quote! { trait FnOnce { type Output; #[inline] @@ -28,6 +28,6 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?)?; - stack.push(impls.build_item()); + items.push(impl_.build_item()); Ok(()) } diff --git a/derive/src/derive/core/ops/generator.rs b/derive/src/derive/core/ops/generator.rs index fc63a84f..61d66a92 100644 --- a/derive/src/derive/core/ops/generator.rs +++ b/derive/src/derive/core/ops/generator.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Generator"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::ops::Generator)?, @@ -15,5 +15,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/ops/index.rs b/derive/src/derive/core/ops/index.rs index cbeabe15..5f9f1336 100644 --- a/derive/src/derive/core/ops/index.rs +++ b/derive/src/derive/core/ops/index.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Index"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::ops::Index)?, @@ -14,5 +14,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/ops/index_mut.rs b/derive/src/derive/core/ops/index_mut.rs index 37a5b2b5..def881ee 100644 --- a/derive/src/derive/core/ops/index_mut.rs +++ b/derive/src/derive/core/ops/index_mut.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["IndexMut"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, Some(ident("Output")), @@ -14,5 +14,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/core/ops/range_bounds.rs b/derive/src/derive/core/ops/range_bounds.rs index 25e60e55..d6f88fd0 100644 --- a/derive/src/derive/core/ops/range_bounds.rs +++ b/derive/src/derive/core/ops/range_bounds.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["RangeBounds"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::core::ops::RangeBounds)?, @@ -15,5 +15,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures/async_buf_read.rs b/derive/src/derive/external/futures/async_buf_read.rs index 7437b5de..944f2d51 100644 --- a/derive/src/derive/external/futures/async_buf_read.rs +++ b/derive/src/derive/external/futures/async_buf_read.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures::AsyncBufRead"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let io = quote!(::futures::io); derive_trait!( @@ -20,5 +20,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures/async_read.rs b/derive/src/derive/external/futures/async_read.rs index 00889cc9..9b9adfcc 100644 --- a/derive/src/derive/external/futures/async_read.rs +++ b/derive/src/derive/external/futures/async_read.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures::AsyncRead"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let io = quote!(::futures::io); derive_trait!( @@ -27,5 +27,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures/async_seek.rs b/derive/src/derive/external/futures/async_seek.rs index ad9097bc..293722ec 100644 --- a/derive/src/derive/external/futures/async_seek.rs +++ b/derive/src/derive/external/futures/async_seek.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures::AsyncSeek"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let io = quote!(::futures::io); derive_trait!( @@ -19,5 +19,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures/async_write.rs b/derive/src/derive/external/futures/async_write.rs index ab675dbc..abdeafbb 100644 --- a/derive/src/derive/external/futures/async_write.rs +++ b/derive/src/derive/external/futures/async_write.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures::AsyncWrite"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let io = quote!(::futures::io); derive_trait!( @@ -35,5 +35,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures/sink.rs b/derive/src/derive/external/futures/sink.rs index fd29f3af..344150ab 100644 --- a/derive/src/derive/external/futures/sink.rs +++ b/derive/src/derive/external/futures/sink.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures::Sink"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::futures::sink::Sink)?, @@ -32,5 +32,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures/stream.rs b/derive/src/derive/external/futures/stream.rs index cebb6dcd..97b4bb94 100644 --- a/derive/src/derive/external/futures/stream.rs +++ b/derive/src/derive/external/futures/stream.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures::Stream"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::futures::stream::Stream)?, @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures01/future.rs b/derive/src/derive/external/futures01/future.rs index 60279309..c0f95f73 100644 --- a/derive/src/derive/external/futures01/future.rs +++ b/derive/src/derive/external/futures01/future.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures01::Future"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let crate_ = quote!(::futures); derive_trait!( @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures01/sink.rs b/derive/src/derive/external/futures01/sink.rs index e98211dc..ec8407be 100644 --- a/derive/src/derive/external/futures01/sink.rs +++ b/derive/src/derive/external/futures01/sink.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures01::Sink"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let crate_ = quote!(::futures); derive_trait!( @@ -21,5 +21,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/futures01/stream.rs b/derive/src/derive/external/futures01/stream.rs index cdeb4ffa..6ab60093 100644 --- a/derive/src/derive/external/futures01/stream.rs +++ b/derive/src/derive/external/futures01/stream.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["futures01::Stream"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let crate_ = quote!(::futures); derive_trait!( @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/proc_macro/to_tokens.rs b/derive/src/derive/external/proc_macro/to_tokens.rs index b8594b05..eb306981 100644 --- a/derive/src/derive/external/proc_macro/to_tokens.rs +++ b/derive/src/derive/external/proc_macro/to_tokens.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["quote::ToTokens"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let crate_ = quote!(::quote); derive_trait!( @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/rayon/indexed_par_iter.rs b/derive/src/derive/external/rayon/indexed_par_iter.rs index e9785519..36fca3eb 100644 --- a/derive/src/derive/external/rayon/indexed_par_iter.rs +++ b/derive/src/derive/external/rayon/indexed_par_iter.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["rayon::IndexedParallelIterator"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let iter = quote!(::rayon::iter); derive_trait!( @@ -24,5 +24,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/rayon/par_extend.rs b/derive/src/derive/external/rayon/par_extend.rs index 0b0e9c97..4efee6df 100644 --- a/derive/src/derive/external/rayon/par_extend.rs +++ b/derive/src/derive/external/rayon/par_extend.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["rayon::ParallelExtend"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let iter = quote!(::rayon::iter); derive_trait!( @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/rayon/par_iter.rs b/derive/src/derive/external/rayon/par_iter.rs index b515b836..8e5adfa4 100644 --- a/derive/src/derive/external/rayon/par_iter.rs +++ b/derive/src/derive/external/rayon/par_iter.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["rayon::ParallelIterator"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let iter = quote!(::rayon::iter); derive_trait!( @@ -20,5 +20,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/external/serde/serialize.rs b/derive/src/derive/external/serde/serialize.rs index eb2bbfa9..1cc41f13 100644 --- a/derive/src/derive/external/serde/serialize.rs +++ b/derive/src/derive/external/serde/serialize.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["serde::Serialize"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let ser = quote!(::serde::ser); derive_trait!( @@ -17,5 +17,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/std/error.rs b/derive/src/derive/std/error.rs index 05601384..c6dd3ebf 100644 --- a/derive/src/derive/std/error.rs +++ b/derive/src/derive/std/error.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Error"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { let ident = data.ident(); let source = data.variants().iter().map(|v| quote!(#ident::#v(x) => ::std::option::Option::Some(x))); @@ -13,7 +13,7 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?; - let mut impls = data.impl_trait_with_capacity( + let mut impl_ = data.impl_trait_with_capacity( 2, parse_quote!(::std::error::Error)?, None, @@ -26,9 +26,9 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { data.fields() .iter() - .try_for_each(|f| parse_quote!(#f: 'static).map(|f| impls.push_where_predicate(f)))?; - impls.push_item(source); + .try_for_each(|f| parse_quote!(#f: 'static).map(|f| impl_.push_where_predicate(f)))?; + impl_.push_item(source); - stack.push(impls.build_item()); + items.push(impl_.build_item()); Ok(()) } diff --git a/derive/src/derive/std/io/buf_read.rs b/derive/src/derive/std/io/buf_read.rs index 3b9038ce..d6a573fb 100644 --- a/derive/src/derive/std/io/buf_read.rs +++ b/derive/src/derive/std/io/buf_read.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["BufRead", "io::BufRead"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::std::io::BufRead)?, @@ -19,5 +19,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/std/io/read.rs b/derive/src/derive/std/io/read.rs index acd4d0ea..fa48ac8a 100644 --- a/derive/src/derive/std/io/read.rs +++ b/derive/src/derive/std/io/read.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Read", "io::Read"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { #[cfg(not(stable_1_36))] let vectored = quote!(); #[cfg(stable_1_36)] @@ -37,5 +37,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/std/io/seek.rs b/derive/src/derive/std/io/seek.rs index cc7952c6..3048d67d 100644 --- a/derive/src/derive/std/io/seek.rs +++ b/derive/src/derive/std/io/seek.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Seek", "io::Seek"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { derive_trait!( data, parse_quote!(::std::io::Seek)?, @@ -13,5 +13,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/std/io/write.rs b/derive/src/derive/std/io/write.rs index eaba502a..38602e21 100644 --- a/derive/src/derive/std/io/write.rs +++ b/derive/src/derive/std/io/write.rs @@ -2,7 +2,7 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Write", "io::Write"]; -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { #[cfg(not(stable_1_36))] let vectored = quote!(); #[cfg(stable_1_36)] @@ -28,5 +28,5 @@ pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { } }?, ) - .map(|item| stack.push(item)) + .map(|item| items.push(item)) } diff --git a/derive/src/derive/ty_impls/transpose.rs b/derive/src/derive/ty_impls/transpose.rs index 6391f0fa..616a1772 100644 --- a/derive/src/derive/ty_impls/transpose.rs +++ b/derive/src/derive/ty_impls/transpose.rs @@ -5,13 +5,13 @@ use crate::utils::*; pub(crate) const NAME: &[&str] = &["Transpose"]; // Implementing this with `Into` requires many type annotations. -pub(crate) fn derive(data: &Data, stack: &mut Stack) -> Result<()> { +pub(crate) fn derive(data: &Data, items: &mut Vec) -> Result<()> { check_fields(data)?; - stack.push(transpose_option(data)?); - stack.push(transpose_result(data)?); - stack.push(transpose_ok(data)?); - stack.push(transpose_err(data)?); + items.push(transpose_option(data)?); + items.push(transpose_result(data)?); + items.push(transpose_ok(data)?); + items.push(transpose_err(data)?); Ok(()) } @@ -31,32 +31,32 @@ fn transpose_option(data: &Data) -> Result { let ident = data.ident(); let fields = data.fields(); - let mut impls = data.impl_with_capacity(1)?; + let mut items = data.impl_with_capacity(1)?; let ty_generics = fields.iter().map(|f| quote!(::core::option::Option<#f>)); - *impls.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; + *items.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; let transpose = data.variants().iter().map(|v| quote!(#ident::#v(x) => x.map(#ident::#v))); - impls.push_item(parse_quote! { + items.push_item(parse_quote! { #[inline] fn transpose(self) -> ::core::option::Option<#ident<#(#fields),*>> { match self { #(#transpose,)* } } }?); - Ok(impls.build_item()) + Ok(items.build_item()) } fn transpose_result(data: &Data) -> Result { let fields = data.fields(); - let mut impls = data.impl_with_capacity(1)?; + let mut items = data.impl_with_capacity(1)?; - let err_fields: &Stack<_> = &(0..fields.len()) + let err_fields: &Vec<_> = &(0..fields.len()) .map(|i| { let id = &format!("__E{}", i); - impls.push_generic_param(param_ident(id)); + items.push_generic_param(param_ident(id)); ident(id) }) .collect(); @@ -64,63 +64,63 @@ fn transpose_result(data: &Data) -> Result { let ident = data.ident(); let ty_generics = fields.iter().zip(err_fields.iter()).map(|(f, ef)| quote!(::core::result::Result<#f, #ef>)); - *impls.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; + *items.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; let transpose = data .variants() .iter() .map(|v| quote!(#ident::#v(x) => x.map(#ident::#v).map_err(#ident::#v))); - impls.push_item(parse_quote! { + items.push_item(parse_quote! { #[inline] fn transpose(self) -> ::core::result::Result<#ident<#(#fields),*>, #ident<#(#err_fields),*>> { match self { #(#transpose,)* } } }?); - Ok(impls.build_item()) + Ok(items.build_item()) } fn transpose_ok(data: &Data) -> Result { let ident = data.ident(); let fields = data.fields(); - let mut impls = data.impl_with_capacity(1)?; + let mut items = data.impl_with_capacity(1)?; - impls.push_generic_param(param_ident("__E")); + items.push_generic_param(param_ident("__E")); let ty_generics = fields.iter().map(|f| quote!(::core::result::Result<#f, __E>)); - *impls.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; + *items.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; let transpose = data.variants().iter().map(|v| quote!(#ident::#v(x) => x.map(#ident::#v))); - impls.push_item(parse_quote! { + items.push_item(parse_quote! { #[inline] fn transpose_ok(self) -> ::core::result::Result<#ident<#(#fields),*>, __E> { match self { #(#transpose,)* } } }?); - Ok(impls.build_item()) + Ok(items.build_item()) } fn transpose_err(data: &Data) -> Result { let ident = data.ident(); let fields = data.fields(); - let mut impls = data.impl_with_capacity(1)?; + let mut items = data.impl_with_capacity(1)?; - impls.push_generic_param(param_ident("__T")); + items.push_generic_param(param_ident("__T")); let ty_generics = fields.iter().map(|f| quote!(::core::result::Result<__T, #f>)); - *impls.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; + *items.self_ty() = parse_quote!(#ident<#(#ty_generics),*>)?; let transpose = data.variants().iter().map(|v| quote!(#ident::#v(x) => x.map_err(#ident::#v))); - impls.push_item(parse_quote! { + items.push_item(parse_quote! { #[inline] fn transpose_err(self) -> ::core::result::Result<__T, #ident<#(#fields),*>> { match self { #(#transpose,)* } } }?); - Ok(impls.build_item()) + Ok(items.build_item()) } diff --git a/derive/src/enum_derive/args.rs b/derive/src/enum_derive/args.rs index edbbd94f..8a1be8fc 100644 --- a/derive/src/enum_derive/args.rs +++ b/derive/src/enum_derive/args.rs @@ -1,10 +1,7 @@ use proc_macro2::{token_stream::IntoIter, Ident, TokenStream, TokenTree}; use quote::ToTokens; -use smallvec::smallvec; use syn::{Path, Result}; -use crate::utils::Stack; - // ============================================================================= // Arg @@ -46,21 +43,21 @@ macro_rules! arg_err { }; } -pub(super) fn parse_args(args: TokenStream) -> Result> { - fn push(args: &mut Stack<(String, Arg)>, arg: Arg) { +pub(super) fn parse_args(args: TokenStream) -> Result> { + fn push(args: &mut Vec<(String, Arg)>, arg: Arg) { args.push((arg.to_trimed_string(), arg)) } const ERR: &str = "expected one of `,`, `::`, or identifier, found "; let mut iter = args.into_iter(); - let mut args = Stack::new(); + let mut args = Vec::new(); while let Some(tt) = iter.next() { match tt { TokenTree::Ident(i) => push(&mut args, path_or_ident(i, iter.next(), &mut iter)?), TokenTree::Punct(p) => match p.as_char() { ',' => {} - ':' => push(&mut args, parse_path(smallvec![p.into()], &mut iter)?), + ':' => push(&mut args, parse_path(vec![p.into()], &mut iter)?), _ => Err(arg_err!(p, "{}`{}`", ERR, p))?, }, _ => Err(arg_err!(tt, "{}`{}`", ERR, tt))?, @@ -70,7 +67,7 @@ pub(super) fn parse_args(args: TokenStream) -> Result> { Ok(args) } -fn parse_path(mut path: Stack, iter: &mut IntoIter) -> Result { +fn parse_path(mut path: Vec, iter: &mut IntoIter) -> Result { for tt in iter { match tt { TokenTree::Punct(ref p) if p.as_char() == ',' => break, @@ -88,7 +85,7 @@ fn path_or_ident(ident: Ident, tt: Option, iter: &mut IntoIter) -> Re None => Ok(Arg::Ident(ident)), Some(TokenTree::Punct(p)) => match p.as_char() { ',' => Ok(Arg::Ident(ident)), - ':' => parse_path(smallvec![ident.into(), p.into()], iter), + ':' => parse_path(vec![ident.into(), p.into()], iter), _ => Err(arg_err!(p, "{}`{}`", ERR, p)), }, Some(tt) => Err(arg_err!(tt, "{}`{}`", ERR, tt)), diff --git a/derive/src/enum_derive/mod.rs b/derive/src/enum_derive/mod.rs index ca52608c..c1ce5441 100644 --- a/derive/src/enum_derive/mod.rs +++ b/derive/src/enum_derive/mod.rs @@ -81,13 +81,13 @@ lazy_static! { }; } -type DeriveFn = &'static (dyn Fn(&'_ Data, &'_ mut Stack) -> Result<()> + Send + Sync); +type DeriveFn = fn(&'_ Data, &'_ mut Vec) -> Result<()>; macro_rules! derive_map { ($map:expr, $($(#[$meta:meta])* $($arm:ident)::*,)*) => {$( $(#[$meta])* crate::derive::$($arm)::*::NAME.iter().for_each(|name| { - if $map.insert(*name, (&crate::derive::$($arm)::*::derive) as DeriveFn).is_some() { + if $map.insert(*name, crate::derive::$($arm)::*::derive as DeriveFn).is_some() { panic!("`#[enum_derive]` internal error: there are multiple `{}`", name); } }); @@ -190,8 +190,8 @@ lazy_static! { } fn expand(args: TokenStream, input: TokenStream) -> Result { - fn alias_exists(s: &str, stack: &[(&str, Option<&Arg>)]) -> bool { - ALIAS_MAP.get(s).map_or(false, |x| stack.iter().any(|(s, _)| s == x)) + fn alias_exists(s: &str, v: &[(&str, Option<&Arg>)]) -> bool { + ALIAS_MAP.get(s).map_or(false, |x| v.iter().any(|(s, _)| s == x)) } let span = span!(input); @@ -200,26 +200,25 @@ fn expand(args: TokenStream, input: TokenStream) -> Result { let data = EnumData::new(&item)?; let data = Data { data, span }; let args = parse_args(args)?; - let mut stack = Stack::new(); - args.iter().for_each(|(s, arg)| { + let args = args.iter().fold(Vec::new(), |mut v, (s, arg)| { if let Some(traits) = TRAIT_DEPENDENCIES.get(&&**s) { traits.iter().filter(|&x| !args.iter().any(|(s, _)| s == x)).for_each(|s| { - if !alias_exists(s, &stack) { - stack.push((s, None)) + if !alias_exists(s, &v) { + v.push((s, None)) } }); } - - if !alias_exists(s, &stack) { - stack.push((s, Some(arg))); + if !alias_exists(s, &v) { + v.push((s, Some(arg))); } + v }); - let mut derive = Stack::new(); - let mut impls = Stack::new(); - for (s, arg) in stack { + let mut derive = Vec::new(); + let mut items = Vec::new(); + for (s, arg) in args { match (DERIVE_MAP.get(&s), arg) { - (Some(f), _) => (&**f)(&data, &mut impls) + (Some(f), _) => (&*f)(&data, &mut items) .map_err(|e| err!(data.span, "`enum_derive({})` {}", s, e))?, (_, Some(arg)) => derive.push(arg), _ => {} @@ -231,6 +230,6 @@ fn expand(args: TokenStream, input: TokenStream) -> Result { } let mut item = item.into_token_stream(); - item.extend(impls.into_iter().map(ToTokens::into_token_stream)); + item.extend(items.into_iter().map(ToTokens::into_token_stream)); Ok(item) } diff --git a/derive/src/utils.rs b/derive/src/utils.rs index 3af9e056..670a7267 100644 --- a/derive/src/utils.rs +++ b/derive/src/utils.rs @@ -1,15 +1,12 @@ use std::ops::Deref; use proc_macro2::{Ident, Span, TokenStream}; -use smallvec::SmallVec; use syn::{punctuated::Punctuated, *}; pub(crate) use derive_utils::{derive_trait_internal as derive_trait, EnumData, Trait}; pub(crate) use quote::{quote, ToTokens}; pub(crate) use syn::{parse2, ItemImpl, Result}; -pub(crate) type Stack = SmallVec<[T; 4]>; - pub(crate) struct Data { pub(crate) data: EnumData, pub(crate) span: TokenStream,