extern crate proc_macro;
use proc_macro::TokenStream;
use quote::quote;
mod accept_visitor;
mod all_node;
mod arena;
mod node;
mod node_data;
mod query;
mod visitor;
mod walk_visitor;
fn first_lifetime(gen: &mut syn::Generics) -> syn::Lifetime {
if let Some(ltdef) = gen.lifetimes().next() {
return ltdef.lifetime.clone();
}
let ltdef: syn::LifetimeDef = syn::parse_str("'a").unwrap();
let lt = ltdef.lifetime.clone();
gen.params.insert(0, syn::GenericParam::Lifetime(ltdef));
lt
}
#[proc_macro_derive(AcceptVisitor, attributes(dont_visit))]
pub fn accept_visitor(input: TokenStream) -> TokenStream {
accept_visitor::accept_visitor(input, false)
}
#[proc_macro_derive(AcceptVisitorAndForeach, attributes(dont_visit))]
pub fn accept_visitor_and_foreach(input: TokenStream) -> TokenStream {
accept_visitor::accept_visitor(input, true)
}
#[proc_macro_attribute]
pub fn node(args: TokenStream, input: TokenStream) -> TokenStream {
node::node(args, input)
}
#[proc_macro_derive(AnyNodeData, attributes(name, forward, indefinite, definite))]
pub fn node_data(input: TokenStream) -> TokenStream {
node_data::node_data(input)
}
#[proc_macro_attribute]
pub fn walk_visitor(args: TokenStream, input: TokenStream) -> TokenStream {
walk_visitor::walk_visitor(args, input)
}
#[proc_macro_attribute]
pub fn visit(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = proc_macro2::TokenStream::from(input);
TokenStream::from(quote! {
#[moore_derive::walk_visitor]
#[derive(moore_derive::AcceptVisitorAndForeach)]
#input
})
}
#[proc_macro_attribute]
pub fn visit_without_foreach(_args: TokenStream, input: TokenStream) -> TokenStream {
let input = proc_macro2::TokenStream::from(input);
TokenStream::from(quote! {
#[moore_derive::walk_visitor]
#[derive(moore_derive::AcceptVisitor)]
#input
})
}
#[proc_macro]
pub fn derive_all_node(input: TokenStream) -> TokenStream {
all_node::all_node(input)
}
#[proc_macro_attribute]
pub fn all_node(args: TokenStream, input: TokenStream) -> TokenStream {
all_node::mark_all_node(args, input)
}
#[proc_macro]
pub fn derive_visitor(input: TokenStream) -> TokenStream {
visitor::visitor(input)
}
#[proc_macro_attribute]
pub fn query(args: TokenStream, input: TokenStream) -> TokenStream {
query::mark_query(args, input)
}
#[proc_macro]
pub fn derive_query_db(input: TokenStream) -> TokenStream {
query::derive_query_db(input)
}
#[proc_macro]
pub fn derive_arena(input: TokenStream) -> TokenStream {
arena::derive_arena(input)
}
#[proc_macro_attribute]
pub fn arena(args: TokenStream, input: TokenStream) -> TokenStream {
arena::mark_arena(args, input)
}