1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38
#![allow(unused_imports)] extern crate syn; #[macro_use] extern crate quote; use proc_macro::TokenStream; use syn::ItemFn; #[proc_macro_attribute] pub fn lovm2_builtin(_attr: TokenStream, item: TokenStream) -> TokenStream { let tree = syn::parse::<ItemFn>(item).unwrap(); let mut ident = format!("{}", tree.sig.ident); let first_char = ident.remove(0); let struct_name = format_ident!("{}{}Builtin", first_char.to_uppercase().to_string(), ident); let block = tree.block; let result = quote! { #[derive(Debug)] struct #struct_name; impl #struct_name { pub fn instantiate() -> Rc<Self> { Rc::new(Self {}) } } impl CallProtocol for #struct_name { fn run(&self, vm: &mut Vm) -> lovm2_error::Lovm2Result<()> { #block } } }; result.into() }