expandable_impl/
macros.rs

1// Architecture invariant: this module contains macros that are used across the
2// crate.
3
4/// Creates a sequence of [`TokenTree`]s from a sequence of tokens. Useful for
5/// testing.
6///
7/// This macro can't parse the `$` token. It uses `#` instead.
8///
9/// [`TokenTree`]: crate::TokenTree
10#[macro_export]
11macro_rules! quote {
12    (@mk_term $sb:expr, $term:expr $(,)?) => {
13        $crate::TokenTree::terminal($sb.mk_span(), $term)
14    };
15
16    (@inner $sb:expr, ( $( $tt:tt )* ) ) => {
17        $crate::TokenTree::parenthesed($sb.mk_span(), $crate::quote! { @with_sb $sb, $( $tt )* })
18    };
19
20    (@inner $sb:expr, { $( $tt:tt )* } ) => {
21        $crate::TokenTree::curly_braced($sb.mk_span(), $crate::quote! { @with_sb $sb, $( $tt )* })
22    };
23
24    (@inner $sb:expr, [ $( $tt:tt )* ] ) => {
25        $crate::TokenTree::bracketed($sb.mk_span(), $crate::quote! { @with_sb $sb, $( $tt )* })
26    };
27
28    // Keywords
29    (@inner $sb:expr, as) => {
30        $crate::quote!(@mk_term $sb, $crate::Terminal::As)
31    };
32
33    (@inner $sb:expr, async) => {
34        $crate::quote!(@mk_term $sb, $crate::Terminal::Async)
35    };
36
37    (@inner $sb:expr, break) => {
38        $crate::quote!(@mk_term $sb, $crate::Terminal::Break)
39    };
40
41    (@inner $sb:expr, const) => {
42        $crate::quote!(@mk_term $sb, $crate::Terminal::Const)
43    };
44
45    (@inner $sb:expr, continue) => {
46        $crate::quote!(@mk_term $sb, $crate::Terminal::Continue)
47    };
48
49    (@inner $sb:expr, crate) => {
50        $crate::quote!(@mk_term $sb, $crate::Terminal::Crate)
51    };
52
53    (@inner $sb:expr, else) => {
54        $crate::quote!(@mk_term $sb, $crate::Terminal::Else)
55    };
56
57    (@inner $sb:expr, enum) => {
58        $crate::quote!(@mk_term $sb, $crate::Terminal::Enum)
59    };
60
61    (@inner $sb:expr, extern) => {
62        $crate::quote!(@mk_term $sb, $crate::Terminal::Extern)
63    };
64
65    (@inner $sb:expr, false) => {
66        $crate::quote!(@mk_term $sb, $crate::Terminal::False)
67    };
68
69    (@inner $sb:expr, fn) => {
70        $crate::quote!(@mk_term $sb, $crate::Terminal::Fn)
71    };
72
73    (@inner $sb:expr, for) => {
74        $crate::quote!(@mk_term $sb, $crate::Terminal::For)
75    };
76
77    (@inner $sb:expr, if) => {
78        $crate::quote!(@mk_term $sb, $crate::Terminal::If)
79    };
80
81    (@inner $sb:expr, impl) => {
82        $crate::quote!(@mk_term $sb, $crate::Terminal::Impl)
83    };
84
85    (@inner $sb:expr, in) => {
86        $crate::quote!(@mk_term $sb, $crate::Terminal::In)
87    };
88
89    (@inner $sb:expr, let) => {
90        $crate::quote!(@mk_term $sb, $crate::Terminal::Let)
91    };
92
93    (@inner $sb:expr, loop) => {
94        $crate::quote!(@mk_term $sb, $crate::Terminal::Loop)
95    };
96
97    (@inner $sb:expr, match) => {
98        $crate::quote!(@mk_term $sb, $crate::Terminal::Match)
99    };
100
101    (@inner $sb:expr, mod) => {
102        $crate::quote!(@mk_term $sb, $crate::Terminal::Mod)
103    };
104
105    (@inner $sb:expr, move) => {
106        $crate::quote!(@mk_term $sb, $crate::Terminal::Move)
107    };
108
109    (@inner $sb:expr, mut) => {
110        $crate::quote!(@mk_term $sb, $crate::Terminal::Mut)
111    };
112
113    (@inner $sb:expr, pub) => {
114        $crate::quote!(@mk_term $sb, $crate::Terminal::Pub)
115    };
116
117    (@inner $sb:expr, ref) => {
118        $crate::quote!(@mk_term $sb, $crate::Terminal::Ref)
119    };
120
121    (@inner $sb:expr, return) => {
122        $crate::quote!(@mk_term $sb, $crate::Terminal::Return)
123    };
124
125    (@inner $sb:expr, self) => {
126        $crate::quote!(@mk_term $sb, $crate::Terminal::Self_)
127    };
128
129    (@inner $sb:expr, Self) => {
130        $crate::quote!(@mk_term $sb, $crate::Terminal::SelfUpper)
131    };
132
133    (@inner $sb:expr, static) => {
134        $crate::quote!(@mk_term $sb, $crate::Terminal::Static)
135    };
136
137    (@inner $sb:expr, struct) => {
138        $crate::quote!(@mk_term $sb, $crate::Terminal::Struct)
139    };
140
141    (@inner $sb:expr, super) => {
142        $crate::quote!(@mk_term $sb, $crate::Terminal::Super)
143    };
144
145    (@inner $sb:expr, trait) => {
146        $crate::quote!(@mk_term $sb, $crate::Terminal::Trait)
147    };
148
149    (@inner $sb:expr, true) => {
150        $crate::quote!(@mk_term $sb, $crate::Terminal::True)
151    };
152
153    (@inner $sb:expr, type) => {
154        $crate::quote!(@mk_term $sb, $crate::Terminal::Type)
155    };
156
157    (@inner $sb:expr, unsafe) => {
158        $crate::quote!(@mk_term $sb, $crate::Terminal::Unsafe)
159    };
160
161    (@inner $sb:expr, use) => {
162        $crate::quote!(@mk_term $sb, $crate::Terminal::Use)
163    };
164
165    (@inner $sb:expr, where) => {
166        $crate::quote!(@mk_term $sb, $crate::Terminal::Where)
167    };
168
169    (@inner $sb:expr, while) => {
170        $crate::quote!(@mk_term $sb, $crate::Terminal::While)
171    };
172
173    // Keywords that are also reserved
174    (@inner $sb:expr, abstract) => {
175        $crate::quote!(@mk_term $sb, $crate::Terminal::Abstract)
176    };
177
178    (@inner $sb:expr, become) => {
179        $crate::quote!(@mk_term $sb, $crate::Terminal::Become)
180    };
181
182    (@inner $sb:expr, box) => {
183        $crate::quote!(@mk_term $sb, $crate::Terminal::Box)
184    };
185
186    (@inner $sb:expr, do) => {
187        $crate::quote!(@mk_term $sb, $crate::Terminal::Do)
188    };
189
190    (@inner $sb:expr, final) => {
191        $crate::quote!(@mk_term $sb, $crate::Terminal::Final)
192    };
193
194    (@inner $sb:expr, macro) => {
195        $crate::quote!(@mk_term $sb, $crate::Terminal::Macro)
196    };
197
198    (@inner $sb:expr, offsetof) => {
199        $crate::quote!(@mk_term $sb, $crate::Terminal::Offsetof)
200    };
201
202    (@inner $sb:expr, override) => {
203        $crate::quote!(@mk_term $sb, $crate::Terminal::Override)
204    };
205
206    (@inner $sb:expr, priv) => {
207        $crate::quote!(@mk_term $sb, $crate::Terminal::Priv)
208    };
209
210    (@inner $sb:expr, proc) => {
211        $crate::quote!(@mk_term $sb, $crate::Terminal::Proc)
212    };
213
214    (@inner $sb:expr, sizeof) => {
215        $crate::quote!(@mk_term $sb, $crate::Terminal::Sizeof)
216    };
217
218    (@inner $sb:expr, typeof) => {
219        $crate::quote!(@mk_term $sb, $crate::Terminal::Typeof)
220    };
221
222    (@inner $sb:expr, unsized) => {
223        $crate::quote!(@mk_term $sb, $crate::Terminal::Unsized)
224    };
225
226    (@inner $sb:expr, virtual) => {
227        $crate::quote!(@mk_term $sb, $crate::Terminal::Virtual)
228    };
229
230    (@inner $sb:expr, yield) => {
231        $crate::quote!(@mk_term $sb, $crate::Terminal::Yield)
232    };
233
234    (@inner $sb:expr, await) => {
235        $crate::quote!(@mk_term $sb, $crate::Terminal::Await)
236    };
237
238    (@inner $sb:expr, dyn) => {
239        $crate::quote!(@mk_term $sb, $crate::Terminal::Dyn)
240    };
241
242    (@inner $sb:expr, abstract) => {
243        $crate::quote!(@mk_term $sb, $crate::Terminal::Abstract)
244    };
245
246    (@inner $sb:expr, catch) => {
247        $crate::quote!(@mk_term $sb, $crate::Terminal::Catch)
248    };
249
250    (@inner $sb:expr, final) => {
251        $crate::quote!(@mk_term $sb, $crate::Terminal::Final)
252    };
253
254    (@inner $sb:expr, macro) => {
255        $crate::quote!(@mk_term $sb, $crate::Terminal::Macro)
256    };
257
258    (@inner $sb:expr, override) => {
259        $crate::quote!(@mk_term $sb, $crate::Terminal::Override)
260    };
261
262    (@inner $sb:expr, priv) => {
263        $crate::quote!(@mk_term $sb, $crate::Terminal::Priv)
264    };
265
266    (@inner $sb:expr, try) => {
267        $crate::quote!(@mk_term $sb, $crate::Terminal::Try)
268    };
269
270    (@inner $sb:expr, union) => {
271        $crate::quote!(@mk_term $sb, $crate::Terminal::Union)
272    };
273
274    (@inner $sb:expr, $id:ident) => {
275        $crate::quote!(@mk_term $sb, $crate::Terminal::Ident(stringify!($id).to_string()))
276    };
277
278    // Punctuates
279    (@inner $sb:expr, +) => {
280        $crate::quote!(@mk_term $sb, $crate::Terminal::Plus)
281    };
282
283    (@inner $sb:expr, -) => {
284        $crate::quote!(@mk_term $sb, $crate::Terminal::Minus)
285    };
286
287    (@inner $sb:expr, *) => {
288        $crate::quote!(@mk_term $sb, $crate::Terminal::Star)
289    };
290
291    (@inner $sb:expr, /) => {
292        $crate::quote!(@mk_term $sb, $crate::Terminal::Slash)
293    };
294
295    (@inner $sb:expr, %) => {
296        $crate::quote!(@mk_term $sb, $crate::Terminal::Percent)
297    };
298
299    (@inner $sb:expr, ^) => {
300        $crate::quote!(@mk_term $sb, $crate::Terminal::Caret)
301    };
302
303    (@inner $sb:expr, !) => {
304        $crate::quote!(@mk_term $sb, $crate::Terminal::Not)
305    };
306
307    (@inner $sb:expr, &) => {
308        $crate::quote!(@mk_term $sb, $crate::Terminal::And)
309    };
310
311    (@inner $sb:expr, |) => {
312        $crate::quote!(@mk_term $sb, $crate::Terminal::Or)
313    };
314
315    (@inner $sb:expr, &&) => {
316        $crate::quote!(@mk_term $sb, $crate::Terminal::AndAnd)
317    };
318
319    (@inner $sb:expr, ||) => {
320        $crate::quote!(@mk_term $sb, $crate::Terminal::OrOr)
321    };
322
323    (@inner $sb:expr, <<) => {
324        $crate::quote!(@mk_term $sb, $crate::Terminal::Shl)
325    };
326
327    (@inner $sb:expr, >>) => {
328        $crate::quote!(@mk_term $sb, $crate::Terminal::Shr)
329    };
330
331    (@inner $sb:expr, +=) => {
332        $crate::quote!(@mk_term $sb, $crate::Terminal::PlusEquals)
333    };
334
335    (@inner $sb:expr, -=) => {
336       $crate::quote!(@mk_term $sb, $crate::Terminal::MinusEquals)
337    };
338
339    (@inner $sb:expr, *=) => {
340        $crate::quote!(@mk_term $sb, $crate::Terminal::StarEquals)
341    };
342
343    (@inner $sb:expr, /=) => {
344        $crate::quote!(@mk_term $sb, $crate::Terminal::SlashEquals)
345    };
346
347    (@inner $sb:expr, %=) => {
348        $crate::quote!(@mk_term $sb, $crate::Terminal::PercentEquals)
349    };
350
351    (@inner $sb:expr, ^=) => {
352        $crate::quote!(@mk_term $sb, $crate::Terminal::CaretEquals)
353    };
354
355    (@inner $sb:expr, &=) => {
356        $crate::quote!(@mk_term $sb, $crate::Terminal::AndEquals)
357    };
358
359    (@inner $sb:expr, |=) => {
360        $crate::quote!(@mk_term $sb, $crate::Terminal::OrEquals)
361    };
362
363    (@inner $sb:expr, <<=) => {
364        $crate::quote!(@mk_term $sb, $crate::Terminal::ShlEquals)
365    };
366
367    (@inner $sb:expr, >>=) => {
368        $crate::quote!(@mk_term $sb, $crate::Terminal::ShrEquals)
369    };
370
371    (@inner $sb:expr, =) => {
372        $crate::quote!(@mk_term $sb, $crate::Terminal::Equals)
373    };
374
375    (@inner $sb:expr, ==) => {
376        $crate::quote!(@mk_term $sb, $crate::Terminal::EqualsEquals)
377    };
378
379    (@inner $sb:expr, !=) => {
380        $crate::quote!(@mk_term $sb, $crate::Terminal::NotEquals)
381    };
382
383    (@inner $sb:expr, >) => {
384        $crate::quote!(@mk_term $sb, $crate::Terminal::GreaterThan)
385    };
386
387    (@inner $sb:expr, <) => {
388        $crate::quote!(@mk_term $sb, $crate::Terminal::LessThan)
389    };
390
391    (@inner $sb:expr, >=) => {
392        $crate::quote!(@mk_term $sb, $crate::Terminal::GreaterThanEquals)
393    };
394
395    (@inner $sb:expr, <=) => {
396        $crate::quote!(@mk_term $sb, $crate::Terminal::LessThanEquals)
397    };
398
399    (@inner $sb:expr, @) => {
400        $crate::quote!(@mk_term $sb, $crate::Terminal::At)
401    };
402
403    (@inner $sb:expr, _) => {
404        $crate::quote!(@mk_term $sb, $crate::Terminal::Underscore)
405    };
406
407    (@inner $sb:expr, .) => {
408        $crate::quote!(@mk_term $sb, $crate::Terminal::Dot)
409    };
410
411    (@inner $sb:expr, ..) => {
412        $crate::quote!(@mk_term $sb, $crate::Terminal::DotDot)
413    };
414
415    (@inner $sb:expr, ...) => {
416        $crate::quote!(@mk_term $sb, $crate::Terminal::DotDotDot)
417    };
418
419    (@inner $sb:expr, ..=) => {
420        $crate::quote!(@mk_term $sb, $crate::Terminal::DotDotEquals)
421    };
422
423    (@inner $sb:expr, ,) => {
424        $crate::quote!(@mk_term $sb, $crate::Terminal::Comma)
425    };
426
427    (@inner $sb:expr, ; ) => {
428        $crate::quote!(@mk_term $sb, $crate::Terminal::Semicolon)
429    };
430
431    (@inner $sb:expr, : ) => {
432        $crate::quote!(@mk_term $sb, $crate::Terminal::Colon)
433    };
434
435    (@inner $sb:expr, ::) => {
436        $crate::quote!(@mk_term $sb, $crate::Terminal::ColonColon)
437    };
438
439    (@inner $sb:expr, ->) => {
440        $crate::quote!(@mk_term $sb, $crate::Terminal::RightArrow)
441    };
442
443    (@inner $sb:expr, =>) => {
444        $crate::quote!(@mk_term $sb, $crate::Terminal::FatArrow)
445    };
446
447    // Warning: this is equivalent to the `$` sign.
448    (@inner $sb:expr, #) => {
449        $crate::quote!(@mk_term $sb, $crate::Terminal::Dollar)
450    };
451
452    (@inner $sb:expr, ?) => {
453        $crate::quote!(@mk_term $sb, $crate::Terminal::QuestionMark)
454    };
455
456    // Keep this rule at the end of the list, so that it does not match `true`
457    // and `false`, which are keywords.
458    (@inner $sb:expr, $lit:literal) => {
459        $crate::quote!(
460            @mk_term $sb,
461            $crate::Terminal::Literal(stringify!($lit).to_string()),
462        )
463    };
464
465    (@inner $sb:expr, $tt:tt) => {
466        compile_error!(concat!("Unexpected token: ", stringify!($tt)))
467    };
468
469    (@with_sb $sb:expr, ) => {
470        vec![]
471    };
472
473    (@with_sb $sb:expr, $( $tt:tt )* ) => {{
474        vec![
475            $(
476                $crate::quote!(@inner $sb, $tt)
477            ),*
478        ]
479    }};
480
481    (@inner $sb:expr, $tt:tt) => {
482        compile_error!(concat!("Unexpected token: ", stringify!($tt)))
483    };
484
485    (@with_sb $sb:expr, ) => {
486        vec![]
487    };
488
489    (@with_sb $sb:expr, $( $tt:tt )* ) => {{
490        vec![
491            $(
492                $crate::quote!(@inner $sb, $tt)
493            ),*
494        ]
495    }};
496
497    ( $( $tt:tt )* ) => {{
498        #[allow(unused_variables, unused_mut)]
499        let mut span_builder = $crate::span::DebugSpanBuilder::new();
500        $crate::quote! { @with_sb span_builder, $( $tt )* }
501    }};
502}
503
504macro_rules! impl_spannable {
505    ($in:ident $( <$span:ident> )? => $out:ident) => {
506        impl<Span> $crate::Spannable<Span> for $in$(<$span>)? {
507            type Output = $out<Span>;
508
509            fn with_span(self, span: Span) -> $out<Span> {
510                $out { kind: self.into(), span }
511            }
512        }
513    };
514}
515
516mod tests {
517    macro_rules! test_quote {
518        ($name:ident {
519            { $( $left:tt )* },
520            $right:expr $(,)?
521        }) => {
522            #[test]
523            fn $name() {
524                let left = quote! { $( $left )* };
525                let right = $right;
526
527                right.assert_debug_eq(&left);
528            }
529        }
530    }
531
532    test_quote! {
533        simple_traduction {
534            { a b c d },
535            expect_test::expect![[r#"
536                [
537                    TokenTree {
538                        kind: Terminal(
539                            Ident(
540                                "a",
541                            ),
542                        ),
543                        span: 0,
544                    },
545                    TokenTree {
546                        kind: Terminal(
547                            Ident(
548                                "b",
549                            ),
550                        ),
551                        span: 1,
552                    },
553                    TokenTree {
554                        kind: Terminal(
555                            Ident(
556                                "c",
557                            ),
558                        ),
559                        span: 2,
560                    },
561                    TokenTree {
562                        kind: Terminal(
563                            Ident(
564                                "d",
565                            ),
566                        ),
567                        span: 3,
568                    },
569                ]
570            "#]],
571        }
572    }
573
574    test_quote! {
575        handles_matcher_syntax {
576            { a + b #( #test:ident )+* },
577            expect_test::expect![[r#"
578                [
579                    TokenTree {
580                        kind: Terminal(
581                            Ident(
582                                "a",
583                            ),
584                        ),
585                        span: 0,
586                    },
587                    TokenTree {
588                        kind: Terminal(
589                            Plus,
590                        ),
591                        span: 1,
592                    },
593                    TokenTree {
594                        kind: Terminal(
595                            Ident(
596                                "b",
597                            ),
598                        ),
599                        span: 2,
600                    },
601                    TokenTree {
602                        kind: Terminal(
603                            Dollar,
604                        ),
605                        span: 3,
606                    },
607                    TokenTree {
608                        kind: Parenthesed(
609                            [
610                                TokenTree {
611                                    kind: Terminal(
612                                        Dollar,
613                                    ),
614                                    span: 5,
615                                },
616                                TokenTree {
617                                    kind: Terminal(
618                                        Ident(
619                                            "test",
620                                        ),
621                                    ),
622                                    span: 6,
623                                },
624                                TokenTree {
625                                    kind: Terminal(
626                                        Colon,
627                                    ),
628                                    span: 7,
629                                },
630                                TokenTree {
631                                    kind: Terminal(
632                                        Ident(
633                                            "ident",
634                                        ),
635                                    ),
636                                    span: 8,
637                                },
638                            ],
639                        ),
640                        span: 4,
641                    },
642                    TokenTree {
643                        kind: Terminal(
644                            Plus,
645                        ),
646                        span: 9,
647                    },
648                    TokenTree {
649                        kind: Terminal(
650                            Star,
651                        ),
652                        span: 10,
653                    },
654                ]
655            "#]],
656        }
657    }
658
659    test_quote! {
660        can_parse_substition_syntax {
661            { a + b #( + #c + a )+? },
662            expect_test::expect![[r#"
663                [
664                    TokenTree {
665                        kind: Terminal(
666                            Ident(
667                                "a",
668                            ),
669                        ),
670                        span: 0,
671                    },
672                    TokenTree {
673                        kind: Terminal(
674                            Plus,
675                        ),
676                        span: 1,
677                    },
678                    TokenTree {
679                        kind: Terminal(
680                            Ident(
681                                "b",
682                            ),
683                        ),
684                        span: 2,
685                    },
686                    TokenTree {
687                        kind: Terminal(
688                            Dollar,
689                        ),
690                        span: 3,
691                    },
692                    TokenTree {
693                        kind: Parenthesed(
694                            [
695                                TokenTree {
696                                    kind: Terminal(
697                                        Plus,
698                                    ),
699                                    span: 5,
700                                },
701                                TokenTree {
702                                    kind: Terminal(
703                                        Dollar,
704                                    ),
705                                    span: 6,
706                                },
707                                TokenTree {
708                                    kind: Terminal(
709                                        Ident(
710                                            "c",
711                                        ),
712                                    ),
713                                    span: 7,
714                                },
715                                TokenTree {
716                                    kind: Terminal(
717                                        Plus,
718                                    ),
719                                    span: 8,
720                                },
721                                TokenTree {
722                                    kind: Terminal(
723                                        Ident(
724                                            "a",
725                                        ),
726                                    ),
727                                    span: 9,
728                                },
729                            ],
730                        ),
731                        span: 4,
732                    },
733                    TokenTree {
734                        kind: Terminal(
735                            Plus,
736                        ),
737                        span: 10,
738                    },
739                    TokenTree {
740                        kind: Terminal(
741                            QuestionMark,
742                        ),
743                        span: 11,
744                    },
745                ]
746            "#]],
747        }
748    }
749
750    test_quote! {
751        all_tokens {
752            {
753                horse
754                as async await break const continue crate do else enum extern false fn for if impl
755                in let loop match mod move mut pub ref return self Self static struct super trait
756                true type unsafe use where while abstract become box do final macro override
757                priv typeof unsized virtual yield
758                42
759                + - * / % ^ ! & | && || << >> += -= *= /= %= ^= &= |= <<= >>= = == != > < >= <= @ _
760                . .. ... ..= , ; : :: => # /* $ */ ?
761            },
762            expect_test::expect![[r#"
763                [
764                    TokenTree {
765                        kind: Terminal(
766                            Ident(
767                                "horse",
768                            ),
769                        ),
770                        span: 0,
771                    },
772                    TokenTree {
773                        kind: Terminal(
774                            As,
775                        ),
776                        span: 1,
777                    },
778                    TokenTree {
779                        kind: Terminal(
780                            Async,
781                        ),
782                        span: 2,
783                    },
784                    TokenTree {
785                        kind: Terminal(
786                            Await,
787                        ),
788                        span: 3,
789                    },
790                    TokenTree {
791                        kind: Terminal(
792                            Break,
793                        ),
794                        span: 4,
795                    },
796                    TokenTree {
797                        kind: Terminal(
798                            Const,
799                        ),
800                        span: 5,
801                    },
802                    TokenTree {
803                        kind: Terminal(
804                            Continue,
805                        ),
806                        span: 6,
807                    },
808                    TokenTree {
809                        kind: Terminal(
810                            Crate,
811                        ),
812                        span: 7,
813                    },
814                    TokenTree {
815                        kind: Terminal(
816                            Do,
817                        ),
818                        span: 8,
819                    },
820                    TokenTree {
821                        kind: Terminal(
822                            Else,
823                        ),
824                        span: 9,
825                    },
826                    TokenTree {
827                        kind: Terminal(
828                            Enum,
829                        ),
830                        span: 10,
831                    },
832                    TokenTree {
833                        kind: Terminal(
834                            Extern,
835                        ),
836                        span: 11,
837                    },
838                    TokenTree {
839                        kind: Terminal(
840                            False,
841                        ),
842                        span: 12,
843                    },
844                    TokenTree {
845                        kind: Terminal(
846                            Fn,
847                        ),
848                        span: 13,
849                    },
850                    TokenTree {
851                        kind: Terminal(
852                            For,
853                        ),
854                        span: 14,
855                    },
856                    TokenTree {
857                        kind: Terminal(
858                            If,
859                        ),
860                        span: 15,
861                    },
862                    TokenTree {
863                        kind: Terminal(
864                            Impl,
865                        ),
866                        span: 16,
867                    },
868                    TokenTree {
869                        kind: Terminal(
870                            In,
871                        ),
872                        span: 17,
873                    },
874                    TokenTree {
875                        kind: Terminal(
876                            Let,
877                        ),
878                        span: 18,
879                    },
880                    TokenTree {
881                        kind: Terminal(
882                            Loop,
883                        ),
884                        span: 19,
885                    },
886                    TokenTree {
887                        kind: Terminal(
888                            Match,
889                        ),
890                        span: 20,
891                    },
892                    TokenTree {
893                        kind: Terminal(
894                            Mod,
895                        ),
896                        span: 21,
897                    },
898                    TokenTree {
899                        kind: Terminal(
900                            Move,
901                        ),
902                        span: 22,
903                    },
904                    TokenTree {
905                        kind: Terminal(
906                            Mut,
907                        ),
908                        span: 23,
909                    },
910                    TokenTree {
911                        kind: Terminal(
912                            Pub,
913                        ),
914                        span: 24,
915                    },
916                    TokenTree {
917                        kind: Terminal(
918                            Ref,
919                        ),
920                        span: 25,
921                    },
922                    TokenTree {
923                        kind: Terminal(
924                            Return,
925                        ),
926                        span: 26,
927                    },
928                    TokenTree {
929                        kind: Terminal(
930                            Self_,
931                        ),
932                        span: 27,
933                    },
934                    TokenTree {
935                        kind: Terminal(
936                            SelfUpper,
937                        ),
938                        span: 28,
939                    },
940                    TokenTree {
941                        kind: Terminal(
942                            Static,
943                        ),
944                        span: 29,
945                    },
946                    TokenTree {
947                        kind: Terminal(
948                            Struct,
949                        ),
950                        span: 30,
951                    },
952                    TokenTree {
953                        kind: Terminal(
954                            Super,
955                        ),
956                        span: 31,
957                    },
958                    TokenTree {
959                        kind: Terminal(
960                            Trait,
961                        ),
962                        span: 32,
963                    },
964                    TokenTree {
965                        kind: Terminal(
966                            True,
967                        ),
968                        span: 33,
969                    },
970                    TokenTree {
971                        kind: Terminal(
972                            Type,
973                        ),
974                        span: 34,
975                    },
976                    TokenTree {
977                        kind: Terminal(
978                            Unsafe,
979                        ),
980                        span: 35,
981                    },
982                    TokenTree {
983                        kind: Terminal(
984                            Use,
985                        ),
986                        span: 36,
987                    },
988                    TokenTree {
989                        kind: Terminal(
990                            Where,
991                        ),
992                        span: 37,
993                    },
994                    TokenTree {
995                        kind: Terminal(
996                            While,
997                        ),
998                        span: 38,
999                    },
1000                    TokenTree {
1001                        kind: Terminal(
1002                            Abstract,
1003                        ),
1004                        span: 39,
1005                    },
1006                    TokenTree {
1007                        kind: Terminal(
1008                            Become,
1009                        ),
1010                        span: 40,
1011                    },
1012                    TokenTree {
1013                        kind: Terminal(
1014                            Box,
1015                        ),
1016                        span: 41,
1017                    },
1018                    TokenTree {
1019                        kind: Terminal(
1020                            Do,
1021                        ),
1022                        span: 42,
1023                    },
1024                    TokenTree {
1025                        kind: Terminal(
1026                            Final,
1027                        ),
1028                        span: 43,
1029                    },
1030                    TokenTree {
1031                        kind: Terminal(
1032                            Macro,
1033                        ),
1034                        span: 44,
1035                    },
1036                    TokenTree {
1037                        kind: Terminal(
1038                            Override,
1039                        ),
1040                        span: 45,
1041                    },
1042                    TokenTree {
1043                        kind: Terminal(
1044                            Priv,
1045                        ),
1046                        span: 46,
1047                    },
1048                    TokenTree {
1049                        kind: Terminal(
1050                            Typeof,
1051                        ),
1052                        span: 47,
1053                    },
1054                    TokenTree {
1055                        kind: Terminal(
1056                            Unsized,
1057                        ),
1058                        span: 48,
1059                    },
1060                    TokenTree {
1061                        kind: Terminal(
1062                            Virtual,
1063                        ),
1064                        span: 49,
1065                    },
1066                    TokenTree {
1067                        kind: Terminal(
1068                            Yield,
1069                        ),
1070                        span: 50,
1071                    },
1072                    TokenTree {
1073                        kind: Terminal(
1074                            Literal(
1075                                "42",
1076                            ),
1077                        ),
1078                        span: 51,
1079                    },
1080                    TokenTree {
1081                        kind: Terminal(
1082                            Plus,
1083                        ),
1084                        span: 52,
1085                    },
1086                    TokenTree {
1087                        kind: Terminal(
1088                            Minus,
1089                        ),
1090                        span: 53,
1091                    },
1092                    TokenTree {
1093                        kind: Terminal(
1094                            Star,
1095                        ),
1096                        span: 54,
1097                    },
1098                    TokenTree {
1099                        kind: Terminal(
1100                            Slash,
1101                        ),
1102                        span: 55,
1103                    },
1104                    TokenTree {
1105                        kind: Terminal(
1106                            Percent,
1107                        ),
1108                        span: 56,
1109                    },
1110                    TokenTree {
1111                        kind: Terminal(
1112                            Caret,
1113                        ),
1114                        span: 57,
1115                    },
1116                    TokenTree {
1117                        kind: Terminal(
1118                            Not,
1119                        ),
1120                        span: 58,
1121                    },
1122                    TokenTree {
1123                        kind: Terminal(
1124                            And,
1125                        ),
1126                        span: 59,
1127                    },
1128                    TokenTree {
1129                        kind: Terminal(
1130                            Or,
1131                        ),
1132                        span: 60,
1133                    },
1134                    TokenTree {
1135                        kind: Terminal(
1136                            AndAnd,
1137                        ),
1138                        span: 61,
1139                    },
1140                    TokenTree {
1141                        kind: Terminal(
1142                            OrOr,
1143                        ),
1144                        span: 62,
1145                    },
1146                    TokenTree {
1147                        kind: Terminal(
1148                            Shl,
1149                        ),
1150                        span: 63,
1151                    },
1152                    TokenTree {
1153                        kind: Terminal(
1154                            Shr,
1155                        ),
1156                        span: 64,
1157                    },
1158                    TokenTree {
1159                        kind: Terminal(
1160                            PlusEquals,
1161                        ),
1162                        span: 65,
1163                    },
1164                    TokenTree {
1165                        kind: Terminal(
1166                            MinusEquals,
1167                        ),
1168                        span: 66,
1169                    },
1170                    TokenTree {
1171                        kind: Terminal(
1172                            StarEquals,
1173                        ),
1174                        span: 67,
1175                    },
1176                    TokenTree {
1177                        kind: Terminal(
1178                            SlashEquals,
1179                        ),
1180                        span: 68,
1181                    },
1182                    TokenTree {
1183                        kind: Terminal(
1184                            PercentEquals,
1185                        ),
1186                        span: 69,
1187                    },
1188                    TokenTree {
1189                        kind: Terminal(
1190                            CaretEquals,
1191                        ),
1192                        span: 70,
1193                    },
1194                    TokenTree {
1195                        kind: Terminal(
1196                            AndEquals,
1197                        ),
1198                        span: 71,
1199                    },
1200                    TokenTree {
1201                        kind: Terminal(
1202                            OrEquals,
1203                        ),
1204                        span: 72,
1205                    },
1206                    TokenTree {
1207                        kind: Terminal(
1208                            ShlEquals,
1209                        ),
1210                        span: 73,
1211                    },
1212                    TokenTree {
1213                        kind: Terminal(
1214                            ShrEquals,
1215                        ),
1216                        span: 74,
1217                    },
1218                    TokenTree {
1219                        kind: Terminal(
1220                            Equals,
1221                        ),
1222                        span: 75,
1223                    },
1224                    TokenTree {
1225                        kind: Terminal(
1226                            EqualsEquals,
1227                        ),
1228                        span: 76,
1229                    },
1230                    TokenTree {
1231                        kind: Terminal(
1232                            NotEquals,
1233                        ),
1234                        span: 77,
1235                    },
1236                    TokenTree {
1237                        kind: Terminal(
1238                            GreaterThan,
1239                        ),
1240                        span: 78,
1241                    },
1242                    TokenTree {
1243                        kind: Terminal(
1244                            LessThan,
1245                        ),
1246                        span: 79,
1247                    },
1248                    TokenTree {
1249                        kind: Terminal(
1250                            GreaterThanEquals,
1251                        ),
1252                        span: 80,
1253                    },
1254                    TokenTree {
1255                        kind: Terminal(
1256                            LessThanEquals,
1257                        ),
1258                        span: 81,
1259                    },
1260                    TokenTree {
1261                        kind: Terminal(
1262                            At,
1263                        ),
1264                        span: 82,
1265                    },
1266                    TokenTree {
1267                        kind: Terminal(
1268                            Underscore,
1269                        ),
1270                        span: 83,
1271                    },
1272                    TokenTree {
1273                        kind: Terminal(
1274                            Dot,
1275                        ),
1276                        span: 84,
1277                    },
1278                    TokenTree {
1279                        kind: Terminal(
1280                            DotDot,
1281                        ),
1282                        span: 85,
1283                    },
1284                    TokenTree {
1285                        kind: Terminal(
1286                            DotDotDot,
1287                        ),
1288                        span: 86,
1289                    },
1290                    TokenTree {
1291                        kind: Terminal(
1292                            DotDotEquals,
1293                        ),
1294                        span: 87,
1295                    },
1296                    TokenTree {
1297                        kind: Terminal(
1298                            Comma,
1299                        ),
1300                        span: 88,
1301                    },
1302                    TokenTree {
1303                        kind: Terminal(
1304                            Semicolon,
1305                        ),
1306                        span: 89,
1307                    },
1308                    TokenTree {
1309                        kind: Terminal(
1310                            Colon,
1311                        ),
1312                        span: 90,
1313                    },
1314                    TokenTree {
1315                        kind: Terminal(
1316                            ColonColon,
1317                        ),
1318                        span: 91,
1319                    },
1320                    TokenTree {
1321                        kind: Terminal(
1322                            FatArrow,
1323                        ),
1324                        span: 92,
1325                    },
1326                    TokenTree {
1327                        kind: Terminal(
1328                            Dollar,
1329                        ),
1330                        span: 93,
1331                    },
1332                    TokenTree {
1333                        kind: Terminal(
1334                            QuestionMark,
1335                        ),
1336                        span: 94,
1337                    },
1338                ]
1339            "#]],
1340        }
1341    }
1342}