From 38f94e4e8e993eacafe51b27f9963394a6169dfe Mon Sep 17 00:00:00 2001 From: Rowan Torbitzky-Lane Date: Thu, 17 Apr 2025 15:52:10 -0500 Subject: [PATCH] need to test extractstate --- rush_macro/src/lib.rs | 7 +++++++ rush_macro/src/utils/extractstate.rs | 19 +++++++++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/rush_macro/src/lib.rs b/rush_macro/src/lib.rs index 97d8977..54bb978 100644 --- a/rush_macro/src/lib.rs +++ b/rush_macro/src/lib.rs @@ -1,4 +1,5 @@ use crate::utils::varfunc::VarFunc; +use crate::utils::extractstate::Extract; use quote::quote; use syn::parse_macro_input; @@ -10,6 +11,12 @@ pub fn run_func(input: proc_macro::TokenStream) -> proc_macro::TokenStream { quote! { #f }.into() } +#[proc_macro] +pub fn run_extract(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let f = parse_macro_input!(input as Extract); + quote! { #f }.into() +} + #[cfg(test)] mod tests { use super::*; diff --git a/rush_macro/src/utils/extractstate.rs b/rush_macro/src/utils/extractstate.rs index 73f4c20..4648a27 100644 --- a/rush_macro/src/utils/extractstate.rs +++ b/rush_macro/src/utils/extractstate.rs @@ -12,7 +12,7 @@ use quote::{ToTokens, quote}; use std::cmp::PartialEq; use syn::parse::{Parse, ParseStream}; -struct Extract { +pub struct Extract { state: State, stacks: Vec, } @@ -27,8 +27,23 @@ impl Parse for Extract { impl ToTokens for Extract { fn to_tokens(&self, tokens: &mut TokenStream2) { - let state = &self.state; + let inner_state = &self.state.0; let stacks = &self.stacks; + + let mut counts = Vec::new(); + for stack in stacks { + match counts.iter_mut().find(|(x, _)| x == stack) { + Some((_, count)) => *count += 1, + None => counts.push((stack, 1)), + } + } + + for (stack, count) in counts { + let inner_stack = &stack.0; + tokens.extend(quote! { + #inner_state.#inner_stack < #count + }) + } } }