diff --git a/node_derive/Cargo.toml b/node_derive/Cargo.toml index 052b31f..7a152cf 100644 --- a/node_derive/Cargo.toml +++ b/node_derive/Cargo.toml @@ -10,5 +10,5 @@ edition = "2018" proc-macro = true [dependencies] -syn = "0.14.4" -quote = "0.6.3" +syn = { version = "0.15.18", features = ["full", "fold", "parsing"] } +quote = "0.6.9" diff --git a/node_derive/src/lib.rs b/node_derive/src/lib.rs index 9886b07..99967b7 100644 --- a/node_derive/src/lib.rs +++ b/node_derive/src/lib.rs @@ -4,7 +4,7 @@ extern crate proc_macro; use crate::proc_macro::TokenStream; use quote::quote; -use syn; +use syn::{self, parse_macro_input, ItemFn}; #[proc_macro_derive(Node)] pub fn node_derive(input: TokenStream) -> TokenStream { @@ -113,3 +113,25 @@ fn impl_any_node(ast: &syn::DeriveInput) -> TokenStream { }; gen.into() } + +#[proc_macro_attribute] +pub fn trace(_attr: TokenStream, item: TokenStream) -> TokenStream { + let item = parse_macro_input!(item as ItemFn); + impl_trace(&item) +} + +fn impl_trace(item: &syn::ItemFn) -> TokenStream { + let ident = &item.ident; + let mut item = item.clone(); + let tracer = quote! { + println!("{}: {:?}", stringify!(#ident), s); + }; + let tracer: TokenStream = tracer.into(); + let tracer = parse_macro_input!(tracer as syn::Stmt); + item.block.stmts.insert(0, tracer); + + let gen = quote! { + #item + }; + gen.into() +} diff --git a/src/parser/expressions/expression_leftside_values.rs b/src/parser/expressions/expression_leftside_values.rs index 4d60e15..f989810 100644 --- a/src/parser/expressions/expression_leftside_values.rs +++ b/src/parser/expressions/expression_leftside_values.rs @@ -151,8 +151,26 @@ pub fn nonrange_variable_lvalue(s: Span) -> IResult