mod analysis;
mod compile;
use crate::analysis::analyze_module;
use crate::compile::{Compiled, Compiler};
use proc_macro::TokenStream;
use syn::{parse_macro_input, ItemMod};
#[proc_macro_attribute]
pub fn context(_attr: TokenStream, item: TokenStream) -> TokenStream {
let item_module: ItemMod = parse_macro_input!(item as ItemMod);
let content = item_module.content.expect("Module must have a body");
let analyzed_module = analyze_module(&ItemMod {
attrs: item_module.attrs,
vis: item_module.vis,
mod_token: item_module.mod_token,
ident: item_module.ident,
content: Some(content.clone()),
semi: item_module.semi,
unsafety: None,
});
let compiled = analyzed_module.compile();
let emitted = compiled.emit();
proc_macro::TokenStream::from(emitted)
}