diff options
Diffstat (limited to 'varihappy-macros/src/lib.rs')
| -rw-r--r-- | varihappy-macros/src/lib.rs | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/varihappy-macros/src/lib.rs b/varihappy-macros/src/lib.rs index 3931899..3b1cc29 100644 --- a/varihappy-macros/src/lib.rs +++ b/varihappy-macros/src/lib.rs @@ -1,11 +1,11 @@ extern crate proc_macro; use proc_macro::TokenStream; -use proc_macro2::{Ident, Literal, Span}; +use proc_macro2::{Ident, Literal}; use quote::{format_ident, quote}; -use syn::LitInt; use unsynn::{ Comma, CommaDelimitedVec, Cons, Either, GroupContaining, IParse, LiteralInteger, TokenIter, + unsynn, }; fn number_to_type(mut number: u128) -> String { @@ -169,11 +169,19 @@ pub fn type_to_field_access(input: TokenStream) -> TokenStream { #[proc_macro] pub fn repeat(input: TokenStream) -> TokenStream { + unsynn! { + struct RangeLiteral { + start: LiteralInteger, + dotdot: unsynn::DotDot, + end: LiteralInteger, + } + } + let input: proc_macro2::TokenStream = input.into(); let mut token_iter = TokenIter::new(input); - let ast: Cons<LiteralInteger, Comma, unsynn::Ident> = token_iter.parse().unwrap(); + let ast: Cons<RangeLiteral, Comma, unsynn::Ident> = token_iter.parse().unwrap(); - let numbers = (2..=ast.first.value()).map(Literal::u128_unsuffixed); + let numbers = (ast.first.start.value()..ast.first.end.value()).map(Literal::u128_unsuffixed); let macro_name = ast.third; quote! { #(#macro_name!(#numbers);)* }.into() } @@ -197,3 +205,10 @@ pub fn tuple_trait_def(input: TokenStream) -> TokenStream { quote! { #ident! { trait #trait_name for #other_trait { type #item_type; fn #item_fn; }} } .into() } + +#[proc_macro] +pub fn tuple_len(input: TokenStream) -> TokenStream { + let tuple = syn::parse_macro_input!(input as syn::TypeTuple); + let len = Literal::usize_unsuffixed(tuple.elems.len()); + quote! { #len }.into() +} |
