schala/schala-lang/codegen/src/lib.rs

37 lines
971 B
Rust
Raw Normal View History

#![feature(box_patterns)]
2018-10-17 15:29:32 -07:00
extern crate proc_macro;
#[macro_use]
extern crate quote;
#[macro_use]
2018-10-17 15:29:32 -07:00
extern crate syn;
use self::proc_macro::TokenStream;
use self::syn::fold::Fold;
struct RecursiveDescentFn {
}
impl Fold for RecursiveDescentFn {
fn fold_item_fn(&mut self, mut i: syn::ItemFn) -> syn::ItemFn {
let box block = i.block;
let mut stmts = block.stmts;
let new_item: syn::Stmt = parse_quote! {
println!("FROM PROC MACRO");
};
let mut new_stmts = vec![new_item];
new_stmts.append(&mut stmts);
let new_block = syn::Block { brace_token: block.brace_token, stmts: new_stmts };
i.block = Box::new(new_block);
i
}
}
2018-10-17 15:29:32 -07:00
#[proc_macro_attribute]
pub fn recursive_descent_method(attr: TokenStream, item: TokenStream) -> TokenStream {
let input: syn::ItemFn = parse_macro_input!(item as syn::ItemFn);
let mut folder = RecursiveDescentFn {};
let output = folder.fold_item_fn(input);
TokenStream::from(quote!(#output))
2018-10-17 15:29:32 -07:00
}