impl_inheritance_macros/
lib.rs1#![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 = 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 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 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 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 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 result.into()
67}
68
69
70pub(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}