Skip to content

Commit be12c80

Browse files
Add a function to convert a SyntaxKind to its text, where possible
This will also help for the make's quote macro.
1 parent ca0c8da commit be12c80

File tree

2 files changed

+341
-0
lines changed

2 files changed

+341
-0
lines changed

src/tools/rust-analyzer/crates/parser/src/syntax_kind/generated.rs

Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -331,6 +331,331 @@ pub enum SyntaxKind {
331331
}
332332
use self::SyntaxKind::*;
333333
impl SyntaxKind {
334+
#[allow(unreachable_patterns)]
335+
pub const fn text(self) -> &'static str {
336+
match self {
337+
TOMBSTONE
338+
| EOF
339+
| __LAST
340+
| BYTE
341+
| BYTE_STRING
342+
| CHAR
343+
| C_STRING
344+
| FLOAT_NUMBER
345+
| INT_NUMBER
346+
| RAW_BYTE_STRING
347+
| RAW_C_STRING
348+
| RAW_STRING
349+
| STRING
350+
| ABI
351+
| ADT
352+
| ARG_LIST
353+
| ARRAY_EXPR
354+
| ARRAY_TYPE
355+
| ASM_CLOBBER_ABI
356+
| ASM_CONST
357+
| ASM_DIR_SPEC
358+
| ASM_EXPR
359+
| ASM_LABEL
360+
| ASM_OPERAND
361+
| ASM_OPERAND_EXPR
362+
| ASM_OPERAND_NAMED
363+
| ASM_OPTION
364+
| ASM_OPTIONS
365+
| ASM_PIECE
366+
| ASM_REG_OPERAND
367+
| ASM_REG_SPEC
368+
| ASM_SYM
369+
| ASSOC_ITEM
370+
| ASSOC_ITEM_LIST
371+
| ASSOC_TYPE_ARG
372+
| ATTR
373+
| AWAIT_EXPR
374+
| BECOME_EXPR
375+
| BIN_EXPR
376+
| BLOCK_EXPR
377+
| BOX_PAT
378+
| BREAK_EXPR
379+
| CALL_EXPR
380+
| CAST_EXPR
381+
| CLOSURE_BINDER
382+
| CLOSURE_EXPR
383+
| CONST
384+
| CONST_ARG
385+
| CONST_BLOCK_PAT
386+
| CONST_PARAM
387+
| CONTINUE_EXPR
388+
| DYN_TRAIT_TYPE
389+
| ENUM
390+
| EXPR
391+
| EXPR_STMT
392+
| EXTERN_BLOCK
393+
| EXTERN_CRATE
394+
| EXTERN_ITEM
395+
| EXTERN_ITEM_LIST
396+
| FIELD_EXPR
397+
| FIELD_LIST
398+
| FN
399+
| FN_PTR_TYPE
400+
| FORMAT_ARGS_ARG
401+
| FORMAT_ARGS_EXPR
402+
| FOR_EXPR
403+
| FOR_TYPE
404+
| GENERIC_ARG
405+
| GENERIC_ARG_LIST
406+
| GENERIC_PARAM
407+
| GENERIC_PARAM_LIST
408+
| IDENT_PAT
409+
| IF_EXPR
410+
| IMPL
411+
| IMPL_TRAIT_TYPE
412+
| INDEX_EXPR
413+
| INFER_TYPE
414+
| ITEM
415+
| ITEM_LIST
416+
| LABEL
417+
| LET_ELSE
418+
| LET_EXPR
419+
| LET_STMT
420+
| LIFETIME
421+
| LIFETIME_ARG
422+
| LIFETIME_PARAM
423+
| LITERAL
424+
| LITERAL_PAT
425+
| LOOP_EXPR
426+
| MACRO_CALL
427+
| MACRO_DEF
428+
| MACRO_EXPR
429+
| MACRO_ITEMS
430+
| MACRO_PAT
431+
| MACRO_RULES
432+
| MACRO_STMTS
433+
| MACRO_TYPE
434+
| MATCH_ARM
435+
| MATCH_ARM_LIST
436+
| MATCH_EXPR
437+
| MATCH_GUARD
438+
| META
439+
| METHOD_CALL_EXPR
440+
| MODULE
441+
| NAME
442+
| NAME_REF
443+
| NEVER_TYPE
444+
| OFFSET_OF_EXPR
445+
| OR_PAT
446+
| PARAM
447+
| PARAM_LIST
448+
| PARENTHESIZED_ARG_LIST
449+
| PAREN_EXPR
450+
| PAREN_PAT
451+
| PAREN_TYPE
452+
| PAT
453+
| PATH
454+
| PATH_EXPR
455+
| PATH_PAT
456+
| PATH_SEGMENT
457+
| PATH_TYPE
458+
| PREFIX_EXPR
459+
| PTR_TYPE
460+
| RANGE_EXPR
461+
| RANGE_PAT
462+
| RECORD_EXPR
463+
| RECORD_EXPR_FIELD
464+
| RECORD_EXPR_FIELD_LIST
465+
| RECORD_FIELD
466+
| RECORD_FIELD_LIST
467+
| RECORD_PAT
468+
| RECORD_PAT_FIELD
469+
| RECORD_PAT_FIELD_LIST
470+
| REF_EXPR
471+
| REF_PAT
472+
| REF_TYPE
473+
| RENAME
474+
| REST_PAT
475+
| RETURN_EXPR
476+
| RETURN_TYPE_SYNTAX
477+
| RET_TYPE
478+
| SELF_PARAM
479+
| SLICE_PAT
480+
| SLICE_TYPE
481+
| SOURCE_FILE
482+
| STATIC
483+
| STMT
484+
| STMT_LIST
485+
| STRUCT
486+
| TOKEN_TREE
487+
| TRAIT
488+
| TRAIT_ALIAS
489+
| TRY_EXPR
490+
| TUPLE_EXPR
491+
| TUPLE_FIELD
492+
| TUPLE_FIELD_LIST
493+
| TUPLE_PAT
494+
| TUPLE_STRUCT_PAT
495+
| TUPLE_TYPE
496+
| TYPE
497+
| TYPE_ALIAS
498+
| TYPE_ARG
499+
| TYPE_BOUND
500+
| TYPE_BOUND_LIST
501+
| TYPE_PARAM
502+
| UNDERSCORE_EXPR
503+
| UNION
504+
| USE
505+
| USE_BOUND_GENERIC_ARG
506+
| USE_BOUND_GENERIC_ARGS
507+
| USE_TREE
508+
| USE_TREE_LIST
509+
| VARIANT
510+
| VARIANT_LIST
511+
| VISIBILITY
512+
| WHERE_CLAUSE
513+
| WHERE_PRED
514+
| WHILE_EXPR
515+
| WILDCARD_PAT
516+
| YEET_EXPR
517+
| YIELD_EXPR
518+
| COMMENT
519+
| ERROR
520+
| IDENT
521+
| LIFETIME_IDENT
522+
| NEWLINE
523+
| SHEBANG
524+
| WHITESPACE => panic!("no text for these `SyntaxKind`s"),
525+
DOLLAR => "$",
526+
SEMICOLON => ";",
527+
COMMA => ",",
528+
L_PAREN => "(",
529+
R_PAREN => ")",
530+
L_CURLY => "{",
531+
R_CURLY => "}",
532+
L_BRACK => "[",
533+
R_BRACK => "]",
534+
L_ANGLE => "<",
535+
R_ANGLE => ">",
536+
AT => "@",
537+
POUND => "#",
538+
TILDE => "~",
539+
QUESTION => "?",
540+
AMP => "&",
541+
PIPE => "|",
542+
PLUS => "+",
543+
STAR => "*",
544+
SLASH => "/",
545+
CARET => "^",
546+
PERCENT => "%",
547+
UNDERSCORE => "_",
548+
DOT => ".",
549+
DOT2 => "..",
550+
DOT3 => "...",
551+
DOT2EQ => "..=",
552+
COLON => ":",
553+
COLON2 => "::",
554+
EQ => "=",
555+
EQ2 => "==",
556+
FAT_ARROW => "=>",
557+
BANG => "!",
558+
NEQ => "!=",
559+
MINUS => "-",
560+
THIN_ARROW => "->",
561+
LTEQ => "<=",
562+
GTEQ => ">=",
563+
PLUSEQ => "+=",
564+
MINUSEQ => "-=",
565+
PIPEEQ => "|=",
566+
AMPEQ => "&=",
567+
CARETEQ => "^=",
568+
SLASHEQ => "/=",
569+
STAREQ => "*=",
570+
PERCENTEQ => "%=",
571+
AMP2 => "&&",
572+
PIPE2 => "||",
573+
SHL => "<<",
574+
SHR => ">>",
575+
SHLEQ => "<<=",
576+
SHREQ => ">>=",
577+
SELF_TYPE_KW => "Self",
578+
ABSTRACT_KW => "abstract",
579+
AS_KW => "as",
580+
BECOME_KW => "become",
581+
BOX_KW => "box",
582+
BREAK_KW => "break",
583+
CONST_KW => "const",
584+
CONTINUE_KW => "continue",
585+
CRATE_KW => "crate",
586+
DO_KW => "do",
587+
ELSE_KW => "else",
588+
ENUM_KW => "enum",
589+
EXTERN_KW => "extern",
590+
FALSE_KW => "false",
591+
FINAL_KW => "final",
592+
FN_KW => "fn",
593+
FOR_KW => "for",
594+
IF_KW => "if",
595+
IMPL_KW => "impl",
596+
IN_KW => "in",
597+
LET_KW => "let",
598+
LOOP_KW => "loop",
599+
MACRO_KW => "macro",
600+
MATCH_KW => "match",
601+
MOD_KW => "mod",
602+
MOVE_KW => "move",
603+
MUT_KW => "mut",
604+
OVERRIDE_KW => "override",
605+
PRIV_KW => "priv",
606+
PUB_KW => "pub",
607+
REF_KW => "ref",
608+
RETURN_KW => "return",
609+
SELF_KW => "self",
610+
STATIC_KW => "static",
611+
STRUCT_KW => "struct",
612+
SUPER_KW => "super",
613+
TRAIT_KW => "trait",
614+
TRUE_KW => "true",
615+
TYPE_KW => "type",
616+
TYPEOF_KW => "typeof",
617+
UNSAFE_KW => "unsafe",
618+
UNSIZED_KW => "unsized",
619+
USE_KW => "use",
620+
VIRTUAL_KW => "virtual",
621+
WHERE_KW => "where",
622+
WHILE_KW => "while",
623+
YIELD_KW => "yield",
624+
ASM_KW => "asm",
625+
ATT_SYNTAX_KW => "att_syntax",
626+
AUTO_KW => "auto",
627+
BUILTIN_KW => "builtin",
628+
CLOBBER_ABI_KW => "clobber_abi",
629+
DEFAULT_KW => "default",
630+
DYN_KW => "dyn",
631+
FORMAT_ARGS_KW => "format_args",
632+
INLATEOUT_KW => "inlateout",
633+
INOUT_KW => "inout",
634+
LABEL_KW => "label",
635+
LATEOUT_KW => "lateout",
636+
MACRO_RULES_KW => "macro_rules",
637+
MAY_UNWIND_KW => "may_unwind",
638+
NOMEM_KW => "nomem",
639+
NORETURN_KW => "noreturn",
640+
NOSTACK_KW => "nostack",
641+
OFFSET_OF_KW => "offset_of",
642+
OPTIONS_KW => "options",
643+
OUT_KW => "out",
644+
PRESERVES_FLAGS_KW => "preserves_flags",
645+
PURE_KW => "pure",
646+
RAW_KW => "raw",
647+
READONLY_KW => "readonly",
648+
SAFE_KW => "safe",
649+
SYM_KW => "sym",
650+
UNION_KW => "union",
651+
YEET_KW => "yeet",
652+
ASYNC_KW => "async",
653+
AWAIT_KW => "await",
654+
DYN_KW => "dyn",
655+
GEN_KW => "gen",
656+
TRY_KW => "try",
657+
}
658+
}
334659
#[doc = r" Checks whether this syntax kind is a strict keyword for the given edition."]
335660
#[doc = r" Strict keywords are identifiers that are always considered keywords."]
336661
pub fn is_strict_keyword(self, edition: Edition) -> bool {

src/tools/rust-analyzer/xtask/src/codegen/grammar.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,7 @@ fn generate_syntax_kinds(grammar: KindsSrc) -> String {
404404
});
405405
let punctuation =
406406
grammar.punct.iter().map(|(_token, name)| format_ident!("{}", name)).collect::<Vec<_>>();
407+
let punctuation_texts = grammar.punct.iter().map(|&(text, _name)| text);
407408

408409
let fmt_kw_as_variant = |&name| match name {
409410
"Self" => format_ident!("SELF_TYPE_KW"),
@@ -429,6 +430,7 @@ fn generate_syntax_kinds(grammar: KindsSrc) -> String {
429430
quote! { #kw if #ed <= edition }
430431
})
431432
.collect::<Vec<_>>();
433+
let edition_dependent_keywords = grammar.edition_dependent_keywords.iter().map(|&(it, _)| it);
432434
let edition_dependent_keywords_variants = grammar
433435
.edition_dependent_keywords
434436
.iter()
@@ -502,6 +504,20 @@ fn generate_syntax_kinds(grammar: KindsSrc) -> String {
502504
use self::SyntaxKind::*;
503505

504506
impl SyntaxKind {
507+
#[allow(unreachable_patterns)]
508+
pub const fn text(self) -> &'static str {
509+
match self {
510+
TOMBSTONE | EOF | __LAST
511+
#( | #literals )*
512+
#( | #nodes )*
513+
#( | #tokens )* => panic!("no text for these `SyntaxKind`s"),
514+
#( #punctuation => #punctuation_texts ,)*
515+
#( #strict_keywords_variants => #strict_keywords ,)*
516+
#( #contextual_keywords_variants => #contextual_keywords ,)*
517+
#( #edition_dependent_keywords_variants => #edition_dependent_keywords ,)*
518+
}
519+
}
520+
505521
/// Checks whether this syntax kind is a strict keyword for the given edition.
506522
/// Strict keywords are identifiers that are always considered keywords.
507523
pub fn is_strict_keyword(self, edition: Edition) -> bool {

0 commit comments

Comments
 (0)