gdnative_impl_proc_macros/
lib.rs

1extern crate proc_macro;
2extern crate proc_macro2;
3#[macro_use]
4extern crate syn;
5#[macro_use]
6extern crate quote;
7
8use proc_macro::TokenStream;
9use syn::AttributeArgs;
10
11mod cfg_ex;
12mod doc;
13mod pool_array_element;
14
15#[proc_macro]
16pub fn impl_typed_array_element(input: TokenStream) -> TokenStream {
17    pool_array_element::impl_element(input)
18        .unwrap_or_else(to_compile_errors)
19        .into()
20}
21
22#[proc_macro]
23pub fn decl_typed_array_element(input: TokenStream) -> TokenStream {
24    pool_array_element::decl_element(input)
25        .unwrap_or_else(to_compile_errors)
26        .into()
27}
28
29/// `#[cfg]` but with custom expansion for GDNative-specific conditional compilation options
30#[proc_macro_attribute]
31pub fn cfg_ex(meta: TokenStream, item: TokenStream) -> TokenStream {
32    let args = parse_macro_input!(meta as AttributeArgs);
33    let attr = cfg_ex::expand_cfg_ex(args).unwrap_or_else(to_compile_errors);
34    let item = proc_macro2::TokenStream::from(item);
35    quote!(#attr #item).into()
36}
37
38/// `#[cfg_attr]` but with custom expansion for GDNative-specific conditional compilation options
39#[proc_macro_attribute]
40pub fn cfg_attr_ex(meta: TokenStream, item: TokenStream) -> TokenStream {
41    let args = parse_macro_input!(meta as AttributeArgs);
42    let attr = cfg_ex::expand_cfg_attr_ex(args).unwrap_or_else(to_compile_errors);
43    let item = proc_macro2::TokenStream::from(item);
44    quote!(#attr #item).into()
45}
46
47fn to_compile_errors(error: syn::Error) -> proc_macro2::TokenStream {
48    let compile_error = error.to_compile_error();
49    quote!(#compile_error)
50}