proc_macro_api_test_base/
lib.rs1#![no_implicit_prelude]
2#![no_std]
3
4extern crate proc_macro;
5
6#[macro_export]
33macro_rules! dummy_api {
34    ($vis:vis mod $($count_down:tt)*) => {
35        $crate::dummy_api_inner! {
36            proc_macro [] $vis mod $($count_down)*
37        }
38    };
39
40    ($vis:vis pm2 mod $($count_down:tt)*) => {
41        $crate::dummy_api_inner! {
42            proc_macro2 [] $vis mod $($count_down)*
43        }
44    };
45}
46
47#[doc(hidden)]
48#[macro_export]
49macro_rules! dummy_api_inner {
50    ($pm:ident [ $($count:tt)* ] $vis:vis mod $tt:tt $($count_down:tt)*) => {
51        #[allow(dead_code)]
52        #[inline(always)]
53        $vis fn b(input: ::$pm::TokenStream) -> ::$pm::TokenStream {
54            use ::quote::quote;
55            use ::core::convert::Into as _;
56
57            const NUM: usize = const { 0usize $($count 1usize)* };
58
59            if input.is_empty() {
60                quote! { #NUM }.into()
61            } else {
62                quote! {
63                    const D_NUM: usize = #NUM;
64                }.into()
65            }
66        }
67
68        #[allow(dead_code)]
69        #[inline(always)]
70        $vis fn c(
71            _: ::$pm::TokenStream,
72            _: ::$pm::TokenStream,
73        ) -> ::$pm::TokenStream {
74            use ::quote::quote;
75            use ::core::convert::Into as _;
76
77            const NUM: usize = const { 0usize $($count 1usize)* };
78
79            quote! {
80                const NUM: usize = #NUM;
81            }.into()
82        }
83
84        #[allow(dead_code)]
85        $vis mod a {
86            $crate::dummy_api_inner! {
87                $pm [ $($count)* + ] pub mod $($count_down)*
88            }
89        }
90    };
91
92    ($($tt:tt)*) => {};
93}
94
95pub mod pm2 {
96    dummy_api!(pub pm2 mod ,,,,,,,,,,,,);
98}
99
100dummy_api!(pub mod ,,,,,,,,,,,,);