Skip to main content

hypersyn/
lib.rs

1mod definition;
2mod fn_args;
3mod fn_returns;
4mod var;
5
6extern crate proc_macro;
7
8use crate::definition::generate_arrow_fn;
9use proc_macro::TokenStream;
10use proc_macro_error::proc_macro_error;
11use quote::quote;
12use syn::{Ident, ItemFn, Token, parse_macro_input, punctuated::Punctuated};
13
14#[proc_macro_error]
15#[proc_macro_attribute]
16pub fn def_arrow(attr: TokenStream, item: TokenStream) -> TokenStream {
17    // 1. Parse the attribute arguments: (ObjType, ArrType, new_fn_name)
18    let args = parse_macro_input!(attr with Punctuated::<Ident, Token![,]>::parse_terminated);
19    let mut iter = args.into_iter();
20    let obj_type = iter.next().expect("expected ObjType");
21    let arr_type = iter.next().expect("expected ArrType");
22    let fn_name = iter.next().expect("expected new function name");
23
24    // 2. Parse the original function
25    let input_fn: ItemFn = parse_macro_input!(item as ItemFn);
26
27    // 3. Generate the new arrow function
28    let generated_fn = generate_arrow_fn(
29        input_fn.clone(),
30        obj_type.clone(),
31        arr_type.clone(),
32        fn_name,
33    );
34
35    // 4. Modify original function to replace var! with Var<O, A>.
36    let input_fn = var::expand_var_macros(input_fn, obj_type.clone(), arr_type.clone());
37
38    // 5. Combine original + generated
39    let out = quote! {
40        // original function, made "stateful"
41        #[state_macro::stateful(&std::rc::Rc<std::cell::RefCell<open_hypergraphs::lax::OpenHypergraph<#obj_type, #arr_type>>>)]
42        #input_fn
43
44        // Generated arrow definition
45        #generated_fn
46    };
47
48    out.into()
49}