rust-code-analysis 0.0.18

Tool to compute and export code metrics
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
// Code generated; DO NOT EDIT.

#[derive(Clone, Debug, PartialEq)]
pub enum Javascript {
    End = 0,
    Identifier = 1,
    HashBangLine = 2,
    Export = 3,
    STAR = 4,
    Default = 5,
    LBRACE = 6,
    COMMA = 7,
    RBRACE = 8,
    As = 9,
    Import2 = 10,
    From = 11,
    Var = 12,
    Let = 13,
    Const = 14,
    If = 15,
    Else = 16,
    Switch = 17,
    For = 18,
    LPAREN = 19,
    RPAREN = 20,
    Await = 21,
    In = 22,
    Of = 23,
    While = 24,
    Do = 25,
    Try = 26,
    With = 27,
    Break = 28,
    Continue = 29,
    Debugger = 30,
    Return = 31,
    Throw = 32,
    SEMI = 33,
    COLON = 34,
    Case = 35,
    Catch = 36,
    Finally = 37,
    Yield = 38,
    EQ = 39,
    LBRACK = 40,
    RBRACK = 41,
    LT = 42,
    GT = 43,
    SLASH = 44,
    JsxText = 45,
    Identifier2 = 46,
    DOT = 47,
    Class2 = 48,
    Extends = 49,
    Async = 50,
    Function2 = 51,
    EQGT = 52,
    New = 53,
    PLUSEQ = 54,
    DASHEQ = 55,
    STAREQ = 56,
    SLASHEQ = 57,
    PERCENTEQ = 58,
    CARETEQ = 59,
    AMPEQ = 60,
    PIPEEQ = 61,
    GTGTEQ = 62,
    GTGTGTEQ = 63,
    LTLTEQ = 64,
    STARSTAREQ = 65,
    AMPAMPEQ = 66,
    PIPEPIPEEQ = 67,
    HASH = 68,
    DOTDOTDOT = 69,
    QMARK = 70,
    AMPAMP = 71,
    PIPEPIPE = 72,
    GTGT = 73,
    GTGTGT = 74,
    LTLT = 75,
    AMP = 76,
    CARET = 77,
    PIPE = 78,
    PLUS = 79,
    DASH = 80,
    PERCENT = 81,
    STARSTAR = 82,
    LTEQ = 83,
    EQEQ = 84,
    EQEQEQ = 85,
    BANGEQ = 86,
    BANGEQEQ = 87,
    GTEQ = 88,
    QMARKQMARK = 89,
    Instanceof = 90,
    BANG = 91,
    TILDE = 92,
    Typeof = 93,
    Void = 94,
    Delete = 95,
    PLUSPLUS = 96,
    DASHDASH = 97,
    DQUOTE = 98,
    StringToken1 = 99,
    SQUOTE = 100,
    StringToken2 = 101,
    EscapeSequence = 102,
    Comment = 103,
    BQUOTE = 104,
    DOLLARLBRACE = 105,
    SLASH2 = 106,
    RegexPattern = 107,
    RegexFlags = 108,
    Number = 109,
    Target = 110,
    This = 111,
    Super = 112,
    True = 113,
    False = 114,
    Null = 115,
    Undefined = 116,
    AT = 117,
    Static = 118,
    Get = 119,
    Set = 120,
    AutomaticSemicolon = 121,
    TemplateChars = 122,
    Program = 123,
    ExportStatement = 124,
    ExportClause = 125,
    ImportExportSpecifier = 126,
    Declaration = 127,
    Import = 128,
    ImportStatement = 129,
    ImportClause = 130,
    FromClause = 131,
    NamespaceImport = 132,
    NamedImports = 133,
    ExpressionStatement = 134,
    VariableDeclaration = 135,
    LexicalDeclaration = 136,
    VariableDeclarator = 137,
    StatementBlock = 138,
    IfStatement = 139,
    SwitchStatement = 140,
    ForStatement = 141,
    ForInStatement = 142,
    ForHeader = 143,
    WhileStatement = 144,
    DoStatement = 145,
    TryStatement = 146,
    WithStatement = 147,
    BreakStatement = 148,
    ContinueStatement = 149,
    DebuggerStatement = 150,
    ReturnStatement = 151,
    ThrowStatement = 152,
    EmptyStatement = 153,
    LabeledStatement = 154,
    SwitchBody = 155,
    SwitchCase = 156,
    SwitchDefault = 157,
    CatchClause = 158,
    FinallyClause = 159,
    ParenthesizedExpression = 160,
    Expression = 161,
    YieldExpression = 162,
    Object = 163,
    AssignmentPattern = 164,
    Array = 165,
    JsxElement = 166,
    JsxFragment = 167,
    JsxExpression = 168,
    JsxOpeningElement = 169,
    NestedIdentifier = 170,
    JsxNamespaceName = 171,
    JsxClosingElement = 172,
    JsxSelfClosingElement = 173,
    JsxAttribute = 174,
    Class = 175,
    ClassDeclaration = 176,
    ClassHeritage = 177,
    Function = 178,
    FunctionDeclaration = 179,
    GeneratorFunction = 180,
    GeneratorFunctionDeclaration = 181,
    ArrowFunction = 182,
    CallExpression = 183,
    NewExpression = 184,
    AwaitExpression = 185,
    MemberExpression = 186,
    SubscriptExpression = 187,
    AssignmentExpression = 188,
    AugmentedAssignmentExpression = 189,
    Initializer = 190,
    SpreadElement = 191,
    TernaryExpression = 192,
    BinaryExpression = 193,
    UnaryExpression = 194,
    UpdateExpression = 195,
    SequenceExpression = 196,
    String = 197,
    TemplateString = 198,
    TemplateSubstitution = 199,
    Regex = 200,
    MetaProperty = 201,
    Arguments = 202,
    Decorator = 203,
    MemberExpression2 = 204,
    CallExpression2 = 205,
    ClassBody = 206,
    PublicFieldDefinition = 207,
    FormalParameters = 208,
    RestParameter = 209,
    MethodDefinition = 210,
    Pair = 211,
    PropertyName = 212,
    ComputedPropertyName = 213,
    ProgramRepeat1 = 214,
    ExportStatementRepeat1 = 215,
    ExportClauseRepeat1 = 216,
    NamedImportsRepeat1 = 217,
    VariableDeclarationRepeat1 = 218,
    SwitchBodyRepeat1 = 219,
    ObjectRepeat1 = 220,
    ArrayRepeat1 = 221,
    JsxElementRepeat1 = 222,
    JsxOpeningElementRepeat1 = 223,
    StringRepeat1 = 224,
    StringRepeat2 = 225,
    TemplateStringRepeat1 = 226,
    ClassBodyRepeat1 = 227,
    FormalParametersRepeat1 = 228,
    ArrayPattern = 229,
    ExportSpecifier = 230,
    ImportSpecifier = 231,
    ObjectPattern = 232,
    PropertyIdentifier = 233,
    ShorthandPropertyIdentifier = 234,
    StatementIdentifier = 235,
    Error = 236,
}

impl Into<&'static str> for Javascript {
    fn into(self) -> &'static str {
        match self {
            Javascript::End => "end",
            Javascript::Identifier => "identifier",
            Javascript::HashBangLine => "hash_bang_line",
            Javascript::Export => "export",
            Javascript::STAR => "*",
            Javascript::Default => "default",
            Javascript::LBRACE => "{",
            Javascript::COMMA => ",",
            Javascript::RBRACE => "}",
            Javascript::As => "as",
            Javascript::Import2 => "import",
            Javascript::From => "from",
            Javascript::Var => "var",
            Javascript::Let => "let",
            Javascript::Const => "const",
            Javascript::If => "if",
            Javascript::Else => "else",
            Javascript::Switch => "switch",
            Javascript::For => "for",
            Javascript::LPAREN => "(",
            Javascript::RPAREN => ")",
            Javascript::Await => "await",
            Javascript::In => "in",
            Javascript::Of => "of",
            Javascript::While => "while",
            Javascript::Do => "do",
            Javascript::Try => "try",
            Javascript::With => "with",
            Javascript::Break => "break",
            Javascript::Continue => "continue",
            Javascript::Debugger => "debugger",
            Javascript::Return => "return",
            Javascript::Throw => "throw",
            Javascript::SEMI => ";",
            Javascript::COLON => ":",
            Javascript::Case => "case",
            Javascript::Catch => "catch",
            Javascript::Finally => "finally",
            Javascript::Yield => "yield",
            Javascript::EQ => "=",
            Javascript::LBRACK => "[",
            Javascript::RBRACK => "]",
            Javascript::LT => "<",
            Javascript::GT => ">",
            Javascript::SLASH => "/",
            Javascript::JsxText => "jsx_text",
            Javascript::Identifier2 => "identifier",
            Javascript::DOT => ".",
            Javascript::Class2 => "class",
            Javascript::Extends => "extends",
            Javascript::Async => "async",
            Javascript::Function2 => "function",
            Javascript::EQGT => "=>",
            Javascript::New => "new",
            Javascript::PLUSEQ => "+=",
            Javascript::DASHEQ => "-=",
            Javascript::STAREQ => "*=",
            Javascript::SLASHEQ => "/=",
            Javascript::PERCENTEQ => "%=",
            Javascript::CARETEQ => "^=",
            Javascript::AMPEQ => "&=",
            Javascript::PIPEEQ => "|=",
            Javascript::GTGTEQ => ">>=",
            Javascript::GTGTGTEQ => ">>>=",
            Javascript::LTLTEQ => "<<=",
            Javascript::STARSTAREQ => "**=",
            Javascript::AMPAMPEQ => "&&=",
            Javascript::PIPEPIPEEQ => "||=",
            Javascript::HASH => "#",
            Javascript::DOTDOTDOT => "...",
            Javascript::QMARK => "?",
            Javascript::AMPAMP => "&&",
            Javascript::PIPEPIPE => "||",
            Javascript::GTGT => ">>",
            Javascript::GTGTGT => ">>>",
            Javascript::LTLT => "<<",
            Javascript::AMP => "&",
            Javascript::CARET => "^",
            Javascript::PIPE => "|",
            Javascript::PLUS => "+",
            Javascript::DASH => "-",
            Javascript::PERCENT => "%",
            Javascript::STARSTAR => "**",
            Javascript::LTEQ => "<=",
            Javascript::EQEQ => "==",
            Javascript::EQEQEQ => "===",
            Javascript::BANGEQ => "!=",
            Javascript::BANGEQEQ => "!==",
            Javascript::GTEQ => ">=",
            Javascript::QMARKQMARK => "??",
            Javascript::Instanceof => "instanceof",
            Javascript::BANG => "!",
            Javascript::TILDE => "~",
            Javascript::Typeof => "typeof",
            Javascript::Void => "void",
            Javascript::Delete => "delete",
            Javascript::PLUSPLUS => "++",
            Javascript::DASHDASH => "--",
            Javascript::DQUOTE => "\"",
            Javascript::StringToken1 => "string_token1",
            Javascript::SQUOTE => "'",
            Javascript::StringToken2 => "string_token2",
            Javascript::EscapeSequence => "escape_sequence",
            Javascript::Comment => "comment",
            Javascript::BQUOTE => "`",
            Javascript::DOLLARLBRACE => "${",
            Javascript::SLASH2 => "/",
            Javascript::RegexPattern => "regex_pattern",
            Javascript::RegexFlags => "regex_flags",
            Javascript::Number => "number",
            Javascript::Target => "target",
            Javascript::This => "this",
            Javascript::Super => "super",
            Javascript::True => "true",
            Javascript::False => "false",
            Javascript::Null => "null",
            Javascript::Undefined => "undefined",
            Javascript::AT => "@",
            Javascript::Static => "static",
            Javascript::Get => "get",
            Javascript::Set => "set",
            Javascript::AutomaticSemicolon => "_automatic_semicolon",
            Javascript::TemplateChars => "_template_chars",
            Javascript::Program => "program",
            Javascript::ExportStatement => "export_statement",
            Javascript::ExportClause => "export_clause",
            Javascript::ImportExportSpecifier => "_import_export_specifier",
            Javascript::Declaration => "_declaration",
            Javascript::Import => "import",
            Javascript::ImportStatement => "import_statement",
            Javascript::ImportClause => "import_clause",
            Javascript::FromClause => "_from_clause",
            Javascript::NamespaceImport => "namespace_import",
            Javascript::NamedImports => "named_imports",
            Javascript::ExpressionStatement => "expression_statement",
            Javascript::VariableDeclaration => "variable_declaration",
            Javascript::LexicalDeclaration => "lexical_declaration",
            Javascript::VariableDeclarator => "variable_declarator",
            Javascript::StatementBlock => "statement_block",
            Javascript::IfStatement => "if_statement",
            Javascript::SwitchStatement => "switch_statement",
            Javascript::ForStatement => "for_statement",
            Javascript::ForInStatement => "for_in_statement",
            Javascript::ForHeader => "_for_header",
            Javascript::WhileStatement => "while_statement",
            Javascript::DoStatement => "do_statement",
            Javascript::TryStatement => "try_statement",
            Javascript::WithStatement => "with_statement",
            Javascript::BreakStatement => "break_statement",
            Javascript::ContinueStatement => "continue_statement",
            Javascript::DebuggerStatement => "debugger_statement",
            Javascript::ReturnStatement => "return_statement",
            Javascript::ThrowStatement => "throw_statement",
            Javascript::EmptyStatement => "empty_statement",
            Javascript::LabeledStatement => "labeled_statement",
            Javascript::SwitchBody => "switch_body",
            Javascript::SwitchCase => "switch_case",
            Javascript::SwitchDefault => "switch_default",
            Javascript::CatchClause => "catch_clause",
            Javascript::FinallyClause => "finally_clause",
            Javascript::ParenthesizedExpression => "parenthesized_expression",
            Javascript::Expression => "_expression",
            Javascript::YieldExpression => "yield_expression",
            Javascript::Object => "object",
            Javascript::AssignmentPattern => "assignment_pattern",
            Javascript::Array => "array",
            Javascript::JsxElement => "jsx_element",
            Javascript::JsxFragment => "jsx_fragment",
            Javascript::JsxExpression => "jsx_expression",
            Javascript::JsxOpeningElement => "jsx_opening_element",
            Javascript::NestedIdentifier => "nested_identifier",
            Javascript::JsxNamespaceName => "jsx_namespace_name",
            Javascript::JsxClosingElement => "jsx_closing_element",
            Javascript::JsxSelfClosingElement => "jsx_self_closing_element",
            Javascript::JsxAttribute => "jsx_attribute",
            Javascript::Class => "class",
            Javascript::ClassDeclaration => "class_declaration",
            Javascript::ClassHeritage => "class_heritage",
            Javascript::Function => "function",
            Javascript::FunctionDeclaration => "function_declaration",
            Javascript::GeneratorFunction => "generator_function",
            Javascript::GeneratorFunctionDeclaration => "generator_function_declaration",
            Javascript::ArrowFunction => "arrow_function",
            Javascript::CallExpression => "call_expression",
            Javascript::NewExpression => "new_expression",
            Javascript::AwaitExpression => "await_expression",
            Javascript::MemberExpression => "member_expression",
            Javascript::SubscriptExpression => "subscript_expression",
            Javascript::AssignmentExpression => "assignment_expression",
            Javascript::AugmentedAssignmentExpression => "augmented_assignment_expression",
            Javascript::Initializer => "_initializer",
            Javascript::SpreadElement => "spread_element",
            Javascript::TernaryExpression => "ternary_expression",
            Javascript::BinaryExpression => "binary_expression",
            Javascript::UnaryExpression => "unary_expression",
            Javascript::UpdateExpression => "update_expression",
            Javascript::SequenceExpression => "sequence_expression",
            Javascript::String => "string",
            Javascript::TemplateString => "template_string",
            Javascript::TemplateSubstitution => "template_substitution",
            Javascript::Regex => "regex",
            Javascript::MetaProperty => "meta_property",
            Javascript::Arguments => "arguments",
            Javascript::Decorator => "decorator",
            Javascript::MemberExpression2 => "member_expression",
            Javascript::CallExpression2 => "call_expression",
            Javascript::ClassBody => "class_body",
            Javascript::PublicFieldDefinition => "public_field_definition",
            Javascript::FormalParameters => "formal_parameters",
            Javascript::RestParameter => "rest_parameter",
            Javascript::MethodDefinition => "method_definition",
            Javascript::Pair => "pair",
            Javascript::PropertyName => "_property_name",
            Javascript::ComputedPropertyName => "computed_property_name",
            Javascript::ProgramRepeat1 => "program_repeat1",
            Javascript::ExportStatementRepeat1 => "export_statement_repeat1",
            Javascript::ExportClauseRepeat1 => "export_clause_repeat1",
            Javascript::NamedImportsRepeat1 => "named_imports_repeat1",
            Javascript::VariableDeclarationRepeat1 => "variable_declaration_repeat1",
            Javascript::SwitchBodyRepeat1 => "switch_body_repeat1",
            Javascript::ObjectRepeat1 => "object_repeat1",
            Javascript::ArrayRepeat1 => "array_repeat1",
            Javascript::JsxElementRepeat1 => "jsx_element_repeat1",
            Javascript::JsxOpeningElementRepeat1 => "jsx_opening_element_repeat1",
            Javascript::StringRepeat1 => "string_repeat1",
            Javascript::StringRepeat2 => "string_repeat2",
            Javascript::TemplateStringRepeat1 => "template_string_repeat1",
            Javascript::ClassBodyRepeat1 => "class_body_repeat1",
            Javascript::FormalParametersRepeat1 => "formal_parameters_repeat1",
            Javascript::ArrayPattern => "array_pattern",
            Javascript::ExportSpecifier => "export_specifier",
            Javascript::ImportSpecifier => "import_specifier",
            Javascript::ObjectPattern => "object_pattern",
            Javascript::PropertyIdentifier => "property_identifier",
            Javascript::ShorthandPropertyIdentifier => "shorthand_property_identifier",
            Javascript::StatementIdentifier => "statement_identifier",
            Javascript::Error => "ERROR",
        }
    }
}

#[allow(clippy::unreadable_literal)]
static KEYS: phf::Map<&'static str, Javascript> = ::phf::Map {
    key: 732231254413039614,
    disps: ::phf::Slice::Static(&[
        (0, 18),
        (0, 1),
        (0, 9),
        (0, 48),
        (0, 16),
        (0, 2),
        (0, 181),
        (0, 0),
        (0, 124),
        (1, 210),
        (0, 76),
        (1, 147),
        (1, 169),
        (0, 192),
        (0, 129),
        (0, 9),
        (0, 141),
        (0, 0),
        (0, 18),
        (0, 2),
        (0, 28),
        (1, 0),
        (0, 91),
        (0, 2),
        (5, 78),
        (3, 56),
        (5, 67),
        (0, 56),
        (0, 29),
        (0, 6),
        (0, 128),
        (0, 11),
        (0, 202),
        (3, 61),
        (0, 11),
        (15, 176),
        (0, 65),
        (14, 2),
        (0, 3),
        (0, 169),
        (0, 142),
        (74, 65),
        (2, 183),
        (2, 189),
        (9, 2),
        (1, 60),
    ]),
    entries: ::phf::Slice::Static(&[
        (
            "variable_declaration_repeat1",
            Javascript::VariableDeclarationRepeat1,
        ),
        ("computed_property_name", Javascript::ComputedPropertyName),
        ("switch_body", Javascript::SwitchBody),
        ("??", Javascript::QMARKQMARK),
        ("formal_parameters", Javascript::FormalParameters),
        ("&", Javascript::AMP),
        ("default", Javascript::Default),
        ("const", Javascript::Const),
        ("import_clause", Javascript::ImportClause),
        ("-", Javascript::DASH),
        ("/=", Javascript::SLASHEQ),
        ("!==", Javascript::BANGEQEQ),
        ("*=", Javascript::STAREQ),
        ("static", Javascript::Static),
        (
            "shorthand_property_identifier",
            Javascript::ShorthandPropertyIdentifier,
        ),
        ("as", Javascript::As),
        ("var", Javascript::Var),
        ("(", Javascript::LPAREN),
        ("end", Javascript::End),
        ("let", Javascript::Let),
        ("<<=", Javascript::LTLTEQ),
        ("_for_header", Javascript::ForHeader),
        ("try_statement", Javascript::TryStatement),
        ("identifier", Javascript::Identifier),
        ("ternary_expression", Javascript::TernaryExpression),
        ("=>", Javascript::EQGT),
        ("switch_case", Javascript::SwitchCase),
        ("try", Javascript::Try),
        ("!", Javascript::BANG),
        ("super", Javascript::Super),
        ("${", Javascript::DOLLARLBRACE),
        ("break_statement", Javascript::BreakStatement),
        ("program", Javascript::Program),
        ("}", Javascript::RBRACE),
        ("jsx_expression", Javascript::JsxExpression),
        ("<=", Javascript::LTEQ),
        ("export_specifier", Javascript::ExportSpecifier),
        ("import_statement", Javascript::ImportStatement),
        ("await_expression", Javascript::AwaitExpression),
        ("assignment_pattern", Javascript::AssignmentPattern),
        ("==", Javascript::EQEQ),
        (".", Javascript::DOT),
        ("||=", Javascript::PIPEPIPEEQ),
        ("extends", Javascript::Extends),
        ("false", Javascript::False),
        ("for", Javascript::For),
        ("case", Javascript::Case),
        ("&=", Javascript::AMPEQ),
        ("expression_statement", Javascript::ExpressionStatement),
        ("jsx_attribute", Javascript::JsxAttribute),
        (
            "jsx_self_closing_element",
            Javascript::JsxSelfClosingElement,
        ),
        ("of", Javascript::Of),
        (
            "export_statement_repeat1",
            Javascript::ExportStatementRepeat1,
        ),
        ("lexical_declaration", Javascript::LexicalDeclaration),
        ("array_repeat1", Javascript::ArrayRepeat1),
        ("class_body_repeat1", Javascript::ClassBodyRepeat1),
        ("@", Javascript::AT),
        ("jsx_element_repeat1", Javascript::JsxElementRepeat1),
        ("!=", Javascript::BANGEQ),
        (">", Javascript::GT),
        ("object_pattern", Javascript::ObjectPattern),
        ("switch", Javascript::Switch),
        ("arguments", Javascript::Arguments),
        ("array", Javascript::Array),
        ("hash_bang_line", Javascript::HashBangLine),
        (">>=", Javascript::GTGTEQ),
        ("statement_block", Javascript::StatementBlock),
        ("=", Javascript::EQ),
        (":", Javascript::COLON),
        ("string_repeat1", Javascript::StringRepeat1),
        ("`", Javascript::BQUOTE),
        (
            "augmented_assignment_expression",
            Javascript::AugmentedAssignmentExpression,
        ),
        ("property_identifier", Javascript::PropertyIdentifier),
        ("-=", Javascript::DASHEQ),
        ("function_declaration", Javascript::FunctionDeclaration),
        ("get", Javascript::Get),
        ("\'", Javascript::SQUOTE),
        ("void", Javascript::Void),
        ("template_string_repeat1", Javascript::TemplateStringRepeat1),
        ("nested_identifier", Javascript::NestedIdentifier),
        ("public_field_definition", Javascript::PublicFieldDefinition),
        ("spread_element", Javascript::SpreadElement),
        ("+", Javascript::PLUS),
        ("comment", Javascript::Comment),
        ("**=", Javascript::STARSTAREQ),
        ("regex_pattern", Javascript::RegexPattern),
        ("yield", Javascript::Yield),
        (";", Javascript::SEMI),
        ("catch", Javascript::Catch),
        (
            "parenthesized_expression",
            Javascript::ParenthesizedExpression,
        ),
        ("object", Javascript::Object),
        ("subscript_expression", Javascript::SubscriptExpression),
        ("if_statement", Javascript::IfStatement),
        ("_expression", Javascript::Expression),
        ("class", Javascript::Class),
        ("?", Javascript::QMARK),
        ("string", Javascript::String),
        ("jsx_element", Javascript::JsxElement),
        ("labeled_statement", Javascript::LabeledStatement),
        ("||", Javascript::PIPEPIPE),
        ("import", Javascript::Import),
        (
            "generator_function_declaration",
            Javascript::GeneratorFunctionDeclaration,
        ),
        (")", Javascript::RPAREN),
        ("|=", Javascript::PIPEEQ),
        ("pair", Javascript::Pair),
        ("while_statement", Javascript::WhileStatement),
        ("**", Javascript::STARSTAR),
        ("unary_expression", Javascript::UnaryExpression),
        ("+=", Javascript::PLUSEQ),
        ("regex", Javascript::Regex),
        ("yield_expression", Javascript::YieldExpression),
        ("]", Javascript::RBRACK),
        ("debugger_statement", Javascript::DebuggerStatement),
        ("for_in_statement", Javascript::ForInStatement),
        (
            "formal_parameters_repeat1",
            Javascript::FormalParametersRepeat1,
        ),
        ("class_body", Javascript::ClassBody),
        ("regex_flags", Javascript::RegexFlags),
        ("variable_declaration", Javascript::VariableDeclaration),
        ("async", Javascript::Async),
        ("finally", Javascript::Finally),
        ("null", Javascript::Null),
        ("|", Javascript::PIPE),
        ("ERROR", Javascript::Error),
        ("decorator", Javascript::Decorator),
        ("for_statement", Javascript::ForStatement),
        ("this", Javascript::This),
        (">>", Javascript::GTGT),
        ("while", Javascript::While),
        ("%", Javascript::PERCENT),
        ("\\\"", Javascript::DQUOTE),
        ("<<", Javascript::LTLT),
        ("continue", Javascript::Continue),
        ("variable_declarator", Javascript::VariableDeclarator),
        (">>>", Javascript::GTGTGT),
        ("%=", Javascript::PERCENTEQ),
        ("string_repeat2", Javascript::StringRepeat2),
        ("true", Javascript::True),
        ("catch_clause", Javascript::CatchClause),
        ("_automatic_semicolon", Javascript::AutomaticSemicolon),
        ("do", Javascript::Do),
        ("_initializer", Javascript::Initializer),
        ("delete", Javascript::Delete),
        ("^", Javascript::CARET),
        ("with", Javascript::With),
        ("object_repeat1", Javascript::ObjectRepeat1),
        ("export_clause_repeat1", Javascript::ExportClauseRepeat1),
        ("named_imports", Javascript::NamedImports),
        ("class_declaration", Javascript::ClassDeclaration),
        ("++", Javascript::PLUSPLUS),
        ("from", Javascript::From),
        ("switch_body_repeat1", Javascript::SwitchBodyRepeat1),
        ("^=", Javascript::CARETEQ),
        (
            "_import_export_specifier",
            Javascript::ImportExportSpecifier,
        ),
        ("~", Javascript::TILDE),
        ("break", Javascript::Break),
        ("#", Javascript::HASH),
        ("import_specifier", Javascript::ImportSpecifier),
        ("rest_parameter", Javascript::RestParameter),
        ("switch_statement", Javascript::SwitchStatement),
        ("throw_statement", Javascript::ThrowStatement),
        ("target", Javascript::Target),
        ("method_definition", Javascript::MethodDefinition),
        ("--", Javascript::DASHDASH),
        ("jsx_closing_element", Javascript::JsxClosingElement),
        (">=", Javascript::GTEQ),
        ("continue_statement", Javascript::ContinueStatement),
        ("/", Javascript::SLASH),
        ("namespace_import", Javascript::NamespaceImport),
        ("template_substitution", Javascript::TemplateSubstitution),
        ("number", Javascript::Number),
        ("return", Javascript::Return),
        ("jsx_text", Javascript::JsxText),
        ("await", Javascript::Await),
        ("...", Javascript::DOTDOTDOT),
        ("statement_identifier", Javascript::StatementIdentifier),
        ("jsx_namespace_name", Javascript::JsxNamespaceName),
        ("export", Javascript::Export),
        ("new_expression", Javascript::NewExpression),
        ("*", Javascript::STAR),
        ("else", Javascript::Else),
        ("typeof", Javascript::Typeof),
        ("debugger", Javascript::Debugger),
        ("_from_clause", Javascript::FromClause),
        ("with_statement", Javascript::WithStatement),
        ("empty_statement", Javascript::EmptyStatement),
        ("[", Javascript::LBRACK),
        ("undefined", Javascript::Undefined),
        ("escape_sequence", Javascript::EscapeSequence),
        ("jsx_fragment", Javascript::JsxFragment),
        ("binary_expression", Javascript::BinaryExpression),
        ("string_token2", Javascript::StringToken2),
        ("new", Javascript::New),
        ("&&=", Javascript::AMPAMPEQ),
        ("export_statement", Javascript::ExportStatement),
        (",", Javascript::COMMA),
        ("class_heritage", Javascript::ClassHeritage),
        ("_property_name", Javascript::PropertyName),
        ("named_imports_repeat1", Javascript::NamedImportsRepeat1),
        ("export_clause", Javascript::ExportClause),
        ("throw", Javascript::Throw),
        ("program_repeat1", Javascript::ProgramRepeat1),
        ("assignment_expression", Javascript::AssignmentExpression),
        ("template_string", Javascript::TemplateString),
        ("_template_chars", Javascript::TemplateChars),
        ("string_token1", Javascript::StringToken1),
        ("if", Javascript::If),
        ("&&", Javascript::AMPAMP),
        ("_declaration", Javascript::Declaration),
        ("meta_property", Javascript::MetaProperty),
        (
            "jsx_opening_element_repeat1",
            Javascript::JsxOpeningElementRepeat1,
        ),
        ("generator_function", Javascript::GeneratorFunction),
        ("function", Javascript::Function),
        ("update_expression", Javascript::UpdateExpression),
        (">>>=", Javascript::GTGTGTEQ),
        ("<", Javascript::LT),
        ("sequence_expression", Javascript::SequenceExpression),
        ("return_statement", Javascript::ReturnStatement),
        ("finally_clause", Javascript::FinallyClause),
        ("switch_default", Javascript::SwitchDefault),
        ("call_expression", Javascript::CallExpression),
        ("do_statement", Javascript::DoStatement),
        ("===", Javascript::EQEQEQ),
        ("instanceof", Javascript::Instanceof),
        ("{", Javascript::LBRACE),
        ("array_pattern", Javascript::ArrayPattern),
        ("jsx_opening_element", Javascript::JsxOpeningElement),
        ("in", Javascript::In),
        ("set", Javascript::Set),
        ("arrow_function", Javascript::ArrowFunction),
        ("member_expression", Javascript::MemberExpression),
    ]),
};

impl From<&str> for Javascript {
    #[inline(always)]
    fn from(key: &str) -> Self {
        KEYS.get(key).unwrap().clone()
    }
}

impl From<u16> for Javascript {
    #[inline(always)]
    fn from(x: u16) -> Self {
        unsafe { std::mem::transmute(x as u8) }
    }
}

// Javascript == u16
impl PartialEq<u16> for Javascript {
    #[inline(always)]
    fn eq(&self, x: &u16) -> bool {
        *self == Javascript::from(*x)
    }
}

// u16 == Javascript
impl PartialEq<Javascript> for u16 {
    #[inline(always)]
    fn eq(&self, x: &Javascript) -> bool {
        *x == *self
    }
}