#![no_implicit_prelude]
#![no_std]
extern crate proc_macro;
#[macro_export]
macro_rules! dummy_api {
($vis:vis mod $($count_down:tt)*) => {
$crate::dummy_api_inner! {
proc_macro [] $vis mod $($count_down)*
}
};
($vis:vis pm2 mod $($count_down:tt)*) => {
$crate::dummy_api_inner! {
proc_macro2 [] $vis mod $($count_down)*
}
};
}
#[doc(hidden)]
#[macro_export]
macro_rules! dummy_api_inner {
($pm:ident [ $($count:tt)* ] $vis:vis mod $tt:tt $($count_down:tt)*) => {
#[allow(dead_code)]
#[inline(always)]
$vis fn b(input: ::$pm::TokenStream) -> ::$pm::TokenStream {
use ::quote::quote;
use ::core::convert::Into as _;
const NUM: usize = const { 0usize $($count 1usize)* };
if input.is_empty() {
quote! { #NUM }.into()
} else {
quote! {
const D_NUM: usize = #NUM;
}.into()
}
}
#[allow(dead_code)]
#[inline(always)]
$vis fn c(
_: ::$pm::TokenStream,
_: ::$pm::TokenStream,
) -> ::$pm::TokenStream {
use ::quote::quote;
use ::core::convert::Into as _;
const NUM: usize = const { 0usize $($count 1usize)* };
quote! {
const NUM: usize = #NUM;
}.into()
}
#[allow(dead_code)]
$vis mod a {
$crate::dummy_api_inner! {
$pm [ $($count)* + ] pub mod $($count_down)*
}
}
};
($($tt:tt)*) => {};
}
pub mod pm2 {
dummy_api!(pub pm2 mod ,,,,,,,,,,,,);
}
dummy_api!(pub mod ,,,,,,,,,,,,);