1#![allow(
2 clippy::module_name_repetitions,
3 clippy::needless_pass_by_value,
4 clippy::unseparated_literal_suffix
5)]
6
7extern crate proc_macro;
8
9use proc_macro::TokenStream;
10use syn::{parse_macro_input, DeriveInput, ItemFn};
11
12mod parse;
13
14#[proc_macro_derive(Codegen, attributes(codegen, serde))]
18pub fn derive_codegen(input: TokenStream) -> TokenStream {
19 parse::derive(
20 parse_macro_input!(input as DeriveInput),
21 parse::LinkKind::External {
22 crate_name: "derive_codegen",
23 },
24 )
25 .unwrap_or_else(|err| err.to_compile_error())
26 .into()
27}
28
29#[proc_macro_attribute]
46pub fn fn_codegen(
47 _attribute: proc_macro::TokenStream,
49 item: proc_macro::TokenStream,
50) -> proc_macro::TokenStream {
51 let function = parse_macro_input!(item as ItemFn);
52 let generated = parse::item_fn(
55 function.clone(),
56 parse::LinkKind::External {
57 crate_name: "derive_codegen",
58 },
59 )
60 .unwrap_or_else(|err| err.to_compile_error());
61 proc_macro2::TokenStream::from(quote::quote! {
66 #function
67
68 #generated
69 })
70 .into()
71}
72
73#[proc_macro_attribute]
76pub fn codegen(
77 _attributes: proc_macro::TokenStream,
78 item: proc_macro::TokenStream,
79) -> proc_macro::TokenStream {
80 return item;
81}
82
83#[doc(hidden)]
84#[proc_macro_derive(CodegenInternal, attributes(codegen, serde))]
85pub fn derive_codegen_internal(input: TokenStream) -> TokenStream {
86 parse::derive(
87 parse_macro_input!(input as DeriveInput),
88 parse::LinkKind::Internal,
89 )
90 .unwrap_or_else(|err| err.to_compile_error())
91 .into()
92}