Version 2.19.0-94.0.dev

Merge commit '8d60314e1260f35d332c9f54ae5e0df363f116ae' into 'dev'
diff --git a/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart b/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart
index 8b59e48..0bbb254 100644
--- a/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/scanner/token.dart
@@ -105,217 +105,231 @@
  */
 class Keyword extends TokenType {
   static const Keyword ABSTRACT = const Keyword(
-      "abstract", "ABSTRACT", KeywordStyle.builtIn,
+      79, "abstract", "ABSTRACT", KeywordStyle.builtIn,
       isModifier: true);
 
-  static const Keyword AS = const Keyword("as", "AS", KeywordStyle.builtIn,
+  static const Keyword AS = const Keyword(80, "as", "AS", KeywordStyle.builtIn,
       precedence: RELATIONAL_PRECEDENCE);
 
   static const Keyword ASSERT =
-      const Keyword("assert", "ASSERT", KeywordStyle.reserved);
+      const Keyword(81, "assert", "ASSERT", KeywordStyle.reserved);
 
   static const Keyword ASYNC =
-      const Keyword("async", "ASYNC", KeywordStyle.pseudo);
+      const Keyword(82, "async", "ASYNC", KeywordStyle.pseudo);
 
   static const Keyword AUGMENT = const Keyword(
-      "augment", "AUGMENT", KeywordStyle.builtIn,
+      83, "augment", "AUGMENT", KeywordStyle.builtIn,
       isModifier: true);
 
   static const Keyword AWAIT =
-      const Keyword("await", "AWAIT", KeywordStyle.pseudo);
+      const Keyword(84, "await", "AWAIT", KeywordStyle.pseudo);
 
   static const Keyword BREAK =
-      const Keyword("break", "BREAK", KeywordStyle.reserved);
+      const Keyword(85, "break", "BREAK", KeywordStyle.reserved);
 
   static const Keyword CASE =
-      const Keyword("case", "CASE", KeywordStyle.reserved);
+      const Keyword(86, "case", "CASE", KeywordStyle.reserved);
 
   static const Keyword CATCH =
-      const Keyword("catch", "CATCH", KeywordStyle.reserved);
+      const Keyword(87, "catch", "CATCH", KeywordStyle.reserved);
 
   static const Keyword CLASS = const Keyword(
-      "class", "CLASS", KeywordStyle.reserved,
+      88, "class", "CLASS", KeywordStyle.reserved,
       isTopLevelKeyword: true);
 
-  static const Keyword CONST =
-      const Keyword("const", "CONST", KeywordStyle.reserved, isModifier: true);
+  static const Keyword CONST = const Keyword(
+      89, "const", "CONST", KeywordStyle.reserved,
+      isModifier: true);
 
   static const Keyword CONTINUE =
-      const Keyword("continue", "CONTINUE", KeywordStyle.reserved);
+      const Keyword(90, "continue", "CONTINUE", KeywordStyle.reserved);
 
   static const Keyword COVARIANT = const Keyword(
-      "covariant", "COVARIANT", KeywordStyle.builtIn,
+      91, "covariant", "COVARIANT", KeywordStyle.builtIn,
       isModifier: true);
 
   static const Keyword DEFAULT =
-      const Keyword("default", "DEFAULT", KeywordStyle.reserved);
+      const Keyword(92, "default", "DEFAULT", KeywordStyle.reserved);
 
   static const Keyword DEFERRED =
-      const Keyword("deferred", "DEFERRED", KeywordStyle.builtIn);
+      const Keyword(93, "deferred", "DEFERRED", KeywordStyle.builtIn);
 
-  static const Keyword DO = const Keyword("do", "DO", KeywordStyle.reserved);
+  static const Keyword DO =
+      const Keyword(94, "do", "DO", KeywordStyle.reserved);
 
   static const Keyword DYNAMIC =
-      const Keyword("dynamic", "DYNAMIC", KeywordStyle.builtIn);
+      const Keyword(95, "dynamic", "DYNAMIC", KeywordStyle.builtIn);
 
   static const Keyword ELSE =
-      const Keyword("else", "ELSE", KeywordStyle.reserved);
+      const Keyword(96, "else", "ELSE", KeywordStyle.reserved);
 
   static const Keyword ENUM = const Keyword(
-      "enum", "ENUM", KeywordStyle.reserved,
+      97, "enum", "ENUM", KeywordStyle.reserved,
       isTopLevelKeyword: true);
 
   static const Keyword EXPORT = const Keyword(
-      "export", "EXPORT", KeywordStyle.builtIn,
+      98, "export", "EXPORT", KeywordStyle.builtIn,
       isTopLevelKeyword: true);
 
   static const Keyword EXTENDS =
-      const Keyword("extends", "EXTENDS", KeywordStyle.reserved);
+      const Keyword(99, "extends", "EXTENDS", KeywordStyle.reserved);
 
   static const Keyword EXTENSION = const Keyword(
-      "extension", "EXTENSION", KeywordStyle.builtIn,
+      100, "extension", "EXTENSION", KeywordStyle.builtIn,
       isTopLevelKeyword: true);
 
   static const Keyword EXTERNAL = const Keyword(
-      "external", "EXTERNAL", KeywordStyle.builtIn,
+      101, "external", "EXTERNAL", KeywordStyle.builtIn,
       isModifier: true);
 
   static const Keyword FACTORY =
-      const Keyword("factory", "FACTORY", KeywordStyle.builtIn);
+      const Keyword(102, "factory", "FACTORY", KeywordStyle.builtIn);
 
   static const Keyword FALSE =
-      const Keyword("false", "FALSE", KeywordStyle.reserved);
+      const Keyword(103, "false", "FALSE", KeywordStyle.reserved);
 
-  static const Keyword FINAL =
-      const Keyword("final", "FINAL", KeywordStyle.reserved, isModifier: true);
+  static const Keyword FINAL = const Keyword(
+      104, "final", "FINAL", KeywordStyle.reserved,
+      isModifier: true);
 
   static const Keyword FINALLY =
-      const Keyword("finally", "FINALLY", KeywordStyle.reserved);
+      const Keyword(105, "finally", "FINALLY", KeywordStyle.reserved);
 
-  static const Keyword FOR = const Keyword("for", "FOR", KeywordStyle.reserved);
+  static const Keyword FOR =
+      const Keyword(106, "for", "FOR", KeywordStyle.reserved);
 
   static const Keyword FUNCTION =
-      const Keyword("Function", "FUNCTION", KeywordStyle.builtIn);
+      const Keyword(107, "Function", "FUNCTION", KeywordStyle.builtIn);
 
-  static const Keyword GET = const Keyword("get", "GET", KeywordStyle.builtIn);
+  static const Keyword GET =
+      const Keyword(108, "get", "GET", KeywordStyle.builtIn);
 
   static const Keyword HIDE =
-      const Keyword("hide", "HIDE", KeywordStyle.pseudo);
+      const Keyword(109, "hide", "HIDE", KeywordStyle.pseudo);
 
-  static const Keyword IF = const Keyword("if", "IF", KeywordStyle.reserved);
+  static const Keyword IF =
+      const Keyword(110, "if", "IF", KeywordStyle.reserved);
 
   static const Keyword IMPLEMENTS =
-      const Keyword("implements", "IMPLEMENTS", KeywordStyle.builtIn);
+      const Keyword(111, "implements", "IMPLEMENTS", KeywordStyle.builtIn);
 
   static const Keyword IMPORT = const Keyword(
-      "import", "IMPORT", KeywordStyle.builtIn,
+      112, "import", "IMPORT", KeywordStyle.builtIn,
       isTopLevelKeyword: true);
 
-  static const Keyword IN = const Keyword("in", "IN", KeywordStyle.reserved);
+  static const Keyword IN =
+      const Keyword(113, "in", "IN", KeywordStyle.reserved);
 
   static const Keyword INOUT =
-      const Keyword("inout", "INOUT", KeywordStyle.pseudo);
+      const Keyword(114, "inout", "INOUT", KeywordStyle.pseudo);
 
   static const Keyword INTERFACE =
-      const Keyword("interface", "INTERFACE", KeywordStyle.builtIn);
+      const Keyword(115, "interface", "INTERFACE", KeywordStyle.builtIn);
 
-  static const Keyword IS = const Keyword("is", "IS", KeywordStyle.reserved,
+  static const Keyword IS = const Keyword(
+      116, "is", "IS", KeywordStyle.reserved,
       precedence: RELATIONAL_PRECEDENCE);
 
-  static const Keyword LATE =
-      const Keyword("late", "LATE", KeywordStyle.builtIn, isModifier: true);
+  static const Keyword LATE = const Keyword(
+      117, "late", "LATE", KeywordStyle.builtIn,
+      isModifier: true);
 
   static const Keyword LIBRARY = const Keyword(
-      "library", "LIBRARY", KeywordStyle.builtIn,
+      118, "library", "LIBRARY", KeywordStyle.builtIn,
       isTopLevelKeyword: true);
 
   static const Keyword MIXIN = const Keyword(
-      "mixin", "MIXIN", KeywordStyle.builtIn,
+      119, "mixin", "MIXIN", KeywordStyle.builtIn,
       isTopLevelKeyword: true);
 
   static const Keyword NATIVE =
-      const Keyword("native", "NATIVE", KeywordStyle.pseudo);
+      const Keyword(120, "native", "NATIVE", KeywordStyle.pseudo);
 
-  static const Keyword NEW = const Keyword("new", "NEW", KeywordStyle.reserved);
+  static const Keyword NEW =
+      const Keyword(121, "new", "NEW", KeywordStyle.reserved);
 
   static const Keyword NULL =
-      const Keyword("null", "NULL", KeywordStyle.reserved);
+      const Keyword(122, "null", "NULL", KeywordStyle.reserved);
 
-  static const Keyword OF = const Keyword("of", "OF", KeywordStyle.pseudo);
+  static const Keyword OF = const Keyword(123, "of", "OF", KeywordStyle.pseudo);
 
-  static const Keyword ON = const Keyword("on", "ON", KeywordStyle.pseudo);
+  static const Keyword ON = const Keyword(124, "on", "ON", KeywordStyle.pseudo);
 
   static const Keyword OPERATOR =
-      const Keyword("operator", "OPERATOR", KeywordStyle.builtIn);
+      const Keyword(125, "operator", "OPERATOR", KeywordStyle.builtIn);
 
-  static const Keyword OUT = const Keyword("out", "OUT", KeywordStyle.pseudo);
+  static const Keyword OUT =
+      const Keyword(126, "out", "OUT", KeywordStyle.pseudo);
 
   static const Keyword PART = const Keyword(
-      "part", "PART", KeywordStyle.builtIn,
+      127, "part", "PART", KeywordStyle.builtIn,
       isTopLevelKeyword: true);
 
   static const Keyword PATCH =
-      const Keyword("patch", "PATCH", KeywordStyle.pseudo);
+      const Keyword(128, "patch", "PATCH", KeywordStyle.pseudo);
 
   static const Keyword REQUIRED = const Keyword(
-      "required", "REQUIRED", KeywordStyle.builtIn,
+      129, "required", "REQUIRED", KeywordStyle.builtIn,
       isModifier: true);
 
   static const Keyword RETHROW =
-      const Keyword("rethrow", "RETHROW", KeywordStyle.reserved);
+      const Keyword(130, "rethrow", "RETHROW", KeywordStyle.reserved);
 
   static const Keyword RETURN =
-      const Keyword("return", "RETURN", KeywordStyle.reserved);
+      const Keyword(131, "return", "RETURN", KeywordStyle.reserved);
 
-  static const Keyword SET = const Keyword("set", "SET", KeywordStyle.builtIn);
+  static const Keyword SET =
+      const Keyword(132, "set", "SET", KeywordStyle.builtIn);
 
   static const Keyword SHOW =
-      const Keyword("show", "SHOW", KeywordStyle.pseudo);
+      const Keyword(133, "show", "SHOW", KeywordStyle.pseudo);
 
   static const Keyword SOURCE =
-      const Keyword("source", "SOURCE", KeywordStyle.pseudo);
+      const Keyword(134, "source", "SOURCE", KeywordStyle.pseudo);
 
-  static const Keyword STATIC =
-      const Keyword("static", "STATIC", KeywordStyle.builtIn, isModifier: true);
+  static const Keyword STATIC = const Keyword(
+      135, "static", "STATIC", KeywordStyle.builtIn,
+      isModifier: true);
 
   static const Keyword SUPER =
-      const Keyword("super", "SUPER", KeywordStyle.reserved);
+      const Keyword(136, "super", "SUPER", KeywordStyle.reserved);
 
   static const Keyword SWITCH =
-      const Keyword("switch", "SWITCH", KeywordStyle.reserved);
+      const Keyword(137, "switch", "SWITCH", KeywordStyle.reserved);
 
   static const Keyword SYNC =
-      const Keyword("sync", "SYNC", KeywordStyle.pseudo);
+      const Keyword(138, "sync", "SYNC", KeywordStyle.pseudo);
 
   static const Keyword THIS =
-      const Keyword("this", "THIS", KeywordStyle.reserved);
+      const Keyword(139, "this", "THIS", KeywordStyle.reserved);
 
   static const Keyword THROW =
-      const Keyword("throw", "THROW", KeywordStyle.reserved);
+      const Keyword(140, "throw", "THROW", KeywordStyle.reserved);
 
   static const Keyword TRUE =
-      const Keyword("true", "TRUE", KeywordStyle.reserved);
+      const Keyword(141, "true", "TRUE", KeywordStyle.reserved);
 
-  static const Keyword TRY = const Keyword("try", "TRY", KeywordStyle.reserved);
+  static const Keyword TRY =
+      const Keyword(142, "try", "TRY", KeywordStyle.reserved);
 
   static const Keyword TYPEDEF = const Keyword(
-      "typedef", "TYPEDEF", KeywordStyle.builtIn,
+      143, "typedef", "TYPEDEF", KeywordStyle.builtIn,
       isTopLevelKeyword: true);
 
   static const Keyword VAR =
-      const Keyword("var", "VAR", KeywordStyle.reserved, isModifier: true);
+      const Keyword(144, "var", "VAR", KeywordStyle.reserved, isModifier: true);
 
   static const Keyword VOID =
-      const Keyword("void", "VOID", KeywordStyle.reserved);
+      const Keyword(145, "void", "VOID", KeywordStyle.reserved);
 
   static const Keyword WHILE =
-      const Keyword("while", "WHILE", KeywordStyle.reserved);
+      const Keyword(146, "while", "WHILE", KeywordStyle.reserved);
 
   static const Keyword WITH =
-      const Keyword("with", "WITH", KeywordStyle.reserved);
+      const Keyword(147, "with", "WITH", KeywordStyle.reserved);
 
   static const Keyword YIELD =
-      const Keyword("yield", "YIELD", KeywordStyle.pseudo);
+      const Keyword(148, "yield", "YIELD", KeywordStyle.pseudo);
 
   static const List<Keyword> values = const <Keyword>[
     ABSTRACT,
@@ -400,11 +414,11 @@
   /**
    * Initialize a newly created keyword.
    */
-  const Keyword(String lexeme, String name, this.keywordStyle,
+  const Keyword(int index, String lexeme, String name, this.keywordStyle,
       {bool isModifier: false,
       bool isTopLevelKeyword: false,
       int precedence: NO_PRECEDENCE})
-      : super(lexeme, name, precedence, KEYWORD_TOKEN,
+      : super(index, lexeme, name, precedence, KEYWORD_TOKEN,
             isModifier: isModifier, isTopLevelKeyword: isTopLevelKeyword);
 
   @override
@@ -495,14 +509,24 @@
    * The type of the token.
    */
   @override
-  final TokenType type;
+  TokenType get type => _tokenTypesByIndex[_typeAndOffset & 0xff];
 
   /**
    * The offset from the beginning of the file to the first character in the
    * token.
    */
   @override
-  int offset = 0;
+  int get offset => _typeAndOffset >> 8;
+
+  /**
+   * Set the offset from the beginning of the file to the first character in
+   * the token to the given [offset].
+   */
+  @override
+  void set offset(int value) {
+    assert(_tokenTypesByIndex.length < 256);
+    _typeAndOffset = (value << 8) | (_typeAndOffset & 0xff);
+  }
 
   /**
    * The previous token in the token stream.
@@ -519,9 +543,20 @@
   CommentToken? _precedingComment;
 
   /**
+   * The combined encoding of token type and offset.
+   */
+  int _typeAndOffset;
+
+  /**
    * Initialize a newly created token to have the given [type] and [offset].
    */
-  SimpleToken(this.type, this.offset, [this._precedingComment]) {
+  SimpleToken(TokenType type, int offset, [this._precedingComment])
+      : _typeAndOffset = ((offset << 8) | type.index) {
+    // Assert the encoding of the [type] is fully reversible.
+    assert(type.index < 256 && _tokenTypesByIndex.length < 256);
+    assert(identical(offset, this.offset));
+    assert(identical(type, this.type));
+
     _setCommentParent(_precedingComment);
   }
 
@@ -1161,49 +1196,50 @@
    * The type of the token that marks the start or end of the input.
    */
   static const TokenType EOF =
-      const TokenType('', 'EOF', NO_PRECEDENCE, EOF_TOKEN);
+      const TokenType(0, '', 'EOF', NO_PRECEDENCE, EOF_TOKEN);
 
   static const TokenType DOUBLE = const TokenType(
-      'double', 'DOUBLE', NO_PRECEDENCE, DOUBLE_TOKEN,
+      1, 'double', 'DOUBLE', NO_PRECEDENCE, DOUBLE_TOKEN,
       stringValue: null);
 
   static const TokenType HEXADECIMAL = const TokenType(
-      'hexadecimal', 'HEXADECIMAL', NO_PRECEDENCE, HEXADECIMAL_TOKEN,
+      2, 'hexadecimal', 'HEXADECIMAL', NO_PRECEDENCE, HEXADECIMAL_TOKEN,
       stringValue: null);
 
   static const TokenType IDENTIFIER = const TokenType(
-      'identifier', 'IDENTIFIER', NO_PRECEDENCE, IDENTIFIER_TOKEN,
+      3, 'identifier', 'IDENTIFIER', NO_PRECEDENCE, IDENTIFIER_TOKEN,
       stringValue: null);
 
   static const TokenType INT = const TokenType(
-      'int', 'INT', NO_PRECEDENCE, INT_TOKEN,
+      4, 'int', 'INT', NO_PRECEDENCE, INT_TOKEN,
       stringValue: null);
 
   static const TokenType MULTI_LINE_COMMENT = const TokenType(
-      'comment', 'MULTI_LINE_COMMENT', NO_PRECEDENCE, COMMENT_TOKEN,
+      5, 'comment', 'MULTI_LINE_COMMENT', NO_PRECEDENCE, COMMENT_TOKEN,
       stringValue: null);
 
   static const TokenType SCRIPT_TAG =
-      const TokenType('script', 'SCRIPT_TAG', NO_PRECEDENCE, SCRIPT_TOKEN);
+      const TokenType(6, 'script', 'SCRIPT_TAG', NO_PRECEDENCE, SCRIPT_TOKEN);
 
   static const TokenType SINGLE_LINE_COMMENT = const TokenType(
-      'comment', 'SINGLE_LINE_COMMENT', NO_PRECEDENCE, COMMENT_TOKEN,
+      7, 'comment', 'SINGLE_LINE_COMMENT', NO_PRECEDENCE, COMMENT_TOKEN,
       stringValue: null);
 
   static const TokenType STRING = const TokenType(
-      'string', 'STRING', NO_PRECEDENCE, STRING_TOKEN,
+      8, 'string', 'STRING', NO_PRECEDENCE, STRING_TOKEN,
       stringValue: null);
 
   static const TokenType AMPERSAND = const TokenType(
-      '&', 'AMPERSAND', BITWISE_AND_PRECEDENCE, AMPERSAND_TOKEN,
+      9, '&', 'AMPERSAND', BITWISE_AND_PRECEDENCE, AMPERSAND_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
-  static const TokenType AMPERSAND_AMPERSAND = const TokenType('&&',
+  static const TokenType AMPERSAND_AMPERSAND = const TokenType(10, '&&',
       'AMPERSAND_AMPERSAND', LOGICAL_AND_PRECEDENCE, AMPERSAND_AMPERSAND_TOKEN,
       isOperator: true, isBinaryOperator: true);
 
   // This is not yet part of the language and not supported by fasta
   static const TokenType AMPERSAND_AMPERSAND_EQ = const TokenType(
+      11,
       '&&=',
       'AMPERSAND_AMPERSAND_EQ',
       ASSIGNMENT_PRECEDENCE,
@@ -1212,257 +1248,261 @@
       isOperator: true);
 
   static const TokenType AMPERSAND_EQ = const TokenType(
-      '&=', 'AMPERSAND_EQ', ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN,
+      12, '&=', 'AMPERSAND_EQ', ASSIGNMENT_PRECEDENCE, AMPERSAND_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.AMPERSAND,
       isOperator: true);
 
   static const TokenType AT =
-      const TokenType('@', 'AT', NO_PRECEDENCE, AT_TOKEN);
+      const TokenType(13, '@', 'AT', NO_PRECEDENCE, AT_TOKEN);
 
   static const TokenType BANG = const TokenType(
-      '!', 'BANG', PREFIX_PRECEDENCE, BANG_TOKEN,
+      14, '!', 'BANG', PREFIX_PRECEDENCE, BANG_TOKEN,
       isOperator: true);
 
   static const TokenType BANG_EQ = const TokenType(
-      '!=', 'BANG_EQ', EQUALITY_PRECEDENCE, BANG_EQ_TOKEN,
+      15, '!=', 'BANG_EQ', EQUALITY_PRECEDENCE, BANG_EQ_TOKEN,
       isOperator: true);
 
   static const TokenType BANG_EQ_EQ = const TokenType(
-      '!==', 'BANG_EQ_EQ', EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN);
+      16, '!==', 'BANG_EQ_EQ', EQUALITY_PRECEDENCE, BANG_EQ_EQ_TOKEN);
 
   static const TokenType BAR = const TokenType(
-      '|', 'BAR', BITWISE_OR_PRECEDENCE, BAR_TOKEN,
+      17, '|', 'BAR', BITWISE_OR_PRECEDENCE, BAR_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType BAR_BAR = const TokenType(
-      '||', 'BAR_BAR', LOGICAL_OR_PRECEDENCE, BAR_BAR_TOKEN,
+      18, '||', 'BAR_BAR', LOGICAL_OR_PRECEDENCE, BAR_BAR_TOKEN,
       isOperator: true, isBinaryOperator: true);
 
   // This is not yet part of the language and not supported by fasta
   static const TokenType BAR_BAR_EQ = const TokenType(
-      '||=', 'BAR_BAR_EQ', ASSIGNMENT_PRECEDENCE, BAR_BAR_EQ_TOKEN,
+      19, '||=', 'BAR_BAR_EQ', ASSIGNMENT_PRECEDENCE, BAR_BAR_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.BAR_BAR, isOperator: true);
 
   static const TokenType BAR_EQ = const TokenType(
-      '|=', 'BAR_EQ', ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN,
+      20, '|=', 'BAR_EQ', ASSIGNMENT_PRECEDENCE, BAR_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.BAR, isOperator: true);
 
   static const TokenType COLON =
-      const TokenType(':', 'COLON', NO_PRECEDENCE, COLON_TOKEN);
+      const TokenType(21, ':', 'COLON', NO_PRECEDENCE, COLON_TOKEN);
 
   static const TokenType COMMA =
-      const TokenType(',', 'COMMA', NO_PRECEDENCE, COMMA_TOKEN);
+      const TokenType(22, ',', 'COMMA', NO_PRECEDENCE, COMMA_TOKEN);
 
   static const TokenType CARET = const TokenType(
-      '^', 'CARET', BITWISE_XOR_PRECEDENCE, CARET_TOKEN,
+      23, '^', 'CARET', BITWISE_XOR_PRECEDENCE, CARET_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType CARET_EQ = const TokenType(
-      '^=', 'CARET_EQ', ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN,
+      24, '^=', 'CARET_EQ', ASSIGNMENT_PRECEDENCE, CARET_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.CARET, isOperator: true);
 
   static const TokenType CLOSE_CURLY_BRACKET = const TokenType(
-      '}', 'CLOSE_CURLY_BRACKET', NO_PRECEDENCE, CLOSE_CURLY_BRACKET_TOKEN);
+      25, '}', 'CLOSE_CURLY_BRACKET', NO_PRECEDENCE, CLOSE_CURLY_BRACKET_TOKEN);
 
   static const TokenType CLOSE_PAREN =
-      const TokenType(')', 'CLOSE_PAREN', NO_PRECEDENCE, CLOSE_PAREN_TOKEN);
+      const TokenType(26, ')', 'CLOSE_PAREN', NO_PRECEDENCE, CLOSE_PAREN_TOKEN);
 
-  static const TokenType CLOSE_SQUARE_BRACKET = const TokenType(
-      ']', 'CLOSE_SQUARE_BRACKET', NO_PRECEDENCE, CLOSE_SQUARE_BRACKET_TOKEN);
+  static const TokenType CLOSE_SQUARE_BRACKET = const TokenType(27, ']',
+      'CLOSE_SQUARE_BRACKET', NO_PRECEDENCE, CLOSE_SQUARE_BRACKET_TOKEN);
 
   static const TokenType EQ = const TokenType(
-      '=', 'EQ', ASSIGNMENT_PRECEDENCE, EQ_TOKEN,
+      28, '=', 'EQ', ASSIGNMENT_PRECEDENCE, EQ_TOKEN,
       isOperator: true);
 
   static const TokenType EQ_EQ = const TokenType(
-      '==', 'EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_TOKEN,
+      29, '==', 'EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   /// The `===` operator is not supported in the Dart language
   /// but is parsed as such by the scanner to support better recovery
   /// when a JavaScript code snippet is pasted into a Dart file.
-  static const TokenType EQ_EQ_EQ =
-      const TokenType('===', 'EQ_EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN);
+  static const TokenType EQ_EQ_EQ = const TokenType(
+      30, '===', 'EQ_EQ_EQ', EQUALITY_PRECEDENCE, EQ_EQ_EQ_TOKEN);
 
   static const TokenType FUNCTION =
-      const TokenType('=>', 'FUNCTION', NO_PRECEDENCE, FUNCTION_TOKEN);
+      const TokenType(31, '=>', 'FUNCTION', NO_PRECEDENCE, FUNCTION_TOKEN);
 
   static const TokenType GT = const TokenType(
-      '>', 'GT', RELATIONAL_PRECEDENCE, GT_TOKEN,
+      32, '>', 'GT', RELATIONAL_PRECEDENCE, GT_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType GT_EQ = const TokenType(
-      '>=', 'GT_EQ', RELATIONAL_PRECEDENCE, GT_EQ_TOKEN,
+      33, '>=', 'GT_EQ', RELATIONAL_PRECEDENCE, GT_EQ_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType GT_GT = const TokenType(
-      '>>', 'GT_GT', SHIFT_PRECEDENCE, GT_GT_TOKEN,
+      34, '>>', 'GT_GT', SHIFT_PRECEDENCE, GT_GT_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType GT_GT_EQ = const TokenType(
-      '>>=', 'GT_GT_EQ', ASSIGNMENT_PRECEDENCE, GT_GT_EQ_TOKEN,
+      35, '>>=', 'GT_GT_EQ', ASSIGNMENT_PRECEDENCE, GT_GT_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.GT_GT, isOperator: true);
 
   static const TokenType GT_GT_GT = const TokenType(
-      '>>>', 'GT_GT_GT', SHIFT_PRECEDENCE, GT_GT_GT_TOKEN,
+      36, '>>>', 'GT_GT_GT', SHIFT_PRECEDENCE, GT_GT_GT_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType GT_GT_GT_EQ = const TokenType(
-      '>>>=', 'GT_GT_GT_EQ', ASSIGNMENT_PRECEDENCE, GT_GT_GT_EQ_TOKEN,
+      37, '>>>=', 'GT_GT_GT_EQ', ASSIGNMENT_PRECEDENCE, GT_GT_GT_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.GT_GT_GT, isOperator: true);
 
   static const TokenType HASH =
-      const TokenType('#', 'HASH', NO_PRECEDENCE, HASH_TOKEN);
+      const TokenType(38, '#', 'HASH', NO_PRECEDENCE, HASH_TOKEN);
 
   static const TokenType INDEX = const TokenType(
-      '[]', 'INDEX', SELECTOR_PRECEDENCE, INDEX_TOKEN,
+      39, '[]', 'INDEX', SELECTOR_PRECEDENCE, INDEX_TOKEN,
       isOperator: true, isUserDefinableOperator: true);
 
   static const TokenType INDEX_EQ = const TokenType(
-      '[]=', 'INDEX_EQ', NO_PRECEDENCE, INDEX_EQ_TOKEN,
+      40, '[]=', 'INDEX_EQ', NO_PRECEDENCE, INDEX_EQ_TOKEN,
       isOperator: true, isUserDefinableOperator: true);
 
   static const TokenType LT = const TokenType(
-      '<', 'LT', RELATIONAL_PRECEDENCE, LT_TOKEN,
+      41, '<', 'LT', RELATIONAL_PRECEDENCE, LT_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType LT_EQ = const TokenType(
-      '<=', 'LT_EQ', RELATIONAL_PRECEDENCE, LT_EQ_TOKEN,
+      42, '<=', 'LT_EQ', RELATIONAL_PRECEDENCE, LT_EQ_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType LT_LT = const TokenType(
-      '<<', 'LT_LT', SHIFT_PRECEDENCE, LT_LT_TOKEN,
+      43, '<<', 'LT_LT', SHIFT_PRECEDENCE, LT_LT_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType LT_LT_EQ = const TokenType(
-      '<<=', 'LT_LT_EQ', ASSIGNMENT_PRECEDENCE, LT_LT_EQ_TOKEN,
+      44, '<<=', 'LT_LT_EQ', ASSIGNMENT_PRECEDENCE, LT_LT_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.LT_LT, isOperator: true);
 
   static const TokenType MINUS = const TokenType(
-      '-', 'MINUS', ADDITIVE_PRECEDENCE, MINUS_TOKEN,
+      45, '-', 'MINUS', ADDITIVE_PRECEDENCE, MINUS_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType MINUS_EQ = const TokenType(
-      '-=', 'MINUS_EQ', ASSIGNMENT_PRECEDENCE, MINUS_EQ_TOKEN,
+      46, '-=', 'MINUS_EQ', ASSIGNMENT_PRECEDENCE, MINUS_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.MINUS, isOperator: true);
 
   static const TokenType MINUS_MINUS = const TokenType(
-      '--', 'MINUS_MINUS', POSTFIX_PRECEDENCE, MINUS_MINUS_TOKEN,
+      47, '--', 'MINUS_MINUS', POSTFIX_PRECEDENCE, MINUS_MINUS_TOKEN,
       isOperator: true);
 
   static const TokenType OPEN_CURLY_BRACKET = const TokenType(
-      '{', 'OPEN_CURLY_BRACKET', NO_PRECEDENCE, OPEN_CURLY_BRACKET_TOKEN);
+      48, '{', 'OPEN_CURLY_BRACKET', NO_PRECEDENCE, OPEN_CURLY_BRACKET_TOKEN);
 
-  static const TokenType OPEN_PAREN =
-      const TokenType('(', 'OPEN_PAREN', SELECTOR_PRECEDENCE, OPEN_PAREN_TOKEN);
+  static const TokenType OPEN_PAREN = const TokenType(
+      49, '(', 'OPEN_PAREN', SELECTOR_PRECEDENCE, OPEN_PAREN_TOKEN);
 
-  static const TokenType OPEN_SQUARE_BRACKET = const TokenType('[',
+  static const TokenType OPEN_SQUARE_BRACKET = const TokenType(50, '[',
       'OPEN_SQUARE_BRACKET', SELECTOR_PRECEDENCE, OPEN_SQUARE_BRACKET_TOKEN);
 
   static const TokenType PERCENT = const TokenType(
-      '%', 'PERCENT', MULTIPLICATIVE_PRECEDENCE, PERCENT_TOKEN,
+      51, '%', 'PERCENT', MULTIPLICATIVE_PRECEDENCE, PERCENT_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType PERCENT_EQ = const TokenType(
-      '%=', 'PERCENT_EQ', ASSIGNMENT_PRECEDENCE, PERCENT_EQ_TOKEN,
+      52, '%=', 'PERCENT_EQ', ASSIGNMENT_PRECEDENCE, PERCENT_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.PERCENT, isOperator: true);
 
   static const TokenType PERIOD =
-      const TokenType('.', 'PERIOD', SELECTOR_PRECEDENCE, PERIOD_TOKEN);
+      const TokenType(53, '.', 'PERIOD', SELECTOR_PRECEDENCE, PERIOD_TOKEN);
 
   static const TokenType PERIOD_PERIOD = const TokenType(
-      '..', 'PERIOD_PERIOD', CASCADE_PRECEDENCE, PERIOD_PERIOD_TOKEN,
+      54, '..', 'PERIOD_PERIOD', CASCADE_PRECEDENCE, PERIOD_PERIOD_TOKEN,
       isOperator: true);
 
   static const TokenType PLUS = const TokenType(
-      '+', 'PLUS', ADDITIVE_PRECEDENCE, PLUS_TOKEN,
+      55, '+', 'PLUS', ADDITIVE_PRECEDENCE, PLUS_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType PLUS_EQ = const TokenType(
-      '+=', 'PLUS_EQ', ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN,
+      56, '+=', 'PLUS_EQ', ASSIGNMENT_PRECEDENCE, PLUS_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.PLUS, isOperator: true);
 
   static const TokenType PLUS_PLUS = const TokenType(
-      '++', 'PLUS_PLUS', POSTFIX_PRECEDENCE, PLUS_PLUS_TOKEN,
+      57, '++', 'PLUS_PLUS', POSTFIX_PRECEDENCE, PLUS_PLUS_TOKEN,
       isOperator: true);
 
   static const TokenType QUESTION = const TokenType(
-      '?', 'QUESTION', CONDITIONAL_PRECEDENCE, QUESTION_TOKEN,
+      58, '?', 'QUESTION', CONDITIONAL_PRECEDENCE, QUESTION_TOKEN,
       isOperator: true);
 
   static const TokenType QUESTION_PERIOD = const TokenType(
-      '?.', 'QUESTION_PERIOD', SELECTOR_PRECEDENCE, QUESTION_PERIOD_TOKEN,
+      59, '?.', 'QUESTION_PERIOD', SELECTOR_PRECEDENCE, QUESTION_PERIOD_TOKEN,
       isOperator: true);
 
-  static const TokenType QUESTION_QUESTION = const TokenType(
-      '??', 'QUESTION_QUESTION', IF_NULL_PRECEDENCE, QUESTION_QUESTION_TOKEN,
+  static const TokenType QUESTION_QUESTION = const TokenType(60, '??',
+      'QUESTION_QUESTION', IF_NULL_PRECEDENCE, QUESTION_QUESTION_TOKEN,
       isOperator: true, isBinaryOperator: true);
 
-  static const TokenType QUESTION_QUESTION_EQ = const TokenType('??=',
+  static const TokenType QUESTION_QUESTION_EQ = const TokenType(61, '??=',
       'QUESTION_QUESTION_EQ', ASSIGNMENT_PRECEDENCE, QUESTION_QUESTION_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.QUESTION_QUESTION,
       isOperator: true);
 
   static const TokenType SEMICOLON =
-      const TokenType(';', 'SEMICOLON', NO_PRECEDENCE, SEMICOLON_TOKEN);
+      const TokenType(62, ';', 'SEMICOLON', NO_PRECEDENCE, SEMICOLON_TOKEN);
 
   static const TokenType SLASH = const TokenType(
-      '/', 'SLASH', MULTIPLICATIVE_PRECEDENCE, SLASH_TOKEN,
+      63, '/', 'SLASH', MULTIPLICATIVE_PRECEDENCE, SLASH_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType SLASH_EQ = const TokenType(
-      '/=', 'SLASH_EQ', ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN,
+      64, '/=', 'SLASH_EQ', ASSIGNMENT_PRECEDENCE, SLASH_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.SLASH, isOperator: true);
 
   static const TokenType STAR = const TokenType(
-      '*', 'STAR', MULTIPLICATIVE_PRECEDENCE, STAR_TOKEN,
+      65, '*', 'STAR', MULTIPLICATIVE_PRECEDENCE, STAR_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType STAR_EQ = const TokenType(
-      '*=', 'STAR_EQ', ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN,
+      66, '*=', 'STAR_EQ', ASSIGNMENT_PRECEDENCE, STAR_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.STAR, isOperator: true);
 
   static const TokenType STRING_INTERPOLATION_EXPRESSION = const TokenType(
+      67,
       '\${',
       'STRING_INTERPOLATION_EXPRESSION',
       NO_PRECEDENCE,
       STRING_INTERPOLATION_TOKEN);
 
   static const TokenType STRING_INTERPOLATION_IDENTIFIER = const TokenType(
+      68,
       '\$',
       'STRING_INTERPOLATION_IDENTIFIER',
       NO_PRECEDENCE,
       STRING_INTERPOLATION_IDENTIFIER_TOKEN);
 
   static const TokenType TILDE = const TokenType(
-      '~', 'TILDE', PREFIX_PRECEDENCE, TILDE_TOKEN,
+      69, '~', 'TILDE', PREFIX_PRECEDENCE, TILDE_TOKEN,
       isOperator: true, isUserDefinableOperator: true);
 
   static const TokenType TILDE_SLASH = const TokenType(
-      '~/', 'TILDE_SLASH', MULTIPLICATIVE_PRECEDENCE, TILDE_SLASH_TOKEN,
+      70, '~/', 'TILDE_SLASH', MULTIPLICATIVE_PRECEDENCE, TILDE_SLASH_TOKEN,
       isOperator: true, isBinaryOperator: true, isUserDefinableOperator: true);
 
   static const TokenType TILDE_SLASH_EQ = const TokenType(
-      '~/=', 'TILDE_SLASH_EQ', ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN,
+      71, '~/=', 'TILDE_SLASH_EQ', ASSIGNMENT_PRECEDENCE, TILDE_SLASH_EQ_TOKEN,
       binaryOperatorOfCompoundAssignment: TokenType.TILDE_SLASH,
       isOperator: true);
 
   static const TokenType BACKPING =
-      const TokenType('`', 'BACKPING', NO_PRECEDENCE, BACKPING_TOKEN);
+      const TokenType(72, '`', 'BACKPING', NO_PRECEDENCE, BACKPING_TOKEN);
 
   static const TokenType BACKSLASH =
-      const TokenType('\\', 'BACKSLASH', NO_PRECEDENCE, BACKSLASH_TOKEN);
+      const TokenType(73, '\\', 'BACKSLASH', NO_PRECEDENCE, BACKSLASH_TOKEN);
 
-  static const TokenType PERIOD_PERIOD_PERIOD = const TokenType(
-      '...', 'PERIOD_PERIOD_PERIOD', NO_PRECEDENCE, PERIOD_PERIOD_PERIOD_TOKEN);
+  static const TokenType PERIOD_PERIOD_PERIOD = const TokenType(74, '...',
+      'PERIOD_PERIOD_PERIOD', NO_PRECEDENCE, PERIOD_PERIOD_PERIOD_TOKEN);
 
   static const TokenType PERIOD_PERIOD_PERIOD_QUESTION = const TokenType(
+      75,
       '...?',
       'PERIOD_PERIOD_PERIOD_QUESTION',
       NO_PRECEDENCE,
       PERIOD_PERIOD_PERIOD_QUESTION_TOKEN);
 
   static const TokenType QUESTION_PERIOD_PERIOD = const TokenType(
+      76,
       '?..',
       'QUESTION_PERIOD_PERIOD',
       CASCADE_PRECEDENCE,
@@ -1476,7 +1516,7 @@
    * Token type used by error tokens.
    */
   static const TokenType BAD_INPUT = const TokenType(
-      'malformed input', 'BAD_INPUT', NO_PRECEDENCE, BAD_INPUT_TOKEN,
+      77, 'malformed input', 'BAD_INPUT', NO_PRECEDENCE, BAD_INPUT_TOKEN,
       stringValue: null);
 
   /**
@@ -1484,7 +1524,7 @@
    * recovery (non-analyzer use case).
    */
   static const TokenType RECOVERY = const TokenType(
-      'recovery', 'RECOVERY', NO_PRECEDENCE, RECOVERY_TOKEN,
+      78, 'recovery', 'RECOVERY', NO_PRECEDENCE, RECOVERY_TOKEN,
       stringValue: null);
 
   // TODO(danrubel): "all" is misleading
@@ -1579,6 +1619,11 @@
   ];
 
   /**
+   * A unique index identifying this [TokenType].
+   */
+  final int index;
+
+  /**
    * The binary operator that is invoked by this compound assignment operator,
    * or `null` otherwise.
    */
@@ -1636,7 +1681,8 @@
    */
   final String? stringValue;
 
-  const TokenType(this.lexeme, this.name, this.precedence, this.kind,
+  const TokenType(
+      this.index, this.lexeme, this.name, this.precedence, this.kind,
       {this.binaryOperatorOfCompoundAssignment,
       this.isBinaryOperator: false,
       this.isModifier: false,
@@ -1750,3 +1796,158 @@
   @override
   String toString() => name;
 }
+
+/**
+ * Constant list of [TokenType] and [Keyword] ordered by index.
+ */
+const List<TokenType> _tokenTypesByIndex = [
+  TokenType.EOF,
+  TokenType.DOUBLE,
+  TokenType.HEXADECIMAL,
+  TokenType.IDENTIFIER,
+  TokenType.INT,
+  TokenType.MULTI_LINE_COMMENT,
+  TokenType.SCRIPT_TAG,
+  TokenType.SINGLE_LINE_COMMENT,
+  TokenType.STRING,
+  TokenType.AMPERSAND,
+  TokenType.AMPERSAND_AMPERSAND,
+  TokenType.AMPERSAND_AMPERSAND_EQ,
+  TokenType.AMPERSAND_EQ,
+  TokenType.AT,
+  TokenType.BANG,
+  TokenType.BANG_EQ,
+  TokenType.BANG_EQ_EQ,
+  TokenType.BAR,
+  TokenType.BAR_BAR,
+  TokenType.BAR_BAR_EQ,
+  TokenType.BAR_EQ,
+  TokenType.COLON,
+  TokenType.COMMA,
+  TokenType.CARET,
+  TokenType.CARET_EQ,
+  TokenType.CLOSE_CURLY_BRACKET,
+  TokenType.CLOSE_PAREN,
+  TokenType.CLOSE_SQUARE_BRACKET,
+  TokenType.EQ,
+  TokenType.EQ_EQ,
+  TokenType.EQ_EQ_EQ,
+  TokenType.FUNCTION,
+  TokenType.GT,
+  TokenType.GT_EQ,
+  TokenType.GT_GT,
+  TokenType.GT_GT_EQ,
+  TokenType.GT_GT_GT,
+  TokenType.GT_GT_GT_EQ,
+  TokenType.HASH,
+  TokenType.INDEX,
+  TokenType.INDEX_EQ,
+  TokenType.LT,
+  TokenType.LT_EQ,
+  TokenType.LT_LT,
+  TokenType.LT_LT_EQ,
+  TokenType.MINUS,
+  TokenType.MINUS_EQ,
+  TokenType.MINUS_MINUS,
+  TokenType.OPEN_CURLY_BRACKET,
+  TokenType.OPEN_PAREN,
+  TokenType.OPEN_SQUARE_BRACKET,
+  TokenType.PERCENT,
+  TokenType.PERCENT_EQ,
+  TokenType.PERIOD,
+  TokenType.PERIOD_PERIOD,
+  TokenType.PLUS,
+  TokenType.PLUS_EQ,
+  TokenType.PLUS_PLUS,
+  TokenType.QUESTION,
+  TokenType.QUESTION_PERIOD,
+  TokenType.QUESTION_QUESTION,
+  TokenType.QUESTION_QUESTION_EQ,
+  TokenType.SEMICOLON,
+  TokenType.SLASH,
+  TokenType.SLASH_EQ,
+  TokenType.STAR,
+  TokenType.STAR_EQ,
+  TokenType.STRING_INTERPOLATION_EXPRESSION,
+  TokenType.STRING_INTERPOLATION_IDENTIFIER,
+  TokenType.TILDE,
+  TokenType.TILDE_SLASH,
+  TokenType.TILDE_SLASH_EQ,
+  TokenType.BACKPING,
+  TokenType.BACKSLASH,
+  TokenType.PERIOD_PERIOD_PERIOD,
+  TokenType.PERIOD_PERIOD_PERIOD_QUESTION,
+  TokenType.QUESTION_PERIOD_PERIOD,
+  TokenType.BAD_INPUT,
+  TokenType.RECOVERY,
+  Keyword.ABSTRACT,
+  Keyword.AS,
+  Keyword.ASSERT,
+  Keyword.ASYNC,
+  Keyword.AUGMENT,
+  Keyword.AWAIT,
+  Keyword.BREAK,
+  Keyword.CASE,
+  Keyword.CATCH,
+  Keyword.CLASS,
+  Keyword.CONST,
+  Keyword.CONTINUE,
+  Keyword.COVARIANT,
+  Keyword.DEFAULT,
+  Keyword.DEFERRED,
+  Keyword.DO,
+  Keyword.DYNAMIC,
+  Keyword.ELSE,
+  Keyword.ENUM,
+  Keyword.EXPORT,
+  Keyword.EXTENDS,
+  Keyword.EXTENSION,
+  Keyword.EXTERNAL,
+  Keyword.FACTORY,
+  Keyword.FALSE,
+  Keyword.FINAL,
+  Keyword.FINALLY,
+  Keyword.FOR,
+  Keyword.FUNCTION,
+  Keyword.GET,
+  Keyword.HIDE,
+  Keyword.IF,
+  Keyword.IMPLEMENTS,
+  Keyword.IMPORT,
+  Keyword.IN,
+  Keyword.INOUT,
+  Keyword.INTERFACE,
+  Keyword.IS,
+  Keyword.LATE,
+  Keyword.LIBRARY,
+  Keyword.MIXIN,
+  Keyword.NATIVE,
+  Keyword.NEW,
+  Keyword.NULL,
+  Keyword.OF,
+  Keyword.ON,
+  Keyword.OPERATOR,
+  Keyword.OUT,
+  Keyword.PART,
+  Keyword.PATCH,
+  Keyword.REQUIRED,
+  Keyword.RETHROW,
+  Keyword.RETURN,
+  Keyword.SET,
+  Keyword.SHOW,
+  Keyword.SOURCE,
+  Keyword.STATIC,
+  Keyword.SUPER,
+  Keyword.SWITCH,
+  Keyword.SYNC,
+  Keyword.THIS,
+  Keyword.THROW,
+  Keyword.TRUE,
+  Keyword.TRY,
+  Keyword.TYPEDEF,
+  Keyword.VAR,
+  Keyword.VOID,
+  Keyword.WHILE,
+  Keyword.WITH,
+  Keyword.YIELD,
+];
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/commands/refactor_command_handler.dart b/pkg/analysis_server/lib/src/lsp/handlers/commands/refactor_command_handler.dart
index 8597c68..2646ea9 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/commands/refactor_command_handler.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/commands/refactor_command_handler.dart
@@ -26,22 +26,22 @@
   @override
   Future<ErrorOr<void>> handle(Map<String, Object?> parameters,
       ProgressReporter progress, CancellationToken cancellationToken) async {
-    if (parameters['filePath'] is! String ||
-        parameters['selectionOffset'] is! int ||
-        parameters['selectionLength'] is! int ||
-        parameters['arguments'] is! List<String>) {
+    var filePath = parameters['filePath'];
+    var offset = parameters['selectionOffset'];
+    var length = parameters['selectionLength'];
+    var arguments = _validateArguments(parameters['arguments']);
+    if (filePath is! String ||
+        offset is! int ||
+        length is! int ||
+        arguments == null) {
       return ErrorOr.error(ResponseError(
           code: ServerErrorCodes.InvalidCommandArguments,
           message: 'Refactoring operations require 4 parameters: '
               'filePath: String, '
               'offset: int, '
               'length: int, '
-              'arguments: Map<String, String>'));
+              'arguments: List<String>'));
     }
-    var filePath = parameters['filePath'] as String;
-    var offset = parameters['selectionOffset'] as int;
-    var length = parameters['selectionLength'] as int;
-    var arguments = parameters['arguments'] as List<String>;
 
     final clientCapabilities = server.clientCapabilities;
     if (clientCapabilities == null) {
@@ -83,4 +83,21 @@
       return sendWorkspaceEditToClient(workspaceEdit);
     });
   }
+
+  /// If the [arguments] is a list whose elements are all strings, then return
+  /// them. Otherwise, return `null` to indicate that they aren't what we were
+  /// expecting.
+  List<String>? _validateArguments(Object? arguments) {
+    if (arguments is! List<Object?>) {
+      return null;
+    }
+    var result = <String>[];
+    for (var element in arguments) {
+      if (element is! String) {
+        return null;
+      }
+      result.add(element);
+    }
+    return result;
+  }
 }
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index 9351f5a..f8727e4 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1142,6 +1142,7 @@
 resumed
 ret
 reusage
+reversible
 rewinds
 rewrites
 rewrote
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index 5e78325..72e6a2a 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -1570,11 +1570,12 @@
   Expectation _validateExpectedErrors(TestCase testCase,
       [OutputWriter? writer]) {
     // Filter out errors that aren't for this configuration.
-    var errorSource = {
+    var errorSource = const {
       Compiler.dart2analyzer: ErrorSource.analyzer,
       Compiler.dart2js: ErrorSource.web,
       Compiler.dart2wasm: ErrorSource.web,
       Compiler.dartdevc: ErrorSource.web,
+      Compiler.dartdevk: ErrorSource.web,
       Compiler.fasta: ErrorSource.cfe
     }[testCase.configuration.compiler]!;
 
diff --git a/pkg/test_runner/lib/src/test_suite.dart b/pkg/test_runner/lib/src/test_suite.dart
index 1d48e10..a5e7239 100644
--- a/pkg/test_runner/lib/src/test_suite.dart
+++ b/pkg/test_runner/lib/src/test_suite.dart
@@ -173,8 +173,11 @@
 
     // Tests of web-specific static errors are run on web compilers.
     if (testFile.isWebStaticErrorTest &&
-        (configuration.compiler == Compiler.dart2js ||
-            configuration.compiler == Compiler.dartdevc)) {
+        const {
+          Compiler.dart2js,
+          Compiler.dartdevc,
+          Compiler.dartdevk,
+        }.contains(configuration.compiler)) {
       return true;
     }
 
diff --git a/tools/VERSION b/tools/VERSION
index 0ca88055..8808dea 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 19
 PATCH 0
-PRERELEASE 93
+PRERELEASE 94
 PRERELEASE_PATCH 0
\ No newline at end of file