impl_inheritance_macros/
lib.rs

1#![recursion_limit="128"]
2extern crate proc_macro;
3
4mod expand_inheritable;
5mod expand_inherites;
6mod expand_base; 
7mod expand_override;
8mod expand_constraits;
9
10#[macro_use]
11extern crate syn;
12
13#[macro_use]
14extern crate quote;
15
16 use syn::{ItemTrait,ItemStruct,punctuated::Punctuated,FnArg,token::Comma,ItemImpl};
17
18 use proc_macro::TokenStream;
19
20#[proc_macro_attribute]
21pub fn inheritable(attr: TokenStream, input: TokenStream) -> TokenStream {
22    let mut out  = input.clone();
23    let item = parse_macro_input!(input as ItemTrait);
24
25    //let ident = parse_macro_input!(attr as Ident);
26    let ident = expand_inheritable::extract_ident(attr.into()).expect("attribute must contain ident of the struct");
27    let expanded : TokenStream = expand_inheritable::expand(item,ident).into();
28    //println!("EXPANDED INHERITABLE: {}", &expanded);
29    out.extend(expanded);
30    out    
31}
32
33#[proc_macro_attribute]
34pub fn overrides(_attr: TokenStream, input: TokenStream) -> TokenStream {
35    let mut out  = input.clone();
36    let item = parse_macro_input!(input as ItemImpl);
37    let expanded : TokenStream = expand_override::expand(item).into();
38    //println!("EXPANDED: {}", &expanded);
39    out.extend(expanded);
40    out 
41}
42
43#[proc_macro_derive(Inherites, attributes(super_data))]
44pub fn inherites(input: TokenStream) -> TokenStream {
45    let item = parse_macro_input!(input as ItemStruct);
46    let expanded : TokenStream =expand_inherites::expand(item).into();
47    //println!("EXPANDED INHERITES: {}", &expanded);
48    expanded
49}
50
51#[proc_macro_derive(Base, attributes(super_data))]
52pub fn base(input: TokenStream) -> TokenStream {
53    let item = parse_macro_input!(input as ItemStruct);
54    let expanded : TokenStream =expand_base::expand(item).into();
55    //println!("EXPANDED: {}", &expanded);
56    expanded
57}
58
59
60pub (crate) static  MAX_CONSTRAITS : u8 = 10;
61
62#[proc_macro]
63pub fn expand_constraits_def(_in: TokenStream) -> TokenStream {
64    let result = expand_constraits::expand();
65    //println!("EXPANDED: {}", result.to_string());
66    result.into()
67}
68
69
70///changes list of fn arguments from form of declaration to form of invocation
71pub(crate) fn unpack_fn_arg( input: &Punctuated<FnArg, Comma>) -> Punctuated<FnArg, Comma> {
72    use FnArg::*;
73    input.iter()
74    .map(|x| match x {
75        SelfRef(arg) => {
76            let arg = arg.clone();
77            SelfValue(syn::ArgSelf{mutability: arg.mutability, self_token: arg.self_token})
78        },
79        Captured(arg) => {
80            let arg = arg.clone();
81            Inferred(arg.pat)
82            
83        }
84        _ => x.clone()
85    })
86    .collect()
87}