Skip to main content

reflect_internal/
lib.rs

1#![allow(
2    clippy::cast_lossless,
3    clippy::enum_glob_use,
4    clippy::uninlined_format_args
5)]
6
7use proc_macro::TokenStream;
8use proc_macro2::{Span, TokenStream as TokenStream2};
9use quote::quote;
10use syn::parse::{Parse, ParseStream, Result};
11use syn::punctuated::Punctuated;
12use syn::{braced, parenthesized, parse_macro_input, token, Ident, Token};
13
14struct Input {
15    crates: Vec<ItemMod>,
16}
17
18enum Item {
19    Mod(ItemMod),
20    Type(ItemType),
21    Impl(ItemImpl),
22    Trait(ItemTrait),
23    Macro(ItemMacro),
24}
25
26struct ItemMod {
27    name: Ident,
28    items: Vec<Item>,
29}
30
31struct ItemType {
32    name: Ident,
33}
34
35struct ItemImpl {
36    name: Ident,
37    functions: Vec<Function>,
38}
39
40struct ItemTrait {
41    name: Ident,
42    functions: Vec<Function>,
43}
44
45struct Function {
46    name: Ident,
47    receiver: Receiver,
48    args: Vec<Type>,
49    ret: Option<Type>,
50}
51
52struct ItemMacro {
53    name: Ident,
54}
55
56enum Receiver {
57    None,
58    ByValue,
59    ByRef,
60    ByMut,
61}
62
63enum Type {
64    Tuple(Vec<Type>),
65    Ident(Ident),
66    TraitObject(Vec<Ident>),
67    Reference(Box<Type>),
68    ReferenceMut(Box<Type>),
69}
70
71impl Parse for Input {
72    fn parse(input: ParseStream) -> Result<Self> {
73        let mut crates = Vec::new();
74        while !input.is_empty() {
75            let lookahead = input.lookahead1();
76            if lookahead.peek(::syn::token::UseToken![use]) {
77                input.parse::<::syn::token::UseToken![use]>()?;
78            } else {
79                input.parse::<::syn::token::ExternToken![extern]>()?;
80                input.parse::<::syn::token::CrateToken![crate]>()?;
81            }
82            let name: Ident = input.parse()?;
83            let items = ItemMod::parse_items(input)?;
84            crates.push(ItemMod { name, items });
85        }
86        Ok(Input { crates })
87    }
88}
89
90impl Parse for Item {
91    fn parse(input: ParseStream) -> Result<Self> {
92        let lookahead = input.lookahead1();
93        if lookahead.peek(::syn::token::ModToken![mod]) {
94            input.parse().map(Item::Mod)
95        } else if lookahead.peek(::syn::token::TypeToken![type]) {
96            input.parse().map(Item::Type)
97        } else if lookahead.peek(::syn::token::ImplToken![impl]) {
98            input.parse().map(Item::Impl)
99        } else if lookahead.peek(::syn::token::TraitToken![trait]) {
100            input.parse().map(Item::Trait)
101        } else if lookahead.peek(::syn::token::MacroToken![macro]) {
102            input.parse().map(Item::Macro)
103        } else {
104            Err(lookahead.error())
105        }
106    }
107}
108
109impl ItemMod {
110    fn parse_items(input: ParseStream) -> Result<Vec<Item>> {
111        let content;
112        match ::syn::__private::parse_braces(&input) {
    ::syn::__private::Ok(braces) => {
        content = braces.content;
        _ = content;
        braces.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
};braced!(content in input);
113        let mut items = Vec::new();
114        while !content.is_empty() {
115            items.push(content.parse()?);
116        }
117        Ok(items)
118    }
119}
120
121impl Parse for ItemMod {
122    fn parse(input: ParseStream) -> Result<Self> {
123        input.parse::<::syn::token::ModToken![mod]>()?;
124        let name: Ident = input.parse()?;
125        let items = ItemMod::parse_items(input)?;
126        Ok(ItemMod { name, items })
127    }
128}
129
130impl Parse for ItemType {
131    fn parse(input: ParseStream) -> Result<Self> {
132        input.parse::<::syn::token::TypeToken![type]>()?;
133        let name: Ident = input.parse()?;
134        input.parse::<::syn::token::SemiToken![;]>()?;
135        Ok(ItemType { name })
136    }
137}
138
139impl Parse for ItemImpl {
140    fn parse(input: ParseStream) -> Result<Self> {
141        input.parse::<::syn::token::ImplToken![impl]>()?;
142        let name: Ident = input.parse()?;
143
144        let content;
145        match ::syn::__private::parse_braces(&input) {
    ::syn::__private::Ok(braces) => {
        content = braces.content;
        _ = content;
        braces.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
};braced!(content in input);
146        let mut functions = Vec::new();
147        while !content.is_empty() {
148            functions.push(content.parse()?);
149        }
150
151        Ok(ItemImpl { name, functions })
152    }
153}
154
155impl Parse for ItemTrait {
156    fn parse(input: ParseStream) -> Result<Self> {
157        input.parse::<::syn::token::TraitToken![trait]>()?;
158        let name: Ident = input.parse()?;
159
160        let content;
161        match ::syn::__private::parse_braces(&input) {
    ::syn::__private::Ok(braces) => {
        content = braces.content;
        _ = content;
        braces.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
};braced!(content in input);
162        let mut functions = Vec::new();
163        while !content.is_empty() {
164            functions.push(content.parse()?);
165        }
166
167        Ok(ItemTrait { name, functions })
168    }
169}
170
171impl Parse for Function {
172    fn parse(input: ParseStream) -> Result<Self> {
173        input.parse::<::syn::token::FnToken![fn]>()?;
174        let name: Ident = input.parse()?;
175
176        let argument_list;
177        match ::syn::__private::parse_parens(&input) {
    ::syn::__private::Ok(parens) => {
        argument_list = parens.content;
        _ = argument_list;
        parens.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
};parenthesized!(argument_list in input);
178
179        let receiver: Receiver = argument_list.parse()?;
180        if !(receiver.is_none() || argument_list.is_empty()) {
181            argument_list.parse::<::syn::token::CommaToken![,]>()?;
182        }
183
184        let mut args = Vec::new();
185        while !argument_list.is_empty() {
186            args.push(argument_list.parse()?);
187            if argument_list.is_empty() {
188                break;
189            }
190            argument_list.parse::<::syn::token::CommaToken![,]>()?;
191        }
192
193        let ret = if input.peek(::syn::token::RArrowToken![->]) {
194            input.parse::<::syn::token::RArrowToken![->]>()?;
195            Some(input.parse()?)
196        } else {
197            None
198        };
199
200        input.parse::<::syn::token::SemiToken![;]>()?;
201
202        Ok(Function {
203            name,
204            receiver,
205            args,
206            ret,
207        })
208    }
209}
210
211impl Parse for Receiver {
212    fn parse(input: ParseStream) -> Result<Self> {
213        if input.peek(::syn::token::SelfValueToken![self]) {
214            input.parse::<::syn::token::SelfValueToken![self]>()?;
215            Ok(Receiver::ByValue)
216        } else if input.peek(::syn::token::AndToken![&]) && input.peek2(::syn::token::SelfValueToken![self]) {
217            input.parse::<::syn::token::AndToken![&]>()?;
218            input.parse::<::syn::token::SelfValueToken![self]>()?;
219            Ok(Receiver::ByRef)
220        } else if input.peek(::syn::token::AndToken![&]) && input.peek2(::syn::token::MutToken![mut]) && input.peek3(::syn::token::SelfValueToken![self]) {
221            input.parse::<::syn::token::AndToken![&]>()?;
222            input.parse::<::syn::token::MutToken![mut]>()?;
223            input.parse::<::syn::token::SelfValueToken![self]>()?;
224            Ok(Receiver::ByMut)
225        } else {
226            Ok(Receiver::None)
227        }
228    }
229}
230
231impl Parse for Type {
232    fn parse(input: ParseStream) -> Result<Self> {
233        let lookahead = input.lookahead1();
234        if lookahead.peek(token::Paren) {
235            let content;
236            match ::syn::__private::parse_parens(&input) {
    ::syn::__private::Ok(parens) => {
        content = parens.content;
        _ = content;
        parens.token
    }
    ::syn::__private::Err(error) => { return ::syn::__private::Err(error); }
};parenthesized!(content in input);
237            let content: Punctuated<Type, ::syn::token::CommaToken![,]> = Punctuated::parse_terminated(&content)?;
238            if content.len() == 1 && !content.trailing_punct() {
239                // It is not a tuple. The parentheses were just used to
240                // disambiguate the type.
241                Ok(content.into_iter().next().unwrap())
242            } else {
243                Ok(Type::Tuple(content.into_iter().collect()))
244            }
245        } else if lookahead.peek(::syn::token::AndToken![&]) {
246            input.parse::<::syn::token::AndToken![&]>()?;
247            let mut_token: Option<::syn::token::MutToken![mut]> = input.parse()?;
248            let inner: Type = input.parse()?;
249            if mut_token.is_some() {
250                Ok(Type::ReferenceMut(Box::new(inner)))
251            } else {
252                Ok(Type::Reference(Box::new(inner)))
253            }
254        } else if lookahead.peek(::syn::token::DynToken![dyn]) {
255            let _: ::syn::token::DynToken![dyn] = input.parse()?;
256            let bounds: Punctuated<Ident, ::syn::token::PlusToken![+]> = Punctuated::parse_terminated(input)?;
257            Ok(Type::TraitObject(bounds.into_iter().collect()))
258        } else if lookahead.peek(Ident) {
259            input.parse().map(Type::Ident)
260        } else {
261            Err(lookahead.error())
262        }
263    }
264}
265
266impl Parse for ItemMacro {
267    fn parse(input: ParseStream) -> Result<Self> {
268        input.parse::<::syn::token::MacroToken![macro]>()?;
269
270        let name: Ident = input.parse()?;
271        input.parse::<::syn::token::SemiToken![;]>()?;
272
273        Ok(Self { name })
274    }
275}
276
277impl Receiver {
278    fn is_none(&self) -> bool {
279        use self::Receiver::*;
280        match self {
281            None => true,
282            ByValue | ByRef | ByMut => false,
283        }
284    }
285}
286
287#[proc_macro]
288pub fn library(input: TokenStream) -> TokenStream {
289    let input = match ::syn::parse::<Input>(input) {
    ::syn::__private::Ok(data) => data,
    ::syn::__private::Err(err) => {
        return ::syn::__private::TokenStream::from(err.to_compile_error());
    }
}parse_macro_input!(input as Input);
290
291    let modules = input.crates.iter().map(declare_mod);
292
293    TokenStream::from({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "non_snake_case");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "mod");
    ::quote::__private::push_ident(&mut _s, "RUNTIME");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "extern");
            ::quote::__private::push_ident(&mut _s, "crate");
            ::quote::__private::push_ident(&mut _s, "reflect");
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_semi(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "non_snake_case");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "MODULE");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Module");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "_reflect");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Module");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "root");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        ::quote::__private::TokenStream::new());
                    _s
                });
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut modules, i) = modules.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let modules =
                        match modules.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&modules, &mut _s);
                }
            }
            _s
        });
    _s
}quote! {
294        #[allow(non_snake_case)]
295        mod RUNTIME {
296            extern crate reflect as _reflect;
297
298            #[allow(dead_code, non_snake_case)]
299            pub fn MODULE() -> _reflect::Module {
300                _reflect::Module::root()
301            }
302
303            #(
304                #modules
305            )*
306        }
307    })
308}
309
310fn declare_mod(module: &ItemMod) -> TokenStream2 {
311    let name = &module.name;
312    let name_str = name.to_string();
313    let items = module.items.iter().map(declare_item);
314
315    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_ident(&mut _s, "mod");
    ::quote::ToTokens::to_tokens(&name, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "extern");
            ::quote::__private::push_ident(&mut _s, "crate");
            ::quote::__private::push_ident(&mut _s, "reflect");
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_semi(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "unused_imports");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "use");
            ::quote::__private::push_ident(&mut _s, "self");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "runtime");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "prelude");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_star(&mut _s);
            ::quote::__private::push_semi(&mut _s);
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "non_snake_case");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "MODULE");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Module");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "super");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "MODULE");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        ::quote::__private::TokenStream::new());
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "get_module");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&name_str, &mut _s);
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "struct");
            ::quote::__private::push_ident(&mut _s, "__Indirect");
            ::quote::__private::push_lt(&mut _s);
            ::quote::__private::push_ident(&mut _s, "T");
            ::quote::__private::push_gt(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "T");
                    _s
                });
            ::quote::__private::push_semi(&mut _s);
            {
                use ::quote::__private::ext::*;
                let has_iter = ::quote::__private::HasIterator::<false>;
                #[allow(unused_mut)]
                let (mut items, i) = items.quote_into_iter();
                let has_iter = has_iter | i;
                <_ as
                        ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                while true {
                    let items =
                        match items.next() {
                            Some(_x) => ::quote::__private::RepInterp(_x),
                            None => break,
                        };
                    ::quote::ToTokens::to_tokens(&items, &mut _s);
                }
            }
            _s
        });
    _s
}quote! {
316        pub mod #name {
317            extern crate reflect as _reflect;
318
319            #[allow(unused_imports)]
320            use self::_reflect::runtime::prelude::*;
321
322            #[allow(dead_code, non_snake_case)]
323            pub fn MODULE() -> _reflect::Module {
324                super::MODULE().get_module(#name_str)
325            }
326
327            struct __Indirect<T>(T);
328
329            #(
330                #items
331            )*
332        }
333    }
334}
335
336fn declare_item(item: &Item) -> TokenStream2 {
337    match item {
338        Item::Mod(item) => declare_mod(item),
339        Item::Type(item) => declare_type(item),
340        Item::Impl(item) => declare_impl(item),
341        Item::Trait(item) => declare_trait(item),
342        Item::Macro(item) => declare_macro(item),
343    }
344}
345
346fn declare_type(item: &ItemType) -> TokenStream2 {
347    let name = &item.name;
348    let name_str = name.to_string();
349
350    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "derive");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "Copy");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Clone");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "non_camel_case_types");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_ident(&mut _s, "struct");
    ::quote::ToTokens::to_tokens(&name, &mut _s);
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::__private::push_ident(&mut _s, "_reflect");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "runtime");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "RuntimeType");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&name, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "SELF");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "self");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Type");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "MODULE");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        ::quote::__private::TokenStream::new());
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "get_type");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&name_str, &mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
351        #[derive(Copy, Clone)]
352        #[allow(non_camel_case_types)]
353        pub struct #name;
354
355        impl _reflect::runtime::RuntimeType for #name {
356            fn SELF(self) -> _reflect::Type {
357                MODULE().get_type(#name_str)
358            }
359        }
360    }
361}
362
363fn declare_impl(item: &ItemImpl) -> TokenStream2 {
364    let parent = &item.name;
365    let functions = item.functions.iter().map(|f| declare_function(parent, f));
366
367    {
    let mut _s = ::quote::__private::TokenStream::new();
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut functions, i) = functions.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let functions =
                match functions.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&functions, &mut _s);
        }
    }
    _s
}quote! {
368        #(
369            #functions
370        )*
371    }
372}
373
374fn declare_trait(item: &ItemTrait) -> TokenStream2 {
375    let d_type = declare_type(&ItemType {
376        name: item.name.clone(),
377    });
378    let name = &item.name;
379    let name_str = name.to_string();
380
381    let parent = &item.name;
382    let functions = item.functions.iter().map(|f| declare_function(parent, f));
383
384    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&d_type, &mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::__private::push_ident(&mut _s, "_reflect");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "runtime");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "RuntimeTrait");
    ::quote::__private::push_ident(&mut _s, "for");
    ::quote::ToTokens::to_tokens(&name, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "SELF");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "self");
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Path");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "MODULE");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        ::quote::__private::TokenStream::new());
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "get_path");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&name_str, &mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    {
        use ::quote::__private::ext::*;
        let has_iter = ::quote::__private::HasIterator::<false>;
        #[allow(unused_mut)]
        let (mut functions, i) = functions.quote_into_iter();
        let has_iter = has_iter | i;
        <_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
        while true {
            let functions =
                match functions.next() {
                    Some(_x) => ::quote::__private::RepInterp(_x),
                    None => break,
                };
            ::quote::ToTokens::to_tokens(&functions, &mut _s);
        }
    }
    _s
}quote! {
385        #d_type
386
387        impl _reflect::runtime::RuntimeTrait for #name {
388            fn SELF(self) -> _reflect::Path {
389                MODULE().get_path(#name_str)
390            }
391        }
392        #(
393            #functions
394        )*
395    }
396}
397
398fn declare_function(parent: &Ident, function: &Function) -> TokenStream2 {
399    let name = &function.name;
400    let name_str = name.to_string();
401    let setup_receiver = match function.receiver {
402        Receiver::None => None,
403        Receiver::ByValue => Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "sig");
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "set_self_by_value");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        ::quote::__private::TokenStream::new());
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
404            sig.set_self_by_value();
405        }),
406        Receiver::ByRef => Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "sig");
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "set_self_by_reference");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        ::quote::__private::TokenStream::new());
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
407            sig.set_self_by_reference();
408        }),
409        Receiver::ByMut => Some({
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "sig");
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "set_self_by_reference_mut");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        ::quote::__private::TokenStream::new());
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
410            sig.set_self_by_reference_mut();
411        }),
412    };
413    let setup_inputs = function.args.iter().map(|arg| {
414        let ty = to_runtime_type(arg);
415        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "sig");
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "add_input");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ty, &mut _s);
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    _s
}quote! {
416            sig.add_input(#ty);
417        }
418    });
419    let set_output = function.ret.as_ref().map(|ty| {
420        let ty = to_runtime_type(ty);
421        {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "sig");
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "set_output");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ty, &mut _s);
            _s
        });
    ::quote::__private::push_semi(&mut _s);
    _s
}quote!(sig.set_output(#ty);)
422    });
423    let vars = (0..(!function.receiver.is_none() as usize + function.args.len()))
424        .map(|i| Ident::new(&::alloc::__export::must_use({ ::alloc::fmt::format(format_args!("v{0}", i)) })format!("v{}", i), Span::call_site()));
425    let vars2 = vars.clone();
426
427    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::__private::push_ident(&mut _s, "__Indirect");
    ::quote::__private::push_lt(&mut _s);
    ::quote::ToTokens::to_tokens(&parent, &mut _s);
    ::quote::__private::push_gt(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "dead_code");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::ToTokens::to_tokens(&name, &mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                ::quote::__private::TokenStream::new());
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_pound(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "allow");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s,
                                        "non_camel_case_types");
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_pound(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "derive");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "Copy");
                                    ::quote::__private::push_comma(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "Clone");
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_ident(&mut _s, "pub");
                    ::quote::__private::push_ident(&mut _s, "struct");
                    ::quote::ToTokens::to_tokens(&name, &mut _s);
                    ::quote::__private::push_semi(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "impl");
                    ::quote::__private::push_ident(&mut _s, "_reflect");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "runtime");
                    ::quote::__private::push_colon2(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "RuntimeFunction");
                    ::quote::__private::push_ident(&mut _s, "for");
                    ::quote::ToTokens::to_tokens(&name, &mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Brace,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "fn");
                            ::quote::__private::push_ident(&mut _s, "SELF");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "self");
                                    _s
                                });
                            ::quote::__private::push_rarrow(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "_reflect");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "Function");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Brace,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "let");
                                    ::quote::__private::push_ident(&mut _s, "mut");
                                    ::quote::__private::push_ident(&mut _s, "sig");
                                    ::quote::__private::push_eq(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "_reflect");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "Signature");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "new");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        ::quote::__private::TokenStream::new());
                                    ::quote::__private::push_semi(&mut _s);
                                    ::quote::ToTokens::to_tokens(&setup_receiver, &mut _s);
                                    {
                                        use ::quote::__private::ext::*;
                                        let has_iter = ::quote::__private::HasIterator::<false>;
                                        #[allow(unused_mut)]
                                        let (mut setup_inputs, i) = setup_inputs.quote_into_iter();
                                        let has_iter = has_iter | i;
                                        <_ as
                                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                        while true {
                                            let setup_inputs =
                                                match setup_inputs.next() {
                                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                                    None => break,
                                                };
                                            ::quote::ToTokens::to_tokens(&setup_inputs, &mut _s);
                                        }
                                    }
                                    ::quote::ToTokens::to_tokens(&set_output, &mut _s);
                                    ::quote::__private::push_ident(&mut _s, "_reflect");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "runtime");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "RuntimeType");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "SELF");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        {
                                            let mut _s = ::quote::__private::TokenStream::new();
                                            ::quote::ToTokens::to_tokens(&parent, &mut _s);
                                            _s
                                        });
                                    ::quote::__private::push_dot(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "get_function");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        {
                                            let mut _s = ::quote::__private::TokenStream::new();
                                            ::quote::ToTokens::to_tokens(&name_str, &mut _s);
                                            ::quote::__private::push_comma(&mut _s);
                                            ::quote::__private::push_ident(&mut _s, "sig");
                                            _s
                                        });
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_ident(&mut _s, "impl");
                    ::quote::ToTokens::to_tokens(&name, &mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Brace,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "pub");
                            ::quote::__private::push_ident(&mut _s, "fn");
                            ::quote::__private::push_ident(&mut _s, "INVOKE");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "self");
                                    ::quote::__private::push_comma(&mut _s);
                                    {
                                        use ::quote::__private::ext::*;
                                        let has_iter = ::quote::__private::HasIterator::<false>;
                                        #[allow(unused_mut)]
                                        let (mut vars, i) = vars.quote_into_iter();
                                        let has_iter = has_iter | i;
                                        <_ as
                                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                        while true {
                                            let vars =
                                                match vars.next() {
                                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                                    None => break,
                                                };
                                            ::quote::ToTokens::to_tokens(&vars, &mut _s);
                                            ::quote::__private::push_colon(&mut _s);
                                            ::quote::__private::push_ident(&mut _s, "_reflect");
                                            ::quote::__private::push_colon2(&mut _s);
                                            ::quote::__private::push_ident(&mut _s, "Value");
                                            ::quote::__private::push_comma(&mut _s);
                                        }
                                    }
                                    _s
                                });
                            ::quote::__private::push_rarrow(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "_reflect");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "Value");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Brace,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "_reflect");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "runtime");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "RuntimeFunction");
                                    ::quote::__private::push_colon2(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "SELF");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        {
                                            let mut _s = ::quote::__private::TokenStream::new();
                                            ::quote::__private::push_ident(&mut _s, "self");
                                            _s
                                        });
                                    ::quote::__private::push_dot(&mut _s);
                                    ::quote::__private::push_ident(&mut _s, "invoke");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        {
                                            let mut _s = ::quote::__private::TokenStream::new();
                                            ::quote::__private::push_and(&mut _s);
                                            ::quote::__private::push_group(&mut _s,
                                                ::quote::__private::Delimiter::Bracket,
                                                {
                                                    let mut _s = ::quote::__private::TokenStream::new();
                                                    {
                                                        use ::quote::__private::ext::*;
                                                        let mut _first = true;
                                                        let has_iter = ::quote::__private::HasIterator::<false>;
                                                        #[allow(unused_mut)]
                                                        let (mut vars2, i) = vars2.quote_into_iter();
                                                        let has_iter = has_iter | i;
                                                        <_ as
                                                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                                                        while true {
                                                            let vars2 =
                                                                match vars2.next() {
                                                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                                                    None => break,
                                                                };
                                                            if !_first { ::quote::__private::push_comma(&mut _s); }
                                                            _first = false;
                                                            ::quote::ToTokens::to_tokens(&vars2, &mut _s);
                                                        }
                                                    }
                                                    _s
                                                });
                                            _s
                                        });
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_pound(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "allow");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "unknown_lints");
                                    ::quote::__private::push_comma(&mut _s);
                                    ::quote::__private::push_ident(&mut _s,
                                        "non_local_definitions");
                                    _s
                                });
                            _s
                        });
                    ::quote::__private::push_ident(&mut _s, "impl");
                    ::quote::ToTokens::to_tokens(&parent, &mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Brace,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_pound(&mut _s);
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Bracket,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::__private::push_ident(&mut _s, "allow");
                                    ::quote::__private::push_group(&mut _s,
                                        ::quote::__private::Delimiter::Parenthesis,
                                        {
                                            let mut _s = ::quote::__private::TokenStream::new();
                                            ::quote::__private::push_ident(&mut _s,
                                                "non_upper_case_globals");
                                            _s
                                        });
                                    _s
                                });
                            ::quote::__private::push_ident(&mut _s, "pub");
                            ::quote::__private::push_ident(&mut _s, "const");
                            ::quote::ToTokens::to_tokens(&name, &mut _s);
                            ::quote::__private::push_colon(&mut _s);
                            ::quote::ToTokens::to_tokens(&name, &mut _s);
                            ::quote::__private::push_eq(&mut _s);
                            ::quote::ToTokens::to_tokens(&name, &mut _s);
                            ::quote::__private::push_semi(&mut _s);
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
428        impl __Indirect<#parent> {
429            #[allow(dead_code)]
430            fn #name() {
431                #[allow(non_camel_case_types)]
432                #[derive(Copy, Clone)]
433                pub struct #name;
434
435                impl _reflect::runtime::RuntimeFunction for #name {
436                    fn SELF(self) -> _reflect::Function {
437                        let mut sig = _reflect::Signature::new();
438                        #setup_receiver
439                        #(
440                            #setup_inputs
441                        )*
442                        #set_output
443                        _reflect::runtime::RuntimeType::SELF(#parent).get_function(#name_str, sig)
444                    }
445                }
446
447                impl #name {
448                    pub fn INVOKE(
449                        self,
450                        #(
451                            #vars: _reflect::Value,
452                        )*
453                    ) -> _reflect::Value {
454                        _reflect::runtime::RuntimeFunction::SELF(self).invoke(&[#(#vars2),*])
455                    }
456                }
457
458                #[allow(unknown_lints, non_local_definitions)]
459                impl #parent {
460                    #[allow(non_upper_case_globals)]
461                    pub const #name: #name = #name;
462                }
463            }
464        }
465    }
466}
467
468fn declare_macro(item: &ItemMacro) -> TokenStream2 {
469    let name = &item.name;
470    let macro_name = name.to_string();
471
472    {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "allow");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s,
                        "non_camel_case_types");
                    _s
                });
            _s
        });
    ::quote::__private::push_pound(&mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Bracket,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_ident(&mut _s, "derive");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "Copy");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "Clone");
                    _s
                });
            _s
        });
    ::quote::__private::push_ident(&mut _s, "pub");
    ::quote::__private::push_ident(&mut _s, "struct");
    ::quote::ToTokens::to_tokens(&name, &mut _s);
    ::quote::__private::push_semi(&mut _s);
    ::quote::__private::push_ident(&mut _s, "impl");
    ::quote::ToTokens::to_tokens(&name, &mut _s);
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Brace,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_pound(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "allow");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s,
                                "non_upper_case_globals");
                            _s
                        });
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "const");
            ::quote::ToTokens::to_tokens(&name, &mut _s);
            ::quote::__private::push_colon(&mut _s);
            ::quote::ToTokens::to_tokens(&name, &mut _s);
            ::quote::__private::push_eq(&mut _s);
            ::quote::ToTokens::to_tokens(&name, &mut _s);
            ::quote::__private::push_semi(&mut _s);
            ::quote::__private::push_ident(&mut _s, "pub");
            ::quote::__private::push_ident(&mut _s, "fn");
            ::quote::__private::push_ident(&mut _s, "INVOKE");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Parenthesis,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "self");
                    ::quote::__private::push_comma(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "values");
                    ::quote::__private::push_colon(&mut _s);
                    ::quote::__private::push_and(&mut _s);
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Bracket,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::__private::push_ident(&mut _s, "_reflect");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "Value");
                            _s
                        });
                    ::quote::__private::push_comma(&mut _s);
                    _s
                });
            ::quote::__private::push_rarrow(&mut _s);
            ::quote::__private::push_ident(&mut _s, "_reflect");
            ::quote::__private::push_colon2(&mut _s);
            ::quote::__private::push_ident(&mut _s, "Value");
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Brace,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_ident(&mut _s, "MODULE");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        ::quote::__private::TokenStream::new());
                    ::quote::__private::push_dot(&mut _s);
                    ::quote::__private::push_ident(&mut _s, "invoke_macro");
                    ::quote::__private::push_group(&mut _s,
                        ::quote::__private::Delimiter::Parenthesis,
                        {
                            let mut _s = ::quote::__private::TokenStream::new();
                            ::quote::ToTokens::to_tokens(&macro_name, &mut _s);
                            ::quote::__private::push_comma(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "values");
                            _s
                        });
                    _s
                });
            _s
        });
    _s
}quote! {
473        #[allow(non_camel_case_types)]
474        #[derive(Copy, Clone)]
475        pub struct #name;
476
477        impl #name {
478            #[allow(non_upper_case_globals)]
479            pub const #name: #name = #name;
480
481            pub fn INVOKE(
482                self,
483                values: &[_reflect::Value],
484            ) -> _reflect::Value {
485                MODULE().invoke_macro(#macro_name, values)
486            }
487        }
488    }
489}
490
491fn to_runtime_type(ty: &Type) -> TokenStream2 {
492    match ty {
493        Type::Tuple(types) => {
494            let types = types.iter().map(to_runtime_type);
495            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "_reflect");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "Type");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "tuple");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let mut _first = true;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut types, i) = types.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let types =
                                match types.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            if !_first { ::quote::__private::push_comma(&mut _s); }
                            _first = false;
                            ::quote::ToTokens::to_tokens(&types, &mut _s);
                        }
                    }
                    _s
                });
            _s
        });
    _s
}quote! {
496                _reflect::Type::tuple(&[#(#types),*])
497            }
498        }
499        Type::Ident(ident) => {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "_reflect");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "runtime");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "RuntimeType");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "SELF");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::ToTokens::to_tokens(&ident, &mut _s);
            _s
        });
    _s
}quote! {
500            _reflect::runtime::RuntimeType::SELF(#ident)
501        },
502        Type::TraitObject(bounds) => {
503            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::__private::push_ident(&mut _s, "_reflect");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "runtime");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "RuntimeTraitObject");
    ::quote::__private::push_colon2(&mut _s);
    ::quote::__private::push_ident(&mut _s, "SELF");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        {
            let mut _s = ::quote::__private::TokenStream::new();
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    {
                        use ::quote::__private::ext::*;
                        let mut _first = true;
                        let has_iter = ::quote::__private::HasIterator::<false>;
                        #[allow(unused_mut)]
                        let (mut bounds, i) = bounds.quote_into_iter();
                        let has_iter = has_iter | i;
                        <_ as
                                ::quote::__private::CheckHasIterator<true>>::check(has_iter);
                        while true {
                            let bounds =
                                match bounds.next() {
                                    Some(_x) => ::quote::__private::RepInterp(_x),
                                    None => break,
                                };
                            if !_first { ::quote::__private::push_comma(&mut _s); }
                            _first = false;
                            ::quote::__private::push_ident(&mut _s, "_reflect");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "runtime");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "RuntimeTrait");
                            ::quote::__private::push_colon2(&mut _s);
                            ::quote::__private::push_ident(&mut _s, "SELF");
                            ::quote::__private::push_group(&mut _s,
                                ::quote::__private::Delimiter::Parenthesis,
                                {
                                    let mut _s = ::quote::__private::TokenStream::new();
                                    ::quote::ToTokens::to_tokens(&bounds, &mut _s);
                                    _s
                                });
                        }
                    }
                    _s
                });
            ::quote::__private::push_ident(&mut _s, "as");
            ::quote::__private::push_and(&mut _s);
            ::quote::__private::push_group(&mut _s,
                ::quote::__private::Delimiter::Bracket,
                {
                    let mut _s = ::quote::__private::TokenStream::new();
                    ::quote::__private::push_underscore(&mut _s);
                    _s
                });
            _s
        });
    _s
}quote! {
504                _reflect::runtime::RuntimeTraitObject::SELF(&[
505                    #(_reflect::runtime::RuntimeTrait::SELF(#bounds)),*
506                ] as &[_])
507            }
508        }
509        Type::Reference(inner) => {
510            let inner = to_runtime_type(inner);
511            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&inner, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "reference");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        ::quote::__private::TokenStream::new());
    _s
}quote! {
512                #inner.reference()
513            }
514        }
515        Type::ReferenceMut(inner) => {
516            let inner = to_runtime_type(inner);
517            {
    let mut _s = ::quote::__private::TokenStream::new();
    ::quote::ToTokens::to_tokens(&inner, &mut _s);
    ::quote::__private::push_dot(&mut _s);
    ::quote::__private::push_ident(&mut _s, "reference_mut");
    ::quote::__private::push_group(&mut _s,
        ::quote::__private::Delimiter::Parenthesis,
        ::quote::__private::TokenStream::new());
    _s
}quote! {
518                #inner.reference_mut()
519            }
520        }
521    }
522}