parser/syntax_kind/
generated.rs

1//! Generated by `cargo xtask codegen grammar`, do not edit by hand.
2
3#![allow(bad_style, missing_docs, unreachable_pub)]
4use crate::Edition;
5#[doc = r" The kind of syntax node, e.g. `IDENT`, `USE_KW`, or `STRUCT`."]
6#[derive(Debug)]
7#[repr(u16)]
8pub enum SyntaxKind {
9    #[doc(hidden)]
10    TOMBSTONE,
11    #[doc(hidden)]
12    EOF,
13    DOLLAR,
14    SEMICOLON,
15    COMMA,
16    L_PAREN,
17    R_PAREN,
18    L_CURLY,
19    R_CURLY,
20    L_BRACK,
21    R_BRACK,
22    L_ANGLE,
23    R_ANGLE,
24    AT,
25    POUND,
26    TILDE,
27    QUESTION,
28    AMP,
29    PIPE,
30    PLUS,
31    STAR,
32    SLASH,
33    CARET,
34    PERCENT,
35    UNDERSCORE,
36    DOT,
37    DOT2,
38    DOT3,
39    DOT2EQ,
40    COLON,
41    COLON2,
42    EQ,
43    EQ2,
44    FAT_ARROW,
45    BANG,
46    NEQ,
47    MINUS,
48    THIN_ARROW,
49    LTEQ,
50    GTEQ,
51    PLUSEQ,
52    MINUSEQ,
53    PIPEEQ,
54    AMPEQ,
55    CARETEQ,
56    SLASHEQ,
57    STAREQ,
58    PERCENTEQ,
59    AMP2,
60    PIPE2,
61    SHL,
62    SHR,
63    SHLEQ,
64    SHREQ,
65    SELF_TYPE_KW,
66    ABSTRACT_KW,
67    AS_KW,
68    BECOME_KW,
69    BOX_KW,
70    BREAK_KW,
71    CONST_KW,
72    CONTINUE_KW,
73    CRATE_KW,
74    DO_KW,
75    ELSE_KW,
76    ENUM_KW,
77    EXTERN_KW,
78    FALSE_KW,
79    FINAL_KW,
80    FN_KW,
81    FOR_KW,
82    IF_KW,
83    IMPL_KW,
84    IN_KW,
85    LET_KW,
86    LOOP_KW,
87    MACRO_KW,
88    MATCH_KW,
89    MOD_KW,
90    MOVE_KW,
91    MUT_KW,
92    OVERRIDE_KW,
93    PRIV_KW,
94    PUB_KW,
95    REF_KW,
96    RETURN_KW,
97    SELF_KW,
98    STATIC_KW,
99    STRUCT_KW,
100    SUPER_KW,
101    TRAIT_KW,
102    TRUE_KW,
103    TYPE_KW,
104    TYPEOF_KW,
105    UNSAFE_KW,
106    UNSIZED_KW,
107    USE_KW,
108    VIRTUAL_KW,
109    WHERE_KW,
110    WHILE_KW,
111    YIELD_KW,
112    ASM_KW,
113    ASYNC_KW,
114    ATT_SYNTAX_KW,
115    AUTO_KW,
116    AWAIT_KW,
117    BIKESHED_KW,
118    BUILTIN_KW,
119    CLOBBER_ABI_KW,
120    DEFAULT_KW,
121    DYN_KW,
122    FORMAT_ARGS_KW,
123    GEN_KW,
124    GLOBAL_ASM_KW,
125    INLATEOUT_KW,
126    INOUT_KW,
127    LABEL_KW,
128    LATEOUT_KW,
129    MACRO_RULES_KW,
130    MAY_UNWIND_KW,
131    NAKED_ASM_KW,
132    NOMEM_KW,
133    NORETURN_KW,
134    NOSTACK_KW,
135    OFFSET_OF_KW,
136    OPTIONS_KW,
137    OUT_KW,
138    PRESERVES_FLAGS_KW,
139    PURE_KW,
140    RAW_KW,
141    READONLY_KW,
142    SAFE_KW,
143    SYM_KW,
144    TRY_KW,
145    UNION_KW,
146    YEET_KW,
147    BYTE,
148    BYTE_STRING,
149    CHAR,
150    C_STRING,
151    FLOAT_NUMBER,
152    INT_NUMBER,
153    STRING,
154    COMMENT,
155    ERROR,
156    FRONTMATTER,
157    IDENT,
158    LIFETIME_IDENT,
159    NEWLINE,
160    SHEBANG,
161    WHITESPACE,
162    ABI,
163    ARG_LIST,
164    ARRAY_EXPR,
165    ARRAY_TYPE,
166    ASM_CLOBBER_ABI,
167    ASM_CONST,
168    ASM_DIR_SPEC,
169    ASM_EXPR,
170    ASM_LABEL,
171    ASM_OPERAND_EXPR,
172    ASM_OPERAND_NAMED,
173    ASM_OPTION,
174    ASM_OPTIONS,
175    ASM_REG_OPERAND,
176    ASM_REG_SPEC,
177    ASM_SYM,
178    ASSOC_ITEM_LIST,
179    ASSOC_TYPE_ARG,
180    ATTR,
181    AWAIT_EXPR,
182    BECOME_EXPR,
183    BIN_EXPR,
184    BLOCK_EXPR,
185    BOX_PAT,
186    BREAK_EXPR,
187    CALL_EXPR,
188    CAST_EXPR,
189    CLOSURE_EXPR,
190    CONST,
191    CONST_ARG,
192    CONST_BLOCK_PAT,
193    CONST_PARAM,
194    CONTINUE_EXPR,
195    DYN_TRAIT_TYPE,
196    ENUM,
197    EXPR_STMT,
198    EXTERN_BLOCK,
199    EXTERN_CRATE,
200    EXTERN_ITEM_LIST,
201    FIELD_EXPR,
202    FN,
203    FN_PTR_TYPE,
204    FORMAT_ARGS_ARG,
205    FORMAT_ARGS_ARG_NAME,
206    FORMAT_ARGS_EXPR,
207    FOR_BINDER,
208    FOR_EXPR,
209    FOR_TYPE,
210    GENERIC_ARG_LIST,
211    GENERIC_PARAM_LIST,
212    IDENT_PAT,
213    IF_EXPR,
214    IMPL,
215    IMPL_TRAIT_TYPE,
216    INDEX_EXPR,
217    INFER_TYPE,
218    ITEM_LIST,
219    LABEL,
220    LET_ELSE,
221    LET_EXPR,
222    LET_STMT,
223    LIFETIME,
224    LIFETIME_ARG,
225    LIFETIME_PARAM,
226    LITERAL,
227    LITERAL_PAT,
228    LOOP_EXPR,
229    MACRO_CALL,
230    MACRO_DEF,
231    MACRO_EXPR,
232    MACRO_ITEMS,
233    MACRO_PAT,
234    MACRO_RULES,
235    MACRO_STMTS,
236    MACRO_TYPE,
237    MATCH_ARM,
238    MATCH_ARM_LIST,
239    MATCH_EXPR,
240    MATCH_GUARD,
241    META,
242    METHOD_CALL_EXPR,
243    MODULE,
244    NAME,
245    NAME_REF,
246    NEVER_TYPE,
247    OFFSET_OF_EXPR,
248    OR_PAT,
249    PARAM,
250    PARAM_LIST,
251    PARENTHESIZED_ARG_LIST,
252    PAREN_EXPR,
253    PAREN_PAT,
254    PAREN_TYPE,
255    PATH,
256    PATH_EXPR,
257    PATH_PAT,
258    PATH_SEGMENT,
259    PATH_TYPE,
260    PREFIX_EXPR,
261    PTR_TYPE,
262    RANGE_EXPR,
263    RANGE_PAT,
264    RECORD_EXPR,
265    RECORD_EXPR_FIELD,
266    RECORD_EXPR_FIELD_LIST,
267    RECORD_FIELD,
268    RECORD_FIELD_LIST,
269    RECORD_PAT,
270    RECORD_PAT_FIELD,
271    RECORD_PAT_FIELD_LIST,
272    REF_EXPR,
273    REF_PAT,
274    REF_TYPE,
275    RENAME,
276    REST_PAT,
277    RETURN_EXPR,
278    RETURN_TYPE_SYNTAX,
279    RET_TYPE,
280    SELF_PARAM,
281    SLICE_PAT,
282    SLICE_TYPE,
283    SOURCE_FILE,
284    STATIC,
285    STMT_LIST,
286    STRUCT,
287    TOKEN_TREE,
288    TRAIT,
289    TRY_BLOCK_MODIFIER,
290    TRY_EXPR,
291    TUPLE_EXPR,
292    TUPLE_FIELD,
293    TUPLE_FIELD_LIST,
294    TUPLE_PAT,
295    TUPLE_STRUCT_PAT,
296    TUPLE_TYPE,
297    TYPE_ALIAS,
298    TYPE_ANCHOR,
299    TYPE_ARG,
300    TYPE_BOUND,
301    TYPE_BOUND_LIST,
302    TYPE_PARAM,
303    UNDERSCORE_EXPR,
304    UNION,
305    USE,
306    USE_BOUND_GENERIC_ARGS,
307    USE_TREE,
308    USE_TREE_LIST,
309    VARIANT,
310    VARIANT_LIST,
311    VISIBILITY,
312    WHERE_CLAUSE,
313    WHERE_PRED,
314    WHILE_EXPR,
315    WILDCARD_PAT,
316    YEET_EXPR,
317    YIELD_EXPR,
318    #[doc(hidden)]
319    __LAST,
320}
321use self::SyntaxKind::*;
322impl SyntaxKind {
323    #[allow(unreachable_patterns)]
324    pub const fn text(self) -> &'static str {
325        match self {
326            TOMBSTONE
327            | EOF
328            | __LAST
329            | BYTE
330            | BYTE_STRING
331            | CHAR
332            | C_STRING
333            | FLOAT_NUMBER
334            | INT_NUMBER
335            | STRING
336            | ABI
337            | ARG_LIST
338            | ARRAY_EXPR
339            | ARRAY_TYPE
340            | ASM_CLOBBER_ABI
341            | ASM_CONST
342            | ASM_DIR_SPEC
343            | ASM_EXPR
344            | ASM_LABEL
345            | ASM_OPERAND_EXPR
346            | ASM_OPERAND_NAMED
347            | ASM_OPTION
348            | ASM_OPTIONS
349            | ASM_REG_OPERAND
350            | ASM_REG_SPEC
351            | ASM_SYM
352            | ASSOC_ITEM_LIST
353            | ASSOC_TYPE_ARG
354            | ATTR
355            | AWAIT_EXPR
356            | BECOME_EXPR
357            | BIN_EXPR
358            | BLOCK_EXPR
359            | BOX_PAT
360            | BREAK_EXPR
361            | CALL_EXPR
362            | CAST_EXPR
363            | CLOSURE_EXPR
364            | CONST
365            | CONST_ARG
366            | CONST_BLOCK_PAT
367            | CONST_PARAM
368            | CONTINUE_EXPR
369            | DYN_TRAIT_TYPE
370            | ENUM
371            | EXPR_STMT
372            | EXTERN_BLOCK
373            | EXTERN_CRATE
374            | EXTERN_ITEM_LIST
375            | FIELD_EXPR
376            | FN
377            | FN_PTR_TYPE
378            | FORMAT_ARGS_ARG
379            | FORMAT_ARGS_ARG_NAME
380            | FORMAT_ARGS_EXPR
381            | FOR_BINDER
382            | FOR_EXPR
383            | FOR_TYPE
384            | GENERIC_ARG_LIST
385            | GENERIC_PARAM_LIST
386            | IDENT_PAT
387            | IF_EXPR
388            | IMPL
389            | IMPL_TRAIT_TYPE
390            | INDEX_EXPR
391            | INFER_TYPE
392            | ITEM_LIST
393            | LABEL
394            | LET_ELSE
395            | LET_EXPR
396            | LET_STMT
397            | LIFETIME
398            | LIFETIME_ARG
399            | LIFETIME_PARAM
400            | LITERAL
401            | LITERAL_PAT
402            | LOOP_EXPR
403            | MACRO_CALL
404            | MACRO_DEF
405            | MACRO_EXPR
406            | MACRO_ITEMS
407            | MACRO_PAT
408            | MACRO_RULES
409            | MACRO_STMTS
410            | MACRO_TYPE
411            | MATCH_ARM
412            | MATCH_ARM_LIST
413            | MATCH_EXPR
414            | MATCH_GUARD
415            | META
416            | METHOD_CALL_EXPR
417            | MODULE
418            | NAME
419            | NAME_REF
420            | NEVER_TYPE
421            | OFFSET_OF_EXPR
422            | OR_PAT
423            | PARAM
424            | PARAM_LIST
425            | PARENTHESIZED_ARG_LIST
426            | PAREN_EXPR
427            | PAREN_PAT
428            | PAREN_TYPE
429            | PATH
430            | PATH_EXPR
431            | PATH_PAT
432            | PATH_SEGMENT
433            | PATH_TYPE
434            | PREFIX_EXPR
435            | PTR_TYPE
436            | RANGE_EXPR
437            | RANGE_PAT
438            | RECORD_EXPR
439            | RECORD_EXPR_FIELD
440            | RECORD_EXPR_FIELD_LIST
441            | RECORD_FIELD
442            | RECORD_FIELD_LIST
443            | RECORD_PAT
444            | RECORD_PAT_FIELD
445            | RECORD_PAT_FIELD_LIST
446            | REF_EXPR
447            | REF_PAT
448            | REF_TYPE
449            | RENAME
450            | REST_PAT
451            | RETURN_EXPR
452            | RETURN_TYPE_SYNTAX
453            | RET_TYPE
454            | SELF_PARAM
455            | SLICE_PAT
456            | SLICE_TYPE
457            | SOURCE_FILE
458            | STATIC
459            | STMT_LIST
460            | STRUCT
461            | TOKEN_TREE
462            | TRAIT
463            | TRY_BLOCK_MODIFIER
464            | TRY_EXPR
465            | TUPLE_EXPR
466            | TUPLE_FIELD
467            | TUPLE_FIELD_LIST
468            | TUPLE_PAT
469            | TUPLE_STRUCT_PAT
470            | TUPLE_TYPE
471            | TYPE_ALIAS
472            | TYPE_ANCHOR
473            | TYPE_ARG
474            | TYPE_BOUND
475            | TYPE_BOUND_LIST
476            | TYPE_PARAM
477            | UNDERSCORE_EXPR
478            | UNION
479            | USE
480            | USE_BOUND_GENERIC_ARGS
481            | USE_TREE
482            | USE_TREE_LIST
483            | VARIANT
484            | VARIANT_LIST
485            | VISIBILITY
486            | WHERE_CLAUSE
487            | WHERE_PRED
488            | WHILE_EXPR
489            | WILDCARD_PAT
490            | YEET_EXPR
491            | YIELD_EXPR
492            | COMMENT
493            | ERROR
494            | FRONTMATTER
495            | IDENT
496            | LIFETIME_IDENT
497            | NEWLINE
498            | SHEBANG
499            | WHITESPACE => panic!("no text for these `SyntaxKind`s"),
500            DOLLAR => "$",
501            SEMICOLON => ";",
502            COMMA => ",",
503            L_PAREN => "(",
504            R_PAREN => ")",
505            L_CURLY => "{",
506            R_CURLY => "}",
507            L_BRACK => "[",
508            R_BRACK => "]",
509            L_ANGLE => "<",
510            R_ANGLE => ">",
511            AT => "@",
512            POUND => "#",
513            TILDE => "~",
514            QUESTION => "?",
515            AMP => "&",
516            PIPE => "|",
517            PLUS => "+",
518            STAR => "*",
519            SLASH => "/",
520            CARET => "^",
521            PERCENT => "%",
522            UNDERSCORE => "_",
523            DOT => ".",
524            DOT2 => "..",
525            DOT3 => "...",
526            DOT2EQ => "..=",
527            COLON => ":",
528            COLON2 => "::",
529            EQ => "=",
530            EQ2 => "==",
531            FAT_ARROW => "=>",
532            BANG => "!",
533            NEQ => "!=",
534            MINUS => "-",
535            THIN_ARROW => "->",
536            LTEQ => "<=",
537            GTEQ => ">=",
538            PLUSEQ => "+=",
539            MINUSEQ => "-=",
540            PIPEEQ => "|=",
541            AMPEQ => "&=",
542            CARETEQ => "^=",
543            SLASHEQ => "/=",
544            STAREQ => "*=",
545            PERCENTEQ => "%=",
546            AMP2 => "&&",
547            PIPE2 => "||",
548            SHL => "<<",
549            SHR => ">>",
550            SHLEQ => "<<=",
551            SHREQ => ">>=",
552            SELF_TYPE_KW => "Self",
553            ABSTRACT_KW => "abstract",
554            AS_KW => "as",
555            BECOME_KW => "become",
556            BOX_KW => "box",
557            BREAK_KW => "break",
558            CONST_KW => "const",
559            CONTINUE_KW => "continue",
560            CRATE_KW => "crate",
561            DO_KW => "do",
562            ELSE_KW => "else",
563            ENUM_KW => "enum",
564            EXTERN_KW => "extern",
565            FALSE_KW => "false",
566            FINAL_KW => "final",
567            FN_KW => "fn",
568            FOR_KW => "for",
569            IF_KW => "if",
570            IMPL_KW => "impl",
571            IN_KW => "in",
572            LET_KW => "let",
573            LOOP_KW => "loop",
574            MACRO_KW => "macro",
575            MATCH_KW => "match",
576            MOD_KW => "mod",
577            MOVE_KW => "move",
578            MUT_KW => "mut",
579            OVERRIDE_KW => "override",
580            PRIV_KW => "priv",
581            PUB_KW => "pub",
582            REF_KW => "ref",
583            RETURN_KW => "return",
584            SELF_KW => "self",
585            STATIC_KW => "static",
586            STRUCT_KW => "struct",
587            SUPER_KW => "super",
588            TRAIT_KW => "trait",
589            TRUE_KW => "true",
590            TYPE_KW => "type",
591            TYPEOF_KW => "typeof",
592            UNSAFE_KW => "unsafe",
593            UNSIZED_KW => "unsized",
594            USE_KW => "use",
595            VIRTUAL_KW => "virtual",
596            WHERE_KW => "where",
597            WHILE_KW => "while",
598            YIELD_KW => "yield",
599            ASM_KW => "asm",
600            ATT_SYNTAX_KW => "att_syntax",
601            AUTO_KW => "auto",
602            BIKESHED_KW => "bikeshed",
603            BUILTIN_KW => "builtin",
604            CLOBBER_ABI_KW => "clobber_abi",
605            DEFAULT_KW => "default",
606            DYN_KW => "dyn",
607            FORMAT_ARGS_KW => "format_args",
608            GLOBAL_ASM_KW => "global_asm",
609            INLATEOUT_KW => "inlateout",
610            INOUT_KW => "inout",
611            LABEL_KW => "label",
612            LATEOUT_KW => "lateout",
613            MACRO_RULES_KW => "macro_rules",
614            MAY_UNWIND_KW => "may_unwind",
615            NAKED_ASM_KW => "naked_asm",
616            NOMEM_KW => "nomem",
617            NORETURN_KW => "noreturn",
618            NOSTACK_KW => "nostack",
619            OFFSET_OF_KW => "offset_of",
620            OPTIONS_KW => "options",
621            OUT_KW => "out",
622            PRESERVES_FLAGS_KW => "preserves_flags",
623            PURE_KW => "pure",
624            RAW_KW => "raw",
625            READONLY_KW => "readonly",
626            SAFE_KW => "safe",
627            SYM_KW => "sym",
628            UNION_KW => "union",
629            YEET_KW => "yeet",
630            ASYNC_KW => "async",
631            AWAIT_KW => "await",
632            DYN_KW => "dyn",
633            GEN_KW => "gen",
634            TRY_KW => "try",
635        }
636    }
637    #[doc = r" Checks whether this syntax kind is a strict keyword for the given edition."]
638    #[doc = r" Strict keywords are identifiers that are always considered keywords."]
639    pub fn is_strict_keyword(self, edition: Edition) -> bool {
640        matches!(
641            self,
642            SELF_TYPE_KW
643                | ABSTRACT_KW
644                | AS_KW
645                | BECOME_KW
646                | BOX_KW
647                | BREAK_KW
648                | CONST_KW
649                | CONTINUE_KW
650                | CRATE_KW
651                | DO_KW
652                | ELSE_KW
653                | ENUM_KW
654                | EXTERN_KW
655                | FALSE_KW
656                | FINAL_KW
657                | FN_KW
658                | FOR_KW
659                | IF_KW
660                | IMPL_KW
661                | IN_KW
662                | LET_KW
663                | LOOP_KW
664                | MACRO_KW
665                | MATCH_KW
666                | MOD_KW
667                | MOVE_KW
668                | MUT_KW
669                | OVERRIDE_KW
670                | PRIV_KW
671                | PUB_KW
672                | REF_KW
673                | RETURN_KW
674                | SELF_KW
675                | STATIC_KW
676                | STRUCT_KW
677                | SUPER_KW
678                | TRAIT_KW
679                | TRUE_KW
680                | TYPE_KW
681                | TYPEOF_KW
682                | UNSAFE_KW
683                | UNSIZED_KW
684                | USE_KW
685                | VIRTUAL_KW
686                | WHERE_KW
687                | WHILE_KW
688                | YIELD_KW
689        ) || match self {
690            ASYNC_KW if Edition::Edition2018 <= edition => true,
691            AWAIT_KW if Edition::Edition2018 <= edition => true,
692            DYN_KW if Edition::Edition2018 <= edition => true,
693            GEN_KW if Edition::Edition2024 <= edition => true,
694            TRY_KW if Edition::Edition2018 <= edition => true,
695            _ => false,
696        }
697    }
698    #[doc = r" Checks whether this syntax kind is a weak keyword for the given edition."]
699    #[doc = r" Weak keywords are identifiers that are considered keywords only in certain contexts."]
700    pub fn is_contextual_keyword(self, edition: Edition) -> bool {
701        match self {
702            ASM_KW => true,
703            ATT_SYNTAX_KW => true,
704            AUTO_KW => true,
705            BIKESHED_KW => true,
706            BUILTIN_KW => true,
707            CLOBBER_ABI_KW => true,
708            DEFAULT_KW => true,
709            DYN_KW if edition < Edition::Edition2018 => true,
710            FORMAT_ARGS_KW => true,
711            GLOBAL_ASM_KW => true,
712            INLATEOUT_KW => true,
713            INOUT_KW => true,
714            LABEL_KW => true,
715            LATEOUT_KW => true,
716            MACRO_RULES_KW => true,
717            MAY_UNWIND_KW => true,
718            NAKED_ASM_KW => true,
719            NOMEM_KW => true,
720            NORETURN_KW => true,
721            NOSTACK_KW => true,
722            OFFSET_OF_KW => true,
723            OPTIONS_KW => true,
724            OUT_KW => true,
725            PRESERVES_FLAGS_KW => true,
726            PURE_KW => true,
727            RAW_KW => true,
728            READONLY_KW => true,
729            SAFE_KW => true,
730            SYM_KW => true,
731            UNION_KW => true,
732            YEET_KW => true,
733            _ => false,
734        }
735    }
736    #[doc = r" Checks whether this syntax kind is a strict or weak keyword for the given edition."]
737    pub fn is_keyword(self, edition: Edition) -> bool {
738        matches!(
739            self,
740            SELF_TYPE_KW
741                | ABSTRACT_KW
742                | AS_KW
743                | BECOME_KW
744                | BOX_KW
745                | BREAK_KW
746                | CONST_KW
747                | CONTINUE_KW
748                | CRATE_KW
749                | DO_KW
750                | ELSE_KW
751                | ENUM_KW
752                | EXTERN_KW
753                | FALSE_KW
754                | FINAL_KW
755                | FN_KW
756                | FOR_KW
757                | IF_KW
758                | IMPL_KW
759                | IN_KW
760                | LET_KW
761                | LOOP_KW
762                | MACRO_KW
763                | MATCH_KW
764                | MOD_KW
765                | MOVE_KW
766                | MUT_KW
767                | OVERRIDE_KW
768                | PRIV_KW
769                | PUB_KW
770                | REF_KW
771                | RETURN_KW
772                | SELF_KW
773                | STATIC_KW
774                | STRUCT_KW
775                | SUPER_KW
776                | TRAIT_KW
777                | TRUE_KW
778                | TYPE_KW
779                | TYPEOF_KW
780                | UNSAFE_KW
781                | UNSIZED_KW
782                | USE_KW
783                | VIRTUAL_KW
784                | WHERE_KW
785                | WHILE_KW
786                | YIELD_KW
787        ) || match self {
788            ASYNC_KW if Edition::Edition2018 <= edition => true,
789            AWAIT_KW if Edition::Edition2018 <= edition => true,
790            DYN_KW if Edition::Edition2018 <= edition => true,
791            GEN_KW if Edition::Edition2024 <= edition => true,
792            TRY_KW if Edition::Edition2018 <= edition => true,
793            ASM_KW => true,
794            ATT_SYNTAX_KW => true,
795            AUTO_KW => true,
796            BIKESHED_KW => true,
797            BUILTIN_KW => true,
798            CLOBBER_ABI_KW => true,
799            DEFAULT_KW => true,
800            DYN_KW if edition < Edition::Edition2018 => true,
801            FORMAT_ARGS_KW => true,
802            GLOBAL_ASM_KW => true,
803            INLATEOUT_KW => true,
804            INOUT_KW => true,
805            LABEL_KW => true,
806            LATEOUT_KW => true,
807            MACRO_RULES_KW => true,
808            MAY_UNWIND_KW => true,
809            NAKED_ASM_KW => true,
810            NOMEM_KW => true,
811            NORETURN_KW => true,
812            NOSTACK_KW => true,
813            OFFSET_OF_KW => true,
814            OPTIONS_KW => true,
815            OUT_KW => true,
816            PRESERVES_FLAGS_KW => true,
817            PURE_KW => true,
818            RAW_KW => true,
819            READONLY_KW => true,
820            SAFE_KW => true,
821            SYM_KW => true,
822            UNION_KW => true,
823            YEET_KW => true,
824            _ => false,
825        }
826    }
827    pub fn is_punct(self) -> bool {
828        matches!(
829            self,
830            DOLLAR
831                | SEMICOLON
832                | COMMA
833                | L_PAREN
834                | R_PAREN
835                | L_CURLY
836                | R_CURLY
837                | L_BRACK
838                | R_BRACK
839                | L_ANGLE
840                | R_ANGLE
841                | AT
842                | POUND
843                | TILDE
844                | QUESTION
845                | AMP
846                | PIPE
847                | PLUS
848                | STAR
849                | SLASH
850                | CARET
851                | PERCENT
852                | UNDERSCORE
853                | DOT
854                | DOT2
855                | DOT3
856                | DOT2EQ
857                | COLON
858                | COLON2
859                | EQ
860                | EQ2
861                | FAT_ARROW
862                | BANG
863                | NEQ
864                | MINUS
865                | THIN_ARROW
866                | LTEQ
867                | GTEQ
868                | PLUSEQ
869                | MINUSEQ
870                | PIPEEQ
871                | AMPEQ
872                | CARETEQ
873                | SLASHEQ
874                | STAREQ
875                | PERCENTEQ
876                | AMP2
877                | PIPE2
878                | SHL
879                | SHR
880                | SHLEQ
881                | SHREQ
882        )
883    }
884    pub fn is_literal(self) -> bool {
885        matches!(self, BYTE | BYTE_STRING | CHAR | C_STRING | FLOAT_NUMBER | INT_NUMBER | STRING)
886    }
887    pub fn from_keyword(ident: &str, edition: Edition) -> Option<SyntaxKind> {
888        let kw = match ident {
889            "Self" => SELF_TYPE_KW,
890            "abstract" => ABSTRACT_KW,
891            "as" => AS_KW,
892            "become" => BECOME_KW,
893            "box" => BOX_KW,
894            "break" => BREAK_KW,
895            "const" => CONST_KW,
896            "continue" => CONTINUE_KW,
897            "crate" => CRATE_KW,
898            "do" => DO_KW,
899            "else" => ELSE_KW,
900            "enum" => ENUM_KW,
901            "extern" => EXTERN_KW,
902            "false" => FALSE_KW,
903            "final" => FINAL_KW,
904            "fn" => FN_KW,
905            "for" => FOR_KW,
906            "if" => IF_KW,
907            "impl" => IMPL_KW,
908            "in" => IN_KW,
909            "let" => LET_KW,
910            "loop" => LOOP_KW,
911            "macro" => MACRO_KW,
912            "match" => MATCH_KW,
913            "mod" => MOD_KW,
914            "move" => MOVE_KW,
915            "mut" => MUT_KW,
916            "override" => OVERRIDE_KW,
917            "priv" => PRIV_KW,
918            "pub" => PUB_KW,
919            "ref" => REF_KW,
920            "return" => RETURN_KW,
921            "self" => SELF_KW,
922            "static" => STATIC_KW,
923            "struct" => STRUCT_KW,
924            "super" => SUPER_KW,
925            "trait" => TRAIT_KW,
926            "true" => TRUE_KW,
927            "type" => TYPE_KW,
928            "typeof" => TYPEOF_KW,
929            "unsafe" => UNSAFE_KW,
930            "unsized" => UNSIZED_KW,
931            "use" => USE_KW,
932            "virtual" => VIRTUAL_KW,
933            "where" => WHERE_KW,
934            "while" => WHILE_KW,
935            "yield" => YIELD_KW,
936            "async" if Edition::Edition2018 <= edition => ASYNC_KW,
937            "await" if Edition::Edition2018 <= edition => AWAIT_KW,
938            "dyn" if Edition::Edition2018 <= edition => DYN_KW,
939            "gen" if Edition::Edition2024 <= edition => GEN_KW,
940            "try" if Edition::Edition2018 <= edition => TRY_KW,
941            _ => return None,
942        };
943        Some(kw)
944    }
945    pub fn from_contextual_keyword(ident: &str, edition: Edition) -> Option<SyntaxKind> {
946        let kw = match ident {
947            "asm" => ASM_KW,
948            "att_syntax" => ATT_SYNTAX_KW,
949            "auto" => AUTO_KW,
950            "bikeshed" => BIKESHED_KW,
951            "builtin" => BUILTIN_KW,
952            "clobber_abi" => CLOBBER_ABI_KW,
953            "default" => DEFAULT_KW,
954            "dyn" if edition < Edition::Edition2018 => DYN_KW,
955            "format_args" => FORMAT_ARGS_KW,
956            "global_asm" => GLOBAL_ASM_KW,
957            "inlateout" => INLATEOUT_KW,
958            "inout" => INOUT_KW,
959            "label" => LABEL_KW,
960            "lateout" => LATEOUT_KW,
961            "macro_rules" => MACRO_RULES_KW,
962            "may_unwind" => MAY_UNWIND_KW,
963            "naked_asm" => NAKED_ASM_KW,
964            "nomem" => NOMEM_KW,
965            "noreturn" => NORETURN_KW,
966            "nostack" => NOSTACK_KW,
967            "offset_of" => OFFSET_OF_KW,
968            "options" => OPTIONS_KW,
969            "out" => OUT_KW,
970            "preserves_flags" => PRESERVES_FLAGS_KW,
971            "pure" => PURE_KW,
972            "raw" => RAW_KW,
973            "readonly" => READONLY_KW,
974            "safe" => SAFE_KW,
975            "sym" => SYM_KW,
976            "union" => UNION_KW,
977            "yeet" => YEET_KW,
978            _ => return None,
979        };
980        Some(kw)
981    }
982    pub fn from_char(c: char) -> Option<SyntaxKind> {
983        let tok = match c {
984            '$' => DOLLAR,
985            ';' => SEMICOLON,
986            ',' => COMMA,
987            '(' => L_PAREN,
988            ')' => R_PAREN,
989            '{' => L_CURLY,
990            '}' => R_CURLY,
991            '[' => L_BRACK,
992            ']' => R_BRACK,
993            '<' => L_ANGLE,
994            '>' => R_ANGLE,
995            '@' => AT,
996            '#' => POUND,
997            '~' => TILDE,
998            '?' => QUESTION,
999            '&' => AMP,
1000            '|' => PIPE,
1001            '+' => PLUS,
1002            '*' => STAR,
1003            '/' => SLASH,
1004            '^' => CARET,
1005            '%' => PERCENT,
1006            '_' => UNDERSCORE,
1007            '.' => DOT,
1008            ':' => COLON,
1009            '=' => EQ,
1010            '!' => BANG,
1011            '-' => MINUS,
1012            _ => return None,
1013        };
1014        Some(tok)
1015    }
1016}
1017#[doc = r" `T![]`"]
1018#[macro_export]
1019macro_rules ! T_ {
1020    [$] => { $ crate :: SyntaxKind :: DOLLAR };
1021    [;] => { $ crate :: SyntaxKind :: SEMICOLON };
1022    [,] => { $ crate :: SyntaxKind :: COMMA };
1023    ['('] => { $ crate :: SyntaxKind :: L_PAREN };
1024    [')'] => { $ crate :: SyntaxKind :: R_PAREN };
1025    ['{'] => { $ crate :: SyntaxKind :: L_CURLY };
1026    ['}'] => { $ crate :: SyntaxKind :: R_CURLY };
1027    ['['] => { $ crate :: SyntaxKind :: L_BRACK };
1028    [']'] => { $ crate :: SyntaxKind :: R_BRACK };
1029    [<] => { $ crate :: SyntaxKind :: L_ANGLE };
1030    [>] => { $ crate :: SyntaxKind :: R_ANGLE };
1031    [@] => { $ crate :: SyntaxKind :: AT };
1032    [#] => { $ crate :: SyntaxKind :: POUND };
1033    [~] => { $ crate :: SyntaxKind :: TILDE };
1034    [?] => { $ crate :: SyntaxKind :: QUESTION };
1035    [&] => { $ crate :: SyntaxKind :: AMP };
1036    [|] => { $ crate :: SyntaxKind :: PIPE };
1037    [+] => { $ crate :: SyntaxKind :: PLUS };
1038    [*] => { $ crate :: SyntaxKind :: STAR };
1039    [/] => { $ crate :: SyntaxKind :: SLASH };
1040    [^] => { $ crate :: SyntaxKind :: CARET };
1041    [%] => { $ crate :: SyntaxKind :: PERCENT };
1042    [_] => { $ crate :: SyntaxKind :: UNDERSCORE };
1043    [.] => { $ crate :: SyntaxKind :: DOT };
1044    [..] => { $ crate :: SyntaxKind :: DOT2 };
1045    [...] => { $ crate :: SyntaxKind :: DOT3 };
1046    [..=] => { $ crate :: SyntaxKind :: DOT2EQ };
1047    [:] => { $ crate :: SyntaxKind :: COLON };
1048    [::] => { $ crate :: SyntaxKind :: COLON2 };
1049    [=] => { $ crate :: SyntaxKind :: EQ };
1050    [==] => { $ crate :: SyntaxKind :: EQ2 };
1051    [=>] => { $ crate :: SyntaxKind :: FAT_ARROW };
1052    [!] => { $ crate :: SyntaxKind :: BANG };
1053    [!=] => { $ crate :: SyntaxKind :: NEQ };
1054    [-] => { $ crate :: SyntaxKind :: MINUS };
1055    [->] => { $ crate :: SyntaxKind :: THIN_ARROW };
1056    [<=] => { $ crate :: SyntaxKind :: LTEQ };
1057    [>=] => { $ crate :: SyntaxKind :: GTEQ };
1058    [+=] => { $ crate :: SyntaxKind :: PLUSEQ };
1059    [-=] => { $ crate :: SyntaxKind :: MINUSEQ };
1060    [|=] => { $ crate :: SyntaxKind :: PIPEEQ };
1061    [&=] => { $ crate :: SyntaxKind :: AMPEQ };
1062    [^=] => { $ crate :: SyntaxKind :: CARETEQ };
1063    [/=] => { $ crate :: SyntaxKind :: SLASHEQ };
1064    [*=] => { $ crate :: SyntaxKind :: STAREQ };
1065    [%=] => { $ crate :: SyntaxKind :: PERCENTEQ };
1066    [&&] => { $ crate :: SyntaxKind :: AMP2 };
1067    [||] => { $ crate :: SyntaxKind :: PIPE2 };
1068    [<<] => { $ crate :: SyntaxKind :: SHL };
1069    [>>] => { $ crate :: SyntaxKind :: SHR };
1070    [<<=] => { $ crate :: SyntaxKind :: SHLEQ };
1071    [>>=] => { $ crate :: SyntaxKind :: SHREQ };
1072    [Self] => { $ crate :: SyntaxKind :: SELF_TYPE_KW };
1073    [abstract] => { $ crate :: SyntaxKind :: ABSTRACT_KW };
1074    [as] => { $ crate :: SyntaxKind :: AS_KW };
1075    [become] => { $ crate :: SyntaxKind :: BECOME_KW };
1076    [box] => { $ crate :: SyntaxKind :: BOX_KW };
1077    [break] => { $ crate :: SyntaxKind :: BREAK_KW };
1078    [const] => { $ crate :: SyntaxKind :: CONST_KW };
1079    [continue] => { $ crate :: SyntaxKind :: CONTINUE_KW };
1080    [crate] => { $ crate :: SyntaxKind :: CRATE_KW };
1081    [do] => { $ crate :: SyntaxKind :: DO_KW };
1082    [else] => { $ crate :: SyntaxKind :: ELSE_KW };
1083    [enum] => { $ crate :: SyntaxKind :: ENUM_KW };
1084    [extern] => { $ crate :: SyntaxKind :: EXTERN_KW };
1085    [false] => { $ crate :: SyntaxKind :: FALSE_KW };
1086    [final] => { $ crate :: SyntaxKind :: FINAL_KW };
1087    [fn] => { $ crate :: SyntaxKind :: FN_KW };
1088    [for] => { $ crate :: SyntaxKind :: FOR_KW };
1089    [if] => { $ crate :: SyntaxKind :: IF_KW };
1090    [impl] => { $ crate :: SyntaxKind :: IMPL_KW };
1091    [in] => { $ crate :: SyntaxKind :: IN_KW };
1092    [let] => { $ crate :: SyntaxKind :: LET_KW };
1093    [loop] => { $ crate :: SyntaxKind :: LOOP_KW };
1094    [macro] => { $ crate :: SyntaxKind :: MACRO_KW };
1095    [match] => { $ crate :: SyntaxKind :: MATCH_KW };
1096    [mod] => { $ crate :: SyntaxKind :: MOD_KW };
1097    [move] => { $ crate :: SyntaxKind :: MOVE_KW };
1098    [mut] => { $ crate :: SyntaxKind :: MUT_KW };
1099    [override] => { $ crate :: SyntaxKind :: OVERRIDE_KW };
1100    [priv] => { $ crate :: SyntaxKind :: PRIV_KW };
1101    [pub] => { $ crate :: SyntaxKind :: PUB_KW };
1102    [ref] => { $ crate :: SyntaxKind :: REF_KW };
1103    [return] => { $ crate :: SyntaxKind :: RETURN_KW };
1104    [self] => { $ crate :: SyntaxKind :: SELF_KW };
1105    [static] => { $ crate :: SyntaxKind :: STATIC_KW };
1106    [struct] => { $ crate :: SyntaxKind :: STRUCT_KW };
1107    [super] => { $ crate :: SyntaxKind :: SUPER_KW };
1108    [trait] => { $ crate :: SyntaxKind :: TRAIT_KW };
1109    [true] => { $ crate :: SyntaxKind :: TRUE_KW };
1110    [type] => { $ crate :: SyntaxKind :: TYPE_KW };
1111    [typeof] => { $ crate :: SyntaxKind :: TYPEOF_KW };
1112    [unsafe] => { $ crate :: SyntaxKind :: UNSAFE_KW };
1113    [unsized] => { $ crate :: SyntaxKind :: UNSIZED_KW };
1114    [use] => { $ crate :: SyntaxKind :: USE_KW };
1115    [virtual] => { $ crate :: SyntaxKind :: VIRTUAL_KW };
1116    [where] => { $ crate :: SyntaxKind :: WHERE_KW };
1117    [while] => { $ crate :: SyntaxKind :: WHILE_KW };
1118    [yield] => { $ crate :: SyntaxKind :: YIELD_KW };
1119    [asm] => { $ crate :: SyntaxKind :: ASM_KW };
1120    [att_syntax] => { $ crate :: SyntaxKind :: ATT_SYNTAX_KW };
1121    [auto] => { $ crate :: SyntaxKind :: AUTO_KW };
1122    [bikeshed] => { $ crate :: SyntaxKind :: BIKESHED_KW };
1123    [builtin] => { $ crate :: SyntaxKind :: BUILTIN_KW };
1124    [clobber_abi] => { $ crate :: SyntaxKind :: CLOBBER_ABI_KW };
1125    [default] => { $ crate :: SyntaxKind :: DEFAULT_KW };
1126    [dyn] => { $ crate :: SyntaxKind :: DYN_KW };
1127    [format_args] => { $ crate :: SyntaxKind :: FORMAT_ARGS_KW };
1128    [global_asm] => { $ crate :: SyntaxKind :: GLOBAL_ASM_KW };
1129    [inlateout] => { $ crate :: SyntaxKind :: INLATEOUT_KW };
1130    [inout] => { $ crate :: SyntaxKind :: INOUT_KW };
1131    [label] => { $ crate :: SyntaxKind :: LABEL_KW };
1132    [lateout] => { $ crate :: SyntaxKind :: LATEOUT_KW };
1133    [macro_rules] => { $ crate :: SyntaxKind :: MACRO_RULES_KW };
1134    [may_unwind] => { $ crate :: SyntaxKind :: MAY_UNWIND_KW };
1135    [naked_asm] => { $ crate :: SyntaxKind :: NAKED_ASM_KW };
1136    [nomem] => { $ crate :: SyntaxKind :: NOMEM_KW };
1137    [noreturn] => { $ crate :: SyntaxKind :: NORETURN_KW };
1138    [nostack] => { $ crate :: SyntaxKind :: NOSTACK_KW };
1139    [offset_of] => { $ crate :: SyntaxKind :: OFFSET_OF_KW };
1140    [options] => { $ crate :: SyntaxKind :: OPTIONS_KW };
1141    [out] => { $ crate :: SyntaxKind :: OUT_KW };
1142    [preserves_flags] => { $ crate :: SyntaxKind :: PRESERVES_FLAGS_KW };
1143    [pure] => { $ crate :: SyntaxKind :: PURE_KW };
1144    [raw] => { $ crate :: SyntaxKind :: RAW_KW };
1145    [readonly] => { $ crate :: SyntaxKind :: READONLY_KW };
1146    [safe] => { $ crate :: SyntaxKind :: SAFE_KW };
1147    [sym] => { $ crate :: SyntaxKind :: SYM_KW };
1148    [union] => { $ crate :: SyntaxKind :: UNION_KW };
1149    [yeet] => { $ crate :: SyntaxKind :: YEET_KW };
1150    [async] => { $ crate :: SyntaxKind :: ASYNC_KW };
1151    [await] => { $ crate :: SyntaxKind :: AWAIT_KW };
1152    [dyn] => { $ crate :: SyntaxKind :: DYN_KW };
1153    [gen] => { $ crate :: SyntaxKind :: GEN_KW };
1154    [try] => { $ crate :: SyntaxKind :: TRY_KW };
1155    [lifetime_ident] => { $ crate :: SyntaxKind :: LIFETIME_IDENT };
1156    [int_number] => { $ crate :: SyntaxKind :: INT_NUMBER };
1157    [ident] => { $ crate :: SyntaxKind :: IDENT };
1158    [string] => { $ crate :: SyntaxKind :: STRING };
1159    [shebang] => { $ crate :: SyntaxKind :: SHEBANG };
1160    [frontmatter] => { $ crate :: SyntaxKind :: FRONTMATTER };
1161}
1162
1163impl ::core::marker::Copy for SyntaxKind {}
1164impl ::core::clone::Clone for SyntaxKind {
1165    #[inline]
1166    fn clone(&self) -> Self { *self }
1167}
1168impl ::core::cmp::PartialEq for SyntaxKind {
1169    #[inline]
1170    fn eq(&self, other: &Self) -> bool { (*self as u16) == (*other as u16) }
1171}
1172impl ::core::cmp::Eq for SyntaxKind {}
1173impl ::core::cmp::PartialOrd for SyntaxKind {
1174    #[inline]
1175    fn partial_cmp(&self, other: &Self) -> core::option::Option<core::cmp::Ordering> {
1176        Some(self.cmp(other))
1177    }
1178}
1179impl ::core::cmp::Ord for SyntaxKind {
1180    #[inline]
1181    fn cmp(&self, other: &Self) -> core::cmp::Ordering { (*self as u16).cmp(&(*other as u16)) }
1182}
1183impl ::core::hash::Hash for SyntaxKind {
1184    fn hash<H: ::core::hash::Hasher>(&self, state: &mut H) {
1185        ::core::mem::discriminant(self).hash(state);
1186    }
1187}