summaryrefslogtreecommitdiff
path: root/varihappy-macros/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'varihappy-macros/src/lib.rs')
-rw-r--r--varihappy-macros/src/lib.rs23
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()
+}