rspack_macros/
lib.rs

1#![feature(try_find)]
2
3mod cacheable;
4mod cacheable_dyn;
5mod hook;
6mod merge;
7mod plugin;
8mod runtime_module;
9mod source_map_config;
10
11#[proc_macro_attribute]
12pub fn impl_runtime_module(
13  args: proc_macro::TokenStream,
14  tokens: proc_macro::TokenStream,
15) -> proc_macro::TokenStream {
16  runtime_module::impl_runtime_module(args, tokens)
17}
18
19#[proc_macro_attribute]
20pub fn impl_source_map_config(
21  args: proc_macro::TokenStream,
22  tokens: proc_macro::TokenStream,
23) -> proc_macro::TokenStream {
24  source_map_config::impl_source_map_config(args, tokens)
25}
26
27#[proc_macro_attribute]
28pub fn plugin(
29  _args: proc_macro::TokenStream,
30  tokens: proc_macro::TokenStream,
31) -> proc_macro::TokenStream {
32  let item = syn::parse_macro_input!(tokens as syn::ItemStruct);
33  plugin::expand_struct(item)
34}
35
36#[proc_macro_attribute]
37pub fn plugin_hook(
38  args: proc_macro::TokenStream,
39  tokens: proc_macro::TokenStream,
40) -> proc_macro::TokenStream {
41  let args = syn::parse_macro_input!(args as plugin::HookArgs);
42  let input = syn::parse_macro_input!(tokens as syn::ItemFn);
43  plugin::expand_fn(args, input)
44}
45
46#[proc_macro]
47pub fn define_hook(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
48  let input = syn::parse_macro_input!(input as hook::DefineHookInput);
49  match input.expand() {
50    syn::Result::Ok(tt) => tt,
51    syn::Result::Err(err) => err.to_compile_error(),
52  }
53  .into()
54}
55
56#[proc_macro_derive(MergeFrom, attributes(merge_from))]
57pub fn merge_from_derive(input: proc_macro::TokenStream) -> proc_macro::TokenStream {
58  let input = syn::parse_macro_input!(input as syn::DeriveInput);
59  let output = merge::expand_merge_from_derive(input);
60  match output {
61    syn::Result::Ok(tt) => tt,
62    syn::Result::Err(err) => err.to_compile_error(),
63  }
64  .into()
65}
66
67#[proc_macro_attribute]
68pub fn enable_cacheable(
69  args: proc_macro::TokenStream,
70  tokens: proc_macro::TokenStream,
71) -> proc_macro::TokenStream {
72  cacheable::cacheable(args, tokens)
73}
74
75#[proc_macro_attribute]
76pub fn disable_cacheable(
77  args: proc_macro::TokenStream,
78  tokens: proc_macro::TokenStream,
79) -> proc_macro::TokenStream {
80  cacheable::disable_cacheable(args, tokens)
81}
82
83#[proc_macro_attribute]
84pub fn enable_cacheable_dyn(
85  _args: proc_macro::TokenStream,
86  tokens: proc_macro::TokenStream,
87) -> proc_macro::TokenStream {
88  let input = syn::parse_macro_input!(tokens as syn::Item);
89
90  match input {
91    syn::Item::Trait(input) => cacheable_dyn::impl_trait(input),
92    syn::Item::Impl(input) => cacheable_dyn::impl_impl(input),
93    _ => panic!("expect Trait or Impl"),
94  }
95}
96
97#[proc_macro_attribute]
98pub fn disable_cacheable_dyn(
99  _args: proc_macro::TokenStream,
100  tokens: proc_macro::TokenStream,
101) -> proc_macro::TokenStream {
102  cacheable_dyn::disable_cacheable_dyn(tokens)
103}