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 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(¯o_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}