Version 2.14.0-224.0.dev

Merge commit 'b3a688a9c692fa769f48472e850a258e6cec152d' into 'dev'
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 9d9e862..4b4cef9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -87,6 +87,9 @@
 * The `dart analyze` command has been extended to support specifying multiple
   files or directories to analyze; see also https://github.com/dart-lang/sdk/issues/45352.
 
+* The `dartanalyzer` command's JSON output mode has been changed to emit the JSON
+  output on stdout instead of stderr.
+
 #### Linter
 
 Updated the Linter to `1.6.1`, which includes changes that
diff --git a/DEPS b/DEPS
index 8a1a74c..177e023 100644
--- a/DEPS
+++ b/DEPS
@@ -109,7 +109,7 @@
   "dartdoc_rev" : "b733d4952dbd25374d55e28476a5f44bd60ed63f",
   "devtools_rev" : "b3bf672474a2bff82f33e1176aa803539baa0d60+1",
   "jsshell_tag": "version:88.0",
-  "ffi_rev": "f3346299c55669cc0db48afae85b8110088bf8da",
+  "ffi_rev": "4dd32429880a57b64edaf54c9d5af8a9fa9a4ffb",
   "fixnum_rev": "16d3890c6dc82ca629659da1934e412292508bba",
   "file_rev": "0e09370f581ab6388d46fda4cdab66638c0171a1",
   "glob_rev": "a62acf590598f458d3198d9f2930c1c9dd4b1379",
diff --git a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
index 4d51a7b..b2359965 100644
--- a/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/parser/identifier_context_impl.dart
@@ -58,9 +58,22 @@
     }
 
     // Recovery
-    if (looksLikeStartOfNextTopLevelDeclaration(identifier) ||
-        isOneOfOrEof(identifier,
-            const ['<', '{', 'extends', 'with', 'implements', 'on'])) {
+    const List<String> afterIdentifier = const [
+      '<',
+      '{',
+      'extends',
+      'with',
+      'implements',
+      'on',
+      '=',
+    ];
+    if (identifier.isEof ||
+        (looksLikeStartOfNextTopLevelDeclaration(identifier) &&
+            (identifier.next == null ||
+                !isOneOfOrEof(identifier.next!, afterIdentifier))) ||
+        (isOneOfOrEof(identifier, afterIdentifier) &&
+            (identifier.next == null ||
+                !isOneOfOrEof(identifier.next!, afterIdentifier)))) {
       identifier = parser.insertSyntheticIdentifier(token, this,
           message: codes.templateExpectedIdentifier.withArguments(identifier));
     } else if (identifier.type.isBuiltIn) {
@@ -548,8 +561,16 @@
     }
 
     // Recovery
-    return parser.insertSyntheticIdentifier(token, this,
-        message: codes.templateExpectedIdentifier.withArguments(identifier));
+    if (!identifier.isKeywordOrIdentifier) {
+      identifier = parser.insertSyntheticIdentifier(token, this,
+          message: codes.templateExpectedIdentifier.withArguments(identifier));
+    } else {
+      // Use the keyword as the identifier.
+      parser.reportRecoverableErrorWithToken(
+          identifier, codes.templateExpectedIdentifierButGotKeyword);
+    }
+
+    return identifier;
   }
 }
 
diff --git a/pkg/analysis_server/benchmark/integration/main.dart b/pkg/analysis_server/benchmark/integration/main.dart
index 8f0a438..b63675e 100644
--- a/pkg/analysis_server/benchmark/integration/main.dart
+++ b/pkg/analysis_server/benchmark/integration/main.dart
@@ -141,7 +141,7 @@
     perfArgs.inputPath = inputArg;
   }
 
-  for (String pair in args[MAP_OPTION]) {
+  for (var pair in args[MAP_OPTION]) {
     if (pair is String) {
       var index = pair.indexOf(',');
       if (index != -1 && !pair.contains(',', index + 1)) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 8c0af08..6db03d6 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -100,6 +100,9 @@
     if (_addIdentifierRegion_class(node)) {
       return;
     }
+    if (_addIdentifierRegion_extension(node)) {
+      return;
+    }
     if (_addIdentifierRegion_constructor(node)) {
       return;
     }
@@ -223,6 +226,29 @@
     return false;
   }
 
+  bool _addIdentifierRegion_extension(SimpleIdentifier node) {
+    var element = node.writeOrReadElement;
+    if (element is! ExtensionElement) {
+      return false;
+    }
+
+    // TODO(dantup): Right now there is no highlight type for extension, so
+    // bail out and do the default thing (which will be to return
+    // IDENTIFIER_DEFAULT). Adding EXTENSION requires coordination with
+    // IntelliJ + bumping protocol version.
+    if (!_computeSemanticTokens) {
+      return false;
+    }
+
+    return _addRegion_node(
+      node,
+      // TODO(dantup): Change this to EXTENSION and add to LSP mapping when
+      // we have it, but for now use CLASS (which is probably what we'll map it
+      // to for LSP semantic tokens anyway).
+      HighlightRegionType.CLASS,
+    );
+  }
+
   bool _addIdentifierRegion_field(SimpleIdentifier node) {
     var element = node.writeOrReadElement;
     if (element is FieldFormalParameterElement) {
diff --git a/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart b/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
index 0b7c262..ab5399b 100644
--- a/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
+++ b/pkg/analysis_server/lib/src/lsp/semantic_tokens/mapping.dart
@@ -97,6 +97,7 @@
   HighlightRegionType.ENUM: SemanticTokenTypes.enum_,
   HighlightRegionType.ENUM_CONSTANT: SemanticTokenTypes.enumMember,
   HighlightRegionType.FUNCTION_TYPE_ALIAS: SemanticTokenTypes.type,
+  HighlightRegionType.IDENTIFIER_DEFAULT: CustomSemanticTokenTypes.source,
   HighlightRegionType.INSTANCE_FIELD_DECLARATION: SemanticTokenTypes.variable,
   HighlightRegionType.INSTANCE_FIELD_REFERENCE: SemanticTokenTypes.variable,
   HighlightRegionType.INSTANCE_GETTER_DECLARATION: SemanticTokenTypes.property,
@@ -137,7 +138,7 @@
   HighlightRegionType.TYPE_NAME_DYNAMIC: SemanticTokenTypes.type,
   HighlightRegionType.TYPE_PARAMETER: SemanticTokenTypes.typeParameter,
   HighlightRegionType.UNRESOLVED_INSTANCE_MEMBER_REFERENCE:
-      SemanticTokenTypes.variable,
+      CustomSemanticTokenTypes.source,
   HighlightRegionType.VALID_STRING_ESCAPE: SemanticTokenTypes.string,
 };
 
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
index 256edee..b6d71a6 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/keyword_contributor.dart
@@ -11,6 +11,7 @@
 import 'package:analyzer/dart/ast/syntactic_entity.dart';
 import 'package:analyzer/dart/ast/token.dart';
 import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/src/dart/ast/extensions.dart';
 import 'package:analyzer/src/dart/ast/token.dart';
 import 'package:analyzer_plugin/src/utilities/completion/optype.dart';
 
@@ -217,7 +218,6 @@
     }
     if (entity == null || entity is Declaration) {
       if (previousMember is FunctionDeclaration &&
-          previousMember.functionExpression is FunctionExpression &&
           previousMember.functionExpression.body.isEmpty) {
         _addSuggestion(Keyword.ASYNC);
         _addSuggestion2(ASYNC_STAR);
@@ -353,12 +353,52 @@
       _addSuggestion(Keyword.THIS);
     }
     final entity = this.entity;
-    if (entity is Token && entity.type == TokenType.CLOSE_PAREN) {
-      _addSuggestion(Keyword.COVARIANT);
-      _addSuggestion(Keyword.DYNAMIC);
-      _addSuggestion(Keyword.VOID);
-      if (request.featureSet.isEnabled(Feature.non_nullable)) {
-        _addSuggestion(Keyword.REQUIRED);
+    if (entity is Token) {
+      FormalParameter? lastParameter() {
+        var parameters = node.parameters;
+        if (parameters.isNotEmpty) {
+          return parameters.last.notDefault;
+        }
+        return null;
+      }
+
+      bool hasCovariant() {
+        var last = lastParameter();
+        return last != null &&
+            (last.covariantKeyword != null ||
+                last.identifier?.name == 'covariant');
+      }
+
+      bool hasRequired() {
+        var last = lastParameter();
+        return last != null &&
+            (last.requiredKeyword != null ||
+                last.identifier?.name == 'required');
+      }
+
+      var tokenType = entity.type;
+      if (tokenType == TokenType.CLOSE_PAREN) {
+        _addSuggestion(Keyword.DYNAMIC);
+        _addSuggestion(Keyword.VOID);
+        if (!hasCovariant()) {
+          _addSuggestion(Keyword.COVARIANT);
+        }
+      } else if (tokenType == TokenType.CLOSE_CURLY_BRACKET) {
+        _addSuggestion(Keyword.DYNAMIC);
+        _addSuggestion(Keyword.VOID);
+        if (!hasCovariant()) {
+          _addSuggestion(Keyword.COVARIANT);
+          if (request.featureSet.isEnabled(Feature.non_nullable) &&
+              !hasRequired()) {
+            _addSuggestion(Keyword.REQUIRED);
+          }
+        }
+      } else if (tokenType == TokenType.CLOSE_SQUARE_BRACKET) {
+        _addSuggestion(Keyword.DYNAMIC);
+        _addSuggestion(Keyword.VOID);
+        if (!hasCovariant()) {
+          _addSuggestion(Keyword.COVARIANT);
+        }
       }
     } else if (entity is FormalParameter) {
       var beginToken = entity.beginToken;
@@ -367,14 +407,18 @@
         _addSuggestion(Keyword.COVARIANT);
         _addSuggestion(Keyword.DYNAMIC);
         _addSuggestion(Keyword.VOID);
-        if (request.featureSet.isEnabled(Feature.non_nullable)) {
+        if (entity.isNamed &&
+            !entity.isRequired &&
+            request.featureSet.isEnabled(Feature.non_nullable)) {
           _addSuggestion(Keyword.REQUIRED);
         }
       } else if (entity is FunctionTypedFormalParameter) {
         _addSuggestion(Keyword.COVARIANT);
         _addSuggestion(Keyword.DYNAMIC);
         _addSuggestion(Keyword.VOID);
-        if (request.featureSet.isEnabled(Feature.non_nullable)) {
+        if (entity.isNamed &&
+            !entity.isRequired &&
+            request.featureSet.isEnabled(Feature.non_nullable)) {
           _addSuggestion(Keyword.REQUIRED);
         }
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
index e4b55f8..1e367b0 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/create_constructor.dart
@@ -6,7 +6,6 @@
 import 'package:analysis_server/src/services/correction/fix.dart';
 import 'package:analysis_server/src/services/correction/util.dart';
 import 'package:analyzer/dart/ast/ast.dart';
-import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer_plugin/utilities/change_builder/change_builder_core.dart';
 import 'package:analyzer_plugin/utilities/fixes/fixes.dart';
@@ -119,10 +118,6 @@
         !constructorElement.isSynthetic) {
       return;
     }
-    // prepare target
-    if (constructorElement.enclosingElement is! ClassElement) {
-      return;
-    }
 
     // prepare target ClassDeclaration
     var targetElement = constructorElement.enclosingElement;
diff --git a/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart b/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart
index 93fd327..7b1fbde 100644
--- a/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart
+++ b/pkg/analysis_server/lib/src/services/correction/dart/ignore_diagnostic.dart
@@ -58,7 +58,8 @@
       final prefix = insertDesc.prefix;
       final comment = '// $ignoreCommentType: $_code';
       final suffix = insertDesc.suffix;
-      builder.addSimpleInsertion(lineOffset, '$prefix$indent$comment\n$suffix');
+      builder.addSimpleInsertion(
+          lineOffset, '$prefix$indent$comment$eol$suffix');
     });
   }
 }
diff --git a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
index ed99582..1b5d9a5 100644
--- a/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
+++ b/pkg/analysis_server/test/lsp/semantic_tokens_test.dart
@@ -396,9 +396,15 @@
       _Token("'../file.dart'", SemanticTokenTypes.string),
       _Token('if', SemanticTokenTypes.keyword,
           [CustomSemanticTokenModifiers.control]),
+      _Token('dart', CustomSemanticTokenTypes.source),
+      _Token('library', CustomSemanticTokenTypes.source),
+      _Token('io', CustomSemanticTokenTypes.source),
       _Token("'file_io.dart'", SemanticTokenTypes.string),
       _Token('if', SemanticTokenTypes.keyword,
           [CustomSemanticTokenModifiers.control]),
+      _Token('dart', CustomSemanticTokenTypes.source),
+      _Token('library', CustomSemanticTokenTypes.source),
+      _Token('html', CustomSemanticTokenTypes.source),
       _Token("'file_html.dart'", SemanticTokenTypes.string),
       _Token('library', SemanticTokenTypes.keyword),
       _Token('foo', SemanticTokenTypes.namespace),
@@ -412,6 +418,26 @@
     expect(decoded, equals(expected));
   }
 
+  Future<void> test_extension() async {
+    final content = '''
+    extension A on String {}
+    ''';
+
+    final expected = [
+      _Token('extension', SemanticTokenTypes.keyword),
+      _Token('A', SemanticTokenTypes.class_),
+      _Token('on', SemanticTokenTypes.keyword),
+      _Token('String', SemanticTokenTypes.class_)
+    ];
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+
+    final tokens = await getSemanticTokens(mainFileUri);
+    final decoded = decodeSemanticTokens(content, tokens);
+    expect(decoded, equals(expected));
+  }
+
   Future<void> test_fromPlugin() async {
     final pluginAnalyzedFilePath = join(projectFolderPath, 'lib', 'foo.foo');
     final pluginAnalyzedFileUri = Uri.file(pluginAnalyzedFilePath);
@@ -1002,6 +1028,48 @@
     final decoded = decodeSemanticTokens(content, tokens);
     expect(decoded, equals(expected));
   }
+
+  Future<void> test_unresolvedOrInvalid() async {
+    // Unresolved/invalid names should be marked as "source", which is used to
+    // mark up code the server thinks should be uncolored (without this, a
+    // clients other grammars would show through, losing the benefit from having
+    // resolved the code).
+    final content = '''
+    main() {
+      int a;
+      a.foo().bar.baz();
+
+      dynamic b;
+      b.foo().bar.baz();
+    }
+    ''';
+
+    final expected = [
+      _Token('main', SemanticTokenTypes.function,
+          [SemanticTokenModifiers.declaration, SemanticTokenModifiers.static]),
+      _Token('int', SemanticTokenTypes.class_),
+      _Token('a', SemanticTokenTypes.variable,
+          [SemanticTokenModifiers.declaration]),
+      _Token('a', SemanticTokenTypes.variable),
+      _Token('foo', CustomSemanticTokenTypes.source),
+      _Token('bar', CustomSemanticTokenTypes.source),
+      _Token('baz', CustomSemanticTokenTypes.source),
+      _Token('dynamic', SemanticTokenTypes.type),
+      _Token('b', SemanticTokenTypes.variable,
+          [SemanticTokenModifiers.declaration]),
+      _Token('b', SemanticTokenTypes.variable),
+      _Token('foo', CustomSemanticTokenTypes.source),
+      _Token('bar', CustomSemanticTokenTypes.source),
+      _Token('baz', CustomSemanticTokenTypes.source),
+    ];
+
+    await initialize();
+    await openFile(mainFileUri, withoutMarkers(content));
+
+    final tokens = await getSemanticTokens(mainFileUri);
+    final decoded = decodeSemanticTokens(content, tokens);
+    expect(decoded, equals(expected));
+  }
 }
 
 class _Token {
diff --git a/pkg/analysis_server/test/lsp/server_abstract.dart b/pkg/analysis_server/test/lsp/server_abstract.dart
index 78b1ba8..721ab0f 100644
--- a/pkg/analysis_server/test/lsp/server_abstract.dart
+++ b/pkg/analysis_server/test/lsp/server_abstract.dart
@@ -827,11 +827,7 @@
     final path = Uri.parse(edit.textDocument.uri).toFilePath();
     final expectedVersion = expectedVersions[path];
 
-    if (edit.textDocument is OptionalVersionedTextDocumentIdentifier) {
-      expect(edit.textDocument.version, equals(expectedVersion));
-    } else {
-      throw 'Document identifier for $path was not versioned (expected version $expectedVersion)';
-    }
+    expect(edit.textDocument.version, equals(expectedVersion));
   }
 
   /// Validates the document versions for a set of edits match the versions in
diff --git a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
index 6792f3e..b8d35f4 100644
--- a/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/keyword_contributor_test.dart
@@ -75,12 +75,8 @@
       Keyword.COVARIANT,
       Keyword.DYNAMIC,
       Keyword.THIS,
-      Keyword.DYNAMIC,
       Keyword.VOID
     ];
-    if (isEnabled(ExperimentalFeatures.non_nullable)) {
-      keywords.add(Keyword.REQUIRED);
-    }
     return keywords;
   }
 
@@ -175,9 +171,6 @@
 
   List<Keyword> get methodParameter {
     var keywords = <Keyword>[Keyword.COVARIANT, Keyword.DYNAMIC, Keyword.VOID];
-    if (isEnabled(ExperimentalFeatures.non_nullable)) {
-      keywords.add(Keyword.REQUIRED);
-    }
     return keywords;
   }
 
diff --git a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
index 0bcf127..f8171dc 100644
--- a/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
+++ b/pkg/analysis_server/test/src/services/completion/dart/completion_test.dart
@@ -15,6 +15,7 @@
     defineReflectiveTests(ConstructorCompletionTest);
     defineReflectiveTests(ExpressionFunctionBodyCompletionTest);
     defineReflectiveTests(ExtensionCompletionTest);
+    defineReflectiveTests(FormalParameterCompletionTest);
     defineReflectiveTests(GenericTypeAliasCompletionTest);
     defineReflectiveTests(PropertyAccessCompletionTest);
     defineReflectiveTests(RedirectedConstructorCompletionTest);
@@ -295,6 +296,86 @@
 }
 
 @reflectiveTest
+class FormalParameterCompletionTest extends CompletionTestCase {
+  Future<void> test_named_last() async {
+    addTestFile('''
+void f({int? a, ^}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('covariant');
+    assertHasCompletion('dynamic');
+    assertHasCompletion('required');
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_named_last_afterCovariant() async {
+    addTestFile('''
+void f({covariant ^}) {}
+''');
+    await getSuggestions();
+    assertHasNoCompletion('covariant');
+    assertHasCompletion('dynamic');
+    assertHasNoCompletion('required');
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_named_last_afterRequired() async {
+    addTestFile('''
+void f({required ^}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('covariant');
+    assertHasCompletion('dynamic');
+    assertHasNoCompletion('required');
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_named_only() async {
+    addTestFile('''
+void f({^}) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('covariant');
+    assertHasCompletion('dynamic');
+    assertHasCompletion('required');
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_optionalPositional_last() async {
+    addTestFile('''
+void f([int a, ^]) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('covariant');
+    assertHasCompletion('dynamic');
+    assertHasNoCompletion('required');
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_optionalPositional_only() async {
+    addTestFile('''
+void f([^]) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('covariant');
+    assertHasCompletion('dynamic');
+    assertHasNoCompletion('required');
+    assertHasCompletion('void');
+  }
+
+  Future<void> test_requiredPositional_only() async {
+    addTestFile('''
+void f(^) {}
+''');
+    await getSuggestions();
+    assertHasCompletion('covariant');
+    assertHasCompletion('dynamic');
+    assertHasNoCompletion('required');
+    assertHasCompletion('void');
+  }
+}
+
+@reflectiveTest
 class GenericTypeAliasCompletionTest extends CompletionTestCase {
   Future<void> test_returnType_void() async {
     addTestFile('''
diff --git a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
index fd320f2..0d952a4 100644
--- a/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
+++ b/pkg/analysis_server/test/src/services/correction/fix/fix_processor.dart
@@ -182,7 +182,7 @@
 
   Future<void> addUnimportedFile(String filePath, String content) async {
     addSource(filePath, content);
-    var result = await session.getResolvedUnit2(filePath);
+    var result = await session.getResolvedUnit2(convertPath(filePath));
     extensionCache.cacheFromResult(result as ResolvedUnitResult);
   }
 
diff --git a/pkg/analyzer/lib/dart/analysis/features.dart b/pkg/analyzer/lib/dart/analysis/features.dart
index d03e08c..a2ca408 100644
--- a/pkg/analyzer/lib/dart/analysis/features.dart
+++ b/pkg/analyzer/lib/dart/analysis/features.dart
@@ -26,6 +26,9 @@
   /// Feature information for extension methods.
   static final extension_methods = ExperimentalFeatures.extension_methods;
 
+  /// Feature information for extension types.
+  static final extension_types = ExperimentalFeatures.extension_types;
+
   /// Feature information for generic metadata.
   static final generic_metadata = ExperimentalFeatures.generic_metadata;
 
diff --git a/pkg/analyzer/lib/error/listener.dart b/pkg/analyzer/lib/error/listener.dart
index 5bcacde..af873be 100644
--- a/pkg/analyzer/lib/error/listener.dart
+++ b/pkg/analyzer/lib/error/listener.dart
@@ -190,9 +190,7 @@
     for (List<_TypeToConvert> typeGroup in typeGroups.values) {
       if (typeGroup.length == 1) {
         _TypeToConvert typeToConvert = typeGroup[0];
-        if (typeToConvert.type is DartType) {
-          arguments[typeToConvert.index] = typeToConvert.displayName;
-        }
+        arguments[typeToConvert.index] = typeToConvert.displayName;
       } else {
         Map<String, Set<Element>> nameToElementMap = {};
         for (_TypeToConvert typeToConvert in typeGroup) {
diff --git a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
index f4555e0..c1dfa14 100644
--- a/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/context_locator.dart
@@ -432,31 +432,28 @@
                 root.workspace.createSourceFactory(null, null))
             .getOptionsFromFile(optionsFile);
 
-        if (doc is YamlMap) {
-          var analyzerOptions = doc.valueAt(AnalyzerOptions.analyzer);
-          if (analyzerOptions is YamlMap) {
-            var excludeOptions =
-                analyzerOptions.valueAt(AnalyzerOptions.exclude);
-            if (excludeOptions is YamlList) {
-              var pathContext = resourceProvider.pathContext;
+        var analyzerOptions = doc.valueAt(AnalyzerOptions.analyzer);
+        if (analyzerOptions is YamlMap) {
+          var excludeOptions = analyzerOptions.valueAt(AnalyzerOptions.exclude);
+          if (excludeOptions is YamlList) {
+            var pathContext = resourceProvider.pathContext;
 
-              void addGlob(List<String> components) {
-                var pattern = posix.joinAll(components);
-                patterns.add(Glob(pattern, context: pathContext));
+            void addGlob(List<String> components) {
+              var pattern = posix.joinAll(components);
+              patterns.add(Glob(pattern, context: pathContext));
+            }
+
+            for (String excludedPath in excludeOptions.whereType<String>()) {
+              var excludedComponents = posix.split(excludedPath);
+              if (pathContext.isRelative(excludedPath)) {
+                excludedComponents = [
+                  ...pathContext.split(optionsFile.parent2.path),
+                  ...excludedComponents,
+                ];
               }
-
-              for (String excludedPath in excludeOptions.whereType<String>()) {
-                var excludedComponents = posix.split(excludedPath);
-                if (pathContext.isRelative(excludedPath)) {
-                  excludedComponents = [
-                    ...pathContext.split(optionsFile.parent2.path),
-                    ...excludedComponents,
-                  ];
-                }
-                addGlob(excludedComponents);
-                if (excludedComponents.last == '**') {
-                  addGlob(excludedComponents..removeLast());
-                }
+              addGlob(excludedComponents);
+              if (excludedComponents.last == '**') {
+                addGlob(excludedComponents..removeLast());
               }
             }
           }
diff --git a/pkg/analyzer/lib/src/dart/analysis/index.dart b/pkg/analyzer/lib/src/dart/analysis/index.dart
index e728899..140a1a7 100644
--- a/pkg/analyzer/lib/src/dart/analysis/index.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/index.dart
@@ -752,7 +752,7 @@
     }
 
     Element? element = node.writeOrReadElement;
-    if (node is SimpleIdentifier && element is ParameterElement) {
+    if (element is ParameterElement) {
       element = declaredParameterElement(node, element);
     }
 
@@ -911,7 +911,7 @@
     var seenConstructors = <ConstructorElement?>{};
     while (constructor is ConstructorElementImpl && constructor.isSynthetic) {
       var enclosing = constructor.enclosingElement;
-      if (enclosing is ClassElement && enclosing.isMixinApplication) {
+      if (enclosing.isMixinApplication) {
         var superInvocation = constructor.constantInitializers
             .whereType<SuperConstructorInvocation>()
             .singleOrNull;
diff --git a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
index 3cb56a5..e10f9be 100644
--- a/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
+++ b/pkg/analyzer/lib/src/dart/analysis/library_analyzer.dart
@@ -676,7 +676,11 @@
         errorListener: errorListener,
         featureSet: unit.featureSet,
         nameScope: _libraryElement.scope,
-        elementWalker: ElementWalker.forCompilationUnit(unitElement),
+        elementWalker: ElementWalker.forCompilationUnit(
+          unitElement,
+          libraryFilePath: _library.path,
+          unitFilePath: file.path,
+        ),
       ),
     );
 
diff --git a/pkg/analyzer/lib/src/dart/ast/ast.dart b/pkg/analyzer/lib/src/dart/ast/ast.dart
index 6d16a45..3bc2bc1 100644
--- a/pkg/analyzer/lib/src/dart/ast/ast.dart
+++ b/pkg/analyzer/lib/src/dart/ast/ast.dart
@@ -118,10 +118,11 @@
 
   @override
   List<AstNode> get sortedCommentAndAnnotations {
-    return <AstNode>[]
-      ..add(_comment!)
-      ..addAll(_metadata)
-      ..sort(AstNode.LEXICAL_ORDER);
+    var comment = _comment;
+    return <AstNode>[
+      if (comment != null) comment,
+      ..._metadata,
+    ]..sort(AstNode.LEXICAL_ORDER);
   }
 
   /// Return a holder of child entities that subclasses can add to.
@@ -7713,10 +7714,11 @@
 
   @override
   List<AstNode> get sortedCommentAndAnnotations {
-    return <AstNode>[]
-      ..add(_comment!)
-      ..addAll(_metadata)
-      ..sort(AstNode.LEXICAL_ORDER);
+    var comment = _comment;
+    return <AstNode>[
+      if (comment != null) comment,
+      ..._metadata,
+    ]..sort(AstNode.LEXICAL_ORDER);
   }
 
   ChildEntities get _childEntities {
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
index 68ce3c5..dfad758 100644
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart
@@ -209,8 +209,7 @@
     } else if (constant is ElementAnnotationImpl) {
       var constNode = constant.annotationAst;
       var element = constant.element;
-      if (element is PropertyAccessorElement &&
-          element.variable is VariableElement) {
+      if (element is PropertyAccessorElement) {
         // The annotation is a reference to a compile-time constant variable.
         // Just copy the evaluation result.
         VariableElementImpl variableElement =
@@ -335,8 +334,7 @@
     } else if (constant is ElementAnnotationImpl) {
       Annotation constNode = constant.annotationAst;
       var element = constant.element;
-      if (element is PropertyAccessorElement &&
-          element.variable is VariableElement) {
+      if (element is PropertyAccessorElement) {
         // The annotation is a reference to a compile-time constant variable,
         // so it depends on the variable.
         callback(element.variable.declaration);
diff --git a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
index 2b9d8a0..df0e9e2 100644
--- a/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
+++ b/pkg/analyzer/lib/src/dart/element/least_upper_bound.dart
@@ -206,11 +206,7 @@
         if (parameterVariance.isCovariant) {
           args.add(typeSystem.getLeastUpperBound(args1[i], args2[i]));
         } else if (parameterVariance.isContravariant) {
-          if (typeSystem is TypeSystemImpl) {
-            args.add(typeSystem.getGreatestLowerBound(args1[i], args2[i]));
-          } else {
-            args.add(typeSystem.getLeastUpperBound(args1[i], args2[i]));
-          }
+          args.add(typeSystem.getGreatestLowerBound(args1[i], args2[i]));
         } else if (parameterVariance.isInvariant) {
           if (!typeSystem.isSubtypeOf(args1[i], args2[i]) ||
               !typeSystem.isSubtypeOf(args2[i], args1[i])) {
diff --git a/pkg/analyzer/lib/src/dart/error/hint_codes.dart b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
index 0534495..14038d6 100644
--- a/pkg/analyzer/lib/src/dart/error/hint_codes.dart
+++ b/pkg/analyzer/lib/src/dart/error/hint_codes.dart
@@ -2342,7 +2342,7 @@
   // this diagnostic:
   //
   // ```dart
-  // const x = 4;
+  // const Object x = 4;
   // const y = [!x is int!] ? 0 : 1;
   // ```
   //
@@ -2362,7 +2362,7 @@
   // [constant context][]:
   //
   // ```dart
-  // const x = 4;
+  // const Object x = 4;
   // var y = x is int ? 0 : 1;
   // ```
   static const HintCode SDK_VERSION_IS_EXPRESSION_IN_CONST_CONTEXT = HintCode(
diff --git a/pkg/analyzer/lib/src/error/assignment_verifier.dart b/pkg/analyzer/lib/src/error/assignment_verifier.dart
index 4b64931..a995629 100644
--- a/pkg/analyzer/lib/src/error/assignment_verifier.dart
+++ b/pkg/analyzer/lib/src/error/assignment_verifier.dart
@@ -102,7 +102,7 @@
       }
     } else if (recovery is MultiplyDefinedElementImpl) {
       // Will be reported in ErrorVerifier.
-    } else if (node is SimpleIdentifier) {
+    } else {
       if (node.isSynthetic) {
         return;
       }
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
index cebd550..ff183f5 100644
--- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -174,10 +174,8 @@
     } else if (node is MethodInvocation &&
         displayName == FunctionElement.CALL_METHOD_NAME) {
       var invokeType = node.staticInvokeType as InterfaceType;
-      if (invokeType is InterfaceType) {
-        var invokeClass = invokeType.element;
-        displayName = "${invokeClass.name}.${element.displayName}";
-      }
+      var invokeClass = invokeType.element;
+      displayName = "${invokeClass.name}.${element.displayName}";
     }
     var library = element is LibraryElement ? element : element.library;
     var message = _deprecatedMessage(element);
diff --git a/pkg/analyzer/lib/src/fasta/ast_builder.dart b/pkg/analyzer/lib/src/fasta/ast_builder.dart
index 88a50ee..498b57b 100644
--- a/pkg/analyzer/lib/src/fasta/ast_builder.dart
+++ b/pkg/analyzer/lib/src/fasta/ast_builder.dart
@@ -143,6 +143,9 @@
   /// `true` if constructor tearoffs are enabled
   final bool enableConstructorTearoffs;
 
+  /// `true` if extension types are enabled;
+  final bool enableExtensionTypes;
+
   final FeatureSet _featureSet;
 
   AstBuilder(ErrorReporter errorReporter, this.fileUri, this.isFullAst,
@@ -160,6 +163,7 @@
         enableVariance = _featureSet.isEnabled(Feature.variance),
         enableConstructorTearoffs =
             _featureSet.isEnabled(Feature.constructor_tearoffs),
+        enableExtensionTypes = _featureSet.isEnabled(Feature.extension_types),
         uri = uri ?? fileUri;
 
   NodeList<ClassMember> get currentDeclarationMembers {
@@ -1189,8 +1193,8 @@
   @override
   void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
       Token onKeyword, Token token) {
-    if (typeKeyword != null && !enableConstructorTearoffs) {
-      var feature = ExperimentalFeatures.constructor_tearoffs;
+    if (typeKeyword != null && !enableExtensionTypes) {
+      var feature = ExperimentalFeatures.extension_types;
       handleRecoverableError(
           templateExperimentNotEnabled.withArguments(
             feature.enableString,
@@ -3031,9 +3035,7 @@
 
       List<Expression> expressions = <Expression>[];
       for (var elem in elements) {
-        if (elem is Expression) {
-          expressions.add(elem);
-        }
+        expressions.add(elem);
       }
 
       push(ast.listLiteral(
diff --git a/pkg/analyzer/lib/src/generated/declaration_resolver.dart b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
index a654bc8..611c2c0 100644
--- a/pkg/analyzer/lib/src/generated/declaration_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/declaration_resolver.dart
@@ -10,6 +10,8 @@
 class ElementWalker {
   /// The element whose child elements are being walked.
   final Element element;
+  String? libraryFilePath;
+  String? unitFilePath;
 
   List<PropertyAccessorElement>? _accessors;
   int _accessorIndex = 0;
@@ -48,7 +50,8 @@
 
   /// Creates an [ElementWalker] which walks the child elements of a compilation
   /// unit element.
-  ElementWalker.forCompilationUnit(CompilationUnitElement element)
+  ElementWalker.forCompilationUnit(CompilationUnitElement element,
+      {this.libraryFilePath, this.unitFilePath})
       : element = element,
         _accessors = element.accessors.where(_isNotSynthetic).toList(),
         _classes = element.classes,
@@ -119,7 +122,22 @@
 
   /// Returns the next non-synthetic child of [element] which is a class; throws
   /// an [IndexError] if there are no more.
-  ClassElementImpl getClass() => _classes![_classIndex++] as ClassElementImpl;
+  ClassElementImpl getClass() {
+    // TODO(scheglov) Remove after fixing.
+    // https://github.com/dart-lang/sdk/issues/46392
+    var classes = _classes;
+    if (classes != null && _classIndex >= classes.length) {
+      throw StateError(
+        '[_classIndex: $_classIndex]'
+        '[classes.length: ${classes.length}]'
+        '[classes: $classes]'
+        '[element.source: ${element.source?.fullName}]'
+        '[libraryFilePath: $libraryFilePath]'
+        '[unitFilePath: $unitFilePath]',
+      );
+    }
+    return _classes![_classIndex++] as ClassElementImpl;
+  }
 
   /// Returns the next non-synthetic child of [element] which is a constructor;
   /// throws an [IndexError] if there are no more.
diff --git a/pkg/analyzer/lib/src/generated/element_resolver.dart b/pkg/analyzer/lib/src/generated/element_resolver.dart
index 69bdf31..cc5fc13 100644
--- a/pkg/analyzer/lib/src/generated/element_resolver.dart
+++ b/pkg/analyzer/lib/src/generated/element_resolver.dart
@@ -190,6 +190,10 @@
               prefixElement.getGetter(name.name) ??
               prefixElement.getSetter(name.name) ??
               prefixElement.getNamedConstructor(name.name);
+        } else if (prefixElement is ExtensionElement) {
+          name.staticElement = prefixElement.getMethod(name.name) ??
+              prefixElement.getGetter(name.name) ??
+              prefixElement.getSetter(name.name);
         } else {
           // TODO(brianwilkerson) Report this error.
         }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index cf4ecd8..ff28b32 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -1500,24 +1500,16 @@
     if (expression is! SimpleIdentifier) return;
 
     // Already handled in the assignment resolver.
-    if (expression is SimpleIdentifier &&
-        expression.parent is AssignmentExpression) {
+    if (expression.parent is AssignmentExpression) {
       return;
     }
 
     // prepare element
-    Element? element;
-    AstNode highlightedNode = expression;
-    if (expression is Identifier) {
-      element = expression.staticElement;
-      if (expression is PrefixedIdentifier) {
-        var prefixedIdentifier = expression as PrefixedIdentifier;
-        highlightedNode = prefixedIdentifier.identifier;
-      }
-    } else if (expression is PropertyAccess) {
-      var propertyAccess = expression as PropertyAccess;
-      element = propertyAccess.propertyName.staticElement;
-      highlightedNode = propertyAccess.propertyName;
+    var highlightedNode = expression;
+    var element = expression.staticElement;
+    if (expression is PrefixedIdentifier) {
+      var prefixedIdentifier = expression as PrefixedIdentifier;
+      highlightedNode = prefixedIdentifier.identifier;
     }
     // check if element is assignable
     if (element is VariableElement) {
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
index 098b70f..9a9dd13 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_reader.dart
@@ -18,6 +18,7 @@
 import 'package:analyzer/src/summary2/ast_binary_tag.dart';
 import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
 import 'package:analyzer/src/summary2/bundle_reader.dart';
+import 'package:analyzer/src/summary2/not_serializable_nodes.dart';
 import 'package:analyzer/src/summary2/unlinked_token_type.dart';
 import 'package:collection/collection.dart';
 
@@ -80,7 +81,7 @@
         return _readFieldFormalParameter();
       case Tag.FormalParameterList:
         return _readFormalParameterList();
-      case Tag.FunctionExpression:
+      case Tag.FunctionExpressionStub:
         return _readFunctionExpression();
       case Tag.FunctionExpressionInvocation:
         return _readFunctionExpressionInvocation();
@@ -182,24 +183,6 @@
     return node;
   }
 
-  FunctionBody _functionBodyForFlags(int flags) {
-    if (AstBinaryFlags.isNative(flags)) {
-      return AstTestFactory.nativeFunctionBody('');
-    } else if (AstBinaryFlags.isAbstract(flags)) {
-      return AstTestFactory.emptyFunctionBody();
-    } else {
-      return astFactory.blockFunctionBody(
-        AstBinaryFlags.isAsync(flags) ? Tokens.async_() : null,
-        AstBinaryFlags.isGenerator(flags) ? Tokens.star() : null,
-        astFactory.block(
-          Tokens.openCurlyBracket(),
-          const <Statement>[],
-          Tokens.closeCurlyBracket(),
-        ),
-      );
-    }
-  }
-
   AdjacentStrings _readAdjacentStrings() {
     var components = _readNodeList<StringLiteral>();
     var node = astFactory.adjacentStrings(components);
@@ -556,16 +539,7 @@
   }
 
   FunctionExpression _readFunctionExpression() {
-    var flags = _readByte();
-    var typeParameters = _readOptionalNode() as TypeParameterList?;
-    var formalParameters = _readOptionalNode() as FormalParameterList?;
-    var body = _functionBodyForFlags(flags);
-
-    return astFactory.functionExpression(
-      typeParameters,
-      formalParameters,
-      body,
-    );
+    return emptyFunctionExpression();
   }
 
   FunctionExpressionInvocation _readFunctionExpressionInvocation() {
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
index b4e509c..deb6b47 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_tag.dart
@@ -47,7 +47,7 @@
   static const int FormalParameterList = 17;
   static const int FunctionDeclaration_getter = 57;
   static const int FunctionDeclaration_setter = 58;
-  static const int FunctionExpression = 19;
+  static const int FunctionExpressionStub = 19;
   static const int FunctionExpressionInvocation = 93;
   static const int FunctionTypedFormalParameter = 20;
   static const int GenericFunctionType = 21;
diff --git a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
index 45e78a4..e5dca3f 100644
--- a/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/ast_binary_writer.dart
@@ -294,7 +294,7 @@
 
   @override
   void visitFunctionExpression(FunctionExpression node) {
-    _writeNotSerializableExpression();
+    _writeByte(Tag.FunctionExpressionStub);
   }
 
   @override
diff --git a/pkg/analyzer/lib/src/summary2/detach_nodes.dart b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
index 3f93f01..7f375e4 100644
--- a/pkg/analyzer/lib/src/summary2/detach_nodes.dart
+++ b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
@@ -7,6 +7,7 @@
 import 'package:analyzer/dart/element/visitor.dart';
 import 'package:analyzer/src/dart/ast/ast.dart';
 import 'package:analyzer/src/dart/element/element.dart';
+import 'package:analyzer/src/summary2/not_serializable_nodes.dart';
 
 /// Elements have references to AST nodes, for example initializers of constant
 /// variables. These nodes are attached to the whole compilation unit, and
@@ -64,6 +65,10 @@
       var initializer = element.constantInitializer;
       if (initializer is ExpressionImpl) {
         _detachNode(initializer);
+
+        initializer = replaceNotSerializableNodes(initializer);
+        element.constantInitializer = initializer;
+
         ConstantContextForExpressionImpl(initializer);
       }
     }
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 9b1bcc9..1dd1e5f 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -1734,6 +1734,18 @@
   }
 
   @override
+  void visitFunctionExpression(FunctionExpression node) {
+    // We store FunctionExpression(s) as empty stubs: `() {}`.
+    // We just need it to have right code range, so we apply 2 offsets.
+    node.parameters?.leftParenthesis.offset = _iterator.take() ?? 0;
+
+    var body = node.body;
+    if (body is BlockFunctionBody) {
+      body.block.rightBracket.offset = _iterator.take() ?? 0;
+    }
+  }
+
+  @override
   void visitSimpleFormalParameter(SimpleFormalParameter node) {
     super.visitSimpleFormalParameter(node);
 
@@ -1819,6 +1831,13 @@
   }
 
   @override
+  void visitFormalParameterList(FormalParameterList node) {
+    _tokenOrNull(node.leftParenthesis);
+    _tokenOrNull(node.rightParenthesis);
+    super.visitFormalParameterList(node);
+  }
+
+  @override
   void visitGenericFunctionType(GenericFunctionType node) {
     _tokenOrNull(node.functionKeyword);
     super.visitGenericFunctionType(node);
@@ -2004,6 +2023,12 @@
   void handleToken(Token token) {
     offsets.add(token.offset);
   }
+
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    offsets.add(node.offset);
+    offsets.add(node.end - 1);
+  }
 }
 
 class _SafeListIterator<T> {
diff --git a/pkg/analyzer/lib/src/summary2/not_serializable_nodes.dart b/pkg/analyzer/lib/src/summary2/not_serializable_nodes.dart
new file mode 100644
index 0000000..95e3adf
--- /dev/null
+++ b/pkg/analyzer/lib/src/summary2/not_serializable_nodes.dart
@@ -0,0 +1,62 @@
+// Copyright (c) 2021, the Dart project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:analyzer/dart/ast/ast.dart';
+import 'package:analyzer/dart/ast/visitor.dart';
+import 'package:analyzer/src/dart/ast/ast.dart';
+import 'package:analyzer/src/dart/ast/ast_factory.dart';
+import 'package:analyzer/src/dart/ast/utilities.dart';
+import 'package:analyzer/src/summary2/ast_binary_tokens.dart';
+
+FunctionExpressionImpl emptyFunctionExpression() {
+  return astFactory.functionExpression(
+    null,
+    astFactory.formalParameterList(
+      Tokens.openParenthesis(),
+      [],
+      null,
+      null,
+      Tokens.closeParenthesis(),
+    ),
+    astFactory.blockFunctionBody(
+      null,
+      null,
+      astFactory.block(
+        Tokens.openCurlyBracket(),
+        [],
+        Tokens.closeCurlyBracket(),
+      ),
+    ),
+  );
+}
+
+/// We cannot serialize [FunctionExpression], but we need to have some node
+/// with the same source range for error reporting. So, we replace them with
+/// empty [FunctionExpression]s that have the same offset and length.
+ExpressionImpl replaceNotSerializableNodes(ExpressionImpl node) {
+  if (node is FunctionExpressionImpl) {
+    return FunctionExpressionReplacementVisitor._replacement(node);
+  }
+  node.accept(FunctionExpressionReplacementVisitor());
+  return node;
+}
+
+class FunctionExpressionReplacementVisitor extends RecursiveAstVisitor<void> {
+  @override
+  void visitFunctionExpression(FunctionExpression node) {
+    NodeReplacer.replace(node, _replacement(node));
+  }
+
+  static FunctionExpressionImpl _replacement(FunctionExpression from) {
+    var to = emptyFunctionExpression();
+    to.parameters?.leftParenthesis.offset = from.offset;
+
+    var toBody = to.body;
+    if (toBody is BlockFunctionBodyImpl) {
+      toBody.block.rightBracket.offset = from.end - 1;
+    }
+
+    return to;
+  }
+}
diff --git a/pkg/analyzer/lib/src/summary2/variance_builder.dart b/pkg/analyzer/lib/src/summary2/variance_builder.dart
index 8543179..c9017ca 100644
--- a/pkg/analyzer/lib/src/summary2/variance_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/variance_builder.dart
@@ -53,13 +53,10 @@
 
   Variance _compute(TypeParameterElement variable, DartType? type) {
     if (type is TypeParameterType) {
-      var element = type.element;
-      if (element is TypeParameterElement) {
-        if (element == variable) {
-          return Variance.covariant;
-        } else {
-          return Variance.unrelated;
-        }
+      if (type.element == variable) {
+        return Variance.covariant;
+      } else {
+        return Variance.unrelated;
       }
     } else if (type is NamedTypeBuilder) {
       var element = type.element;
diff --git a/pkg/analyzer/lib/src/test_utilities/find_node.dart b/pkg/analyzer/lib/src/test_utilities/find_node.dart
index 566e8d7..11c7031e 100644
--- a/pkg/analyzer/lib/src/test_utilities/find_node.dart
+++ b/pkg/analyzer/lib/src/test_utilities/find_node.dart
@@ -188,6 +188,10 @@
     return _node(search, (n) => n is IntegerLiteral);
   }
 
+  IsExpression isExpression(String search) {
+    return _node(search, (n) => n is IsExpression);
+  }
+
   Label label(String search) {
     return _node(search, (n) => n is Label);
   }
diff --git a/pkg/analyzer/test/dart/ast/ast_test.dart b/pkg/analyzer/test/dart/ast/ast_test.dart
index 5fcfbc6..e7da3d0 100644
--- a/pkg/analyzer/test/dart/ast/ast_test.dart
+++ b/pkg/analyzer/test/dart/ast/ast_test.dart
@@ -30,6 +30,7 @@
     defineReflectiveTests(MethodDeclarationTest);
     defineReflectiveTests(MethodInvocationTest);
     defineReflectiveTests(NodeListTest);
+    defineReflectiveTests(NormalFormalParameterTest);
     defineReflectiveTests(PreviousTokenTest);
     defineReflectiveTests(PropertyAccessTest);
     defineReflectiveTests(SimpleIdentifierTest);
@@ -918,6 +919,19 @@
 }
 
 @reflectiveTest
+class NormalFormalParameterTest extends ParserTestCase {
+  test_sortedCommentAndAnnotations_noComment() {
+    var result = parseString(content: '''
+void f(int i) {}
+''');
+    var function = result.unit.declarations[0] as FunctionDeclaration;
+    var parameters = function.functionExpression.parameters;
+    var parameter = parameters?.parameters[0] as NormalFormalParameter;
+    expect(parameter.sortedCommentAndAnnotations, isEmpty);
+  }
+}
+
+@reflectiveTest
 class PreviousTokenTest {
   static final String contents = '''
 class A {
@@ -1721,6 +1735,15 @@
     decl.documentationComment = comment;
     expect(decl.documentationComment, isNotNull);
   }
+
+  test_sortedCommentAndAnnotations_noComment() {
+    var result = parseString(content: '''
+int i = 0;
+''');
+    var variables = result.unit.declarations[0] as TopLevelVariableDeclaration;
+    var variable = variables.variables.variables[0];
+    expect(variable.sortedCommentAndAnnotations, isEmpty);
+  }
 }
 
 class _AssignmentKind {
diff --git a/pkg/analyzer/test/generated/non_error_resolver_test.dart b/pkg/analyzer/test/generated/non_error_resolver_test.dart
index 3b69c9b8..ba86bc2 100644
--- a/pkg/analyzer/test/generated/non_error_resolver_test.dart
+++ b/pkg/analyzer/test/generated/non_error_resolver_test.dart
@@ -23,6 +23,7 @@
 class NonConstantValueInInitializer extends PubPackageResolutionTest {
   test_intLiteralInDoubleContext_const_exact() async {
     await assertNoErrorsInCode(r'''
+// @dart = 2.9
 const double x = 0;
 class C {
   const C(double y) : assert(y is double), assert(x is double);
@@ -42,6 +43,7 @@
 
   test_isCheckInConstAssert() async {
     await assertNoErrorsInCode(r'''
+// @dart = 2.9
 class C {
   const C() : assert(1 is int);
 }
@@ -1376,6 +1378,7 @@
 
   test_genericTypeAlias_castsAndTypeChecks_hasTypeParameters() async {
     await assertNoErrorsInCode('''
+// @dart = 2.9
 typedef Foo<S> = S Function<T>(T x);
 
 main(Object p) {
@@ -1393,6 +1396,7 @@
 
   test_genericTypeAlias_castsAndTypeChecks_noTypeParameters() async {
     await assertNoErrorsInCode('''
+// @dart = 2.9
 typedef Foo = T Function<T>(T x);
 
 main(Object p) {
@@ -3084,6 +3088,7 @@
 
   test_typePromotion_if_is_and_subThenSuper() async {
     await assertNoErrorsInCode(r'''
+// @dart = 2.9
 class A {
   var a;
 }
diff --git a/pkg/analyzer/test/generated/resolver_test_case.dart b/pkg/analyzer/test/generated/resolver_test_case.dart
index e4b62f1..385bb7d 100644
--- a/pkg/analyzer/test/generated/resolver_test_case.dart
+++ b/pkg/analyzer/test/generated/resolver_test_case.dart
@@ -60,8 +60,6 @@
       if (_knownExceptions == null || !_knownExceptions!.contains(node)) {
         _unresolvedNodes.add(node);
       }
-    } else if (elementAnnotation is! ElementAnnotation) {
-      _wrongTypedNodes.add(node);
     }
   }
 
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index 981d29c..6000f44 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -311,6 +311,57 @@
 class C {}''');
   }
 
+  test_commentReference_extension_getter() async {
+    await resolveTestCode('''
+/// See [E.b]
+class A {}
+
+extension E on A {
+  String get b => '';
+}
+''');
+
+    final classA = findNode.classDeclaration('class A');
+    final reference = classA.documentationComment!.references.single;
+
+    expect(
+        reference.identifier.staticElement, findElement.getter('b', of: 'E'));
+  }
+
+  test_commentReference_extension_method() async {
+    await resolveTestCode('''
+/// See [E.b]
+class A {}
+
+extension E on A {
+  void b() {}
+}
+''');
+
+    final classA = findNode.classDeclaration('class A');
+    final reference = classA.documentationComment!.references.single;
+
+    expect(
+        reference.identifier.staticElement, findElement.method('b', of: 'E'));
+  }
+
+  test_commentReference_extension_setter() async {
+    await resolveTestCode('''
+/// See [E.b]
+class A {}
+
+extension E on A {
+  set b(String x) {}
+}
+''');
+
+    final classA = findNode.classDeclaration('class A');
+    final reference = classA.documentationComment!.references.single;
+
+    expect(
+        reference.identifier.staticElement, findElement.setter('b', of: 'E'));
+  }
+
   test_continueTarget_labeled() async {
     // Verify that the target of the label is correctly found and is recorded
     // as the unlabeled portion of the statement.
diff --git a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
index 62bdd51..5853f91 100644
--- a/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
+++ b/pkg/analyzer/test/src/dart/analysis/driver_resolution_test.dart
@@ -3798,72 +3798,42 @@
 
   test_isExpression() async {
     await assertNoErrorsInCode(r'''
-void main() {
-  var v = 42;
-  v is num;
+void f(var a) {
+  a is num;
 }
 ''');
 
-    List<Statement> statements = _getMainStatements(result);
+    var isExpression = findNode.isExpression('a is num');
+    expect(isExpression.notOperator, isNull);
+    expect(isExpression.staticType, typeProvider.boolType);
 
-    // var v = 42;
-    VariableElement vElement;
-    {
-      var statement = statements[0] as VariableDeclarationStatement;
-      vElement = statement.variables.variables[0].name.staticElement
-          as VariableElement;
-    }
+    var target = isExpression.expression as SimpleIdentifier;
+    expect(target.staticElement, findElement.parameter('a'));
+    expect(target.staticType, dynamicType);
 
-    // v is num;
-    {
-      var statement = statements[1] as ExpressionStatement;
-      var isExpression = statement.expression as IsExpression;
-      expect(isExpression.notOperator, isNull);
-      expect(isExpression.staticType, typeProvider.boolType);
-
-      var target = isExpression.expression as SimpleIdentifier;
-      expect(target.staticElement, vElement);
-      expect(target.staticType, typeProvider.intType);
-
-      var numName = isExpression.type as TypeName;
-      expect(numName.name.staticElement, typeProvider.numType.element);
-      expect(numName.name.staticType, isNull);
-    }
+    var numName = isExpression.type as TypeName;
+    expect(numName.name.staticElement, typeProvider.numType.element);
+    expect(numName.name.staticType, isNull);
   }
 
   test_isExpression_not() async {
     await assertNoErrorsInCode(r'''
-void main() {
-  var v = 42;
-  v is! num;
+void f(var a) {
+  a is! num;
 }
 ''');
 
-    List<Statement> statements = _getMainStatements(result);
+    var isExpression = findNode.isExpression('a is! num');
+    expect(isExpression.notOperator, isNotNull);
+    expect(isExpression.staticType, typeProvider.boolType);
 
-    // var v = 42;
-    VariableElement vElement;
-    {
-      var statement = statements[0] as VariableDeclarationStatement;
-      vElement = statement.variables.variables[0].name.staticElement
-          as VariableElement;
-    }
+    var target = isExpression.expression as SimpleIdentifier;
+    expect(target.staticElement, findElement.parameter('a'));
+    expect(target.staticType, dynamicType);
 
-    // v is! num;
-    {
-      var statement = statements[1] as ExpressionStatement;
-      var isExpression = statement.expression as IsExpression;
-      expect(isExpression.notOperator, isNotNull);
-      expect(isExpression.staticType, typeProvider.boolType);
-
-      var target = isExpression.expression as SimpleIdentifier;
-      expect(target.staticElement, vElement);
-      expect(target.staticType, typeProvider.intType);
-
-      var numName = isExpression.type as TypeName;
-      expect(numName.name.staticElement, typeProvider.numType.element);
-      expect(numName.name.staticType, isNull);
-    }
+    var numName = isExpression.type as TypeName;
+    expect(numName.name.staticElement, typeProvider.numType.element);
+    expect(numName.name.staticType, isNull);
   }
 
   test_label_while() async {
diff --git a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
index 17d8a68..857df32 100644
--- a/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
+++ b/pkg/analyzer/test/src/diagnostics/const_initialized_with_non_constant_value_test.dart
@@ -40,6 +40,15 @@
     ]);
   }
 
+  test_functionExpression() async {
+    await assertErrorsInCode('''
+const a = () {};
+''', [
+      error(CompileTimeErrorCode.CONST_INITIALIZED_WITH_NON_CONSTANT_VALUE, 10,
+          5),
+    ]);
+  }
+
   test_missingConstInListLiteral() async {
     await assertNoErrorsInCode('''
 const List L = [0];
diff --git a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
index b9c4e07..afbe147 100644
--- a/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
+++ b/pkg/analyzer/test/src/summary/resolved_ast_printer.dart
@@ -187,6 +187,8 @@
     _writeln('Block');
     _withIndent(() {
       var properties = _Properties();
+      properties.addToken('leftBracket', node.leftBracket);
+      properties.addToken('rightBracket', node.rightBracket);
       properties.addNodeList('statements', node.statements);
       _addStatement(properties, node);
       _writeProperties(properties);
@@ -578,6 +580,8 @@
     _writeln('FormalParameterList');
     _withIndent(() {
       var properties = _Properties();
+      properties.addToken('leftParenthesis', node.leftParenthesis);
+      properties.addToken('rightParenthesis', node.rightParenthesis);
       properties.addNodeList('parameters', node.parameters);
       _addAstNode(properties, node);
       _writeProperties(properties);
diff --git a/pkg/analyzer/test/src/summary/resynthesize_common.dart b/pkg/analyzer/test/src/summary/resynthesize_common.dart
index e33cc31..dc4d4cf 100644
--- a/pkg/analyzer/test/src/summary/resynthesize_common.dart
+++ b/pkg/analyzer/test/src/summary/resynthesize_common.dart
@@ -6555,6 +6555,68 @@
 ''');
   }
 
+  test_const_invalid_functionExpression() async {
+    var library = await checkLibrary('''
+const v = () { return 0; };
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    topLevelVariables
+      static const v @6
+        type: int Function()
+        constantInitializer
+          FunctionExpression
+            body: BlockFunctionBody
+              block: Block
+                leftBracket: { @0
+                rightBracket: } @25
+            declaredElement: <null>
+            parameters: FormalParameterList
+              leftParenthesis: ( @10
+              rightParenthesis: ) @0
+            staticType: null
+    accessors
+      synthetic static get v @-1
+        returnType: int Function()
+''');
+  }
+
+  test_const_invalid_functionExpression_nested() async {
+    var library = await checkLibrary('''
+const v = () { return 0; } + 2;
+''');
+    checkElementText(library, r'''
+library
+  definingUnit
+    topLevelVariables
+      static const v @6
+        type: dynamic
+        constantInitializer
+          BinaryExpression
+            leftOperand: FunctionExpression
+              body: BlockFunctionBody
+                block: Block
+                  leftBracket: { @0
+                  rightBracket: } @25
+              declaredElement: <null>
+              parameters: FormalParameterList
+                leftParenthesis: ( @10
+                rightParenthesis: ) @0
+              staticType: null
+            operator: + @27
+            rightOperand: IntegerLiteral
+              literal: 2 @29
+              staticType: int
+            staticElement: <null>
+            staticInvokeType: null
+            staticType: dynamic
+    accessors
+      synthetic static get v @-1
+        returnType: dynamic
+''');
+  }
+
   @FailingTest(issue: 'https://github.com/dart-lang/sdk/issues/44522')
   test_const_invalid_intLiteral() async {
     var library = await checkLibrary(r'''
@@ -8604,7 +8666,6 @@
 ''');
   }
 
-  /// TODO(scheglov) review location
   test_const_methodInvocation() async {
     var library = await checkLibrary(r'''
 T f<T>(T a) => a;
@@ -12162,6 +12223,8 @@
                                   type: dynamic Function()
                                 functionKeyword: Function @86
                                 parameters: FormalParameterList
+                                  leftParenthesis: ( @94
+                                  rightParenthesis: ) @95
                                 type: dynamic Function()
                             leftBracket: < @85
                             rightBracket: > @96
@@ -13690,6 +13753,8 @@
                                 type: dynamic Function()
                               functionKeyword: Function @61
                               parameters: FormalParameterList
+                                leftParenthesis: ( @69
+                                rightParenthesis: ) @70
                               type: dynamic Function()
                           leftBracket: < @60
                           rightBracket: > @71
@@ -15669,6 +15734,7 @@
                             type: int Function(double)
                           functionKeyword: Function @62
                           parameters: FormalParameterList
+                            leftParenthesis: ( @70
                             parameters
                               SimpleFormalParameter
                                 declaredElement: a@78
@@ -15683,6 +15749,7 @@
                                     staticType: null
                                     token: double @71
                                   type: double
+                            rightParenthesis: ) @79
                           returnType: TypeName
                             name: SimpleIdentifier
                               staticElement: dart:core::@class::int
@@ -17279,6 +17346,7 @@
                     type: int Function(String)
                   functionKeyword: Function @36
                   parameters: FormalParameterList
+                    leftParenthesis: ( @44
                     parameters
                       SimpleFormalParameter
                         declaredElement: a@52
@@ -17293,6 +17361,7 @@
                             staticType: null
                             token: String @45
                           type: String
+                    rightParenthesis: ) @53
                   returnType: TypeName
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
@@ -17353,6 +17422,7 @@
                     type: int Function(String)
                   functionKeyword: Function @36
                   parameters: FormalParameterList
+                    leftParenthesis: ( @44
                     parameters
                       SimpleFormalParameter
                         declaredElement: a@52
@@ -17367,6 +17437,7 @@
                             staticType: null
                             token: String @45
                           type: String
+                    rightParenthesis: ) @53
                   returnType: TypeName
                     name: SimpleIdentifier
                       staticElement: dart:core::@class::int
@@ -17436,6 +17507,7 @@
                         type: String Function({int? a})
                       functionKeyword: Function @48
                       parameters: FormalParameterList
+                        leftParenthesis: ( @56
                         parameters
                           DefaultFormalParameter
                             declaredElement: a@63
@@ -17457,6 +17529,7 @@
                                   staticType: null
                                   token: int @58
                                 type: int?
+                        rightParenthesis: ) @65
                       returnType: TypeName
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
@@ -17521,6 +17594,7 @@
                         type: String Function([int?])
                       functionKeyword: Function @48
                       parameters: FormalParameterList
+                        leftParenthesis: ( @56
                         parameters
                           DefaultFormalParameter
                             declaredElement: a@63
@@ -17542,6 +17616,7 @@
                                   staticType: null
                                   token: int @58
                                 type: int?
+                        rightParenthesis: ) @65
                       returnType: TypeName
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
@@ -17606,6 +17681,7 @@
                         type: String Function({required int a})
                       functionKeyword: Function @48
                       parameters: FormalParameterList
+                        leftParenthesis: ( @56
                         parameters
                           DefaultFormalParameter
                             declaredElement: a@71
@@ -17628,6 +17704,7 @@
                                   staticType: null
                                   token: int @67
                                 type: int
+                        rightParenthesis: ) @73
                       returnType: TypeName
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
@@ -17692,6 +17769,7 @@
                         type: String Function(int)
                       functionKeyword: Function @48
                       parameters: FormalParameterList
+                        leftParenthesis: ( @56
                         parameters
                           SimpleFormalParameter
                             declaredElement: a@61
@@ -17706,6 +17784,7 @@
                                 staticType: null
                                 token: int @57
                               type: int
+                        rightParenthesis: ) @62
                       returnType: TypeName
                         name: SimpleIdentifier
                           staticElement: dart:core::@class::String
@@ -23834,7 +23913,6 @@
   A(@foo int a);
 }
 ''');
-    // TODO(scheglov) Enhance to show metadata on formal parameters?
     checkElementText(library, r'''
 library
   definingUnit
@@ -23926,7 +24004,6 @@
   void method<@foo T>(@foo int a) {}
 }
 ''');
-    // TODO(scheglov) Enhance to show metadata on formal parameters?
     checkElementText(library, r'''
 library
   definingUnit
@@ -23988,7 +24065,6 @@
   set setter(@foo int a) {}
 }
 ''');
-    // TODO(scheglov) Enhance to show metadata on formal parameters?
     checkElementText(library, r'''
 library
   definingUnit
@@ -24584,7 +24660,6 @@
 @foo
 void f<@foo T>({@foo int? a = 42}) {}
 ''');
-    // TODO(scheglov) Enhance to show metadata on formal parameters?
     checkElementText(library, r'''
 library
   definingUnit
@@ -24679,7 +24754,6 @@
 @foo
 set setter(@foo int a) {}
 ''');
-    // TODO(scheglov) Enhance to show metadata on formal parameters?
     checkElementText(library, r'''
 library
   definingUnit
diff --git a/pkg/analyzer/tool/diagnostics/diagnostics.md b/pkg/analyzer/tool/diagnostics/diagnostics.md
index 85c48aa..2201508 100644
--- a/pkg/analyzer/tool/diagnostics/diagnostics.md
+++ b/pkg/analyzer/tool/diagnostics/diagnostics.md
@@ -11144,7 +11144,7 @@
 this diagnostic:
 
 {% prettify dart tag=pre+code %}
-const x = 4;
+const Object x = 4;
 const y = [!x is int!] ? 0 : 1;
 {% endprettify %}
 
@@ -11164,7 +11164,7 @@
 [constant context][]:
 
 {% prettify dart tag=pre+code %}
-const x = 4;
+const Object x = 4;
 var y = x is int ? 0 : 1;
 {% endprettify %}
 
diff --git a/pkg/analyzer_cli/lib/src/driver.dart b/pkg/analyzer_cli/lib/src/driver.dart
index 523b2f2..9c8c353a 100644
--- a/pkg/analyzer_cli/lib/src/driver.dart
+++ b/pkg/analyzer_cli/lib/src/driver.dart
@@ -186,9 +186,11 @@
     // batch flag and source file" error message.
     ErrorFormatter formatter;
     if (options.jsonFormat) {
-      formatter = JsonErrorFormatter(errorSink, options, stats,
+      formatter = JsonErrorFormatter(outSink, options, stats,
           severityProcessor: defaultSeverityProcessor);
     } else if (options.machineFormat) {
+      // The older machine format emits to stderr (instead of stdout) for legacy
+      // reasons.
       formatter = MachineErrorFormatter(errorSink, options, stats,
           severityProcessor: defaultSeverityProcessor);
     } else {
@@ -368,7 +370,7 @@
 
     formatter.flush();
 
-    if (!options.machineFormat) {
+    if (!options.machineFormat && !options.jsonFormat) {
       stats.print(outSink);
     }
 
diff --git a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
index 443c711..12e92b5 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/change_builder/change_builder_dart.dart
@@ -1496,7 +1496,7 @@
             // file.
             var isFirst =
                 next == (next.parent as CompilationUnit).directives.first;
-            var offset = isFirst && next is AnnotatedNode
+            var offset = isFirst
                 ? next.firstTokenAfterCommentAndMetadata.offset
                 : next.offset;
             addInsertion(offset, (EditBuilder builder) {
diff --git a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
index 004132a..f076a8a 100644
--- a/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
+++ b/pkg/compiler/lib/src/js_backend/deferred_holder_expression.dart
@@ -19,7 +19,7 @@
 enum DeferredHolderExpressionKind {
   globalObjectForStaticState,
   globalObjectForConstant,
-  globalObjectForLibrary,
+  globalObjectForInterceptors,
   globalObjectForClass,
   globalObjectForMember,
 }
@@ -45,6 +45,11 @@
   DeferredHolderExpression._(
       this.kind, this.data, this._value, this.sourceInformation);
 
+  factory DeferredHolderExpression.forInterceptors() {
+    return DeferredHolderExpression(
+        DeferredHolderExpressionKind.globalObjectForInterceptors, null);
+  }
+
   factory DeferredHolderExpression.forStaticState() {
     return DeferredHolderExpression(
         DeferredHolderExpressionKind.globalObjectForStaticState, null);
@@ -55,9 +60,6 @@
     var kind = source.readEnum(DeferredHolderExpressionKind.values);
     Object data;
     switch (kind) {
-      case DeferredHolderExpressionKind.globalObjectForLibrary:
-        data = source.readLibrary();
-        break;
       case DeferredHolderExpressionKind.globalObjectForClass:
         data = source.readClass();
         break;
@@ -67,6 +69,7 @@
       case DeferredHolderExpressionKind.globalObjectForConstant:
         data = source.readConstant();
         break;
+      case DeferredHolderExpressionKind.globalObjectForInterceptors:
       case DeferredHolderExpressionKind.globalObjectForStaticState:
         // no entity.
         break;
@@ -79,9 +82,6 @@
     sink.begin(tag);
     sink.writeEnum(kind);
     switch (kind) {
-      case DeferredHolderExpressionKind.globalObjectForLibrary:
-        sink.writeLibrary(data);
-        break;
       case DeferredHolderExpressionKind.globalObjectForClass:
         sink.writeClass(data);
         break;
@@ -91,6 +91,7 @@
       case DeferredHolderExpressionKind.globalObjectForConstant:
         sink.writeConstant(data);
         break;
+      case DeferredHolderExpressionKind.globalObjectForInterceptors:
       case DeferredHolderExpressionKind.globalObjectForStaticState:
         // no entity.
         break;
@@ -375,7 +376,8 @@
 
   /// Returns the [reservedGlobalObjectNames] for [library].
   String globalObjectNameForLibrary(LibraryEntity library) {
-    if (library == _commonElements.interceptorsLibrary) return 'J';
+    if (library == _commonElements.interceptorsLibrary)
+      return globalObjectNameForInterceptors();
     Uri uri = library.canonicalUri;
     if (uri.scheme == 'dart') {
       if (uri.path == 'html') return 'W';
@@ -411,6 +413,8 @@
   final Holder globalObjectForStaticState =
       Holder(globalObjectNameForStaticState());
 
+  static String globalObjectNameForInterceptors() => 'J';
+
   static String globalObjectNameForStaticState() => r'$';
 
   String globalObjectNameForConstants() => 'C';
@@ -458,8 +462,8 @@
   /// [DeferredHolderExpressionKind].
   String kindToHolderName(DeferredHolderExpressionKind kind, Object data) {
     switch (kind) {
-      case DeferredHolderExpressionKind.globalObjectForLibrary:
-        return globalObjectNameForLibrary(data);
+      case DeferredHolderExpressionKind.globalObjectForInterceptors:
+        return globalObjectNameForInterceptors();
       case DeferredHolderExpressionKind.globalObjectForClass:
         return globalObjectNameForClass(data);
       case DeferredHolderExpressionKind.globalObjectForMember:
@@ -820,6 +824,8 @@
     return globalObjectForLibrary(entity.library);
   }
 
+  String globalObjectForInterceptors() => 'J';
+
   String globalObjectForStaticState() => r'$';
 
   String globalObjectForConstants() => 'C';
@@ -848,8 +854,8 @@
   /// [DeferredHolderExpressionKind].
   String kindToHolder(DeferredHolderExpressionKind kind, Object data) {
     switch (kind) {
-      case DeferredHolderExpressionKind.globalObjectForLibrary:
-        return globalObjectForLibrary(data);
+      case DeferredHolderExpressionKind.globalObjectForInterceptors:
+        return globalObjectForInterceptors();
       case DeferredHolderExpressionKind.globalObjectForClass:
         return globalObjectForClass(data);
       case DeferredHolderExpressionKind.globalObjectForMember:
diff --git a/pkg/compiler/lib/src/js_backend/namer.dart b/pkg/compiler/lib/src/js_backend/namer.dart
index 5e4afbd..e8b00b7 100644
--- a/pkg/compiler/lib/src/js_backend/namer.dart
+++ b/pkg/compiler/lib/src/js_backend/namer.dart
@@ -2081,12 +2081,11 @@
     return DeferredHolderExpression.forStaticState();
   }
 
-  /// Returns a variable use for accessing [library].
+  /// Returns a variable use for accessing interceptors.
   ///
   /// This is one of the [reservedGlobalObjectNames]
-  jsAst.Expression readGlobalObjectForLibrary(LibraryEntity library) {
-    return DeferredHolderExpression(
-        DeferredHolderExpressionKind.globalObjectForLibrary, library);
+  jsAst.Expression readGlobalObjectForInterceptors() {
+    return DeferredHolderExpression.forInterceptors();
   }
 
   /// Returns a variable use for accessing the class [element].
diff --git a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
index f49bf66..13e4a5e 100644
--- a/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
+++ b/pkg/compiler/lib/src/js_emitter/interceptor_stub_generator.dart
@@ -398,8 +398,7 @@
     }
 
     jsAst.Name invocationName = _namer.invocationName(selector);
-    var globalObject =
-        _namer.readGlobalObjectForLibrary(_commonElements.interceptorsLibrary);
+    var globalObject = _namer.readGlobalObjectForInterceptors();
 
     jsAst.Statement optimizedPath =
         _fastPathForOneShotInterceptor(selector, classes);
diff --git a/pkg/compiler/lib/src/ssa/builder_kernel.dart b/pkg/compiler/lib/src/ssa/builder_kernel.dart
index 20a3676..56c3746 100644
--- a/pkg/compiler/lib/src/ssa/builder_kernel.dart
+++ b/pkg/compiler/lib/src/ssa/builder_kernel.dart
@@ -599,7 +599,7 @@
       // TODO(sra): The source information should indiciate the field and
       // possibly its type but not the initializer.
       value.sourceInformation ??= _sourceInformationBuilder.buildSet(node);
-      value = _potentiallyAssertNotNull(node, value, type);
+      value = _potentiallyAssertNotNull(field, node, value, type);
       if (!_fieldAnalysis.getFieldData(field).isElided) {
         add(HFieldSet(_abstractValueDomain, field, thisInstruction, value));
       }
@@ -1371,7 +1371,7 @@
     return true;
   }
 
-  void _potentiallyAddFunctionParameterTypeChecks(
+  void _potentiallyAddFunctionParameterTypeChecks(MemberEntity member,
       ir.FunctionNode function, TargetChecks targetChecks) {
     // Put the type checks in the first successor of the entry,
     // because that is where the type guards will also be inserted.
@@ -1417,7 +1417,8 @@
             targetElement, newParameter, type);
       }
       // TODO(sra): Hoist out of loop.
-      newParameter = _potentiallyAssertNotNull(variable, newParameter, type);
+      newParameter =
+          _potentiallyAssertNotNull(member, variable, newParameter, type);
       localsHandler.updateLocal(local, newParameter);
     }
 
@@ -1448,12 +1449,21 @@
   /// In mixed mode, inserts an assertion of the form `assert(x != null)` for
   /// parameters in opt-in libraries that have a static type that cannot be
   /// nullable under a strong interpretation.
-  HInstruction _potentiallyAssertNotNull(
+  HInstruction _potentiallyAssertNotNull(MemberEntity member,
       ir.TreeNode context, HInstruction value, DartType type) {
     if (!options.enableNullAssertions) return value;
     if (!_isNonNullableByDefault(context)) return value;
     if (!dartTypes.isNonNullableIfSound(type)) return value;
 
+    // `operator==` is usually augmented to handle a `null`-argument before this
+    // test would be inserted.  There are a few exceptions (Object,
+    // Interceptor), where the body of the `==` method is designed to handle a
+    // `null` argument. In the usual case the null assertion is unnecessary and
+    // will be optimized away. In the exception cases a null assertion would be
+    // incorrect. Either way we should not do a null-assertion on the parameter
+    // of any `operator==` method.
+    if (member.name == '==') return value;
+
     if (options.enableUserAssertions) {
       pushCheckNull(value);
       push(HNot(pop(), _abstractValueDomain.boolType));
@@ -1668,7 +1678,7 @@
     }
 
     if (functionNode != null) {
-      _potentiallyAddFunctionParameterTypeChecks(functionNode, checks);
+      _potentiallyAddFunctionParameterTypeChecks(member, functionNode, checks);
     }
     _insertCoverageCall(member);
   }
@@ -6311,7 +6321,7 @@
             function, argument, type);
       }
       checkedOrTrusted =
-          _potentiallyAssertNotNull(variable, checkedOrTrusted, type);
+          _potentiallyAssertNotNull(function, variable, checkedOrTrusted, type);
       localsHandler.updateLocal(parameter, checkedOrTrusted);
     });
   }
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 594204c..0abdba8 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -1881,8 +1881,7 @@
       assert(node.inputs.length == 1);
       _registry.registerSpecializedGetInterceptor(node.interceptedClasses);
       js.Name name = _namer.nameForGetInterceptor(node.interceptedClasses);
-      js.Expression isolate = _namer
-          .readGlobalObjectForLibrary(_commonElements.interceptorsLibrary);
+      js.Expression isolate = _namer.readGlobalObjectForInterceptors();
       use(node.receiver);
       List<js.Expression> arguments = <js.Expression>[pop()];
       push(js
@@ -1968,8 +1967,7 @@
     _metrics.countHInterceptor.add();
     _metrics.countHInterceptorOneshot.add();
     List<js.Expression> arguments = visitArguments(node.inputs);
-    js.Expression isolate =
-        _namer.readGlobalObjectForLibrary(_commonElements.interceptorsLibrary);
+    js.Expression isolate = _namer.readGlobalObjectForInterceptors();
     Selector selector = node.selector;
     Set<ClassEntity> classes =
         _interceptorData.getInterceptedClassesOn(selector.name, _closedWorld);
diff --git a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
index 0052d2d..a8b8b85 100644
--- a/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
+++ b/pkg/dev_compiler/lib/src/kernel/expression_compiler_worker.dart
@@ -262,6 +262,9 @@
                 'Unrecognized command `$command`, full request was `$request`');
         }
       } catch (e, s) {
+        var command = request['command'] as String;
+        _processedOptions.ticker
+            .logMs('Expression compiler worker request $command failed: $e:$s');
         sendResponse({
           'exception': '$e',
           'stackTrace': '$s',
diff --git a/pkg/dev_compiler/pubspec.yaml b/pkg/dev_compiler/pubspec.yaml
index a3a70e5..b0f3974 100644
--- a/pkg/dev_compiler/pubspec.yaml
+++ b/pkg/dev_compiler/pubspec.yaml
@@ -31,6 +31,8 @@
   browser_launcher: ^0.1.9
   expect:
     path: ../expect
+  http_multi_server:
+    path: ../../third_party/pkg/http_multi_server
   js:
     path: ../js
   modular_test:
@@ -40,6 +42,8 @@
   sourcemap_testing:
     path: ../sourcemap_testing
   stack_trace: any
+  shelf:
+    path: ../../third_party/pkg/shelf
   test: any
   testing:
     path: ../testing
diff --git a/pkg/dev_compiler/test/expression_compiler/asset_file_system_test.dart b/pkg/dev_compiler/test/expression_compiler/asset_file_system_test.dart
new file mode 100644
index 0000000..a3483ed
--- /dev/null
+++ b/pkg/dev_compiler/test/expression_compiler/asset_file_system_test.dart
@@ -0,0 +1,145 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// @dart=2.9
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io' show HttpServer;
+
+import 'package:browser_launcher/browser_launcher.dart';
+import 'package:dev_compiler/src/kernel/expression_compiler_worker.dart';
+import 'package:front_end/src/api_prototype/file_system.dart';
+import 'package:front_end/src/api_prototype/standard_file_system.dart';
+import 'package:http_multi_server/http_multi_server.dart';
+import 'package:shelf/shelf.dart';
+import 'package:shelf/shelf_io.dart';
+import 'package:test/test.dart';
+
+const _existingFile = 'http://localhost/existingFile';
+const _nonExistingFile = 'http://localhost/nonExistingFile';
+
+const _smallFileContents = 'Hello world!';
+
+String _largeFileContents() =>
+    List.filled(10000, _smallFileContents).join('/n');
+
+FutureOr<Response> handler(Request request) {
+  final uri = request.requestedUri.queryParameters['uri'];
+  final headers = {
+    'content-length': '${utf8.encode(_smallFileContents).length}',
+    ...request.headers,
+  };
+
+  if (request.method == 'HEAD') {
+    // 'exists'
+    return uri == _existingFile
+        ? Response.ok(null, headers: headers)
+        : Response.notFound(uri);
+  }
+  if (request.method == 'GET') {
+    // 'readAsBytes'
+    return uri == _existingFile
+        ? Response.ok(_smallFileContents, headers: headers)
+        : Response.notFound(uri);
+  }
+  return Response.internalServerError();
+}
+
+FutureOr<Response> noisyHandler(Request request) {
+  final uri = request.requestedUri.queryParameters['uri'];
+  final contents = _largeFileContents();
+  final headers = {
+    'content-length': '${utf8.encode(contents).length}',
+    ...request.headers,
+  };
+
+  if (request.method == 'HEAD' || request.method == 'GET') {
+    // 'exists' or 'readAsBytes'
+    return uri == _existingFile
+        ? Response.ok(contents, headers: headers)
+        : Response.notFound(uri);
+  }
+  return Response.internalServerError();
+}
+
+void main() async {
+  HttpServer server;
+  AssetFileSystem fileSystem;
+  group('AssetFileSystem with a server', () {
+    setUpAll(() async {
+      var hostname = 'localhost';
+      var port = await findUnusedPort();
+
+      server = await HttpMultiServer.bind(hostname, port);
+      fileSystem =
+          AssetFileSystem(StandardFileSystem.instance, hostname, '$port');
+
+      serveRequests(server, handler);
+    });
+
+    tearDownAll(() async {
+      await expectLater(server.close(), completes);
+    });
+
+    test('can tell if file exists', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_existingFile));
+      expect(await entity.exists(), true);
+    });
+
+    test('can tell if file does not exist', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_nonExistingFile));
+      expect(await entity.exists(), false);
+    });
+
+    test('can read existing file', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_existingFile));
+      expect(utf8.decode(await entity.readAsBytes()), _smallFileContents);
+    });
+
+    test('cannot read non-existing file', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_nonExistingFile));
+      await expectLater(
+          entity.readAsBytes(), throwsA(isA<FileSystemException>()));
+    });
+  });
+
+  group('AssetFileSystem with a noisy server', () {
+    setUpAll(() async {
+      var hostname = 'localhost';
+      var port = await findUnusedPort();
+
+      server = await HttpMultiServer.bind(hostname, port);
+      fileSystem =
+          AssetFileSystem(StandardFileSystem.instance, hostname, '$port');
+
+      serveRequests(server, noisyHandler);
+    });
+
+    tearDownAll(() async {
+      await expectLater(server.close(), completes);
+    });
+
+    test('can tell if file exists', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_existingFile));
+      expect(await entity.exists(), true);
+    });
+
+    test('can tell if file does not exist', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_nonExistingFile));
+      expect(await entity.exists(), false);
+    });
+
+    test('can read existing file', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_existingFile));
+      expect(utf8.decode(await entity.readAsBytes()), _largeFileContents());
+    });
+
+    test('cannot read non-existing file', () async {
+      var entity = fileSystem.entityForUri(Uri.parse(_nonExistingFile));
+      await expectLater(
+          entity.readAsBytes(), throwsA(isA<FileSystemException>()));
+    });
+  });
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
index 58f6cf1..1c7f034 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constant_evaluator.dart
@@ -1523,7 +1523,10 @@
     if (isSymbol) {
       final Constant nameValue = positionals.single;
 
-      if (nameValue is StringConstant && isValidSymbolName(nameValue.value)) {
+      // For libraries with null safety Symbol constructor accepts arbitrary
+      // string as argument.
+      if (nameValue is StringConstant &&
+          (isNonNullableByDefault || isValidSymbolName(nameValue.value))) {
         return canonicalize(new SymbolConstant(nameValue.value, null));
       }
       return createErrorConstant(
@@ -3159,7 +3162,7 @@
     }
 
     String name = target.name.text;
-    if (target is Procedure && target.isFactory) {
+    if (target.isFactory) {
       if (name.isEmpty) {
         name = target.enclosingClass!.name;
       } else {
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart
new file mode 100644
index 0000000..3920233
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart
@@ -0,0 +1,69 @@
+class abstract {}
+class as {}
+class assert {}
+class async {}
+class await {}
+class break {}
+class case {}
+class catch {}
+class class {}
+class const {}
+class continue {}
+class covariant {}
+class default {}
+class deferred {}
+class do {}
+class dynamic {}
+class else {}
+class enum {}
+class export {}
+class extends {}
+class extension {}
+class external {}
+class factory {}
+class false {}
+class final {}
+class finally {}
+class for {}
+class Function {}
+class get {}
+class hide {}
+class if {}
+class implements {}
+class import {}
+class in {}
+class inout {}
+class interface {}
+class is {}
+class late {}
+class library {}
+class mixin {}
+class native {}
+class new {}
+class null {}
+class of {}
+class on {}
+class operator {}
+class out {}
+class part {}
+class patch {}
+class required {}
+class rethrow {}
+class return {}
+class set {}
+class show {}
+class source {}
+class static {}
+class super {}
+class switch {}
+class sync {}
+class this {}
+class throw {}
+class true {}
+class try {}
+class typedef {}
+class var {}
+class void {}
+class while {}
+class with {}
+class yield {}
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
new file mode 100644
index 0000000..c371313
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.expect
@@ -0,0 +1,1314 @@
+Problems reported:
+
+parser/error_recovery/issue_46346:1:7: Can't use 'abstract' as a name here.
+class abstract {}
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346:2:7: Can't use 'as' as a name here.
+class as {}
+      ^^
+
+parser/error_recovery/issue_46346:3:7: 'assert' can't be used as an identifier because it's a keyword.
+class assert {}
+      ^^^^^^
+
+parser/error_recovery/issue_46346:6:7: 'break' can't be used as an identifier because it's a keyword.
+class break {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:7:7: 'case' can't be used as an identifier because it's a keyword.
+class case {}
+      ^^^^
+
+parser/error_recovery/issue_46346:8:7: 'catch' can't be used as an identifier because it's a keyword.
+class catch {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:9:7: 'class' can't be used as an identifier because it's a keyword.
+class class {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:10:7: 'const' can't be used as an identifier because it's a keyword.
+class const {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:11:7: 'continue' can't be used as an identifier because it's a keyword.
+class continue {}
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346:12:7: Can't use 'covariant' as a name here.
+class covariant {}
+      ^^^^^^^^^
+
+parser/error_recovery/issue_46346:13:7: 'default' can't be used as an identifier because it's a keyword.
+class default {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:14:7: Can't use 'deferred' as a name here.
+class deferred {}
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346:15:7: 'do' can't be used as an identifier because it's a keyword.
+class do {}
+      ^^
+
+parser/error_recovery/issue_46346:16:7: Can't use 'dynamic' as a name here.
+class dynamic {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:17:7: 'else' can't be used as an identifier because it's a keyword.
+class else {}
+      ^^^^
+
+parser/error_recovery/issue_46346:18:7: 'enum' can't be used as an identifier because it's a keyword.
+class enum {}
+      ^^^^
+
+parser/error_recovery/issue_46346:19:7: Can't use 'export' as a name here.
+class export {}
+      ^^^^^^
+
+parser/error_recovery/issue_46346:20:7: 'extends' can't be used as an identifier because it's a keyword.
+class extends {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:21:7: Can't use 'extension' as a name here.
+class extension {}
+      ^^^^^^^^^
+
+parser/error_recovery/issue_46346:22:7: Can't use 'external' as a name here.
+class external {}
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346:23:7: Can't use 'factory' as a name here.
+class factory {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:24:7: 'false' can't be used as an identifier because it's a keyword.
+class false {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:25:7: 'final' can't be used as an identifier because it's a keyword.
+class final {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:26:7: 'finally' can't be used as an identifier because it's a keyword.
+class finally {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:27:7: 'for' can't be used as an identifier because it's a keyword.
+class for {}
+      ^^^
+
+parser/error_recovery/issue_46346:29:7: Can't use 'get' as a name here.
+class get {}
+      ^^^
+
+parser/error_recovery/issue_46346:31:7: 'if' can't be used as an identifier because it's a keyword.
+class if {}
+      ^^
+
+parser/error_recovery/issue_46346:32:7: Can't use 'implements' as a name here.
+class implements {}
+      ^^^^^^^^^^
+
+parser/error_recovery/issue_46346:33:7: Can't use 'import' as a name here.
+class import {}
+      ^^^^^^
+
+parser/error_recovery/issue_46346:34:7: 'in' can't be used as an identifier because it's a keyword.
+class in {}
+      ^^
+
+parser/error_recovery/issue_46346:36:7: Can't use 'interface' as a name here.
+class interface {}
+      ^^^^^^^^^
+
+parser/error_recovery/issue_46346:37:7: 'is' can't be used as an identifier because it's a keyword.
+class is {}
+      ^^
+
+parser/error_recovery/issue_46346:38:7: Can't use 'late' as a name here.
+class late {}
+      ^^^^
+
+parser/error_recovery/issue_46346:39:7: Can't use 'library' as a name here.
+class library {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:40:7: Can't use 'mixin' as a name here.
+class mixin {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:42:7: 'new' can't be used as an identifier because it's a keyword.
+class new {}
+      ^^^
+
+parser/error_recovery/issue_46346:43:7: 'null' can't be used as an identifier because it's a keyword.
+class null {}
+      ^^^^
+
+parser/error_recovery/issue_46346:46:7: Can't use 'operator' as a name here.
+class operator {}
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346:48:7: Can't use 'part' as a name here.
+class part {}
+      ^^^^
+
+parser/error_recovery/issue_46346:50:7: Can't use 'required' as a name here.
+class required {}
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346:51:7: 'rethrow' can't be used as an identifier because it's a keyword.
+class rethrow {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:52:7: 'return' can't be used as an identifier because it's a keyword.
+class return {}
+      ^^^^^^
+
+parser/error_recovery/issue_46346:53:7: Can't use 'set' as a name here.
+class set {}
+      ^^^
+
+parser/error_recovery/issue_46346:56:7: Can't use 'static' as a name here.
+class static {}
+      ^^^^^^
+
+parser/error_recovery/issue_46346:57:7: 'super' can't be used as an identifier because it's a keyword.
+class super {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:58:7: 'switch' can't be used as an identifier because it's a keyword.
+class switch {}
+      ^^^^^^
+
+parser/error_recovery/issue_46346:60:7: 'this' can't be used as an identifier because it's a keyword.
+class this {}
+      ^^^^
+
+parser/error_recovery/issue_46346:61:7: 'throw' can't be used as an identifier because it's a keyword.
+class throw {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:62:7: 'true' can't be used as an identifier because it's a keyword.
+class true {}
+      ^^^^
+
+parser/error_recovery/issue_46346:63:7: 'try' can't be used as an identifier because it's a keyword.
+class try {}
+      ^^^
+
+parser/error_recovery/issue_46346:64:7: Can't use 'typedef' as a name here.
+class typedef {}
+      ^^^^^^^
+
+parser/error_recovery/issue_46346:65:7: 'var' can't be used as an identifier because it's a keyword.
+class var {}
+      ^^^
+
+parser/error_recovery/issue_46346:66:7: 'void' can't be used as an identifier because it's a keyword.
+class void {}
+      ^^^^
+
+parser/error_recovery/issue_46346:67:7: 'while' can't be used as an identifier because it's a keyword.
+class while {}
+      ^^^^^
+
+parser/error_recovery/issue_46346:68:7: 'with' can't be used as an identifier because it's a keyword.
+class with {}
+      ^^^^
+
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
+    handleIdentifier(abstract, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, abstract)
+      handleNoType(abstract)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
+    handleIdentifier(as, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, as)
+      handleNoType(as)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+    handleIdentifier(assert, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, assert)
+      handleNoType(assert)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(async, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, async)
+      handleNoType(async)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(await, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, await)
+      handleNoType(await)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+    handleIdentifier(break, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, break)
+      handleNoType(break)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+    handleIdentifier(case, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, case)
+      handleNoType(case)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+    handleIdentifier(catch, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, catch)
+      handleNoType(catch)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+    handleIdentifier(class, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, class)
+      handleNoType(class)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+    handleIdentifier(const, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, const)
+      handleNoType(const)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+    handleIdentifier(continue, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, continue)
+      handleNoType(continue)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
+    handleIdentifier(covariant, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, covariant)
+      handleNoType(covariant)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+    handleIdentifier(default, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, default)
+      handleNoType(default)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
+    handleIdentifier(deferred, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, deferred)
+      handleNoType(deferred)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+    handleIdentifier(do, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, do)
+      handleNoType(do)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
+    handleIdentifier(dynamic, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, dynamic)
+      handleNoType(dynamic)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+    handleIdentifier(else, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, else)
+      handleNoType(else)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+    handleIdentifier(enum, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, enum)
+      handleNoType(enum)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
+    handleIdentifier(export, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, export)
+      handleNoType(export)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+    handleIdentifier(extends, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, extends)
+      handleNoType(extends)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
+    handleIdentifier(extension, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, extension)
+      handleNoType(extension)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
+    handleIdentifier(external, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, external)
+      handleNoType(external)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
+    handleIdentifier(factory, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, factory)
+      handleNoType(factory)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+    handleIdentifier(false, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, false)
+      handleNoType(false)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+    handleIdentifier(final, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, final)
+      handleNoType(final)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+    handleIdentifier(finally, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, finally)
+      handleNoType(finally)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+    handleIdentifier(for, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, for)
+      handleNoType(for)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(Function, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, Function)
+      handleNoType(Function)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
+    handleIdentifier(get, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, get)
+      handleNoType(get)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(hide, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, hide)
+      handleNoType(hide)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+    handleIdentifier(if, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, if)
+      handleNoType(if)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
+    handleIdentifier(implements, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, implements)
+      handleNoType(implements)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
+    handleIdentifier(import, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, import)
+      handleNoType(import)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+    handleIdentifier(in, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, in)
+      handleNoType(in)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(inout, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, inout)
+      handleNoType(inout)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
+    handleIdentifier(interface, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, interface)
+      handleNoType(interface)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+    handleIdentifier(is, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, is)
+      handleNoType(is)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
+    handleIdentifier(late, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, late)
+      handleNoType(late)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
+    handleIdentifier(library, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, library)
+      handleNoType(library)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
+    handleIdentifier(mixin, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, mixin)
+      handleNoType(mixin)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(native, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, native)
+      handleNoType(native)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+    handleIdentifier(new, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, new)
+      handleNoType(new)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+    handleIdentifier(null, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, null)
+      handleNoType(null)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(of, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, of)
+      handleNoType(of)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(on, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, on)
+      handleNoType(on)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
+    handleIdentifier(operator, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, operator)
+      handleNoType(operator)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(out, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, out)
+      handleNoType(out)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
+    handleIdentifier(part, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, part)
+      handleNoType(part)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(patch, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, patch)
+      handleNoType(patch)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
+    handleIdentifier(required, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, required)
+      handleNoType(required)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+    handleIdentifier(rethrow, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, rethrow)
+      handleNoType(rethrow)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+    handleIdentifier(return, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, return)
+      handleNoType(return)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
+    handleIdentifier(set, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, set)
+      handleNoType(set)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(show, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, show)
+      handleNoType(show)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(source, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, source)
+      handleNoType(source)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
+    handleIdentifier(static, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, static)
+      handleNoType(static)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+    handleIdentifier(super, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, super)
+      handleNoType(super)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+    handleIdentifier(switch, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, switch)
+      handleNoType(switch)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(sync, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, sync)
+      handleNoType(sync)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+    handleIdentifier(this, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, this)
+      handleNoType(this)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+    handleIdentifier(throw, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, throw)
+      handleNoType(throw)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+    handleIdentifier(true, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, true)
+      handleNoType(true)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+    handleIdentifier(try, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, try)
+      handleNoType(try)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
+    handleIdentifier(typedef, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, typedef)
+      handleNoType(typedef)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+    handleIdentifier(var, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, var)
+      handleNoType(var)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
+    handleIdentifier(void, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, void)
+      handleNoType(void)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+    handleIdentifier(while, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, while)
+      handleNoType(while)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+    handleIdentifier(with, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, with)
+      handleNoType(with)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(yield, classOrMixinDeclaration)
+    handleNoTypeVariables({)
+    beginClassDeclaration(class, null, yield)
+      handleNoType(yield)
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(69, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
new file mode 100644
index 0000000..350e22e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.intertwined.expect
@@ -0,0 +1,2048 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(abstract, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
+          listener: handleIdentifier(abstract, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, abstract)
+        parseClass(abstract, class, class, abstract)
+          parseClassHeaderOpt(abstract, class, class)
+            parseClassExtendsOpt(abstract)
+              listener: handleNoType(abstract)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(abstract)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(abstract)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(abstract, DeclarationKind.Class, abstract)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(as, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
+          listener: handleIdentifier(as, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, as)
+        parseClass(as, class, class, as)
+          parseClassHeaderOpt(as, class, class)
+            parseClassExtendsOpt(as)
+              listener: handleNoType(as)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(as)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(as)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(as, DeclarationKind.Class, as)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(assert, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+          listener: handleIdentifier(assert, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, assert)
+        parseClass(assert, class, class, assert)
+          parseClassHeaderOpt(assert, class, class)
+            parseClassExtendsOpt(assert)
+              listener: handleNoType(assert)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(assert)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(assert)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(assert, DeclarationKind.Class, assert)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(async, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, async)
+        parseClass(async, class, class, async)
+          parseClassHeaderOpt(async, class, class)
+            parseClassExtendsOpt(async)
+              listener: handleNoType(async)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(async)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(async)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(async, DeclarationKind.Class, async)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(await, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, await)
+        parseClass(await, class, class, await)
+          parseClassHeaderOpt(await, class, class)
+            parseClassExtendsOpt(await)
+              listener: handleNoType(await)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(await)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(await)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(await, DeclarationKind.Class, await)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(break, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+          listener: handleIdentifier(break, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, break)
+        parseClass(break, class, class, break)
+          parseClassHeaderOpt(break, class, class)
+            parseClassExtendsOpt(break)
+              listener: handleNoType(break)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(break)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(break)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(break, DeclarationKind.Class, break)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(case, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+          listener: handleIdentifier(case, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, case)
+        parseClass(case, class, class, case)
+          parseClassHeaderOpt(case, class, class)
+            parseClassExtendsOpt(case)
+              listener: handleNoType(case)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(case)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(case)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(case, DeclarationKind.Class, case)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(catch, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+          listener: handleIdentifier(catch, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, catch)
+        parseClass(catch, class, class, catch)
+          parseClassHeaderOpt(catch, class, class)
+            parseClassExtendsOpt(catch)
+              listener: handleNoType(catch)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(catch)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(catch)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(catch, DeclarationKind.Class, catch)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(class, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+          listener: handleIdentifier(class, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, class)
+        parseClass(class, class, class, class)
+          parseClassHeaderOpt(class, class, class)
+            parseClassExtendsOpt(class)
+              listener: handleNoType(class)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(class)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(class)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(class, DeclarationKind.Class, class)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(const, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+          listener: handleIdentifier(const, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, const)
+        parseClass(const, class, class, const)
+          parseClassHeaderOpt(const, class, class)
+            parseClassExtendsOpt(const)
+              listener: handleNoType(const)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(const)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(const)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(const, DeclarationKind.Class, const)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(continue, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+          listener: handleIdentifier(continue, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, continue)
+        parseClass(continue, class, class, continue)
+          parseClassHeaderOpt(continue, class, class)
+            parseClassExtendsOpt(continue)
+              listener: handleNoType(continue)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(continue)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(continue)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(continue, DeclarationKind.Class, continue)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(covariant, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
+          listener: handleIdentifier(covariant, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, covariant)
+        parseClass(covariant, class, class, covariant)
+          parseClassHeaderOpt(covariant, class, class)
+            parseClassExtendsOpt(covariant)
+              listener: handleNoType(covariant)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(covariant)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(covariant)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(covariant, DeclarationKind.Class, covariant)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(default, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+          listener: handleIdentifier(default, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, default)
+        parseClass(default, class, class, default)
+          parseClassHeaderOpt(default, class, class)
+            parseClassExtendsOpt(default)
+              listener: handleNoType(default)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(default)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(default)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(default, DeclarationKind.Class, default)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(deferred, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
+          listener: handleIdentifier(deferred, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, deferred)
+        parseClass(deferred, class, class, deferred)
+          parseClassHeaderOpt(deferred, class, class)
+            parseClassExtendsOpt(deferred)
+              listener: handleNoType(deferred)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(deferred)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(deferred)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(deferred, DeclarationKind.Class, deferred)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(do, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+          listener: handleIdentifier(do, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, do)
+        parseClass(do, class, class, do)
+          parseClassHeaderOpt(do, class, class)
+            parseClassExtendsOpt(do)
+              listener: handleNoType(do)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(do)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(do)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(do, DeclarationKind.Class, do)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(dynamic, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
+          listener: handleIdentifier(dynamic, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, dynamic)
+        parseClass(dynamic, class, class, dynamic)
+          parseClassHeaderOpt(dynamic, class, class)
+            parseClassExtendsOpt(dynamic)
+              listener: handleNoType(dynamic)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(dynamic)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(dynamic)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(dynamic, DeclarationKind.Class, dynamic)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(else, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+          listener: handleIdentifier(else, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, else)
+        parseClass(else, class, class, else)
+          parseClassHeaderOpt(else, class, class)
+            parseClassExtendsOpt(else)
+              listener: handleNoType(else)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(else)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(else)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(else, DeclarationKind.Class, else)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(enum, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+          listener: handleIdentifier(enum, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, enum)
+        parseClass(enum, class, class, enum)
+          parseClassHeaderOpt(enum, class, class)
+            parseClassExtendsOpt(enum)
+              listener: handleNoType(enum)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(enum)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(enum)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(enum, DeclarationKind.Class, enum)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(export, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
+          listener: handleIdentifier(export, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, export)
+        parseClass(export, class, class, export)
+          parseClassHeaderOpt(export, class, class)
+            parseClassExtendsOpt(export)
+              listener: handleNoType(export)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(export)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(export)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(export, DeclarationKind.Class, export)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(extends, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+          listener: handleIdentifier(extends, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, extends)
+        parseClass(extends, class, class, extends)
+          parseClassHeaderOpt(extends, class, class)
+            parseClassExtendsOpt(extends)
+              listener: handleNoType(extends)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(extends)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(extends)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(extends, DeclarationKind.Class, extends)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(extension, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
+          listener: handleIdentifier(extension, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, extension)
+        parseClass(extension, class, class, extension)
+          parseClassHeaderOpt(extension, class, class)
+            parseClassExtendsOpt(extension)
+              listener: handleNoType(extension)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(extension)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(extension)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(extension, DeclarationKind.Class, extension)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(external, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
+          listener: handleIdentifier(external, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, external)
+        parseClass(external, class, class, external)
+          parseClassHeaderOpt(external, class, class)
+            parseClassExtendsOpt(external)
+              listener: handleNoType(external)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(external)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(external)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(external, DeclarationKind.Class, external)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(factory, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
+          listener: handleIdentifier(factory, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, factory)
+        parseClass(factory, class, class, factory)
+          parseClassHeaderOpt(factory, class, class)
+            parseClassExtendsOpt(factory)
+              listener: handleNoType(factory)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(factory)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(factory)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(factory, DeclarationKind.Class, factory)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(false, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+          listener: handleIdentifier(false, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, false)
+        parseClass(false, class, class, false)
+          parseClassHeaderOpt(false, class, class)
+            parseClassExtendsOpt(false)
+              listener: handleNoType(false)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(false)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(false)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(false, DeclarationKind.Class, false)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(final, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+          listener: handleIdentifier(final, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, final)
+        parseClass(final, class, class, final)
+          parseClassHeaderOpt(final, class, class)
+            parseClassExtendsOpt(final)
+              listener: handleNoType(final)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(final)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(final)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(final, DeclarationKind.Class, final)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(finally, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+          listener: handleIdentifier(finally, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, finally)
+        parseClass(finally, class, class, finally)
+          parseClassHeaderOpt(finally, class, class)
+            parseClassExtendsOpt(finally)
+              listener: handleNoType(finally)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(finally)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(finally)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(finally, DeclarationKind.Class, finally)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(for, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+          listener: handleIdentifier(for, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, for)
+        parseClass(for, class, class, for)
+          parseClassHeaderOpt(for, class, class)
+            parseClassExtendsOpt(for)
+              listener: handleNoType(for)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(for)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(for)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(for, DeclarationKind.Class, for)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Function, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, Function)
+        parseClass(Function, class, class, Function)
+          parseClassHeaderOpt(Function, class, class)
+            parseClassExtendsOpt(Function)
+              listener: handleNoType(Function)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(Function)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(Function)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(Function, DeclarationKind.Class, Function)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(get, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
+          listener: handleIdentifier(get, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, get)
+        parseClass(get, class, class, get)
+          parseClassHeaderOpt(get, class, class)
+            parseClassExtendsOpt(get)
+              listener: handleNoType(get)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(get)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(get)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(get, DeclarationKind.Class, get)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(hide, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, hide)
+        parseClass(hide, class, class, hide)
+          parseClassHeaderOpt(hide, class, class)
+            parseClassExtendsOpt(hide)
+              listener: handleNoType(hide)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(hide)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(hide)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(hide, DeclarationKind.Class, hide)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(if, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+          listener: handleIdentifier(if, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, if)
+        parseClass(if, class, class, if)
+          parseClassHeaderOpt(if, class, class)
+            parseClassExtendsOpt(if)
+              listener: handleNoType(if)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(if)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(if)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(if, DeclarationKind.Class, if)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(implements, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
+          listener: handleIdentifier(implements, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, implements)
+        parseClass(implements, class, class, implements)
+          parseClassHeaderOpt(implements, class, class)
+            parseClassExtendsOpt(implements)
+              listener: handleNoType(implements)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(implements)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(implements)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(implements, DeclarationKind.Class, implements)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(import, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
+          listener: handleIdentifier(import, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, import)
+        parseClass(import, class, class, import)
+          parseClassHeaderOpt(import, class, class)
+            parseClassExtendsOpt(import)
+              listener: handleNoType(import)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(import)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(import)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(import, DeclarationKind.Class, import)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(in, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+          listener: handleIdentifier(in, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, in)
+        parseClass(in, class, class, in)
+          parseClassHeaderOpt(in, class, class)
+            parseClassExtendsOpt(in)
+              listener: handleNoType(in)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(in)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(in)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(in, DeclarationKind.Class, in)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(inout, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, inout)
+        parseClass(inout, class, class, inout)
+          parseClassHeaderOpt(inout, class, class)
+            parseClassExtendsOpt(inout)
+              listener: handleNoType(inout)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(inout)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(inout)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(inout, DeclarationKind.Class, inout)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(interface, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
+          listener: handleIdentifier(interface, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, interface)
+        parseClass(interface, class, class, interface)
+          parseClassHeaderOpt(interface, class, class)
+            parseClassExtendsOpt(interface)
+              listener: handleNoType(interface)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(interface)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(interface)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(interface, DeclarationKind.Class, interface)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(is, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+          listener: handleIdentifier(is, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, is)
+        parseClass(is, class, class, is)
+          parseClassHeaderOpt(is, class, class)
+            parseClassExtendsOpt(is)
+              listener: handleNoType(is)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(is)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(is)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(is, DeclarationKind.Class, is)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(late, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
+          listener: handleIdentifier(late, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, late)
+        parseClass(late, class, class, late)
+          parseClassHeaderOpt(late, class, class)
+            parseClassExtendsOpt(late)
+              listener: handleNoType(late)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(late)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(late)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(late, DeclarationKind.Class, late)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(library, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
+          listener: handleIdentifier(library, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, library)
+        parseClass(library, class, class, library)
+          parseClassHeaderOpt(library, class, class)
+            parseClassExtendsOpt(library)
+              listener: handleNoType(library)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(library)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(library)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(library, DeclarationKind.Class, library)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(mixin, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
+          listener: handleIdentifier(mixin, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, mixin)
+        parseClass(mixin, class, class, mixin)
+          parseClassHeaderOpt(mixin, class, class)
+            parseClassExtendsOpt(mixin)
+              listener: handleNoType(mixin)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(mixin)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(mixin)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(mixin, DeclarationKind.Class, mixin)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(native, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, native)
+        parseClass(native, class, class, native)
+          parseClassHeaderOpt(native, class, class)
+            parseClassExtendsOpt(native)
+              listener: handleNoType(native)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(native)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(native)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(native, DeclarationKind.Class, native)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(new, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+          listener: handleIdentifier(new, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, new)
+        parseClass(new, class, class, new)
+          parseClassHeaderOpt(new, class, class)
+            parseClassExtendsOpt(new)
+              listener: handleNoType(new)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(new)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(new)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(new, DeclarationKind.Class, new)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(null, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+          listener: handleIdentifier(null, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, null)
+        parseClass(null, class, class, null)
+          parseClassHeaderOpt(null, class, class)
+            parseClassExtendsOpt(null)
+              listener: handleNoType(null)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(null)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(null)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(null, DeclarationKind.Class, null)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(of, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, of)
+        parseClass(of, class, class, of)
+          parseClassHeaderOpt(of, class, class)
+            parseClassExtendsOpt(of)
+              listener: handleNoType(of)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(of)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(of)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(of, DeclarationKind.Class, of)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(on, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, on)
+        parseClass(on, class, class, on)
+          parseClassHeaderOpt(on, class, class)
+            parseClassExtendsOpt(on)
+              listener: handleNoType(on)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(on)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(on)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(on, DeclarationKind.Class, on)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(operator, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
+          listener: handleIdentifier(operator, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, operator)
+        parseClass(operator, class, class, operator)
+          parseClassHeaderOpt(operator, class, class)
+            parseClassExtendsOpt(operator)
+              listener: handleNoType(operator)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(operator)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(operator)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(operator, DeclarationKind.Class, operator)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(out, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, out)
+        parseClass(out, class, class, out)
+          parseClassHeaderOpt(out, class, class)
+            parseClassExtendsOpt(out)
+              listener: handleNoType(out)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(out)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(out)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(out, DeclarationKind.Class, out)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(part, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
+          listener: handleIdentifier(part, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, part)
+        parseClass(part, class, class, part)
+          parseClassHeaderOpt(part, class, class)
+            parseClassExtendsOpt(part)
+              listener: handleNoType(part)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(part)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(part)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(part, DeclarationKind.Class, part)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(patch, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, patch)
+        parseClass(patch, class, class, patch)
+          parseClassHeaderOpt(patch, class, class)
+            parseClassExtendsOpt(patch)
+              listener: handleNoType(patch)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(patch)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(patch)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(patch, DeclarationKind.Class, patch)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(required, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
+          listener: handleIdentifier(required, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, required)
+        parseClass(required, class, class, required)
+          parseClassHeaderOpt(required, class, class)
+            parseClassExtendsOpt(required)
+              listener: handleNoType(required)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(required)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(required)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(required, DeclarationKind.Class, required)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(rethrow, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+          listener: handleIdentifier(rethrow, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, rethrow)
+        parseClass(rethrow, class, class, rethrow)
+          parseClassHeaderOpt(rethrow, class, class)
+            parseClassExtendsOpt(rethrow)
+              listener: handleNoType(rethrow)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(rethrow)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(rethrow)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(rethrow, DeclarationKind.Class, rethrow)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+          listener: handleIdentifier(return, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, return)
+        parseClass(return, class, class, return)
+          parseClassHeaderOpt(return, class, class)
+            parseClassExtendsOpt(return)
+              listener: handleNoType(return)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(return)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(return)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(return, DeclarationKind.Class, return)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(set, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
+          listener: handleIdentifier(set, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, set)
+        parseClass(set, class, class, set)
+          parseClassHeaderOpt(set, class, class)
+            parseClassExtendsOpt(set)
+              listener: handleNoType(set)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(set)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(set)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(set, DeclarationKind.Class, set)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(show, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, show)
+        parseClass(show, class, class, show)
+          parseClassHeaderOpt(show, class, class)
+            parseClassExtendsOpt(show)
+              listener: handleNoType(show)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(show)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(show)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(show, DeclarationKind.Class, show)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(source, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, source)
+        parseClass(source, class, class, source)
+          parseClassHeaderOpt(source, class, class)
+            parseClassExtendsOpt(source)
+              listener: handleNoType(source)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(source)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(source)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(source, DeclarationKind.Class, source)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(static, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
+          listener: handleIdentifier(static, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, static)
+        parseClass(static, class, class, static)
+          parseClassHeaderOpt(static, class, class)
+            parseClassExtendsOpt(static)
+              listener: handleNoType(static)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(static)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(static)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(static, DeclarationKind.Class, static)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(super, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+          listener: handleIdentifier(super, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, super)
+        parseClass(super, class, class, super)
+          parseClassHeaderOpt(super, class, class)
+            parseClassExtendsOpt(super)
+              listener: handleNoType(super)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(super)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(super)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(super, DeclarationKind.Class, super)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(switch, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+          listener: handleIdentifier(switch, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, switch)
+        parseClass(switch, class, class, switch)
+          parseClassHeaderOpt(switch, class, class)
+            parseClassExtendsOpt(switch)
+              listener: handleNoType(switch)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(switch)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(switch)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(switch, DeclarationKind.Class, switch)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(sync, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, sync)
+        parseClass(sync, class, class, sync)
+          parseClassHeaderOpt(sync, class, class)
+            parseClassExtendsOpt(sync)
+              listener: handleNoType(sync)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(sync)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(sync)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(sync, DeclarationKind.Class, sync)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(this, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+          listener: handleIdentifier(this, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, this)
+        parseClass(this, class, class, this)
+          parseClassHeaderOpt(this, class, class)
+            parseClassExtendsOpt(this)
+              listener: handleNoType(this)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(this)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(this)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(this, DeclarationKind.Class, this)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(throw, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+          listener: handleIdentifier(throw, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, throw)
+        parseClass(throw, class, class, throw)
+          parseClassHeaderOpt(throw, class, class)
+            parseClassExtendsOpt(throw)
+              listener: handleNoType(throw)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(throw)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(throw)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(throw, DeclarationKind.Class, throw)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(true, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+          listener: handleIdentifier(true, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, true)
+        parseClass(true, class, class, true)
+          parseClassHeaderOpt(true, class, class)
+            parseClassExtendsOpt(true)
+              listener: handleNoType(true)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(true)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(true)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(true, DeclarationKind.Class, true)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(try, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+          listener: handleIdentifier(try, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, try)
+        parseClass(try, class, class, try)
+          parseClassHeaderOpt(try, class, class)
+            parseClassExtendsOpt(try)
+              listener: handleNoType(try)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(try)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(try)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(try, DeclarationKind.Class, try)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(typedef, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
+          listener: handleIdentifier(typedef, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, typedef)
+        parseClass(typedef, class, class, typedef)
+          parseClassHeaderOpt(typedef, class, class)
+            parseClassExtendsOpt(typedef)
+              listener: handleNoType(typedef)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(typedef)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(typedef)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(typedef, DeclarationKind.Class, typedef)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(var, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+          listener: handleIdentifier(var, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, var)
+        parseClass(var, class, class, var)
+          parseClassHeaderOpt(var, class, class)
+            parseClassExtendsOpt(var)
+              listener: handleNoType(var)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(var)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(var)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(var, DeclarationKind.Class, var)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(void, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
+          listener: handleIdentifier(void, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, void)
+        parseClass(void, class, class, void)
+          parseClassHeaderOpt(void, class, class)
+            parseClassExtendsOpt(void)
+              listener: handleNoType(void)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(void)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(void)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(void, DeclarationKind.Class, void)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(while, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+          listener: handleIdentifier(while, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, while)
+        parseClass(while, class, class, while)
+          parseClassHeaderOpt(while, class, class)
+            parseClassExtendsOpt(while)
+              listener: handleNoType(while)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(while)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(while)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(while, DeclarationKind.Class, while)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+          listener: handleIdentifier(with, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, with)
+        parseClass(with, class, class, with)
+          parseClassHeaderOpt(with, class, class)
+            parseClassExtendsOpt(with)
+              listener: handleNoType(with)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(with)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(with)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(with, DeclarationKind.Class, with)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
+    parseMetadataStar(})
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(}, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(}, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(yield, classOrMixinDeclaration)
+        listener: handleNoTypeVariables({)
+        listener: beginClassDeclaration(class, null, yield)
+        parseClass(yield, class, class, yield)
+          parseClassHeaderOpt(yield, class, class)
+            parseClassExtendsOpt(yield)
+              listener: handleNoType(yield)
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt(yield)
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt(yield)
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassOrMixinOrExtensionBody(yield, DeclarationKind.Class, yield)
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(69, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.parser.expect
new file mode 100644
index 0000000..54c447e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.parser.expect
@@ -0,0 +1,141 @@
+class abstract {}
+class as {}
+class assert {}
+class async {}
+class await {}
+class break {}
+class case {}
+class catch {}
+class class {}
+class const {}
+class continue {}
+class covariant {}
+class default {}
+class deferred {}
+class do {}
+class dynamic {}
+class else {}
+class enum {}
+class export {}
+class extends {}
+class extension {}
+class external {}
+class factory {}
+class false {}
+class final {}
+class finally {}
+class for {}
+class Function {}
+class get {}
+class hide {}
+class if {}
+class implements {}
+class import {}
+class in {}
+class inout {}
+class interface {}
+class is {}
+class late {}
+class library {}
+class mixin {}
+class native {}
+class new {}
+class null {}
+class of {}
+class on {}
+class operator {}
+class out {}
+class part {}
+class patch {}
+class required {}
+class rethrow {}
+class return {}
+class set {}
+class show {}
+class source {}
+class static {}
+class super {}
+class switch {}
+class sync {}
+class this {}
+class throw {}
+class true {}
+class try {}
+class typedef {}
+class var {}
+class void {}
+class while {}
+class with {}
+class yield {}
+
+
+class[KeywordToken] abstract[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] as[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] assert[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] async[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] await[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] break[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] case[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] catch[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] class[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] const[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] continue[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] covariant[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] default[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] deferred[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] do[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] dynamic[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] else[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] enum[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] export[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] extends[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] extension[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] external[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] factory[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] false[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] final[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] finally[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] for[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] Function[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] get[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] hide[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] if[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] implements[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] import[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] in[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] inout[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] interface[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] is[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] late[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] library[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] mixin[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] native[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] new[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] null[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] of[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] on[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] operator[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] out[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] part[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] patch[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] required[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] rethrow[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] return[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] set[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] show[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] source[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] static[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] super[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] switch[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] sync[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] this[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] throw[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] true[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] try[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] typedef[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] var[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] void[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] while[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] with[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] yield[KeywordToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.scanner.expect
new file mode 100644
index 0000000..54c447e
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346.dart.scanner.expect
@@ -0,0 +1,141 @@
+class abstract {}
+class as {}
+class assert {}
+class async {}
+class await {}
+class break {}
+class case {}
+class catch {}
+class class {}
+class const {}
+class continue {}
+class covariant {}
+class default {}
+class deferred {}
+class do {}
+class dynamic {}
+class else {}
+class enum {}
+class export {}
+class extends {}
+class extension {}
+class external {}
+class factory {}
+class false {}
+class final {}
+class finally {}
+class for {}
+class Function {}
+class get {}
+class hide {}
+class if {}
+class implements {}
+class import {}
+class in {}
+class inout {}
+class interface {}
+class is {}
+class late {}
+class library {}
+class mixin {}
+class native {}
+class new {}
+class null {}
+class of {}
+class on {}
+class operator {}
+class out {}
+class part {}
+class patch {}
+class required {}
+class rethrow {}
+class return {}
+class set {}
+class show {}
+class source {}
+class static {}
+class super {}
+class switch {}
+class sync {}
+class this {}
+class throw {}
+class true {}
+class try {}
+class typedef {}
+class var {}
+class void {}
+class while {}
+class with {}
+class yield {}
+
+
+class[KeywordToken] abstract[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] as[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] assert[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] async[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] await[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] break[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] case[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] catch[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] class[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] const[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] continue[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] covariant[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] default[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] deferred[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] do[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] dynamic[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] else[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] enum[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] export[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] extends[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] extension[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] external[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] factory[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] false[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] final[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] finally[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] for[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] Function[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] get[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] hide[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] if[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] implements[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] import[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] in[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] inout[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] interface[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] is[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] late[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] library[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] mixin[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] native[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] new[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] null[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] of[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] on[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] operator[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] out[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] part[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] patch[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] required[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] rethrow[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] return[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] set[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] show[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] source[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] static[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] super[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] switch[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] sync[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] this[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] throw[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] true[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] try[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] typedef[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] var[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] void[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] while[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] with[KeywordToken] {[BeginToken]}[SimpleToken]
+class[KeywordToken] yield[KeywordToken] {[BeginToken]}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart
new file mode 100644
index 0000000..b70c6c3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart
@@ -0,0 +1,69 @@
+class abstract = A with B;
+class as = A with B;
+class assert = A with B;
+class async = A with B;
+class await = A with B;
+class break = A with B;
+class case = A with B;
+class catch = A with B;
+class class = A with B;
+class const = A with B;
+class continue = A with B;
+class covariant = A with B;
+class default = A with B;
+class deferred = A with B;
+class do = A with B;
+class dynamic = A with B;
+class else = A with B;
+class enum = A with B;
+class export = A with B;
+class extends = A with B;
+class extension = A with B;
+class external = A with B;
+class factory = A with B;
+class false = A with B;
+class final = A with B;
+class finally = A with B;
+class for = A with B;
+class Function = A with B;
+class get = A with B;
+class hide = A with B;
+class if = A with B;
+class implements = A with B;
+class import = A with B;
+class in = A with B;
+class inout = A with B;
+class interface = A with B;
+class is = A with B;
+class late = A with B;
+class library = A with B;
+class mixin = A with B;
+class native = A with B;
+class new = A with B;
+class null = A with B;
+class of = A with B;
+class on = A with B;
+class operator = A with B;
+class out = A with B;
+class part = A with B;
+class patch = A with B;
+class required = A with B;
+class rethrow = A with B;
+class return = A with B;
+class set = A with B;
+class show = A with B;
+class source = A with B;
+class static = A with B;
+class super = A with B;
+class switch = A with B;
+class sync = A with B;
+class this = A with B;
+class throw = A with B;
+class true = A with B;
+class try = A with B;
+class typedef = A with B;
+class var = A with B;
+class void = A with B;
+class while = A with B;
+class with = A with B;
+class yield = A with B;
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.expect
new file mode 100644
index 0000000..caa8b1a
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.expect
@@ -0,0 +1,1452 @@
+Problems reported:
+
+parser/error_recovery/issue_46346_prime_1:1:7: Can't use 'abstract' as a name here.
+class abstract = A with B;
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:2:7: Can't use 'as' as a name here.
+class as = A with B;
+      ^^
+
+parser/error_recovery/issue_46346_prime_1:3:7: 'assert' can't be used as an identifier because it's a keyword.
+class assert = A with B;
+      ^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:6:7: 'break' can't be used as an identifier because it's a keyword.
+class break = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:7:7: 'case' can't be used as an identifier because it's a keyword.
+class case = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:8:7: 'catch' can't be used as an identifier because it's a keyword.
+class catch = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:9:7: 'class' can't be used as an identifier because it's a keyword.
+class class = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:10:7: 'const' can't be used as an identifier because it's a keyword.
+class const = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:11:7: 'continue' can't be used as an identifier because it's a keyword.
+class continue = A with B;
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:12:7: Can't use 'covariant' as a name here.
+class covariant = A with B;
+      ^^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:13:7: 'default' can't be used as an identifier because it's a keyword.
+class default = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:14:7: Can't use 'deferred' as a name here.
+class deferred = A with B;
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:15:7: 'do' can't be used as an identifier because it's a keyword.
+class do = A with B;
+      ^^
+
+parser/error_recovery/issue_46346_prime_1:16:7: Can't use 'dynamic' as a name here.
+class dynamic = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:17:7: 'else' can't be used as an identifier because it's a keyword.
+class else = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:18:7: 'enum' can't be used as an identifier because it's a keyword.
+class enum = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:19:7: Can't use 'export' as a name here.
+class export = A with B;
+      ^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:20:7: 'extends' can't be used as an identifier because it's a keyword.
+class extends = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:21:7: Can't use 'extension' as a name here.
+class extension = A with B;
+      ^^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:22:7: Can't use 'external' as a name here.
+class external = A with B;
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:23:7: Can't use 'factory' as a name here.
+class factory = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:24:7: 'false' can't be used as an identifier because it's a keyword.
+class false = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:25:7: 'final' can't be used as an identifier because it's a keyword.
+class final = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:26:7: 'finally' can't be used as an identifier because it's a keyword.
+class finally = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:27:7: 'for' can't be used as an identifier because it's a keyword.
+class for = A with B;
+      ^^^
+
+parser/error_recovery/issue_46346_prime_1:29:7: Can't use 'get' as a name here.
+class get = A with B;
+      ^^^
+
+parser/error_recovery/issue_46346_prime_1:31:7: 'if' can't be used as an identifier because it's a keyword.
+class if = A with B;
+      ^^
+
+parser/error_recovery/issue_46346_prime_1:32:7: Can't use 'implements' as a name here.
+class implements = A with B;
+      ^^^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:33:7: Can't use 'import' as a name here.
+class import = A with B;
+      ^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:34:7: 'in' can't be used as an identifier because it's a keyword.
+class in = A with B;
+      ^^
+
+parser/error_recovery/issue_46346_prime_1:36:7: Can't use 'interface' as a name here.
+class interface = A with B;
+      ^^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:37:7: 'is' can't be used as an identifier because it's a keyword.
+class is = A with B;
+      ^^
+
+parser/error_recovery/issue_46346_prime_1:38:7: Can't use 'late' as a name here.
+class late = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:39:7: Can't use 'library' as a name here.
+class library = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:40:7: Can't use 'mixin' as a name here.
+class mixin = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:42:7: 'new' can't be used as an identifier because it's a keyword.
+class new = A with B;
+      ^^^
+
+parser/error_recovery/issue_46346_prime_1:43:7: 'null' can't be used as an identifier because it's a keyword.
+class null = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:46:7: Can't use 'operator' as a name here.
+class operator = A with B;
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:48:7: Can't use 'part' as a name here.
+class part = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:50:7: Can't use 'required' as a name here.
+class required = A with B;
+      ^^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:51:7: 'rethrow' can't be used as an identifier because it's a keyword.
+class rethrow = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:52:7: 'return' can't be used as an identifier because it's a keyword.
+class return = A with B;
+      ^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:53:7: Can't use 'set' as a name here.
+class set = A with B;
+      ^^^
+
+parser/error_recovery/issue_46346_prime_1:56:7: Can't use 'static' as a name here.
+class static = A with B;
+      ^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:57:7: 'super' can't be used as an identifier because it's a keyword.
+class super = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:58:7: 'switch' can't be used as an identifier because it's a keyword.
+class switch = A with B;
+      ^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:60:7: 'this' can't be used as an identifier because it's a keyword.
+class this = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:61:7: 'throw' can't be used as an identifier because it's a keyword.
+class throw = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:62:7: 'true' can't be used as an identifier because it's a keyword.
+class true = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:63:7: 'try' can't be used as an identifier because it's a keyword.
+class try = A with B;
+      ^^^
+
+parser/error_recovery/issue_46346_prime_1:64:7: Can't use 'typedef' as a name here.
+class typedef = A with B;
+      ^^^^^^^
+
+parser/error_recovery/issue_46346_prime_1:65:7: 'var' can't be used as an identifier because it's a keyword.
+class var = A with B;
+      ^^^
+
+parser/error_recovery/issue_46346_prime_1:66:7: 'void' can't be used as an identifier because it's a keyword.
+class void = A with B;
+      ^^^^
+
+parser/error_recovery/issue_46346_prime_1:67:7: 'while' can't be used as an identifier because it's a keyword.
+class while = A with B;
+      ^^^^^
+
+parser/error_recovery/issue_46346_prime_1:68:7: 'with' can't be used as an identifier because it's a keyword.
+class with = A with B;
+      ^^^^
+
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
+    handleIdentifier(abstract, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, abstract)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
+    handleIdentifier(as, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, as)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+    handleIdentifier(assert, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, assert)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(async, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, async)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(await, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, await)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+    handleIdentifier(break, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, break)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+    handleIdentifier(case, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, case)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+    handleIdentifier(catch, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, catch)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+    handleIdentifier(class, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, class)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+    handleIdentifier(const, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, const)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+    handleIdentifier(continue, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, continue)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
+    handleIdentifier(covariant, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, covariant)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+    handleIdentifier(default, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, default)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
+    handleIdentifier(deferred, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, deferred)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+    handleIdentifier(do, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, do)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
+    handleIdentifier(dynamic, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, dynamic)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+    handleIdentifier(else, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, else)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+    handleIdentifier(enum, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, enum)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
+    handleIdentifier(export, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, export)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+    handleIdentifier(extends, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, extends)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
+    handleIdentifier(extension, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, extension)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
+    handleIdentifier(external, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, external)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
+    handleIdentifier(factory, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, factory)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+    handleIdentifier(false, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, false)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+    handleIdentifier(final, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, final)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+    handleIdentifier(finally, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, finally)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+    handleIdentifier(for, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, for)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(Function, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, Function)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
+    handleIdentifier(get, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, get)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(hide, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, hide)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+    handleIdentifier(if, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, if)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
+    handleIdentifier(implements, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, implements)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
+    handleIdentifier(import, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, import)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+    handleIdentifier(in, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, in)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(inout, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, inout)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
+    handleIdentifier(interface, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, interface)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+    handleIdentifier(is, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, is)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
+    handleIdentifier(late, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, late)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
+    handleIdentifier(library, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, library)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
+    handleIdentifier(mixin, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, mixin)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(native, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, native)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+    handleIdentifier(new, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, new)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+    handleIdentifier(null, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, null)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(of, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, of)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(on, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, on)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
+    handleIdentifier(operator, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, operator)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(out, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, out)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
+    handleIdentifier(part, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, part)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(patch, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, patch)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
+    handleIdentifier(required, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, required)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+    handleIdentifier(rethrow, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, rethrow)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+    handleIdentifier(return, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, return)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
+    handleIdentifier(set, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, set)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(show, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, show)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(source, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, source)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
+    handleIdentifier(static, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, static)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+    handleIdentifier(super, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, super)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+    handleIdentifier(switch, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, switch)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(sync, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, sync)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+    handleIdentifier(this, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, this)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+    handleIdentifier(throw, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, throw)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+    handleIdentifier(true, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, true)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+    handleIdentifier(try, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, try)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
+    handleIdentifier(typedef, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, typedef)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+    handleIdentifier(var, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, var)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
+    handleIdentifier(void, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, void)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+    handleIdentifier(while, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, while)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+    handleIdentifier(with, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, with)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleIdentifier(yield, classOrMixinDeclaration)
+    handleNoTypeVariables(=)
+    beginNamedMixinApplication(class, null, yield)
+      handleIdentifier(A, typeReference)
+      handleNoTypeArguments(with)
+      handleType(A, null)
+      beginTypeList(B)
+        handleIdentifier(B, typeReference)
+        handleNoTypeArguments(;)
+        handleType(B, null)
+      endTypeList(1)
+      handleNamedMixinApplicationWithClause(with)
+    endNamedMixinApplication(class, class, =, null, ;)
+  endTopLevelDeclaration()
+endCompilationUnit(69, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.intertwined.expect
new file mode 100644
index 0000000..d0f33a6
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.intertwined.expect
@@ -0,0 +1,1979 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(abstract, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'abstract' as a name here., null, {lexeme: abstract}], abstract, abstract)
+          listener: handleIdentifier(abstract, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, abstract)
+        parseNamedMixinApplication(abstract, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(as, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'as' as a name here., null, {lexeme: as}], as, as)
+          listener: handleIdentifier(as, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, as)
+        parseNamedMixinApplication(as, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(assert, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+          listener: handleIdentifier(assert, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, assert)
+        parseNamedMixinApplication(assert, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(async, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, async)
+        parseNamedMixinApplication(async, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(await, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, await)
+        parseNamedMixinApplication(await, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(break, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+          listener: handleIdentifier(break, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, break)
+        parseNamedMixinApplication(break, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(case, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+          listener: handleIdentifier(case, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, case)
+        parseNamedMixinApplication(case, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(catch, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+          listener: handleIdentifier(catch, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, catch)
+        parseNamedMixinApplication(catch, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(class, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+          listener: handleIdentifier(class, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, class)
+        parseNamedMixinApplication(class, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(const, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+          listener: handleIdentifier(const, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, const)
+        parseNamedMixinApplication(const, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(continue, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+          listener: handleIdentifier(continue, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, continue)
+        parseNamedMixinApplication(continue, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(covariant, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'covariant' as a name here., null, {lexeme: covariant}], covariant, covariant)
+          listener: handleIdentifier(covariant, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, covariant)
+        parseNamedMixinApplication(covariant, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(default, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+          listener: handleIdentifier(default, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, default)
+        parseNamedMixinApplication(default, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(deferred, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'deferred' as a name here., null, {lexeme: deferred}], deferred, deferred)
+          listener: handleIdentifier(deferred, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, deferred)
+        parseNamedMixinApplication(deferred, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(do, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+          listener: handleIdentifier(do, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, do)
+        parseNamedMixinApplication(do, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(dynamic, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'dynamic' as a name here., null, {lexeme: dynamic}], dynamic, dynamic)
+          listener: handleIdentifier(dynamic, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, dynamic)
+        parseNamedMixinApplication(dynamic, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(else, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+          listener: handleIdentifier(else, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, else)
+        parseNamedMixinApplication(else, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(enum, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+          listener: handleIdentifier(enum, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, enum)
+        parseNamedMixinApplication(enum, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(export, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'export' as a name here., null, {lexeme: export}], export, export)
+          listener: handleIdentifier(export, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, export)
+        parseNamedMixinApplication(export, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(extends, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+          listener: handleIdentifier(extends, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, extends)
+        parseNamedMixinApplication(extends, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(extension, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'extension' as a name here., null, {lexeme: extension}], extension, extension)
+          listener: handleIdentifier(extension, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, extension)
+        parseNamedMixinApplication(extension, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(external, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'external' as a name here., null, {lexeme: external}], external, external)
+          listener: handleIdentifier(external, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, external)
+        parseNamedMixinApplication(external, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(factory, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'factory' as a name here., null, {lexeme: factory}], factory, factory)
+          listener: handleIdentifier(factory, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, factory)
+        parseNamedMixinApplication(factory, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(false, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+          listener: handleIdentifier(false, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, false)
+        parseNamedMixinApplication(false, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(final, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+          listener: handleIdentifier(final, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, final)
+        parseNamedMixinApplication(final, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(finally, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+          listener: handleIdentifier(finally, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, finally)
+        parseNamedMixinApplication(finally, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(for, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+          listener: handleIdentifier(for, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, for)
+        parseNamedMixinApplication(for, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(Function, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, Function)
+        parseNamedMixinApplication(Function, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(get, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'get' as a name here., null, {lexeme: get}], get, get)
+          listener: handleIdentifier(get, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, get)
+        parseNamedMixinApplication(get, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(hide, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, hide)
+        parseNamedMixinApplication(hide, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(if, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+          listener: handleIdentifier(if, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, if)
+        parseNamedMixinApplication(if, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(implements, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'implements' as a name here., null, {lexeme: implements}], implements, implements)
+          listener: handleIdentifier(implements, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, implements)
+        parseNamedMixinApplication(implements, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(import, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'import' as a name here., null, {lexeme: import}], import, import)
+          listener: handleIdentifier(import, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, import)
+        parseNamedMixinApplication(import, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(in, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+          listener: handleIdentifier(in, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, in)
+        parseNamedMixinApplication(in, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(inout, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, inout)
+        parseNamedMixinApplication(inout, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(interface, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'interface' as a name here., null, {lexeme: interface}], interface, interface)
+          listener: handleIdentifier(interface, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, interface)
+        parseNamedMixinApplication(interface, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(is, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+          listener: handleIdentifier(is, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, is)
+        parseNamedMixinApplication(is, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(late, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'late' as a name here., null, {lexeme: late}], late, late)
+          listener: handleIdentifier(late, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, late)
+        parseNamedMixinApplication(late, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(library, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'library' as a name here., null, {lexeme: library}], library, library)
+          listener: handleIdentifier(library, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, library)
+        parseNamedMixinApplication(library, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(mixin, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'mixin' as a name here., null, {lexeme: mixin}], mixin, mixin)
+          listener: handleIdentifier(mixin, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, mixin)
+        parseNamedMixinApplication(mixin, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(native, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, native)
+        parseNamedMixinApplication(native, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(new, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+          listener: handleIdentifier(new, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, new)
+        parseNamedMixinApplication(new, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(null, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+          listener: handleIdentifier(null, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, null)
+        parseNamedMixinApplication(null, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(of, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, of)
+        parseNamedMixinApplication(of, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(on, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, on)
+        parseNamedMixinApplication(on, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(operator, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'operator' as a name here., null, {lexeme: operator}], operator, operator)
+          listener: handleIdentifier(operator, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, operator)
+        parseNamedMixinApplication(operator, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(out, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, out)
+        parseNamedMixinApplication(out, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(part, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'part' as a name here., null, {lexeme: part}], part, part)
+          listener: handleIdentifier(part, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, part)
+        parseNamedMixinApplication(part, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(patch, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, patch)
+        parseNamedMixinApplication(patch, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(required, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'required' as a name here., null, {lexeme: required}], required, required)
+          listener: handleIdentifier(required, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, required)
+        parseNamedMixinApplication(required, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(rethrow, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+          listener: handleIdentifier(rethrow, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, rethrow)
+        parseNamedMixinApplication(rethrow, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+          listener: handleIdentifier(return, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, return)
+        parseNamedMixinApplication(return, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(set, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'set' as a name here., null, {lexeme: set}], set, set)
+          listener: handleIdentifier(set, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, set)
+        parseNamedMixinApplication(set, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(show, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, show)
+        parseNamedMixinApplication(show, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(source, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, source)
+        parseNamedMixinApplication(source, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(static, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'static' as a name here., null, {lexeme: static}], static, static)
+          listener: handleIdentifier(static, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, static)
+        parseNamedMixinApplication(static, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(super, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+          listener: handleIdentifier(super, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, super)
+        parseNamedMixinApplication(super, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(switch, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+          listener: handleIdentifier(switch, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, switch)
+        parseNamedMixinApplication(switch, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(sync, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, sync)
+        parseNamedMixinApplication(sync, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(this, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+          listener: handleIdentifier(this, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, this)
+        parseNamedMixinApplication(this, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(throw, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+          listener: handleIdentifier(throw, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, throw)
+        parseNamedMixinApplication(throw, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(true, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+          listener: handleIdentifier(true, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, true)
+        parseNamedMixinApplication(true, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(try, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+          listener: handleIdentifier(try, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, try)
+        parseNamedMixinApplication(try, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(typedef, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[BuiltInIdentifierInDeclaration, Can't use 'typedef' as a name here., null, {lexeme: typedef}], typedef, typedef)
+          listener: handleIdentifier(typedef, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, typedef)
+        parseNamedMixinApplication(typedef, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(var, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+          listener: handleIdentifier(var, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, var)
+        parseNamedMixinApplication(var, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(void, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
+          listener: handleIdentifier(void, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, void)
+        parseNamedMixinApplication(void, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(while, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+          listener: handleIdentifier(while, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, while)
+        parseNamedMixinApplication(while, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
+            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+          listener: handleIdentifier(with, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, with)
+        parseNamedMixinApplication(with, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration(class)
+  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
+    parseMetadataStar(;)
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(;, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(;, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          listener: handleIdentifier(yield, classOrMixinDeclaration)
+        listener: handleNoTypeVariables(=)
+        listener: beginNamedMixinApplication(class, null, yield)
+        parseNamedMixinApplication(yield, class, class)
+          listener: handleIdentifier(A, typeReference)
+          listener: handleNoTypeArguments(with)
+          listener: handleType(A, null)
+          parseMixinApplicationRest(A)
+            parseTypeList(with)
+              listener: beginTypeList(B)
+              listener: handleIdentifier(B, typeReference)
+              listener: handleNoTypeArguments(;)
+              listener: handleType(B, null)
+              listener: endTypeList(1)
+            listener: handleNamedMixinApplicationWithClause(with)
+          ensureSemicolon(B)
+          listener: endNamedMixinApplication(class, class, =, null, ;)
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(69, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.parser.expect
new file mode 100644
index 0000000..049b7d1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.parser.expect
@@ -0,0 +1,141 @@
+class abstract = A with B;
+class as = A with B;
+class assert = A with B;
+class async = A with B;
+class await = A with B;
+class break = A with B;
+class case = A with B;
+class catch = A with B;
+class class = A with B;
+class const = A with B;
+class continue = A with B;
+class covariant = A with B;
+class default = A with B;
+class deferred = A with B;
+class do = A with B;
+class dynamic = A with B;
+class else = A with B;
+class enum = A with B;
+class export = A with B;
+class extends = A with B;
+class extension = A with B;
+class external = A with B;
+class factory = A with B;
+class false = A with B;
+class final = A with B;
+class finally = A with B;
+class for = A with B;
+class Function = A with B;
+class get = A with B;
+class hide = A with B;
+class if = A with B;
+class implements = A with B;
+class import = A with B;
+class in = A with B;
+class inout = A with B;
+class interface = A with B;
+class is = A with B;
+class late = A with B;
+class library = A with B;
+class mixin = A with B;
+class native = A with B;
+class new = A with B;
+class null = A with B;
+class of = A with B;
+class on = A with B;
+class operator = A with B;
+class out = A with B;
+class part = A with B;
+class patch = A with B;
+class required = A with B;
+class rethrow = A with B;
+class return = A with B;
+class set = A with B;
+class show = A with B;
+class source = A with B;
+class static = A with B;
+class super = A with B;
+class switch = A with B;
+class sync = A with B;
+class this = A with B;
+class throw = A with B;
+class true = A with B;
+class try = A with B;
+class typedef = A with B;
+class var = A with B;
+class void = A with B;
+class while = A with B;
+class with = A with B;
+class yield = A with B;
+
+
+class[KeywordToken] abstract[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] as[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] assert[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] async[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] await[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] break[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] case[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] catch[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] class[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] const[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] continue[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] covariant[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] default[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] deferred[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] do[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] dynamic[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] else[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] enum[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] export[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] extends[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] extension[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] external[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] factory[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] false[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] final[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] finally[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] for[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] Function[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] get[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] hide[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] if[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] implements[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] import[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] in[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] inout[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] interface[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] is[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] late[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] library[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] mixin[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] native[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] new[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] null[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] of[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] on[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] operator[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] out[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] part[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] patch[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] required[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] rethrow[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] return[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] set[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] show[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] source[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] static[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] super[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] switch[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] sync[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] this[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] throw[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] true[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] try[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] typedef[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] var[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] void[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] while[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] with[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] yield[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.scanner.expect
new file mode 100644
index 0000000..049b7d1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_1.dart.scanner.expect
@@ -0,0 +1,141 @@
+class abstract = A with B;
+class as = A with B;
+class assert = A with B;
+class async = A with B;
+class await = A with B;
+class break = A with B;
+class case = A with B;
+class catch = A with B;
+class class = A with B;
+class const = A with B;
+class continue = A with B;
+class covariant = A with B;
+class default = A with B;
+class deferred = A with B;
+class do = A with B;
+class dynamic = A with B;
+class else = A with B;
+class enum = A with B;
+class export = A with B;
+class extends = A with B;
+class extension = A with B;
+class external = A with B;
+class factory = A with B;
+class false = A with B;
+class final = A with B;
+class finally = A with B;
+class for = A with B;
+class Function = A with B;
+class get = A with B;
+class hide = A with B;
+class if = A with B;
+class implements = A with B;
+class import = A with B;
+class in = A with B;
+class inout = A with B;
+class interface = A with B;
+class is = A with B;
+class late = A with B;
+class library = A with B;
+class mixin = A with B;
+class native = A with B;
+class new = A with B;
+class null = A with B;
+class of = A with B;
+class on = A with B;
+class operator = A with B;
+class out = A with B;
+class part = A with B;
+class patch = A with B;
+class required = A with B;
+class rethrow = A with B;
+class return = A with B;
+class set = A with B;
+class show = A with B;
+class source = A with B;
+class static = A with B;
+class super = A with B;
+class switch = A with B;
+class sync = A with B;
+class this = A with B;
+class throw = A with B;
+class true = A with B;
+class try = A with B;
+class typedef = A with B;
+class var = A with B;
+class void = A with B;
+class while = A with B;
+class with = A with B;
+class yield = A with B;
+
+
+class[KeywordToken] abstract[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] as[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] assert[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] async[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] await[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] break[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] case[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] catch[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] class[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] const[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] continue[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] covariant[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] default[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] deferred[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] do[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] dynamic[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] else[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] enum[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] export[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] extends[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] extension[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] external[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] factory[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] false[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] final[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] finally[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] for[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] Function[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] get[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] hide[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] if[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] implements[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] import[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] in[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] inout[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] interface[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] is[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] late[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] library[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] mixin[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] native[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] new[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] null[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] of[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] on[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] operator[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] out[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] part[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] patch[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] required[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] rethrow[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] return[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] set[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] show[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] source[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] static[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] super[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] switch[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] sync[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] this[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] throw[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] true[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] try[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] typedef[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] var[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] void[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] while[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] with[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+class[KeywordToken] yield[KeywordToken] =[SimpleToken] A[StringToken] with[KeywordToken] B[StringToken];[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart
new file mode 100644
index 0000000..1e88aff
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart
@@ -0,0 +1 @@
+class
\ No newline at end of file
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
new file mode 100644
index 0000000..86afa58
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.expect
@@ -0,0 +1,40 @@
+Problems reported:
+
+parser/error_recovery/issue_46346_prime_2:1:6: Expected an identifier, but got ''.
+class
+     ^...
+
+WARNING: Reporting at eof --- see below for details.
+
+parser/error_recovery/issue_46346_prime_2:1:6: A class declaration must have a body, even if it is empty.
+class
+     ^...
+
+WARNING: Reporting at eof --- see below for details.
+
+beginCompilationUnit(class)
+  beginMetadataStar(class)
+  endMetadataStar(0)
+  beginClassOrNamedMixinApplicationPrelude(class)
+    handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ''., Try inserting an identifier before ''., {lexeme: }], , )
+    // WARNING: Reporting at eof for .
+    handleIdentifier(, classOrMixinDeclaration)
+    handleNoTypeVariables()
+    beginClassDeclaration(class, null, )
+      handleNoType()
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleClassHeader(class, class, null)
+      handleNoType()
+      handleClassExtends(null, 1)
+      handleClassNoWithClause()
+      handleClassOrMixinImplements(null, 0)
+      handleRecoverClassHeader()
+      handleRecoverableError(Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}], , )
+      // WARNING: Reporting at eof for .
+      beginClassOrMixinBody(DeclarationKind.Class, {)
+      endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+    endClassDeclaration(class, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
new file mode 100644
index 0000000..766bdc3
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.intertwined.expect
@@ -0,0 +1,60 @@
+parseUnit(class)
+  skipErrorTokens(class)
+  listener: beginCompilationUnit(class)
+  syntheticPreviousToken(class)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(class)
+      listener: endMetadataStar(0)
+    parseTopLevelKeywordDeclaration(, class, Instance of 'DirectiveContext')
+      parseClassDeclarationModifiers(, class)
+      parseClassOrNamedMixinApplication(null, class)
+        listener: beginClassOrNamedMixinApplicationPrelude(class)
+        ensureIdentifier(class, classOrMixinDeclaration)
+          insertSyntheticIdentifier(class, classOrMixinDeclaration, message: Message[ExpectedIdentifier, Expected an identifier, but got ''., Try inserting an identifier before ''., {lexeme: }], messageOnToken: null)
+            reportRecoverableError(, Message[ExpectedIdentifier, Expected an identifier, but got ''., Try inserting an identifier before ''., {lexeme: }])
+              listener: handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ''., Try inserting an identifier before ''., {lexeme: }], , )
+              listener: // WARNING: Reporting at eof for .
+            rewriter()
+          listener: handleIdentifier(, classOrMixinDeclaration)
+        listener: handleNoTypeVariables()
+        listener: beginClassDeclaration(class, null, )
+        parseClass(, class, class, )
+          parseClassHeaderOpt(, class, class)
+            parseClassExtendsOpt()
+              listener: handleNoType()
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt()
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt()
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleClassHeader(class, class, null)
+          parseClassHeaderRecovery(, class, class)
+            parseClassHeaderOpt(, class, class)
+              parseClassExtendsOpt()
+              parseWithClauseOpt()
+              parseClassOrMixinImplementsOpt()
+            skipUnexpectedTokenOpt(, [extends, with, implements, {])
+            parseClassExtendsOpt()
+              listener: handleNoType()
+              listener: handleClassExtends(null, 1)
+            parseWithClauseOpt()
+              listener: handleClassNoWithClause()
+            parseClassOrMixinImplementsOpt()
+              listener: handleClassOrMixinImplements(null, 0)
+            listener: handleRecoverClassHeader()
+          ensureBlock(, null, class declaration)
+            reportRecoverableError(, Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}])
+              listener: handleRecoverableError(Message[ExpectedClassOrMixinBody, A class declaration must have a body, even if it is empty., Try adding an empty body., {string: class declaration}], , )
+              listener: // WARNING: Reporting at eof for .
+            insertBlock()
+              rewriter()
+              rewriter()
+          parseClassOrMixinOrExtensionBody(, DeclarationKind.Class, )
+            listener: beginClassOrMixinBody(DeclarationKind.Class, {)
+            notEofOrValue(}, })
+            listener: endClassOrMixinBody(DeclarationKind.Class, 0, {, })
+          listener: endClassDeclaration(class, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(class)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.parser.expect
new file mode 100644
index 0000000..6294f83
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.parser.expect
@@ -0,0 +1,5 @@
+NOTICE: Stream was rewritten by parser!
+
+class{}
+
+class[KeywordToken][SyntheticStringToken]{[SyntheticBeginToken]}[SyntheticToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.scanner.expect
new file mode 100644
index 0000000..dedca4c
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/issue_46346_prime_2.dart.scanner.expect
@@ -0,0 +1,3 @@
+class
+
+class[KeywordToken][SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/symbols.dart b/pkg/front_end/parser_testcases/error_recovery/symbols.dart
new file mode 100644
index 0000000..000061f
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/symbols.dart
@@ -0,0 +1,101 @@
+main() {
+  #void;
+  #void.foo;
+  #foo.void;
+  #assert;
+  #break;
+  #case;
+  #catch;
+  #class;
+  #const;
+  #continue;
+  #default;
+  #do;
+  #else;
+  #enum;
+  #extends;
+  #false;
+  #final;
+  #finally;
+  #for;
+  #if;
+  #in;
+  #is;
+  #new;
+  #null;
+  #rethrow;
+  #return;
+  #super;
+  #switch;
+  #this;
+  #throw;
+  #true;
+  #try;
+  #var;
+  #while;
+  #with;
+  #foo.assert;
+  #foo.break;
+  #foo.case;
+  #foo.catch;
+  #foo.class;
+  #foo.const;
+  #foo.continue;
+  #foo.default;
+  #foo.do;
+  #foo.else;
+  #foo.enum;
+  #foo.extends;
+  #foo.false;
+  #foo.final;
+  #foo.finally;
+  #foo.for;
+  #foo.if;
+  #foo.in;
+  #foo.is;
+  #foo.new;
+  #foo.null;
+  #foo.rethrow;
+  #foo.return;
+  #foo.super;
+  #foo.switch;
+  #foo.this;
+  #foo.throw;
+  #foo.true;
+  #foo.try;
+  #foo.var;
+  #foo.while;
+  #foo.with;
+  #assert.foo;
+  #break.foo;
+  #case.foo;
+  #catch.foo;
+  #class.foo;
+  #const.foo;
+  #continue.foo;
+  #default.foo;
+  #do.foo;
+  #else.foo;
+  #enum.foo;
+  #extends.foo;
+  #false.foo;
+  #final.foo;
+  #finally.foo;
+  #for.foo;
+  #if.foo;
+  #in.foo;
+  #is.foo;
+  #new.foo;
+  #null.foo;
+  #rethrow.foo;
+  #return.foo;
+  #super.foo;
+  #switch.foo;
+  #this.foo;
+  #throw.foo;
+  #true.foo;
+  #try.foo;
+  #var.foo;
+  #while.foo;
+  #with.foo;
+}
diff --git a/pkg/front_end/parser_testcases/error_recovery/symbols.dart.expect b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.expect
new file mode 100644
index 0000000..0e96030
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.expect
@@ -0,0 +1,969 @@
+Problems reported:
+
+parser/error_recovery/symbols:4:8: 'void' can't be used as an identifier because it's a keyword.
+  #foo.void;
+       ^^^^
+
+parser/error_recovery/symbols:5:4: 'assert' can't be used as an identifier because it's a keyword.
+  #assert;
+   ^^^^^^
+
+parser/error_recovery/symbols:6:4: 'break' can't be used as an identifier because it's a keyword.
+  #break;
+   ^^^^^
+
+parser/error_recovery/symbols:7:4: 'case' can't be used as an identifier because it's a keyword.
+  #case;
+   ^^^^
+
+parser/error_recovery/symbols:8:4: 'catch' can't be used as an identifier because it's a keyword.
+  #catch;
+   ^^^^^
+
+parser/error_recovery/symbols:9:4: 'class' can't be used as an identifier because it's a keyword.
+  #class;
+   ^^^^^
+
+parser/error_recovery/symbols:10:4: 'const' can't be used as an identifier because it's a keyword.
+  #const;
+   ^^^^^
+
+parser/error_recovery/symbols:11:4: 'continue' can't be used as an identifier because it's a keyword.
+  #continue;
+   ^^^^^^^^
+
+parser/error_recovery/symbols:12:4: 'default' can't be used as an identifier because it's a keyword.
+  #default;
+   ^^^^^^^
+
+parser/error_recovery/symbols:13:4: 'do' can't be used as an identifier because it's a keyword.
+  #do;
+   ^^
+
+parser/error_recovery/symbols:14:4: 'else' can't be used as an identifier because it's a keyword.
+  #else;
+   ^^^^
+
+parser/error_recovery/symbols:15:4: 'enum' can't be used as an identifier because it's a keyword.
+  #enum;
+   ^^^^
+
+parser/error_recovery/symbols:16:4: 'extends' can't be used as an identifier because it's a keyword.
+  #extends;
+   ^^^^^^^
+
+parser/error_recovery/symbols:17:4: 'false' can't be used as an identifier because it's a keyword.
+  #false;
+   ^^^^^
+
+parser/error_recovery/symbols:18:4: 'final' can't be used as an identifier because it's a keyword.
+  #final;
+   ^^^^^
+
+parser/error_recovery/symbols:19:4: 'finally' can't be used as an identifier because it's a keyword.
+  #finally;
+   ^^^^^^^
+
+parser/error_recovery/symbols:20:4: 'for' can't be used as an identifier because it's a keyword.
+  #for;
+   ^^^
+
+parser/error_recovery/symbols:21:4: 'if' can't be used as an identifier because it's a keyword.
+  #if;
+   ^^
+
+parser/error_recovery/symbols:22:4: 'in' can't be used as an identifier because it's a keyword.
+  #in;
+   ^^
+
+parser/error_recovery/symbols:23:4: 'is' can't be used as an identifier because it's a keyword.
+  #is;
+   ^^
+
+parser/error_recovery/symbols:24:4: 'new' can't be used as an identifier because it's a keyword.
+  #new;
+   ^^^
+
+parser/error_recovery/symbols:25:4: 'null' can't be used as an identifier because it's a keyword.
+  #null;
+   ^^^^
+
+parser/error_recovery/symbols:26:4: 'rethrow' can't be used as an identifier because it's a keyword.
+  #rethrow;
+   ^^^^^^^
+
+parser/error_recovery/symbols:27:4: 'return' can't be used as an identifier because it's a keyword.
+  #return;
+   ^^^^^^
+
+parser/error_recovery/symbols:28:4: 'super' can't be used as an identifier because it's a keyword.
+  #super;
+   ^^^^^
+
+parser/error_recovery/symbols:29:4: 'switch' can't be used as an identifier because it's a keyword.
+  #switch;
+   ^^^^^^
+
+parser/error_recovery/symbols:30:4: 'this' can't be used as an identifier because it's a keyword.
+  #this;
+   ^^^^
+
+parser/error_recovery/symbols:31:4: 'throw' can't be used as an identifier because it's a keyword.
+  #throw;
+   ^^^^^
+
+parser/error_recovery/symbols:32:4: 'true' can't be used as an identifier because it's a keyword.
+  #true;
+   ^^^^
+
+parser/error_recovery/symbols:33:4: 'try' can't be used as an identifier because it's a keyword.
+  #try;
+   ^^^
+
+parser/error_recovery/symbols:34:4: 'var' can't be used as an identifier because it's a keyword.
+  #var;
+   ^^^
+
+parser/error_recovery/symbols:35:4: 'while' can't be used as an identifier because it's a keyword.
+  #while;
+   ^^^^^
+
+parser/error_recovery/symbols:36:4: 'with' can't be used as an identifier because it's a keyword.
+  #with;
+   ^^^^
+
+parser/error_recovery/symbols:37:8: 'assert' can't be used as an identifier because it's a keyword.
+  #foo.assert;
+       ^^^^^^
+
+parser/error_recovery/symbols:38:8: 'break' can't be used as an identifier because it's a keyword.
+  #foo.break;
+       ^^^^^
+
+parser/error_recovery/symbols:39:8: 'case' can't be used as an identifier because it's a keyword.
+  #foo.case;
+       ^^^^
+
+parser/error_recovery/symbols:40:8: 'catch' can't be used as an identifier because it's a keyword.
+  #foo.catch;
+       ^^^^^
+
+parser/error_recovery/symbols:41:8: 'class' can't be used as an identifier because it's a keyword.
+  #foo.class;
+       ^^^^^
+
+parser/error_recovery/symbols:42:8: 'const' can't be used as an identifier because it's a keyword.
+  #foo.const;
+       ^^^^^
+
+parser/error_recovery/symbols:43:8: 'continue' can't be used as an identifier because it's a keyword.
+  #foo.continue;
+       ^^^^^^^^
+
+parser/error_recovery/symbols:44:8: 'default' can't be used as an identifier because it's a keyword.
+  #foo.default;
+       ^^^^^^^
+
+parser/error_recovery/symbols:45:8: 'do' can't be used as an identifier because it's a keyword.
+  #foo.do;
+       ^^
+
+parser/error_recovery/symbols:46:8: 'else' can't be used as an identifier because it's a keyword.
+  #foo.else;
+       ^^^^
+
+parser/error_recovery/symbols:47:8: 'enum' can't be used as an identifier because it's a keyword.
+  #foo.enum;
+       ^^^^
+
+parser/error_recovery/symbols:48:8: 'extends' can't be used as an identifier because it's a keyword.
+  #foo.extends;
+       ^^^^^^^
+
+parser/error_recovery/symbols:49:8: 'false' can't be used as an identifier because it's a keyword.
+  #foo.false;
+       ^^^^^
+
+parser/error_recovery/symbols:50:8: 'final' can't be used as an identifier because it's a keyword.
+  #foo.final;
+       ^^^^^
+
+parser/error_recovery/symbols:51:8: 'finally' can't be used as an identifier because it's a keyword.
+  #foo.finally;
+       ^^^^^^^
+
+parser/error_recovery/symbols:52:8: 'for' can't be used as an identifier because it's a keyword.
+  #foo.for;
+       ^^^
+
+parser/error_recovery/symbols:53:8: 'if' can't be used as an identifier because it's a keyword.
+  #foo.if;
+       ^^
+
+parser/error_recovery/symbols:54:8: 'in' can't be used as an identifier because it's a keyword.
+  #foo.in;
+       ^^
+
+parser/error_recovery/symbols:55:8: 'is' can't be used as an identifier because it's a keyword.
+  #foo.is;
+       ^^
+
+parser/error_recovery/symbols:56:8: 'new' can't be used as an identifier because it's a keyword.
+  #foo.new;
+       ^^^
+
+parser/error_recovery/symbols:57:8: 'null' can't be used as an identifier because it's a keyword.
+  #foo.null;
+       ^^^^
+
+parser/error_recovery/symbols:58:8: 'rethrow' can't be used as an identifier because it's a keyword.
+  #foo.rethrow;
+       ^^^^^^^
+
+parser/error_recovery/symbols:59:8: 'return' can't be used as an identifier because it's a keyword.
+  #foo.return;
+       ^^^^^^
+
+parser/error_recovery/symbols:60:8: 'super' can't be used as an identifier because it's a keyword.
+  #foo.super;
+       ^^^^^
+
+parser/error_recovery/symbols:61:8: 'switch' can't be used as an identifier because it's a keyword.
+  #foo.switch;
+       ^^^^^^
+
+parser/error_recovery/symbols:62:8: 'this' can't be used as an identifier because it's a keyword.
+  #foo.this;
+       ^^^^
+
+parser/error_recovery/symbols:63:8: 'throw' can't be used as an identifier because it's a keyword.
+  #foo.throw;
+       ^^^^^
+
+parser/error_recovery/symbols:64:8: 'true' can't be used as an identifier because it's a keyword.
+  #foo.true;
+       ^^^^
+
+parser/error_recovery/symbols:65:8: 'try' can't be used as an identifier because it's a keyword.
+  #foo.try;
+       ^^^
+
+parser/error_recovery/symbols:66:8: 'var' can't be used as an identifier because it's a keyword.
+  #foo.var;
+       ^^^
+
+parser/error_recovery/symbols:67:8: 'while' can't be used as an identifier because it's a keyword.
+  #foo.while;
+       ^^^^^
+
+parser/error_recovery/symbols:68:8: 'with' can't be used as an identifier because it's a keyword.
+  #foo.with;
+       ^^^^
+
+parser/error_recovery/symbols:69:4: 'assert' can't be used as an identifier because it's a keyword.
+  #assert.foo;
+   ^^^^^^
+
+parser/error_recovery/symbols:70:4: 'break' can't be used as an identifier because it's a keyword.
+  #break.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:71:4: 'case' can't be used as an identifier because it's a keyword.
+  #case.foo;
+   ^^^^
+
+parser/error_recovery/symbols:72:4: 'catch' can't be used as an identifier because it's a keyword.
+  #catch.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:73:4: 'class' can't be used as an identifier because it's a keyword.
+  #class.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:74:4: 'const' can't be used as an identifier because it's a keyword.
+  #const.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:75:4: 'continue' can't be used as an identifier because it's a keyword.
+  #continue.foo;
+   ^^^^^^^^
+
+parser/error_recovery/symbols:76:4: 'default' can't be used as an identifier because it's a keyword.
+  #default.foo;
+   ^^^^^^^
+
+parser/error_recovery/symbols:77:4: 'do' can't be used as an identifier because it's a keyword.
+  #do.foo;
+   ^^
+
+parser/error_recovery/symbols:78:4: 'else' can't be used as an identifier because it's a keyword.
+  #else.foo;
+   ^^^^
+
+parser/error_recovery/symbols:79:4: 'enum' can't be used as an identifier because it's a keyword.
+  #enum.foo;
+   ^^^^
+
+parser/error_recovery/symbols:80:4: 'extends' can't be used as an identifier because it's a keyword.
+  #extends.foo;
+   ^^^^^^^
+
+parser/error_recovery/symbols:81:4: 'false' can't be used as an identifier because it's a keyword.
+  #false.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:82:4: 'final' can't be used as an identifier because it's a keyword.
+  #final.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:83:4: 'finally' can't be used as an identifier because it's a keyword.
+  #finally.foo;
+   ^^^^^^^
+
+parser/error_recovery/symbols:84:4: 'for' can't be used as an identifier because it's a keyword.
+  #for.foo;
+   ^^^
+
+parser/error_recovery/symbols:85:4: 'if' can't be used as an identifier because it's a keyword.
+  #if.foo;
+   ^^
+
+parser/error_recovery/symbols:86:4: 'in' can't be used as an identifier because it's a keyword.
+  #in.foo;
+   ^^
+
+parser/error_recovery/symbols:87:4: 'is' can't be used as an identifier because it's a keyword.
+  #is.foo;
+   ^^
+
+parser/error_recovery/symbols:88:4: 'new' can't be used as an identifier because it's a keyword.
+  #new.foo;
+   ^^^
+
+parser/error_recovery/symbols:89:4: 'null' can't be used as an identifier because it's a keyword.
+  #null.foo;
+   ^^^^
+
+parser/error_recovery/symbols:90:4: 'rethrow' can't be used as an identifier because it's a keyword.
+  #rethrow.foo;
+   ^^^^^^^
+
+parser/error_recovery/symbols:91:4: 'return' can't be used as an identifier because it's a keyword.
+  #return.foo;
+   ^^^^^^
+
+parser/error_recovery/symbols:92:4: 'super' can't be used as an identifier because it's a keyword.
+  #super.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:93:4: 'switch' can't be used as an identifier because it's a keyword.
+  #switch.foo;
+   ^^^^^^
+
+parser/error_recovery/symbols:94:4: 'this' can't be used as an identifier because it's a keyword.
+  #this.foo;
+   ^^^^
+
+parser/error_recovery/symbols:95:4: 'throw' can't be used as an identifier because it's a keyword.
+  #throw.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:96:4: 'true' can't be used as an identifier because it's a keyword.
+  #true.foo;
+   ^^^^
+
+parser/error_recovery/symbols:97:4: 'try' can't be used as an identifier because it's a keyword.
+  #try.foo;
+   ^^^
+
+parser/error_recovery/symbols:98:4: 'var' can't be used as an identifier because it's a keyword.
+  #var.foo;
+   ^^^
+
+parser/error_recovery/symbols:99:4: 'while' can't be used as an identifier because it's a keyword.
+  #while.foo;
+   ^^^^^
+
+parser/error_recovery/symbols:100:4: 'with' can't be used as an identifier because it's a keyword.
+  #with.foo;
+   ^^^^
+
+beginCompilationUnit(main)
+  beginMetadataStar(main)
+  endMetadataStar(0)
+  beginTopLevelMember(main)
+    beginTopLevelMethod(, null)
+      handleNoType()
+      handleIdentifier(main, topLevelFunctionDeclaration)
+      handleNoTypeVariables(()
+      beginFormalParameters((, MemberKind.TopLevelMethod)
+      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+      handleAsyncModifier(null, null)
+      beginBlockFunctionBody({)
+        beginLiteralSymbol(#)
+          handleSymbolVoid(void)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleSymbolVoid(void)
+        endLiteralSymbol(#, 1)
+        handleIdentifier(foo, expressionContinuation)
+        handleNoTypeArguments(;)
+        handleNoArguments(;)
+        handleSend(foo, ;)
+        handleEndingBinaryExpression(.)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
+          handleIdentifier(void, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+          handleIdentifier(assert, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+          handleIdentifier(break, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+          handleIdentifier(case, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+          handleIdentifier(catch, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+          handleIdentifier(class, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+          handleIdentifier(const, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+          handleIdentifier(continue, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+          handleIdentifier(default, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+          handleIdentifier(do, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+          handleIdentifier(else, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+          handleIdentifier(enum, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+          handleIdentifier(extends, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+          handleIdentifier(false, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+          handleIdentifier(final, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+          handleIdentifier(finally, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+          handleIdentifier(for, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+          handleIdentifier(if, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+          handleIdentifier(in, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+          handleIdentifier(is, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+          handleIdentifier(new, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+          handleIdentifier(null, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+          handleIdentifier(rethrow, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+          handleIdentifier(return, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+          handleIdentifier(super, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+          handleIdentifier(switch, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+          handleIdentifier(this, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+          handleIdentifier(throw, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+          handleIdentifier(true, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+          handleIdentifier(try, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+          handleIdentifier(var, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+          handleIdentifier(while, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+          handleIdentifier(with, literalSymbol)
+        endLiteralSymbol(#, 1)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+          handleIdentifier(assert, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+          handleIdentifier(break, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+          handleIdentifier(case, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+          handleIdentifier(catch, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+          handleIdentifier(class, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+          handleIdentifier(const, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+          handleIdentifier(continue, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+          handleIdentifier(default, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+          handleIdentifier(do, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+          handleIdentifier(else, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+          handleIdentifier(enum, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+          handleIdentifier(extends, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+          handleIdentifier(false, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+          handleIdentifier(final, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+          handleIdentifier(finally, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+          handleIdentifier(for, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+          handleIdentifier(if, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+          handleIdentifier(in, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+          handleIdentifier(is, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+          handleIdentifier(new, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+          handleIdentifier(null, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+          handleIdentifier(rethrow, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+          handleIdentifier(return, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+          handleIdentifier(super, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+          handleIdentifier(switch, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+          handleIdentifier(this, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+          handleIdentifier(throw, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+          handleIdentifier(true, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+          handleIdentifier(try, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+          handleIdentifier(var, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+          handleIdentifier(while, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleIdentifier(foo, literalSymbol)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+          handleIdentifier(with, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+          handleIdentifier(assert, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+          handleIdentifier(break, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+          handleIdentifier(case, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+          handleIdentifier(catch, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+          handleIdentifier(class, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+          handleIdentifier(const, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+          handleIdentifier(continue, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+          handleIdentifier(default, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+          handleIdentifier(do, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+          handleIdentifier(else, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+          handleIdentifier(enum, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+          handleIdentifier(extends, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+          handleIdentifier(false, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+          handleIdentifier(final, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+          handleIdentifier(finally, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+          handleIdentifier(for, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+          handleIdentifier(if, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+          handleIdentifier(in, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+          handleIdentifier(is, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+          handleIdentifier(new, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+          handleIdentifier(null, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+          handleIdentifier(rethrow, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+          handleIdentifier(return, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+          handleIdentifier(super, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+          handleIdentifier(switch, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+          handleIdentifier(this, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+          handleIdentifier(throw, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+          handleIdentifier(true, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+          handleIdentifier(try, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+          handleIdentifier(var, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+          handleIdentifier(while, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+        beginLiteralSymbol(#)
+          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+          handleIdentifier(with, literalSymbol)
+          handleIdentifier(foo, literalSymbolContinuation)
+        endLiteralSymbol(#, 2)
+        handleExpressionStatement(;)
+      endBlockFunctionBody(99, {, })
+    endTopLevelMethod(main, null, })
+  endTopLevelDeclaration()
+endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/symbols.dart.intertwined.expect b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.intertwined.expect
new file mode 100644
index 0000000..8db03b1
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.intertwined.expect
@@ -0,0 +1,2149 @@
+parseUnit(main)
+  skipErrorTokens(main)
+  listener: beginCompilationUnit(main)
+  syntheticPreviousToken(main)
+  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
+    parseMetadataStar()
+      listener: beginMetadataStar(main)
+      listener: endMetadataStar(0)
+    parseTopLevelMemberImpl()
+      listener: beginTopLevelMember(main)
+      isReservedKeyword(()
+      parseTopLevelMethod(, null, , Instance of 'NoType', null, main, false)
+        listener: beginTopLevelMethod(, null)
+        listener: handleNoType()
+        ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
+          listener: handleIdentifier(main, topLevelFunctionDeclaration)
+        parseMethodTypeVar(main)
+          listener: handleNoTypeVariables(()
+        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
+          parseFormalParameters(main, MemberKind.TopLevelMethod)
+            parseFormalParametersRest((, MemberKind.TopLevelMethod)
+              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
+              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
+        parseAsyncModifierOpt())
+          listener: handleAsyncModifier(null, null)
+          inPlainSync()
+        parseFunctionBody(), false, false)
+          listener: beginBlockFunctionBody({)
+          notEofOrValue(}, #)
+          parseStatement({)
+            parseStatementX({)
+              parseExpressionStatementOrDeclaration({, false)
+                parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement({)
+                    parseExpression({)
+                      parsePrecedenceExpression({, 1, true)
+                        parseUnaryExpression({, true)
+                          parsePrimary({, expression)
+                            parseLiteralSymbol({)
+                              listener: beginLiteralSymbol(#)
+                              listener: handleSymbolVoid(void)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(void)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              listener: handleSymbolVoid(void)
+                              listener: endLiteralSymbol(#, 1)
+                        parsePrimary(., expressionContinuation)
+                          parseSendOrFunctionLiteral(., expressionContinuation)
+                            parseSend(., expressionContinuation)
+                              isNextIdentifier(.)
+                              ensureIdentifier(., expressionContinuation)
+                                listener: handleIdentifier(foo, expressionContinuation)
+                              listener: handleNoTypeArguments(;)
+                              parseArgumentsOpt(foo)
+                                listener: handleNoArguments(;)
+                              listener: handleSend(foo, ;)
+                        listener: handleEndingBinaryExpression(.)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(void, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'void' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: void}], void, void)
+                                listener: handleIdentifier(void, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(void)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(assert, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+                                listener: handleIdentifier(assert, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(assert)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(break, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+                                listener: handleIdentifier(break, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(break)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(case, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+                                listener: handleIdentifier(case, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(case)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(catch, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+                                listener: handleIdentifier(catch, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(catch)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(class, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+                                listener: handleIdentifier(class, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(class)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(const, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+                                listener: handleIdentifier(const, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(const)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(continue, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+                                listener: handleIdentifier(continue, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(continue)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(default, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+                                listener: handleIdentifier(default, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(default)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(do, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+                                listener: handleIdentifier(do, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(do)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(else, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+                                listener: handleIdentifier(else, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(else)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(enum, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+                                listener: handleIdentifier(enum, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(enum)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(extends, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+                                listener: handleIdentifier(extends, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(extends)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(false, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+                                listener: handleIdentifier(false, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(false)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(final, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+                                listener: handleIdentifier(final, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(final)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(finally, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+                                listener: handleIdentifier(finally, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(finally)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(for, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+                                listener: handleIdentifier(for, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(for)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(if, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+                                listener: handleIdentifier(if, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(if)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(in, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+                                listener: handleIdentifier(in, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(in)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(is, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+                                listener: handleIdentifier(is, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(is)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(new, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+                                listener: handleIdentifier(new, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(new)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(null, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+                                listener: handleIdentifier(null, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(null)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(rethrow, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+                                listener: handleIdentifier(rethrow, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(rethrow)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+                                listener: handleIdentifier(return, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(return)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(super, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+                                listener: handleIdentifier(super, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(super)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(switch, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+                                listener: handleIdentifier(switch, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(switch)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(this, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+                                listener: handleIdentifier(this, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(this)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(throw, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+                                listener: handleIdentifier(throw, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(throw)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(true, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+                                listener: handleIdentifier(true, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(true)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(try, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+                                listener: handleIdentifier(try, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(try)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(var, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+                                listener: handleIdentifier(var, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(var)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(while, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+                                listener: handleIdentifier(while, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(while)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+                                listener: handleIdentifier(with, literalSymbol)
+                              listener: endLiteralSymbol(#, 1)
+                    ensureSemicolon(with)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(assert, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+                                listener: handleIdentifier(assert, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(assert)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(break, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+                                listener: handleIdentifier(break, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(break)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(case, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+                                listener: handleIdentifier(case, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(case)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(catch, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+                                listener: handleIdentifier(catch, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(catch)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(class, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+                                listener: handleIdentifier(class, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(class)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(const, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+                                listener: handleIdentifier(const, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(const)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(continue, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+                                listener: handleIdentifier(continue, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(continue)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(default, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+                                listener: handleIdentifier(default, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(default)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(do, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+                                listener: handleIdentifier(do, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(do)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(else, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+                                listener: handleIdentifier(else, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(else)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(enum, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+                                listener: handleIdentifier(enum, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(enum)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(extends, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+                                listener: handleIdentifier(extends, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(extends)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(false, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+                                listener: handleIdentifier(false, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(false)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(final, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+                                listener: handleIdentifier(final, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(final)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(finally, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+                                listener: handleIdentifier(finally, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(finally)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(for, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+                                listener: handleIdentifier(for, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(for)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(if, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+                                listener: handleIdentifier(if, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(if)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(in, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+                                listener: handleIdentifier(in, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(in)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(is, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+                                listener: handleIdentifier(is, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(is)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(new, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+                                listener: handleIdentifier(new, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(new)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(null, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+                                listener: handleIdentifier(null, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(null)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(rethrow, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+                                listener: handleIdentifier(rethrow, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(rethrow)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+                                listener: handleIdentifier(return, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(return)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(super, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+                                listener: handleIdentifier(super, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(super)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(switch, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+                                listener: handleIdentifier(switch, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(switch)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(this, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+                                listener: handleIdentifier(this, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(this)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(throw, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+                                listener: handleIdentifier(throw, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(throw)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(true, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+                                listener: handleIdentifier(true, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(true)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(try, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+                                listener: handleIdentifier(try, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(try)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(var, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+                                listener: handleIdentifier(var, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(var)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(while, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+                                listener: handleIdentifier(while, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(while)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                listener: handleIdentifier(foo, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+                                listener: handleIdentifier(with, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(with)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(assert, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'assert' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: assert}], assert, assert)
+                                listener: handleIdentifier(assert, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(break, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'break' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: break}], break, break)
+                                listener: handleIdentifier(break, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(case, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'case' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: case}], case, case)
+                                listener: handleIdentifier(case, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(catch, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'catch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: catch}], catch, catch)
+                                listener: handleIdentifier(catch, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(class, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'class' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: class}], class, class)
+                                listener: handleIdentifier(class, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(const, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'const' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: const}], const, const)
+                                listener: handleIdentifier(const, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(continue, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'continue' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: continue}], continue, continue)
+                                listener: handleIdentifier(continue, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(default, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'default' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: default}], default, default)
+                                listener: handleIdentifier(default, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(do, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'do' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: do}], do, do)
+                                listener: handleIdentifier(do, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(else, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'else' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: else}], else, else)
+                                listener: handleIdentifier(else, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(enum, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'enum' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: enum}], enum, enum)
+                                listener: handleIdentifier(enum, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(extends, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'extends' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: extends}], extends, extends)
+                                listener: handleIdentifier(extends, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(false, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'false' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: false}], false, false)
+                                listener: handleIdentifier(false, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(final, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'final' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: final}], final, final)
+                                listener: handleIdentifier(final, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(finally, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'finally' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: finally}], finally, finally)
+                                listener: handleIdentifier(finally, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(for, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'for' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: for}], for, for)
+                                listener: handleIdentifier(for, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(if, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'if' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: if}], if, if)
+                                listener: handleIdentifier(if, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(in, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'in' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: in}], in, in)
+                                listener: handleIdentifier(in, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(is, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'is' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: is}], is, is)
+                                listener: handleIdentifier(is, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(new, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'new' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: new}], new, new)
+                                listener: handleIdentifier(new, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(null, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'null' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: null}], null, null)
+                                listener: handleIdentifier(null, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(rethrow, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'rethrow' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: rethrow}], rethrow, rethrow)
+                                listener: handleIdentifier(rethrow, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(return, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'return' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: return}], return, return)
+                                listener: handleIdentifier(return, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(super, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: super}], super, super)
+                                listener: handleIdentifier(super, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(switch, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'switch' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: switch}], switch, switch)
+                                listener: handleIdentifier(switch, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(this, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'this' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: this}], this, this)
+                                listener: handleIdentifier(this, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(throw, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'throw' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: throw}], throw, throw)
+                                listener: handleIdentifier(throw, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(true, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'true' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: true}], true, true)
+                                listener: handleIdentifier(true, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(try, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'try' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: try}], try, try)
+                                listener: handleIdentifier(try, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(var, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'var' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: var}], var, var)
+                                listener: handleIdentifier(var, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(while, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'while' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: while}], while, while)
+                                listener: handleIdentifier(while, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, #)
+          parseStatement(;)
+            parseStatementX(;)
+              parseExpressionStatementOrDeclaration(;, false)
+                parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
+                  looksLikeLocalFunction(#)
+                  parseExpressionStatement(;)
+                    parseExpression(;)
+                      parsePrecedenceExpression(;, 1, true)
+                        parseUnaryExpression(;, true)
+                          parsePrimary(;, expression)
+                            parseLiteralSymbol(;)
+                              listener: beginLiteralSymbol(#)
+                              ensureIdentifier(#, literalSymbol)
+                                reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
+                                  listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
+                                listener: handleIdentifier(with, literalSymbol)
+                              ensureIdentifier(., literalSymbolContinuation)
+                                listener: handleIdentifier(foo, literalSymbolContinuation)
+                              listener: endLiteralSymbol(#, 2)
+                    ensureSemicolon(foo)
+                    listener: handleExpressionStatement(;)
+          notEofOrValue(}, })
+          listener: endBlockFunctionBody(99, {, })
+        listener: endTopLevelMethod(main, null, })
+  listener: endTopLevelDeclaration()
+  reportAllErrorTokens(main)
+  listener: endCompilationUnit(1, )
diff --git a/pkg/front_end/parser_testcases/error_recovery/symbols.dart.parser.expect b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.parser.expect
new file mode 100644
index 0000000..4db15cc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.parser.expect
@@ -0,0 +1,205 @@
+main() {
+#void;
+#void.foo;
+#foo.void;
+#assert;
+#break;
+#case;
+#catch;
+#class;
+#const;
+#continue;
+#default;
+#do;
+#else;
+#enum;
+#extends;
+#false;
+#final;
+#finally;
+#for;
+#if;
+#in;
+#is;
+#new;
+#null;
+#rethrow;
+#return;
+#super;
+#switch;
+#this;
+#throw;
+#true;
+#try;
+#var;
+#while;
+#with;
+#foo.assert;
+#foo.break;
+#foo.case;
+#foo.catch;
+#foo.class;
+#foo.const;
+#foo.continue;
+#foo.default;
+#foo.do;
+#foo.else;
+#foo.enum;
+#foo.extends;
+#foo.false;
+#foo.final;
+#foo.finally;
+#foo.for;
+#foo.if;
+#foo.in;
+#foo.is;
+#foo.new;
+#foo.null;
+#foo.rethrow;
+#foo.return;
+#foo.super;
+#foo.switch;
+#foo.this;
+#foo.throw;
+#foo.true;
+#foo.try;
+#foo.var;
+#foo.while;
+#foo.with;
+#assert.foo;
+#break.foo;
+#case.foo;
+#catch.foo;
+#class.foo;
+#const.foo;
+#continue.foo;
+#default.foo;
+#do.foo;
+#else.foo;
+#enum.foo;
+#extends.foo;
+#false.foo;
+#final.foo;
+#finally.foo;
+#for.foo;
+#if.foo;
+#in.foo;
+#is.foo;
+#new.foo;
+#null.foo;
+#rethrow.foo;
+#return.foo;
+#super.foo;
+#switch.foo;
+#this.foo;
+#throw.foo;
+#true.foo;
+#try.foo;
+#var.foo;
+#while.foo;
+#with.foo;
+}
+
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+#[SimpleToken]void[KeywordToken];[SimpleToken]
+#[SimpleToken]void[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]void[KeywordToken];[SimpleToken]
+#[SimpleToken]assert[KeywordToken];[SimpleToken]
+#[SimpleToken]break[KeywordToken];[SimpleToken]
+#[SimpleToken]case[KeywordToken];[SimpleToken]
+#[SimpleToken]catch[KeywordToken];[SimpleToken]
+#[SimpleToken]class[KeywordToken];[SimpleToken]
+#[SimpleToken]const[KeywordToken];[SimpleToken]
+#[SimpleToken]continue[KeywordToken];[SimpleToken]
+#[SimpleToken]default[KeywordToken];[SimpleToken]
+#[SimpleToken]do[KeywordToken];[SimpleToken]
+#[SimpleToken]else[KeywordToken];[SimpleToken]
+#[SimpleToken]enum[KeywordToken];[SimpleToken]
+#[SimpleToken]extends[KeywordToken];[SimpleToken]
+#[SimpleToken]false[KeywordToken];[SimpleToken]
+#[SimpleToken]final[KeywordToken];[SimpleToken]
+#[SimpleToken]finally[KeywordToken];[SimpleToken]
+#[SimpleToken]for[KeywordToken];[SimpleToken]
+#[SimpleToken]if[KeywordToken];[SimpleToken]
+#[SimpleToken]in[KeywordToken];[SimpleToken]
+#[SimpleToken]is[KeywordToken];[SimpleToken]
+#[SimpleToken]new[KeywordToken];[SimpleToken]
+#[SimpleToken]null[KeywordToken];[SimpleToken]
+#[SimpleToken]rethrow[KeywordToken];[SimpleToken]
+#[SimpleToken]return[KeywordToken];[SimpleToken]
+#[SimpleToken]super[KeywordToken];[SimpleToken]
+#[SimpleToken]switch[KeywordToken];[SimpleToken]
+#[SimpleToken]this[KeywordToken];[SimpleToken]
+#[SimpleToken]throw[KeywordToken];[SimpleToken]
+#[SimpleToken]true[KeywordToken];[SimpleToken]
+#[SimpleToken]try[KeywordToken];[SimpleToken]
+#[SimpleToken]var[KeywordToken];[SimpleToken]
+#[SimpleToken]while[KeywordToken];[SimpleToken]
+#[SimpleToken]with[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]assert[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]break[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]case[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]catch[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]class[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]const[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]continue[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]default[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]do[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]else[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]enum[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]extends[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]false[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]final[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]finally[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]for[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]if[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]in[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]is[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]new[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]null[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]rethrow[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]return[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]super[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]switch[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]this[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]throw[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]true[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]try[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]var[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]while[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]with[KeywordToken];[SimpleToken]
+#[SimpleToken]assert[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]break[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]case[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]catch[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]class[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]const[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]continue[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]default[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]do[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]else[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]enum[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]extends[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]false[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]final[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]finally[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]for[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]if[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]in[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]is[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]new[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]null[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]rethrow[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]return[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]super[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]switch[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]this[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]throw[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]true[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]try[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]var[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]while[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]with[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/parser_testcases/error_recovery/symbols.dart.scanner.expect b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.scanner.expect
new file mode 100644
index 0000000..4db15cc
--- /dev/null
+++ b/pkg/front_end/parser_testcases/error_recovery/symbols.dart.scanner.expect
@@ -0,0 +1,205 @@
+main() {
+#void;
+#void.foo;
+#foo.void;
+#assert;
+#break;
+#case;
+#catch;
+#class;
+#const;
+#continue;
+#default;
+#do;
+#else;
+#enum;
+#extends;
+#false;
+#final;
+#finally;
+#for;
+#if;
+#in;
+#is;
+#new;
+#null;
+#rethrow;
+#return;
+#super;
+#switch;
+#this;
+#throw;
+#true;
+#try;
+#var;
+#while;
+#with;
+#foo.assert;
+#foo.break;
+#foo.case;
+#foo.catch;
+#foo.class;
+#foo.const;
+#foo.continue;
+#foo.default;
+#foo.do;
+#foo.else;
+#foo.enum;
+#foo.extends;
+#foo.false;
+#foo.final;
+#foo.finally;
+#foo.for;
+#foo.if;
+#foo.in;
+#foo.is;
+#foo.new;
+#foo.null;
+#foo.rethrow;
+#foo.return;
+#foo.super;
+#foo.switch;
+#foo.this;
+#foo.throw;
+#foo.true;
+#foo.try;
+#foo.var;
+#foo.while;
+#foo.with;
+#assert.foo;
+#break.foo;
+#case.foo;
+#catch.foo;
+#class.foo;
+#const.foo;
+#continue.foo;
+#default.foo;
+#do.foo;
+#else.foo;
+#enum.foo;
+#extends.foo;
+#false.foo;
+#final.foo;
+#finally.foo;
+#for.foo;
+#if.foo;
+#in.foo;
+#is.foo;
+#new.foo;
+#null.foo;
+#rethrow.foo;
+#return.foo;
+#super.foo;
+#switch.foo;
+#this.foo;
+#throw.foo;
+#true.foo;
+#try.foo;
+#var.foo;
+#while.foo;
+#with.foo;
+}
+
+
+main[StringToken]([BeginToken])[SimpleToken] {[BeginToken]
+#[SimpleToken]void[KeywordToken];[SimpleToken]
+#[SimpleToken]void[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]void[KeywordToken];[SimpleToken]
+#[SimpleToken]assert[KeywordToken];[SimpleToken]
+#[SimpleToken]break[KeywordToken];[SimpleToken]
+#[SimpleToken]case[KeywordToken];[SimpleToken]
+#[SimpleToken]catch[KeywordToken];[SimpleToken]
+#[SimpleToken]class[KeywordToken];[SimpleToken]
+#[SimpleToken]const[KeywordToken];[SimpleToken]
+#[SimpleToken]continue[KeywordToken];[SimpleToken]
+#[SimpleToken]default[KeywordToken];[SimpleToken]
+#[SimpleToken]do[KeywordToken];[SimpleToken]
+#[SimpleToken]else[KeywordToken];[SimpleToken]
+#[SimpleToken]enum[KeywordToken];[SimpleToken]
+#[SimpleToken]extends[KeywordToken];[SimpleToken]
+#[SimpleToken]false[KeywordToken];[SimpleToken]
+#[SimpleToken]final[KeywordToken];[SimpleToken]
+#[SimpleToken]finally[KeywordToken];[SimpleToken]
+#[SimpleToken]for[KeywordToken];[SimpleToken]
+#[SimpleToken]if[KeywordToken];[SimpleToken]
+#[SimpleToken]in[KeywordToken];[SimpleToken]
+#[SimpleToken]is[KeywordToken];[SimpleToken]
+#[SimpleToken]new[KeywordToken];[SimpleToken]
+#[SimpleToken]null[KeywordToken];[SimpleToken]
+#[SimpleToken]rethrow[KeywordToken];[SimpleToken]
+#[SimpleToken]return[KeywordToken];[SimpleToken]
+#[SimpleToken]super[KeywordToken];[SimpleToken]
+#[SimpleToken]switch[KeywordToken];[SimpleToken]
+#[SimpleToken]this[KeywordToken];[SimpleToken]
+#[SimpleToken]throw[KeywordToken];[SimpleToken]
+#[SimpleToken]true[KeywordToken];[SimpleToken]
+#[SimpleToken]try[KeywordToken];[SimpleToken]
+#[SimpleToken]var[KeywordToken];[SimpleToken]
+#[SimpleToken]while[KeywordToken];[SimpleToken]
+#[SimpleToken]with[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]assert[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]break[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]case[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]catch[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]class[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]const[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]continue[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]default[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]do[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]else[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]enum[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]extends[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]false[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]final[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]finally[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]for[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]if[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]in[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]is[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]new[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]null[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]rethrow[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]return[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]super[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]switch[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]this[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]throw[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]true[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]try[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]var[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]while[KeywordToken];[SimpleToken]
+#[SimpleToken]foo[StringToken].[SimpleToken]with[KeywordToken];[SimpleToken]
+#[SimpleToken]assert[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]break[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]case[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]catch[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]class[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]const[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]continue[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]default[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]do[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]else[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]enum[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]extends[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]false[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]final[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]finally[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]for[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]if[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]in[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]is[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]new[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]null[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]rethrow[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]return[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]super[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]switch[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]this[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]throw[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]true[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]try[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]var[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]while[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+#[SimpleToken]with[KeywordToken].[SimpleToken]foo[StringToken];[SimpleToken]
+}[SimpleToken]
+[SimpleToken]
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart
new file mode 100644
index 0000000..5d082fb
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  A.new();
+  factory A.redirectingFactory() = A.new;
+  factory A.redirectingFactoryChild() = B.new;
+  factory A.redirectingTwice() = A.redirectingFactory;
+}
+
+class B extends A {}
+
+test() {
+  A Function() f1 = A.redirectingFactory;
+  A Function() f2 = A.redirectingFactoryChild;
+  A Function() f3 = A.redirectingTwice;
+  A x1 = f1();
+  B x2 = f2() as B;
+  A x3 f3();
+}
+
+main() => test();
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
new file mode 100644
index 0000000..93e586a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+//   A Function() f1 = A.redirectingFactory;
+//                       ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+//   A Function() f2 = A.redirectingFactoryChild;
+//                       ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+//   A Function() f3 = A.redirectingTwice;
+//                       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
+//   A x3 f3();
+//     ^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  static factory redirectingFactory() → self::A
+    let dynamic #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let dynamic #redirecting_factory = "B.new" in invalid-expression;
+  static factory redirectingTwice() → self::A
+    let dynamic #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+static method test() → dynamic {
+  () → self::A f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+  A Function() f1 = A.redirectingFactory;
+                      ^^^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  () → self::A f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+  A Function() f2 = A.redirectingFactoryChild;
+                      ^^^^^^^^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  () → self::A f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+  A Function() f3 = A.redirectingTwice;
+                      ^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  self::A x1 = f1(){() → self::A};
+  self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
+  self::A x3;
+  f3(){() → self::A};
+}
+static method main() → dynamic
+  return self::test();
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
new file mode 100644
index 0000000..dbc8412
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.strong.transformed.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+//   A Function() f1 = A.redirectingFactory;
+//                       ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+//   A Function() f2 = A.redirectingFactoryChild;
+//                       ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+//   A Function() f3 = A.redirectingTwice;
+//                       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
+//   A x3 f3();
+//     ^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  static factory redirectingFactory() → self::A
+    let Never #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let core::String* #redirecting_factory = "B.new" in invalid-expression;
+  static factory redirectingTwice() → self::A
+    let () → self::A #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+static method test() → dynamic {
+  () → self::A f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+  A Function() f1 = A.redirectingFactory;
+                      ^^^^^^^^^^^^^^^^^^";
+  () → self::A f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+  A Function() f2 = A.redirectingFactoryChild;
+                      ^^^^^^^^^^^^^^^^^^^^^^^";
+  () → self::A f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+  A Function() f3 = A.redirectingTwice;
+                      ^^^^^^^^^^^^^^^^";
+  self::A x1 = f1(){() → self::A};
+  self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
+  self::A x3;
+  f3(){() → self::A};
+}
+static method main() → dynamic
+  return self::test();
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.textual_outline.expect
new file mode 100644
index 0000000..1e775a7
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.textual_outline.expect
@@ -0,0 +1,9 @@
+class A {
+  A.new();
+  factory A.redirectingFactory() = A.new;
+  factory A.redirectingFactoryChild() = B.new;
+  factory A.redirectingTwice() = A.redirectingFactory;
+}
+class B extends A {}
+test() {}
+main() => test();
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
new file mode 100644
index 0000000..93e586a
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+//   A Function() f1 = A.redirectingFactory;
+//                       ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+//   A Function() f2 = A.redirectingFactoryChild;
+//                       ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+//   A Function() f3 = A.redirectingTwice;
+//                       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
+//   A x3 f3();
+//     ^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  static factory redirectingFactory() → self::A
+    let dynamic #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let dynamic #redirecting_factory = "B.new" in invalid-expression;
+  static factory redirectingTwice() → self::A
+    let dynamic #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+static method test() → dynamic {
+  () → self::A f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+  A Function() f1 = A.redirectingFactory;
+                      ^^^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  () → self::A f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+  A Function() f2 = A.redirectingFactoryChild;
+                      ^^^^^^^^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  () → self::A f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+  A Function() f3 = A.redirectingTwice;
+                      ^^^^^^^^^^^^^^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  self::A x1 = f1(){() → self::A};
+  self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
+  self::A x3;
+  f3(){() → self::A};
+}
+static method main() → dynamic
+  return self::test();
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
new file mode 100644
index 0000000..a8e0129
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.outline.expect
@@ -0,0 +1,45 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  constructor new() → self::A
+    ;
+  static factory redirectingFactory() → self::A
+    let dynamic #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let dynamic #redirecting_factory = "B.new" in invalid-expression;
+  static factory redirectingTwice() → self::A
+    let dynamic #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
new file mode 100644
index 0000000..dbc8412
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart.weak.transformed.expect
@@ -0,0 +1,80 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+//   A Function() f1 = A.redirectingFactory;
+//                       ^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+//   A Function() f2 = A.redirectingFactoryChild;
+//                       ^^^^^^^^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+//   A Function() f3 = A.redirectingTwice;
+//                       ^^^^^^^^^^^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:20:5: Error: Expected ';' after this.
+//   A x3 f3();
+//     ^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild, self::A::redirectingTwice]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  static factory redirectingFactory() → self::A
+    let Never #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let core::String* #redirecting_factory = "B.new" in invalid-expression;
+  static factory redirectingTwice() → self::A
+    let () → self::A #redirecting_factory = self::A::redirectingFactory in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+static method test() → dynamic {
+  () → self::A f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:15:23: Error: Getter not found: 'redirectingFactory'.
+  A Function() f1 = A.redirectingFactory;
+                      ^^^^^^^^^^^^^^^^^^";
+  () → self::A f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:16:23: Error: Getter not found: 'redirectingFactoryChild'.
+  A Function() f2 = A.redirectingFactoryChild;
+                      ^^^^^^^^^^^^^^^^^^^^^^^";
+  () → self::A f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/redirecting_constructors.dart:17:23: Error: Getter not found: 'redirectingTwice'.
+  A Function() f3 = A.redirectingTwice;
+                      ^^^^^^^^^^^^^^^^";
+  self::A x1 = f1(){() → self::A};
+  self::B x2 = f2(){() → self::A} as{ForNonNullableByDefault} self::B;
+  self::A x3;
+  f3(){() → self::A};
+}
+static method main() → dynamic
+  return self::test();
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart
new file mode 100644
index 0000000..681aeae
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+class A {
+  A.new();
+  factory A.redirectingFactory() = A.new;
+  factory A.redirectingFactoryChild() = B.new;
+  A.redirecting() : this.new();
+}
+
+class B extends A {}
+
+class C {
+  final int x;
+  const C.new(this.x);
+}
+
+class D extend C {
+  D(int x) : super.new(x * 2);
+}
+
+test() {
+  D.new(1);
+  const C.new(1);
+  new C.new(1);
+  
+  var f1 = A.new;
+  var f2 = B.new;
+  var f3 = C.new;
+  var f4 = D.new;
+  f1();
+  f2();
+  f3(1);
+  f4(1);
+
+  A Function() g1 = A.new;
+  B Function() g2 = B.new;
+  C Function(int x) g3 = C.new;
+  D Function(int x) g4 = D.new;
+  g1();
+  g2();
+  g3(1);
+  g4(1);
+}
+
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
new file mode 100644
index 0000000..c5f6007
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.expect
@@ -0,0 +1,226 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.redirecting() : this.new();
+//                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(this.x);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
+// class D extend C {
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D(int x) : super.new(x * 2);
+//                    ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+//   D(int x) : super.new(x * 2);
+//              ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(1);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   new C.new(1);
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  constructor redirecting() → self::A
+    : this self::A::new()
+    ;
+  static factory redirectingFactory() → self::A
+    let dynamic #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let dynamic #redirecting_factory = "B.new" in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor new(core::int x) → self::C
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  constructor •(core::int x) → self::D
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+  D(int x) : super.new(x * 2);
+             ^^^^^"
+    ;
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+  D.new(1);
+    ^^^";
+  #C2;
+  new self::C::new(1);
+  dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+  var f1 = A.new;
+             ^^^";
+  dynamic f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+  var f2 = B.new;
+             ^^^";
+  dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+  var f3 = C.new;
+             ^^^";
+  dynamic f4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+  var f4 = D.new;
+             ^^^";
+  f1{dynamic}.call();
+  f2{dynamic}.call();
+  f3{dynamic}.call(1);
+  f4{dynamic}.call(1);
+  () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+  A Function() g1 = A.new;
+                      ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  () → self::B g2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+  B Function() g2 = B.new;
+                      ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::B;
+  (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+  C Function(int x) g3 = C.new;
+                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::C;
+  (core::int) → self::D g4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+  D Function(int x) g4 = D.new;
+                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::D;
+  g1(){() → self::A};
+  g2(){() → self::B};
+  g3(1){(core::int) → self::C};
+  g4(1){(core::int) → self::D};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = self::C {x:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C.new (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
new file mode 100644
index 0000000..7323740
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.strong.transformed.expect
@@ -0,0 +1,226 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.redirecting() : this.new();
+//                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(this.x);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
+// class D extend C {
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D(int x) : super.new(x * 2);
+//                    ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+//   D(int x) : super.new(x * 2);
+//              ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(1);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   new C.new(1);
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  constructor redirecting() → self::A
+    : this self::A::new()
+    ;
+  static factory redirectingFactory() → self::A
+    let Never #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let core::String* #redirecting_factory = "B.new" in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor new(core::int x) → self::C
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  constructor •(core::int x) → self::D
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+  D(int x) : super.new(x * 2);
+             ^^^^^"
+    ;
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+  D.new(1);
+    ^^^";
+  #C2;
+  new self::C::new(1);
+  dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+  var f1 = A.new;
+             ^^^";
+  dynamic f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+  var f2 = B.new;
+             ^^^";
+  dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+  var f3 = C.new;
+             ^^^";
+  dynamic f4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+  var f4 = D.new;
+             ^^^";
+  f1{dynamic}.call();
+  f2{dynamic}.call();
+  f3{dynamic}.call(1);
+  f4{dynamic}.call(1);
+  () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+  A Function() g1 = A.new;
+                      ^^^";
+  () → self::B g2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+  B Function() g2 = B.new;
+                      ^^^";
+  (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+  C Function(int x) g3 = C.new;
+                           ^^^";
+  (core::int) → self::D g4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+  D Function(int x) g4 = D.new;
+                           ^^^";
+  g1(){() → self::A};
+  g2(){() → self::B};
+  g3(1){(core::int) → self::C};
+  g4(1){(core::int) → self::D};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = self::C {x:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C.new (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.textual_outline.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.textual_outline.expect
new file mode 100644
index 0000000..d70331c
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.textual_outline.expect
@@ -0,0 +1,16 @@
+class A {
+  A.new();
+  factory A.redirectingFactory() = A.new;
+  factory A.redirectingFactoryChild() = B.new;
+  A.redirecting() : this.new();
+}
+class B extends A {}
+class C {
+  final int x;
+  const C.new(this.x);
+}
+class D extend C {
+  D(int x) : super.new(x * 2);
+}
+test() {}
+main() {}
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
new file mode 100644
index 0000000..c5f6007
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.expect
@@ -0,0 +1,226 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.redirecting() : this.new();
+//                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(this.x);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
+// class D extend C {
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D(int x) : super.new(x * 2);
+//                    ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+//   D(int x) : super.new(x * 2);
+//              ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(1);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   new C.new(1);
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  constructor redirecting() → self::A
+    : this self::A::new()
+    ;
+  static factory redirectingFactory() → self::A
+    let dynamic #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let dynamic #redirecting_factory = "B.new" in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor new(core::int x) → self::C
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  constructor •(core::int x) → self::D
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+  D(int x) : super.new(x * 2);
+             ^^^^^"
+    ;
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+  D.new(1);
+    ^^^";
+  #C2;
+  new self::C::new(1);
+  dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+  var f1 = A.new;
+             ^^^";
+  dynamic f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+  var f2 = B.new;
+             ^^^";
+  dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+  var f3 = C.new;
+             ^^^";
+  dynamic f4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+  var f4 = D.new;
+             ^^^";
+  f1{dynamic}.call();
+  f2{dynamic}.call();
+  f3{dynamic}.call(1);
+  f4{dynamic}.call(1);
+  () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+  A Function() g1 = A.new;
+                      ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::A;
+  () → self::B g2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+  B Function() g2 = B.new;
+                      ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} () → self::B;
+  (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+  C Function(int x) g3 = C.new;
+                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::C;
+  (core::int) → self::D g4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+  D Function(int x) g4 = D.new;
+                           ^^^" as{TypeError,ForDynamic,ForNonNullableByDefault} (core::int) → self::D;
+  g1(){() → self::A};
+  g2(){() → self::B};
+  g3(1){(core::int) → self::C};
+  g4(1){(core::int) → self::D};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = self::C {x:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C.new (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
new file mode 100644
index 0000000..286b949
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.outline.expect
@@ -0,0 +1,74 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.redirecting() : this.new();
+//                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(this.x);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
+// class D extend C {
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D(int x) : super.new(x * 2);
+//                    ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  constructor new() → self::A
+    ;
+  constructor redirecting() → self::A
+    ;
+  static factory redirectingFactory() → self::A
+    let dynamic #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let dynamic #redirecting_factory = "B.new" in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor new(core::int x) → self::C
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  constructor •(core::int x) → self::D
+    ;
+}
+static method test() → dynamic
+  ;
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
new file mode 100644
index 0000000..7323740
--- /dev/null
+++ b/pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart.weak.transformed.expect
@@ -0,0 +1,226 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:6:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.new();
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:7:38: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactory() = A.new;
+//                                      ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:43: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   factory A.redirectingFactoryChild() = B.new;
+//                                           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:9:26: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A.redirecting() : this.new();
+//                          ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:16:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(this.x);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:19:9: Error: Expected 'extends' instead of this.
+// class D extend C {
+//         ^^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:20: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D(int x) : super.new(x * 2);
+//                    ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:8:41: Error: Redirection constructor target not found: 'B.new'
+//   factory A.redirectingFactoryChild() = B.new;
+//                                         ^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+//   D(int x) : super.new(x * 2);
+//              ^^^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+//   D.new(1);
+//     ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:25:11: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   const C.new(1);
+//           ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:26:9: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   new C.new(1);
+//         ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+//   var f1 = A.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+//   var f2 = B.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+//   var f3 = C.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+//   var f4 = D.new;
+//              ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+//   A Function() g1 = A.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+//   B Function() g2 = B.new;
+//                       ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+//   C Function(int x) g3 = C.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: This requires the 'constructor-tearoffs' language feature to be enabled.
+// Try updating your pubspec.yaml to set the minimum SDK constraint to 2.14 or higher, and running 'pub get'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+//   D Function(int x) g4 = D.new;
+//                            ^^^
+//
+// pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:12:7: Error: The superclass, 'A', has no unnamed constructor that takes no arguments.
+// class B extends A {}
+//       ^
+//
+import self as self;
+import "dart:core" as core;
+
+class A extends core::Object {
+  static final field dynamic _redirecting# = <dynamic>[self::A::redirectingFactory, self::A::redirectingFactoryChild]/*isLegacy*/;
+  constructor new() → self::A
+    : super core::Object::•()
+    ;
+  constructor redirecting() → self::A
+    : this self::A::new()
+    ;
+  static factory redirectingFactory() → self::A
+    let Never #redirecting_factory = self::A::new in invalid-expression;
+  static factory redirectingFactoryChild() → self::A
+    let core::String* #redirecting_factory = "B.new" in invalid-expression;
+}
+class B extends self::A {
+  synthetic constructor •() → self::B
+    : invalid-initializer
+    ;
+}
+class C extends core::Object /*hasConstConstructor*/  {
+  final field core::int x;
+  const constructor new(core::int x) → self::C
+    : self::C::x = x, super core::Object::•()
+    ;
+}
+class D extends core::Object {
+  constructor •(core::int x) → self::D
+    : final dynamic #t1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:20:14: Error: Superclass has no constructor named 'Object.new'.
+  D(int x) : super.new(x * 2);
+             ^^^^^"
+    ;
+}
+static method test() → dynamic {
+  invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:24:5: Error: Method not found: 'D.new'.
+  D.new(1);
+    ^^^";
+  #C2;
+  new self::C::new(1);
+  dynamic f1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:28:14: Error: Getter not found: 'new'.
+  var f1 = A.new;
+             ^^^";
+  dynamic f2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:29:14: Error: Getter not found: 'new'.
+  var f2 = B.new;
+             ^^^";
+  dynamic f3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:30:14: Error: Getter not found: 'new'.
+  var f3 = C.new;
+             ^^^";
+  dynamic f4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:31:14: Error: Getter not found: 'new'.
+  var f4 = D.new;
+             ^^^";
+  f1{dynamic}.call();
+  f2{dynamic}.call();
+  f3{dynamic}.call(1);
+  f4{dynamic}.call(1);
+  () → self::A g1 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:37:23: Error: Getter not found: 'new'.
+  A Function() g1 = A.new;
+                      ^^^";
+  () → self::B g2 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:38:23: Error: Getter not found: 'new'.
+  B Function() g2 = B.new;
+                      ^^^";
+  (core::int) → self::C g3 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:39:28: Error: Getter not found: 'new'.
+  C Function(int x) g3 = C.new;
+                           ^^^";
+  (core::int) → self::D g4 = invalid-expression "pkg/front_end/testcases/constructor_tearoffs/unnamed_constructor.dart:40:28: Error: Getter not found: 'new'.
+  D Function(int x) g4 = D.new;
+                           ^^^";
+  g1(){() → self::A};
+  g2(){() → self::B};
+  g3(1){(core::int) → self::C};
+  g4(1){(core::int) → self::D};
+}
+static method main() → dynamic {}
+
+constants  {
+  #C1 = 1
+  #C2 = self::C {x:#C1}
+}
+
+
+Constructor coverage from constants:
+org-dartlang-testcase:///unnamed_constructor.dart:
+- C.new (from org-dartlang-testcase:///unnamed_constructor.dart:16:9)
+- Object. (from org-dartlang-sdk:///sdk/lib/core/object.dart:25:9)
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect
index 3144a2d..9b677e7 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.expect
@@ -46,16 +46,6 @@
 // const fromDeferredLib = lib.x;
 //       ^
 //
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:44: Error: Constant evaluation error:
-// const Symbol symbolWithInvalidName = const Symbol("42");
-//                                            ^
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:51: Context: The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '"42"'.
-// const Symbol symbolWithInvalidName = const Symbol("42");
-//                                                   ^
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:14: Context: While analyzing:
-// const Symbol symbolWithInvalidName = const Symbol("42");
-//              ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
@@ -159,37 +149,37 @@
 static const field core::bool isMapOfMapOfInt1 = #C8;
 static const field core::bool isMapOfMapOfInt2 = #C8;
 static const field core::Symbol symbolWithUnevaluatedParameter = #C31;
-static const field core::Symbol symbolWithInvalidName = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\"42\"'.";
-static const field self::Class<self::B>? c0 = #C33;
+static const field core::Symbol symbolWithInvalidName = #C32;
+static const field self::Class<self::B>? c0 = #C34;
 static const field self::Class<self::A>? c1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^";
-static const field self::Subclass<self::B>? c2 = #C34;
-static const field self::Class<self::A>? c3 = #C35;
-static const field self::Class<self::B>? c4 = #C36;
-static const field self::Subclass<self::A>? c5 = #C37;
-static const field self::Subclass<self::B>? c6 = #C38;
-static const field core::Type f = #C39;
-static field self::ConstClassWithF constClassWithF1 = #C41;
-static const field self::ConstClassWithF constClassWithF2 = #C41;
-static const field core::bool unevaluatedBool = #C42;
-static const field core::bool notUnevaluatedBool = #C43;
-static const field core::bool? unevaluatedBoolOrNull = #C44;
-static const field core::bool unevaluatedBoolNotNull = #C45;
+static const field self::Subclass<self::B>? c2 = #C35;
+static const field self::Class<self::A>? c3 = #C36;
+static const field self::Class<self::B>? c4 = #C37;
+static const field self::Subclass<self::A>? c5 = #C38;
+static const field self::Subclass<self::B>? c6 = #C39;
+static const field core::Type f = #C40;
+static field self::ConstClassWithF constClassWithF1 = #C42;
+static const field self::ConstClassWithF constClassWithF2 = #C42;
+static const field core::bool unevaluatedBool = #C43;
+static const field core::bool notUnevaluatedBool = #C44;
+static const field core::bool? unevaluatedBoolOrNull = #C45;
+static const field core::bool unevaluatedBoolNotNull = #C46;
 static method procedure(core::int i, {core::int named = #C9}) → core::int
   return i;
 static method main() → dynamic {
-  core::print(#C33);
+  core::print(#C34);
   core::print(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^");
-  core::print(#C34);
   core::print(#C35);
   core::print(#C36);
   core::print(#C37);
   core::print(#C38);
+  core::print(#C39);
   core::print(#C20);
   core::print((#C20).{self::Foo::saved}{core::bool});
   core::print((#C20).{self::Foo::value}{core::int});
@@ -233,20 +223,21 @@
   #C29 = <core::Map<core::int*, core::int*>*, core::int*>{#C26:#C19)
   #C30 = <core::int*, core::Map<core::int*, core::int*>*>{#C19:#C26)
   #C31 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
-  #C32 = "x"
-  #C33 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
-  #C34 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
-  #C35 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::A>?} #C9 : self::Class<self::A*>{self::A{}}
-  #C36 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
-  #C37 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A*>{(self::A{}) as{ForNonNullableByDefault} self::A*}
-  #C38 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
-  #C39 = TypeLiteralConstant((core::int*, {named: core::int*}) →* core::int*)
-  #C40 = tearoff self::procedure
-  #C41 = self::ConstClassWithF {foo:#C40}
-  #C42 = eval const core::bool::fromEnvironment(#C1)
-  #C43 = eval !const core::bool::fromEnvironment(#C1)
-  #C44 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
-  #C45 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
+  #C32 = #42
+  #C33 = "x"
+  #C34 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C35 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C36 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::A>?} #C9 : self::Class<self::A*>{self::A{}}
+  #C37 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C38 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A*>{(self::A{}) as{ForNonNullableByDefault} self::A*}
+  #C39 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C40 = TypeLiteralConstant((core::int*, {named: core::int*}) →* core::int*)
+  #C41 = tearoff self::procedure
+  #C42 = self::ConstClassWithF {foo:#C41}
+  #C43 = eval const core::bool::fromEnvironment(#C1)
+  #C44 = eval !const core::bool::fromEnvironment(#C1)
+  #C45 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
+  #C46 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
 }
 
 
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect
index 247eb18..f9aaa93 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.outline.expect
@@ -200,6 +200,7 @@
 Evaluated: IsExpression @ org-dartlang-testcase:///various.dart:73:46 -> BoolConstant(true)
 Evaluated with empty environment: ConstructorInvocation @ org-dartlang-testcase:///various.dart:76:11 -> SymbolConstant(#)
 Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:76:25 -> StringConstant("")
+Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:77:44 -> SymbolConstant(#42)
 Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:107:17 -> BoolConstant(false)
 Evaluated: ConstructorInvocation @ org-dartlang-testcase:///various.dart:107:71 -> InstanceConstant(const C{})
 Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:108:17 -> BoolConstant(false)
@@ -227,4 +228,4 @@
 Evaluated with empty environment: FactoryConstructorInvocationJudgment @ org-dartlang-testcase:///various.dart:130:10 -> BoolConstant(false)
 Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:130:35 -> BoolConstant(false)
 Evaluated with empty environment: StaticGet @ org-dartlang-testcase:///various.dart:131:37 -> NullConstant(null)
-Extra constant evaluation: evaluated: 112, effectively constant: 68
+Extra constant evaluation: evaluated: 112, effectively constant: 69
diff --git a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect
index bb6d767..b2b5426 100644
--- a/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart.weak.transformed.expect
@@ -46,16 +46,6 @@
 // const fromDeferredLib = lib.x;
 //       ^
 //
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:44: Error: Constant evaluation error:
-// const Symbol symbolWithInvalidName = const Symbol("42");
-//                                            ^
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:51: Context: The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '"42"'.
-// const Symbol symbolWithInvalidName = const Symbol("42");
-//                                                   ^
-// pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:77:14: Context: While analyzing:
-// const Symbol symbolWithInvalidName = const Symbol("42");
-//              ^
-//
 import self as self;
 import "dart:core" as core;
 import "dart:_internal" as _in;
@@ -159,40 +149,40 @@
 static const field core::bool isMapOfMapOfInt1 = #C8;
 static const field core::bool isMapOfMapOfInt2 = #C8;
 static const field core::Symbol symbolWithUnevaluatedParameter = #C31;
-static const field core::Symbol symbolWithInvalidName = invalid-expression "The symbol name must be a valid public Dart member name, public constructor name, or library name, optionally qualified, but was '\"42\"'.";
-static const field self::Class<self::B>? c0 = #C33;
+static const field core::Symbol symbolWithInvalidName = #C32;
+static const field self::Class<self::B>? c0 = #C34;
 static const field self::Class<self::A>? c1 = invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^";
-static const field self::Subclass<self::B>? c2 = #C34;
-static const field self::Class<self::A>? c3 = #C35;
-static const field self::Class<self::B>? c4 = #C36;
-static const field self::Subclass<self::A>? c5 = #C37;
-static const field self::Subclass<self::B>? c6 = #C38;
-static const field core::Type f = #C39;
-static field self::ConstClassWithF constClassWithF1 = #C41;
-static const field self::ConstClassWithF constClassWithF2 = #C41;
-static const field core::bool unevaluatedBool = #C42;
-static const field core::bool notUnevaluatedBool = #C43;
-static const field core::bool? unevaluatedBoolOrNull = #C44;
-static const field core::bool unevaluatedBoolNotNull = #C45;
+static const field self::Subclass<self::B>? c2 = #C35;
+static const field self::Class<self::A>? c3 = #C36;
+static const field self::Class<self::B>? c4 = #C37;
+static const field self::Subclass<self::A>? c5 = #C38;
+static const field self::Subclass<self::B>? c6 = #C39;
+static const field core::Type f = #C40;
+static field self::ConstClassWithF constClassWithF1 = #C42;
+static const field self::ConstClassWithF constClassWithF2 = #C42;
+static const field core::bool unevaluatedBool = #C43;
+static const field core::bool notUnevaluatedBool = #C44;
+static const field core::bool? unevaluatedBoolOrNull = #C45;
+static const field core::bool unevaluatedBoolNotNull = #C46;
 static method procedure(core::int i, {core::int named = #C9}) → core::int
   return i;
 static method main() → dynamic {
-  core::print(#C46);
+  core::print(#C47);
   core::print(invalid-expression "pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart:100:34: Error: The argument type 'A' can't be assigned to the parameter type 'T'.
  - 'A' is from 'pkg/front_end/testcases/general/constants/with_unevaluated_agnostic/various.dart'.
   const Class.method(T t) : this(-t);
                                  ^");
-  core::print(#C47);
   core::print(#C48);
   core::print(#C49);
   core::print(#C50);
   core::print(#C51);
   core::print(#C52);
-  core::print((#C52).{self::Foo::saved}{core::bool});
-  core::print((#C52).{self::Foo::value}{core::int});
+  core::print(#C53);
+  core::print((#C53).{self::Foo::saved}{core::bool});
+  core::print((#C53).{self::Foo::value}{core::int});
 }
 
 library /*isNonNullableByDefault*/;
@@ -233,27 +223,28 @@
   #C29 = <core::Map<core::int*, core::int*>*, core::int*>{#C26:#C19)
   #C30 = <core::int*, core::Map<core::int*, core::int*>*>{#C19:#C26)
   #C31 = eval const _in::Symbol::•(const core::String::fromEnvironment(#C1))
-  #C32 = "x"
-  #C33 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
-  #C34 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
-  #C35 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::A>?} #C9 : self::Class<self::A*>{self::A{}}
-  #C36 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
-  #C37 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A*>{(self::A{}) as{ForNonNullableByDefault} self::A*}
-  #C38 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
-  #C39 = TypeLiteralConstant((core::int*, {named: core::int*}) →* core::int*)
-  #C40 = tearoff self::procedure
-  #C41 = self::ConstClassWithF {foo:#C40}
-  #C42 = eval const core::bool::fromEnvironment(#C1)
-  #C43 = eval !const core::bool::fromEnvironment(#C1)
-  #C44 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
-  #C45 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
-  #C46 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
-  #C47 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
-  #C48 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::A>?} #C9 : self::Class<self::A*>{self::A{}}
-  #C49 = eval const core::bool::fromEnvironment(#C32) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
-  #C50 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A*>{(self::A{}) as{ForNonNullableByDefault} self::A*}
-  #C51 = eval const core::bool::fromEnvironment(#C32) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
-  #C52 = eval self::Foo<core::int*>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
+  #C32 = #42
+  #C33 = "x"
+  #C34 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C35 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C36 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::A>?} #C9 : self::Class<self::A*>{self::A{}}
+  #C37 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C38 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A*>{(self::A{}) as{ForNonNullableByDefault} self::A*}
+  #C39 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C40 = TypeLiteralConstant((core::int*, {named: core::int*}) →* core::int*)
+  #C41 = tearoff self::procedure
+  #C42 = self::ConstClassWithF {foo:#C41}
+  #C43 = eval const core::bool::fromEnvironment(#C1)
+  #C44 = eval !const core::bool::fromEnvironment(#C1)
+  #C45 = eval const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9
+  #C46 = eval (const core::bool::fromEnvironment(#C2) ?{core::bool?} const core::bool::fromEnvironment(#C1) : #C9)!
+  #C47 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C48 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::C{}) as{ForNonNullableByDefault} self::B*}
+  #C49 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::A>?} #C9 : self::Class<self::A*>{self::A{}}
+  #C50 = eval const core::bool::fromEnvironment(#C33) ?{self::Class<self::B>?} #C9 : self::Class<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C51 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::A>?} #C9 : self::Subclass<self::A*>{(self::A{}) as{ForNonNullableByDefault} self::A*}
+  #C52 = eval const core::bool::fromEnvironment(#C33) ?{self::Subclass<self::B>?} #C9 : self::Subclass<self::B*>{(self::B{}) as{ForNonNullableByDefault} self::B*}
+  #C53 = eval self::Foo<core::int*>{saved:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), saved2:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), initialized:const core::bool::fromEnvironment(#C1, defaultValue: const core::bool::fromEnvironment(#C2)), value:#C19}
 }
 
 Extra constant evaluation status:
diff --git a/pkg/front_end/testcases/general/issue42610.dart.weak.expect b/pkg/front_end/testcases/general/issue42610.dart.weak.expect
index 40fc5da..be9d427 100644
--- a/pkg/front_end/testcases/general/issue42610.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue42610.dart.weak.expect
@@ -2,20 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue42610.dart:6:4: Error: Expected an identifier, but got 'final'.
-// Try inserting an identifier before 'final'.
+// pkg/front_end/testcases/general/issue42610.dart:6:4: Error: 'final' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
 //   #final;
 //    ^^^^^
 //
-// pkg/front_end/testcases/general/issue42610.dart:6:4: Error: Expected ';' after this.
-//   #final;
-//    ^^^^^
-//
-// pkg/front_end/testcases/general/issue42610.dart:6:9: Error: Expected an identifier, but got ';'.
-// Try inserting an identifier before ';'.
-//   #final;
-//         ^
-//
 // pkg/front_end/testcases/general/issue42610.dart:7:9: Error: The final variable 'x' must be initialized.
 // Try adding an initializer ('= expression') to the declaration.
 //   final x;
@@ -37,6 +28,29 @@
 //             ^
 //
 import self as self;
+import "dart:core" as core;
 
-static method test() → void {}
+static method test() → void {
+  #C1;
+  final dynamic x = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:7:9: Error: The final variable 'x' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  final x;
+        ^";
+  const dynamic y = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:8:9: Error: The const variable 'y' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  const y;
+        ^";
+  final core::int* z = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:9:13: Error: The final variable 'z' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  final int z;
+            ^" as{TypeError,ForDynamic} core::int*;
+  const core::int* w = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:10:13: Error: The const variable 'w' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  const int w;
+            ^";
+}
 static method main() → void {}
+
+constants  {
+  #C1 = #final
+}
diff --git a/pkg/front_end/testcases/general/issue42610.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue42610.dart.weak.transformed.expect
index 40fc5da..78cba42 100644
--- a/pkg/front_end/testcases/general/issue42610.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue42610.dart.weak.transformed.expect
@@ -2,20 +2,11 @@
 //
 // Problems in library:
 //
-// pkg/front_end/testcases/general/issue42610.dart:6:4: Error: Expected an identifier, but got 'final'.
-// Try inserting an identifier before 'final'.
+// pkg/front_end/testcases/general/issue42610.dart:6:4: Error: 'final' can't be used as an identifier because it's a keyword.
+// Try renaming this to be an identifier that isn't a keyword.
 //   #final;
 //    ^^^^^
 //
-// pkg/front_end/testcases/general/issue42610.dart:6:4: Error: Expected ';' after this.
-//   #final;
-//    ^^^^^
-//
-// pkg/front_end/testcases/general/issue42610.dart:6:9: Error: Expected an identifier, but got ';'.
-// Try inserting an identifier before ';'.
-//   #final;
-//         ^
-//
 // pkg/front_end/testcases/general/issue42610.dart:7:9: Error: The final variable 'x' must be initialized.
 // Try adding an initializer ('= expression') to the declaration.
 //   final x;
@@ -37,6 +28,29 @@
 //             ^
 //
 import self as self;
+import "dart:core" as core;
 
-static method test() → void {}
+static method test() → void {
+  #C1;
+  final dynamic x = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:7:9: Error: The final variable 'x' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  final x;
+        ^";
+  const dynamic y = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:8:9: Error: The const variable 'y' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  const y;
+        ^";
+  final core::int* z = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:9:13: Error: The final variable 'z' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  final int z;
+            ^";
+  const core::int* w = invalid-expression "pkg/front_end/testcases/general/issue42610.dart:10:13: Error: The const variable 'w' must be initialized.
+Try adding an initializer ('= expression') to the declaration.
+  const int w;
+            ^";
+}
 static method main() → void {}
+
+constants  {
+  #C1 = #final
+}
diff --git a/pkg/front_end/testcases/strong.status b/pkg/front_end/testcases/strong.status
index f3bdfc8..cfb0715 100644
--- a/pkg/front_end/testcases/strong.status
+++ b/pkg/front_end/testcases/strong.status
@@ -8,6 +8,7 @@
 
 dart2js/late_statics: SemiFuzzFailure # dartbug.com/45854
 
+constructor_tearoffs/redirecting_constructors: RuntimeError
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/text_serialization.status b/pkg/front_end/testcases/text_serialization.status
index 6d4e214..24201ec 100644
--- a/pkg/front_end/testcases/text_serialization.status
+++ b/pkg/front_end/testcases/text_serialization.status
@@ -6,6 +6,7 @@
 # the round trip for Kernel textual serialization where the initial binary
 # Kernel files are produced by compiling Dart code via Fasta.
 
+constructor_tearoffs/redirecting_constructors: RuntimeError
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 31ef5f3..5dd912a 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -28,6 +28,8 @@
 constructor_tearoffs/instantiation: FormatterCrash
 constructor_tearoffs/nongeneric_tearoff_with_context: FormatterCrash
 constructor_tearoffs/nongeneric_tearoff_without_context: FormatterCrash
+constructor_tearoffs/redirecting_constructors: FormatterCrash
+constructor_tearoffs/unnamed_constructor: FormatterCrash
 dart2js/late_fields: FormatterCrash
 dart2js/late_statics: FormatterCrash
 extensions/extension_constructor: FormatterCrash
diff --git a/pkg/front_end/testcases/weak.status b/pkg/front_end/testcases/weak.status
index 751db7e..3c2c427 100644
--- a/pkg/front_end/testcases/weak.status
+++ b/pkg/front_end/testcases/weak.status
@@ -11,6 +11,7 @@
 regress/utf_16_le_content.crash: SemiFuzzCrash
 dart2js/late_statics: SemiFuzzFailure # dartbug.com/45854
 
+constructor_tearoffs/redirecting_constructors: RuntimeError
 extension_types/extension_on_nullable: ExpectationFileMismatchSerialized # Expected.
 extension_types/issue45775: ExpectationFileMismatchSerialized # Expected.
 extension_types/simple: ExpectationFileMismatchSerialized # Expected.
diff --git a/pkg/kernel/lib/class_hierarchy.dart b/pkg/kernel/lib/class_hierarchy.dart
index e1a99a8..f66182a 100644
--- a/pkg/kernel/lib/class_hierarchy.dart
+++ b/pkg/kernel/lib/class_hierarchy.dart
@@ -1216,8 +1216,7 @@
       for (Member mixinMember in _buildDeclaredMembers(
           mixedInClassNode, mixedInInfo,
           setters: setters)) {
-        if (mixinMember is! Procedure ||
-            (mixinMember is Procedure && !mixinMember.isSynthetic)) {
+        if (mixinMember is! Procedure || !mixinMember.isSynthetic) {
           memberMap[mixinMember.name] = mixinMember;
         }
       }
diff --git a/pkg/nnbd_migration/lib/src/edge_builder.dart b/pkg/nnbd_migration/lib/src/edge_builder.dart
index 3ae06c1..c98e62c 100644
--- a/pkg/nnbd_migration/lib/src/edge_builder.dart
+++ b/pkg/nnbd_migration/lib/src/edge_builder.dart
@@ -220,8 +220,6 @@
 
   final Set<PromotableElement> _lateHintedLocals = {};
 
-  final Set<PromotableElement> _requiredHintedParameters = {};
-
   final Map<Token, HintComment> _nullCheckHints = {};
 
   /// Helper that assists us in transforming Iterable methods to their "OrNull"
@@ -801,22 +799,31 @@
   DecoratedType visitDefaultFormalParameter(DefaultFormalParameter node) {
     _dispatch(node.parameter);
     var defaultValue = node.defaultValue;
+    var declaredElement = node.declaredElement;
     if (defaultValue == null) {
-      if (node.declaredElement.hasRequired) {
+      if (declaredElement.hasRequired) {
         // Nothing to do; the implicit default value of `null` will never be
         // reached.
       } else if (_variables.getRequiredHint(source, node) != null) {
         // Nothing to do; assume the implicit default value of `null` will never
         // be reached.
-        _requiredHintedParameters.add(node.declaredElement);
       } else {
-        _graph.makeNullable(
-            getOrComputeElementType(node, node.declaredElement).node,
-            OptionalFormalParameterOrigin(source, node));
+        var enclosingElement = declaredElement.enclosingElement;
+        if (enclosingElement is ConstructorElement &&
+            enclosingElement.isFactory &&
+            enclosingElement.redirectedConstructor != null) {
+          // Redirecting factory constructors inherit their parameters' default
+          // values from the constructors they redirect to, so the lack of a
+          // default value doesn't mean the parameter has to be nullable.
+        } else {
+          _graph.makeNullable(
+              getOrComputeElementType(node, declaredElement).node,
+              OptionalFormalParameterOrigin(source, node));
+        }
       }
     } else {
       _handleAssignment(defaultValue,
-          destinationType: getOrComputeElementType(node, node.declaredElement),
+          destinationType: getOrComputeElementType(node, declaredElement),
           fromDefaultValue: true);
     }
     return null;
@@ -1647,7 +1654,6 @@
       if (!node.inDeclarationContext() &&
           node.inGetterContext() &&
           !_lateHintedLocals.contains(staticElement) &&
-          !_requiredHintedParameters.contains(staticElement) &&
           !_flowAnalysis.isAssigned(staticElement)) {
         _graph.makeNullable(type.node, UninitializedReadOrigin(source, node));
       }
diff --git a/pkg/nnbd_migration/lib/src/edit_plan.dart b/pkg/nnbd_migration/lib/src/edit_plan.dart
index bc70677..633732f 100644
--- a/pkg/nnbd_migration/lib/src/edit_plan.dart
+++ b/pkg/nnbd_migration/lib/src/edit_plan.dart
@@ -185,8 +185,9 @@
   EditPlanner(this.lineInfo, this.sourceText, {this.removeViaComments = false});
 
   /// Creates a new edit plan that consists of executing [innerPlan], and then
-  /// converting the late [hint] into an explicit `late`.
-  NodeProducingEditPlan acceptLateHint(
+  /// converting the [hint] (which precedes the node) into text that is not
+  /// commented out.
+  NodeProducingEditPlan acceptPrefixHint(
       NodeProducingEditPlan innerPlan, HintComment hint,
       {AtomicEditInfo info}) {
     var affixPlan = innerPlan is _CommentAffixPlan
@@ -200,8 +201,9 @@
   }
 
   /// Creates a new edit plan that consists of executing [innerPlan], and then
-  /// converting the nullability [hint] into an explicit `?` or `!`.
-  NodeProducingEditPlan acceptNullabilityOrNullCheckHint(
+  /// converting the [hint] (which follows the node) into text that is not
+  /// commented out.
+  NodeProducingEditPlan acceptSuffixHint(
       NodeProducingEditPlan innerPlan, HintComment hint,
       {AtomicEditInfo info}) {
     var affixPlan = innerPlan is _CommentAffixPlan
diff --git a/pkg/nnbd_migration/lib/src/fix_aggregator.dart b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
index 60e779d..2df2b83 100644
--- a/pkg/nnbd_migration/lib/src/fix_aggregator.dart
+++ b/pkg/nnbd_migration/lib/src/fix_aggregator.dart
@@ -746,6 +746,10 @@
   /// contained in the edit.
   AtomicEditInfo addRequiredKeywordInfo;
 
+  /// If [addRequiredKeyword] is `true`, and there is a `/*required*/` hint,
+  /// the hint comment that should be converted into a simple `required` string.
+  HintComment requiredHint;
+
   /// If non-null, indicates a `@required` annotation which should be removed
   /// from this node.
   Annotation annotationToRemove;
@@ -762,8 +766,13 @@
 
   @override
   EditPlan _apply(DefaultFormalParameter node, FixAggregator aggregator) {
-    var innerPlan = aggregator.innerPlanForNode(node);
-    if (!addRequiredKeyword) return innerPlan;
+    if (!addRequiredKeyword) return aggregator.innerPlanForNode(node);
+
+    if (requiredHint != null) {
+      var innerPlan = aggregator.innerPlanForNode(node);
+      return aggregator.planner.acceptPrefixHint(innerPlan, requiredHint,
+          info: addRequiredKeywordInfo);
+    }
 
     var offset = node.firstTokenAfterCommentAndMetadata.offset;
     return aggregator.planner.passThrough(node, innerPlans: [
@@ -1205,8 +1214,7 @@
     if (_makeNullable) {
       var hint = _nullabilityHint;
       if (hint != null) {
-        return aggregator.planner.acceptNullabilityOrNullCheckHint(
-            innerPlan, hint,
+        return aggregator.planner.acceptSuffixHint(innerPlan, hint,
             info: AtomicEditInfo(
                 NullabilityFixDescription.makeTypeNullableDueToHint(typeName),
                 fixReasons,
@@ -1302,7 +1310,7 @@
       var description = lateHint.kind == HintCommentKind.late_
           ? NullabilityFixDescription.addLateDueToHint
           : NullabilityFixDescription.addLateFinalDueToHint;
-      plan = aggregator.planner.acceptLateHint(plan, lateHint,
+      plan = aggregator.planner.acceptPrefixHint(plan, lateHint,
           info: AtomicEditInfo(description, {}, hintComment: lateHint));
     }
     return plan;
@@ -1348,8 +1356,7 @@
   NodeProducingEditPlan applyExpression(FixAggregator aggregator,
       NodeProducingEditPlan innerPlan, AtomicEditInfo info) {
     if (hint != null) {
-      return aggregator.planner
-          .acceptNullabilityOrNullCheckHint(innerPlan, hint, info: info);
+      return aggregator.planner.acceptSuffixHint(innerPlan, hint, info: info);
     } else {
       return aggregator.planner
           .addUnaryPostfix(innerPlan, TokenType.BANG, info: info);
diff --git a/pkg/nnbd_migration/lib/src/fix_builder.dart b/pkg/nnbd_migration/lib/src/fix_builder.dart
index add21a0..6a7731b 100644
--- a/pkg/nnbd_migration/lib/src/fix_builder.dart
+++ b/pkg/nnbd_migration/lib/src/fix_builder.dart
@@ -426,7 +426,7 @@
       node,
       () => node.elements,
       () => _collectionElements[node] ??=
-          _transformCollectionElements(node.elements, node.typeArguments));
+          _transformCollectionElements(node.elements));
 
   @override
   List<CollectionElement> getSetOrMapElements(SetOrMapLiteral node) =>
@@ -434,7 +434,7 @@
           node,
           () => node.elements,
           () => _collectionElements[node] ??=
-              _transformCollectionElements(node.elements, node.typeArguments));
+              _transformCollectionElements(node.elements));
 
   @override
   DartType getTypeParameterBound(TypeParameterElementImpl element) {
@@ -808,7 +808,7 @@
   }
 
   List<CollectionElement> _transformCollectionElements(
-      NodeList<CollectionElement> elements, TypeArgumentList typeArguments) {
+      NodeList<CollectionElement> elements) {
     return elements
         .map(_transformCollectionElement)
         .where((e) => e != null)
@@ -1113,17 +1113,27 @@
   void visitDefaultFormalParameter(DefaultFormalParameter node) {
     var element = node.declaredElement;
     if (node.defaultValue == null) {
+      var requiredHint =
+          _fixBuilder._variables.getRequiredHint(_fixBuilder.source, node);
       var nullabilityNode =
           _fixBuilder._variables.decoratedElementType(element).node;
       if (!nullabilityNode.isNullable) {
-        if (element.isNamed) {
-          _addRequiredKeyword(node, nullabilityNode);
+        var enclosingElement = element.enclosingElement;
+        if (enclosingElement is ConstructorElement &&
+            enclosingElement.isFactory &&
+            enclosingElement.redirectedConstructor != null) {
+          // Redirecting factory constructors inherit their parameters' default
+          // values from the constructors they redirect to, so the lack of a
+          // default value doesn't mean the parameter has to be nullable.
+        } else if (element.isNamed) {
+          _addRequiredKeyword(node, nullabilityNode, requiredHint);
         } else {
           _fixBuilder._addProblem(
               node, const NonNullableUnnamedOptionalParameter());
         }
-      } else if (element.metadata.any((m) => m.isRequired)) {
-        _addRequiredKeyword(node, nullabilityNode);
+      } else if (requiredHint != null ||
+          element.metadata.any((m) => m.isRequired)) {
+        _addRequiredKeyword(node, nullabilityNode, requiredHint);
       }
     }
     super.visitDefaultFormalParameter(node);
@@ -1199,8 +1209,8 @@
     super.visitTypeName(node);
   }
 
-  void _addRequiredKeyword(
-      DefaultFormalParameter parameter, NullabilityNode node) {
+  void _addRequiredKeyword(DefaultFormalParameter parameter,
+      NullabilityNode node, HintComment requiredHint) {
     // Change an existing `@required` annotation into a `required` keyword if
     // possible.
     final element = parameter.declaredElement;
@@ -1226,7 +1236,8 @@
     var nodeChange = (_fixBuilder._getChange(parameter)
         as NodeChangeForDefaultFormalParameter)
       ..addRequiredKeyword = true
-      ..addRequiredKeywordInfo = info;
+      ..addRequiredKeywordInfo = info
+      ..requiredHint = requiredHint;
     var requiredAnnotation = metadata?.firstWhere(
         (annotation) => annotation.elementAnnotation.isRequired,
         orElse: () => null);
diff --git a/pkg/nnbd_migration/lib/src/front_end/instrumentation_information.dart b/pkg/nnbd_migration/lib/src/front_end/instrumentation_information.dart
index 07398ba..6099a8f 100644
--- a/pkg/nnbd_migration/lib/src/front_end/instrumentation_information.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/instrumentation_information.dart
@@ -20,20 +20,12 @@
   /// The node used for type sources that are never `null`.
   NullabilityNodeInfo never;
 
-  /// A map associating [NodeInformation] with [NullabilityNodeInfo] objects.
-  Map<NullabilityNodeInfo, NodeInformation> nodeInformation = {};
-
   /// The instrumentation information that is specific to a single source.
   final Map<Source, SourceInformation> sourceInformation = {};
 
   /// Initialize a newly created holder of instrumentation information.
   InstrumentationInformation();
 
-  /// Return information about the given [node].
-  NodeInformation nodeInfoFor(NullabilityNodeInfo node) {
-    return nodeInformation[node];
-  }
-
   /// Return the type annotation associated with the [node] or `null` if the
   /// node represents an implicit type.
   TypeAnnotation typeAnnotationForNode(NullabilityNodeInfo node) {
diff --git a/pkg/nnbd_migration/lib/src/front_end/instrumentation_listener.dart b/pkg/nnbd_migration/lib/src/front_end/instrumentation_listener.dart
index c72f61c..c6927da 100644
--- a/pkg/nnbd_migration/lib/src/front_end/instrumentation_listener.dart
+++ b/pkg/nnbd_migration/lib/src/front_end/instrumentation_listener.dart
@@ -4,7 +4,6 @@
 
 import 'package:analyzer/dart/ast/ast.dart';
 import 'package:analyzer/dart/element/element.dart';
-import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:nnbd_migration/instrumentation.dart';
 import 'package:nnbd_migration/src/edit_plan.dart';
@@ -32,21 +31,20 @@
   @override
   void explicitTypeNullability(
       Source source, TypeAnnotation typeAnnotation, NullabilityNodeInfo node) {
-    data.nodeInformation[node] =
-        NodeInformation(_filePathForSource(source), typeAnnotation, null);
     _sourceInfo(source).explicitTypeNullability[typeAnnotation] = node;
   }
 
   @override
-  void externalDecoratedType(Element element, DecoratedTypeInfo decoratedType) {
-    _storeNodeInformation(decoratedType, element.source, null, element);
-  }
+  void externalDecoratedType(
+      Element element, DecoratedTypeInfo decoratedType) {}
 
   @override
   void externalDecoratedTypeParameterBound(
-      TypeParameterElement typeParameter, DecoratedTypeInfo decoratedType) {
-    _storeNodeInformation(
-        decoratedType, typeParameter.source, null, typeParameter);
+      TypeParameterElement typeParameter, DecoratedTypeInfo decoratedType) {}
+
+  @override
+  void finished() {
+    migrationSummary?.write();
   }
 
   @override
@@ -62,23 +60,15 @@
 
   @override
   void implicitReturnType(
-      Source source, AstNode node, DecoratedTypeInfo decoratedReturnType) {
-    _storeNodeInformation(decoratedReturnType, source, node, null);
-  }
+      Source source, AstNode node, DecoratedTypeInfo decoratedReturnType) {}
 
   @override
   void implicitType(
-      Source source, AstNode node, DecoratedTypeInfo decoratedType) {
-    _storeNodeInformation(decoratedType, source, node, null);
-  }
+      Source source, AstNode node, DecoratedTypeInfo decoratedType) {}
 
   @override
   void implicitTypeArguments(
-      Source source, AstNode node, Iterable<DecoratedTypeInfo> types) {
-    for (var type in types) {
-      _storeNodeInformation(type, source, node, null);
-    }
-  }
+      Source source, AstNode node, Iterable<DecoratedTypeInfo> types) {}
 
   @override
   void prepareForUpdate() {
@@ -87,52 +77,8 @@
     }
   }
 
-  String _filePathForSource(Source source) {
-    return source.fullName;
-  }
-
   /// Return the source information associated with the given [source], creating
   /// it if there has been no previous information for that source.
   SourceInformation _sourceInfo(Source source) =>
       data.sourceInformation.putIfAbsent(source, () => SourceInformation());
-
-  // TODO(srawlins): This code is completely untested.
-  void _storeNodeInformation(DecoratedTypeInfo decoratedType, Source source,
-      AstNode astNode, Element element) {
-    // Make sure source info exists for the given source.
-    _sourceInfo(source);
-    data.nodeInformation[decoratedType.node] =
-        NodeInformation(_filePathForSource(source), astNode, element);
-    var dartType = decoratedType.type;
-    if (dartType is InterfaceType) {
-      for (var i = 0; i < dartType.typeArguments.length; i++) {
-        _storeNodeInformation(
-            decoratedType.typeArgument(i), source, astNode, element);
-      }
-    } else if (dartType is FunctionType) {
-      _storeNodeInformation(
-        decoratedType.returnType,
-        source,
-        astNode,
-        element,
-      );
-      var i = 0;
-      for (var parameter in dartType.parameters) {
-        if (parameter.isNamed) {
-          var name = parameter.name;
-          _storeNodeInformation(
-              decoratedType.namedParameter(name), source, astNode, element);
-        } else {
-          _storeNodeInformation(
-              decoratedType.positionalParameter(i), source, astNode, element);
-          i++;
-        }
-      }
-    }
-  }
-
-  @override
-  void finished() {
-    migrationSummary?.write();
-  }
 }
diff --git a/pkg/nnbd_migration/test/api_test.dart b/pkg/nnbd_migration/test/api_test.dart
index 19248f9..cd978d6 100644
--- a/pkg/nnbd_migration/test/api_test.dart
+++ b/pkg/nnbd_migration/test/api_test.dart
@@ -124,6 +124,32 @@
 
 /// Mixin containing test cases for the provisional API.
 mixin _ProvisionalApiTestCases on _ProvisionalApiTestBase {
+  Future<void> test_accept_required_hint() async {
+    var content = '''
+f({/*required*/ int i}) {}
+''';
+    var expected = '''
+f({required int i}) {}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_accept_required_hint_nullable() async {
+    var content = '''
+f({/*required*/ int i}) {}
+g() {
+  f(i: null);
+}
+''';
+    var expected = '''
+f({required int? i}) {}
+g() {
+  f(i: null);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_add_explicit_parameter_type() async {
     var content = '''
 abstract class C {
@@ -1070,6 +1096,86 @@
     await _checkSingleFileChanges(content, expected);
   }
 
+  Future<void> test_constructor_optional_param_factory() async {
+    var content = '''
+class C {
+  factory C([int x]) => C._();
+  C._([int x = 0]);
+}
+''';
+    var expected = '''
+class C {
+  factory C([int? x]) => C._();
+  C._([int x = 0]);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void>
+      test_constructor_optional_param_factory_redirecting_named() async {
+    var content = '''
+class C {
+  factory C({int x}) = C._;
+  C._({int x = 0});
+}
+''';
+    var expected = '''
+class C {
+  factory C({int x}) = C._;
+  C._({int x = 0});
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void>
+      test_constructor_optional_param_factory_redirecting_unnamed() async {
+    var content = '''
+class C {
+  factory C([int x]) = C._;
+  C._([int x = 0]);
+}
+''';
+    var expected = '''
+class C {
+  factory C([int x]) = C._;
+  C._([int x = 0]);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_constructor_optional_param_normal() async {
+    var content = '''
+class C {
+  C([int x]);
+}
+''';
+    var expected = '''
+class C {
+  C([int? x]);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
+  Future<void> test_constructor_optional_param_redirecting() async {
+    var content = '''
+class C {
+  C([int x]) : this._();
+  C._([int x = 0]);
+}
+''';
+    var expected = '''
+class C {
+  C([int? x]) : this._();
+  C._([int x = 0]);
+}
+''';
+    await _checkSingleFileChanges(content, expected);
+  }
+
   Future<void> test_constructorDeclaration_factory_non_null_return() async {
     var content = '''
 class C {
diff --git a/pkg/nnbd_migration/test/edit_plan_test.dart b/pkg/nnbd_migration/test/edit_plan_test.dart
index 078318e..d7881a2 100644
--- a/pkg/nnbd_migration/test/edit_plan_test.dart
+++ b/pkg/nnbd_migration/test/edit_plan_test.dart
@@ -64,7 +64,7 @@
     await analyze(code);
     var hint = getPrefixHint(findNode.simple('int').token);
     var changes = checkPlan(
-        planner.acceptLateHint(
+        planner.acceptPrefixHint(
             planner.passThrough(findNode.simple('int')), hint),
         'late int x = 0;');
     expect(changes.keys, unorderedEquals([0, 7]));
@@ -77,7 +77,7 @@
     await analyze(code);
     var hint = getPrefixHint(findNode.simple('int').token);
     checkPlan(
-        planner.acceptLateHint(
+        planner.acceptPrefixHint(
             planner.passThrough(findNode.simple('int')), hint),
         'late int x = 0;');
   }
@@ -87,7 +87,7 @@
     await analyze(code);
     var hint = getPrefixHint(findNode.simple('int').token);
     checkPlan(
-        planner.acceptLateHint(
+        planner.acceptPrefixHint(
             planner.passThrough(findNode.simple('int')), hint),
         '@deprecated late int x = 0;');
   }
@@ -103,7 +103,7 @@
     var parameter = findNode.fieldFormalParameter('void this.f(int i)');
     var typeName = planner.passThrough(parameter);
     checkPlan(
-        planner.acceptNullabilityOrNullCheckHint(
+        planner.acceptSuffixHint(
             typeName, getPostfixHint(parameter.parameters.rightParenthesis)),
         '''
 class C {
@@ -118,7 +118,7 @@
     var parameter = findNode.functionTypedFormalParameter('void g(int i)');
     var typeName = planner.passThrough(parameter);
     checkPlan(
-        planner.acceptNullabilityOrNullCheckHint(
+        planner.acceptSuffixHint(
             typeName, getPostfixHint(parameter.parameters.rightParenthesis)),
         'f(void g(int i)?) {}');
   }
@@ -128,9 +128,7 @@
     await analyze(code);
     var intRef = findNode.simple('int');
     var typeName = planner.passThrough(intRef);
-    checkPlan(
-        planner.acceptNullabilityOrNullCheckHint(
-            typeName, getPostfixHint(intRef.token)),
+    checkPlan(planner.acceptSuffixHint(typeName, getPostfixHint(intRef.token)),
         'int? x = 0;');
   }
 
@@ -141,7 +139,7 @@
     checkPlan(
         planner.extract(
             xRef.parent.parent,
-            planner.acceptNullabilityOrNullCheckHint(
+            planner.acceptSuffixHint(
                 planner.passThrough(xRef), getPostfixHint(xRef.token))),
         'f(x) => x!;');
   }
diff --git a/pkg/test_runner/lib/src/command_output.dart b/pkg/test_runner/lib/src/command_output.dart
index ae762aa..579b10e 100644
--- a/pkg/test_runner/lib/src/command_output.dart
+++ b/pkg/test_runner/lib/src/command_output.dart
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:convert';
+
 // We need to use the 'io' prefix here, otherwise io.exitCode will shadow
 // CommandOutput.exitCode in subclasses of CommandOutput.
 import 'dart:io' as io;
@@ -459,11 +460,11 @@
 
 /// A parsed analyzer error diagnostic.
 class AnalyzerError implements Comparable<AnalyzerError> {
-  /// Parses all errors from analyzer [stderr] output.
-  static List<AnalyzerError> parseStderr(String stderr) {
+  /// Parses all errors from analyzer [stdout] output.
+  static List<AnalyzerError> parseStdout(String stdout) {
     var result = <AnalyzerError>[];
 
-    var jsonData = json.decode(stderr) as Map<String, dynamic>;
+    var jsonData = json.decode(stdout) as Map<String, dynamic>;
     var version = jsonData['version'];
     if (version != 1) {
       DebugLogger.error('Unexpected analyzer JSON data version: $version');
@@ -543,8 +544,11 @@
 }
 
 class AnalysisCommandOutput extends CommandOutput with _StaticErrorOutput {
-  static void parseErrors(String stderr, List<StaticError> errors,
-      [List<StaticError> warnings]) {
+  static void parseErrors(
+    String stdout,
+    List<StaticError> errors, [
+    List<StaticError> warnings,
+  ]) {
     StaticError convert(AnalyzerError error) {
       var staticError = StaticError(ErrorSource.analyzer, error.errorCode,
           line: error.line, column: error.column, length: error.length);
@@ -570,7 +574,7 @@
 
     // Parse as Analyzer errors and then convert them to the StaticError objects
     // the static error tests expect.
-    for (var diagnostic in AnalyzerError.parseStderr(stderr)) {
+    for (var diagnostic in AnalyzerError.parseStdout(stdout)) {
       if (diagnostic.severity == 'ERROR') {
         errors.add(convert(diagnostic));
       } else if (diagnostic.severity == 'WARNING' && warnings != null) {
@@ -579,18 +583,18 @@
     }
   }
 
-  /// If the stderr of analyzer could not be parsed as valid JSON, this will
-  /// be the stderr as a string instead. Otherwise it will be null.
-  String get invalidJsonStderr {
+  /// If the stdout of analyzer could not be parsed as valid JSON, this will be
+  /// the stdout as a string instead. Otherwise it will be null.
+  String get invalidJsonStdout {
     if (!_parsedErrors) {
       _parseErrors();
       _parsedErrors = true;
     }
 
-    return _invalidJsonStderr;
+    return _invalidJsonStdout;
   }
 
-  String _invalidJsonStderr;
+  String _invalidJsonStdout;
 
   AnalysisCommandOutput(
       Command command,
@@ -614,7 +618,7 @@
     if (hasNonUtf8) return Expectation.nonUtf8Error;
     if (truncatedOutput) return Expectation.truncatedOutput;
 
-    if (invalidJsonStderr != null) return Expectation.fail;
+    if (invalidJsonStdout != null) return Expectation.fail;
 
     // If it's a static error test, validate the exact errors.
     if (testCase.testFile.isStaticErrorTest) {
@@ -661,7 +665,7 @@
     if (hasNonUtf8) return Expectation.nonUtf8Error;
     if (truncatedOutput) return Expectation.truncatedOutput;
 
-    if (invalidJsonStderr != null) return Expectation.fail;
+    if (invalidJsonStdout != null) return Expectation.fail;
 
     // If it's a static error test, validate the exact errors.
     if (testCase.testFile.isStaticErrorTest) {
@@ -679,9 +683,9 @@
 
   @override
   void describe(TestCase testCase, Progress progress, OutputWriter output) {
-    if (invalidJsonStderr != null) {
-      output.subsection("invalid JSON on analyzer stderr");
-      output.write(invalidJsonStderr);
+    if (invalidJsonStdout != null) {
+      output.subsection("invalid analyzer json");
+      output.write(invalidJsonStdout);
       return;
     }
 
@@ -692,7 +696,7 @@
     } else {
       // Parse and sort the errors.
       var errorsByFile = <String, List<AnalyzerError>>{};
-      for (var error in AnalyzerError.parseStderr(decodeUtf8(stderr))) {
+      for (var error in AnalyzerError.parseStdout(decodeUtf8(stdout))) {
         errorsByFile.putIfAbsent(error.file, () => []).add(error);
       }
 
@@ -720,20 +724,20 @@
     }
   }
 
-  /// Parses the JSON output of analyzer.
+  /// Parses the JSON output of the analyzer.
   @override
   void _parseErrors() {
-    var stderrString = decodeUtf8(stderr);
+    var stdoutString = decodeUtf8(stdout);
     try {
       var errors = <StaticError>[];
       var warnings = <StaticError>[];
-      parseErrors(stderrString, errors, warnings);
+      parseErrors(stdoutString, errors, warnings);
       errors.forEach(addError);
       warnings.forEach(addWarning);
     } on FormatException {
       // It wasn't JSON. This can happen if analyzer instead prints:
       // "No dart files found at: ..."
-      _invalidJsonStderr = stderrString;
+      _invalidJsonStdout = stdoutString;
     }
   }
 }
@@ -1293,6 +1297,7 @@
   }
 
   Expectation result(TestCase testCase) => _result;
+
   Expectation realResult(TestCase testCase) => _result;
 
   bool get canRunDependendCommands => _result == Expectation.pass;
diff --git a/pkg/test_runner/tool/update_static_error_tests.dart b/pkg/test_runner/tool/update_static_error_tests.dart
index 9758107..053dcbd 100644
--- a/pkg/test_runner/tool/update_static_error_tests.dart
+++ b/pkg/test_runner/tool/update_static_error_tests.dart
@@ -244,7 +244,7 @@
 
   var errors = <StaticError>[];
   var warnings = <StaticError>[];
-  AnalysisCommandOutput.parseErrors(result.stderr as String, errors, warnings);
+  AnalysisCommandOutput.parseErrors(result.stdout as String, errors, warnings);
   return [...errors, ...warnings];
 }
 
diff --git a/pkg/vm/lib/http_filesystem.dart b/pkg/vm/lib/http_filesystem.dart
index 6d249e3..cd8e42a 100644
--- a/pkg/vm/lib/http_filesystem.dart
+++ b/pkg/vm/lib/http_filesystem.dart
@@ -29,6 +29,7 @@
     return connectAndRun((io.HttpClient httpClient) async {
       io.HttpClientRequest request = await httpClient.headUrl(uri);
       io.HttpClientResponse response = await request.close();
+      await response.drain();
       return response.statusCode == io.HttpStatus.ok;
     });
   }
@@ -42,6 +43,7 @@
       io.HttpClientRequest request = await httpClient.getUrl(uri);
       io.HttpClientResponse response = await request.close();
       if (response.statusCode != io.HttpStatus.ok) {
+        await response.drain();
         throw new FileSystemException(uri, response.toString());
       }
       List<List<int>> list = await response.toList();
@@ -57,13 +59,13 @@
     return String.fromCharCodes(await readAsBytes());
   }
 
-  T connectAndRun<T>(T body(io.HttpClient httpClient)) {
+  Future<T> connectAndRun<T>(Future<T> body(io.HttpClient httpClient)) async {
     io.HttpClient httpClient;
     try {
       httpClient = new io.HttpClient();
       // Set timeout to be shorter than anticipated OS default
       httpClient.connectionTimeout = const Duration(seconds: 5);
-      return body(httpClient);
+      return await body(httpClient);
     } on Exception catch (e) {
       throw new FileSystemException(uri, e.toString());
     } finally {
diff --git a/pkg/vm_service/example/sample_isolates.dart b/pkg/vm_service/example/sample_isolates.dart
index e57fd09..98eb667 100644
--- a/pkg/vm_service/example/sample_isolates.dart
+++ b/pkg/vm_service/example/sample_isolates.dart
@@ -4,7 +4,7 @@
 
 import 'dart:isolate';
 
-main(List<String> args) async {
+void main(List<String> args) async {
   var arr = newArray(5);
   var arr2 = newArray(417);
   var hash1 = newHash(5);
@@ -30,7 +30,7 @@
   Isolate.spawn(isolateEntry, val);
 }
 
-isolateEntry(message) async {
+Future isolateEntry(message) async {
   print('starting $message');
   await Future.delayed(Duration(seconds: message));
   print('ending $message');
diff --git a/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceBase.java b/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceBase.java
index 207cdc5..cf058e0 100644
--- a/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceBase.java
+++ b/pkg/vm_service/java/src/org/dartlang/vm/service/VmServiceBase.java
@@ -572,6 +572,10 @@
     }
   }
 
+  protected String removeNewLines(String str) {
+    return str.replaceAll("\r\n", " ").replaceAll("\n", " ");
+  }
+
   void processResponse(JsonObject json) {
     JsonElement idElem = json.get(ID);
     if (idElem == null) {
diff --git a/pkg/vm_service/lib/src/vm_service.dart b/pkg/vm_service/lib/src/vm_service.dart
index 209f06e..983d0f7 100644
--- a/pkg/vm_service/lib/src/vm_service.dart
+++ b/pkg/vm_service/lib/src/vm_service.dart
@@ -2899,7 +2899,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Breakpoint && id == other.id;
+  bool operator ==(Object other) => other is Breakpoint && id == other.id;
 
   String toString() => '[Breakpoint ' //
       'id: ${id}, breakpointNumber: ${breakpointNumber}, enabled: ${enabled}, ' //
@@ -2955,7 +2955,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is ClassRef && id == other.id;
+  bool operator ==(Object other) => other is ClassRef && id == other.id;
 
   String toString() =>
       '[ClassRef id: ${id}, name: ${name}, library: ${library}]';
@@ -3098,7 +3098,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Class && id == other.id;
+  bool operator ==(Object other) => other is Class && id == other.id;
 
   String toString() => '[Class]';
 }
@@ -3235,7 +3235,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is CodeRef && id == other.id;
+  bool operator ==(Object other) => other is CodeRef && id == other.id;
 
   String toString() => '[CodeRef id: ${id}, name: ${name}, kind: ${kind}]';
 }
@@ -3280,7 +3280,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Code && id == other.id;
+  bool operator ==(Object other) => other is Code && id == other.id;
 
   String toString() => '[Code id: ${id}, name: ${name}, kind: ${kind}]';
 }
@@ -3318,7 +3318,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is ContextRef && id == other.id;
+  bool operator ==(Object other) => other is ContextRef && id == other.id;
 
   String toString() => '[ContextRef id: ${id}, length: ${length}]';
 }
@@ -3375,7 +3375,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Context && id == other.id;
+  bool operator ==(Object other) => other is Context && id == other.id;
 
   String toString() =>
       '[Context id: ${id}, length: ${length}, variables: ${variables}]';
@@ -3631,7 +3631,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is ErrorRef && id == other.id;
+  bool operator ==(Object other) => other is ErrorRef && id == other.id;
 
   String toString() =>
       '[ErrorRef id: ${id}, kind: ${kind}, message: ${message}]';
@@ -3696,7 +3696,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Error && id == other.id;
+  bool operator ==(Object other) => other is Error && id == other.id;
 
   String toString() => '[Error id: ${id}, kind: ${kind}, message: ${message}]';
 }
@@ -4082,7 +4082,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is FieldRef && id == other.id;
+  bool operator ==(Object other) => other is FieldRef && id == other.id;
 
   String toString() => '[FieldRef ' //
       'id: ${id}, name: ${name}, owner: ${owner}, declaredType: ${declaredType}, ' //
@@ -4177,7 +4177,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Field && id == other.id;
+  bool operator ==(Object other) => other is Field && id == other.id;
 
   String toString() => '[Field ' //
       'id: ${id}, name: ${name}, owner: ${owner}, declaredType: ${declaredType}, ' //
@@ -4396,7 +4396,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is FuncRef && id == other.id;
+  bool operator ==(Object other) => other is FuncRef && id == other.id;
 
   String toString() => '[FuncRef ' //
       'id: ${id}, name: ${name}, owner: ${owner}, isStatic: ${isStatic}, ' //
@@ -4473,7 +4473,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Func && id == other.id;
+  bool operator ==(Object other) => other is Func && id == other.id;
 
   String toString() => '[Func ' //
       'id: ${id}, name: ${name}, owner: ${owner}, isStatic: ${isStatic}, ' //
@@ -4686,7 +4686,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is InstanceRef && id == other.id;
+  bool operator ==(Object other) => other is InstanceRef && id == other.id;
 
   String toString() => '[InstanceRef ' //
       'id: ${id}, kind: ${kind}, identityHashCode: ${identityHashCode}, ' //
@@ -5120,7 +5120,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Instance && id == other.id;
+  bool operator ==(Object other) => other is Instance && id == other.id;
 
   String toString() => '[Instance ' //
       'id: ${id}, kind: ${kind}, identityHashCode: ${identityHashCode}, ' //
@@ -5177,7 +5177,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is IsolateRef && id == other.id;
+  bool operator ==(Object other) => other is IsolateRef && id == other.id;
 
   String toString() => '[IsolateRef ' //
       'id: ${id}, number: ${number}, name: ${name}, isSystemIsolate: ${isSystemIsolate}]';
@@ -5329,7 +5329,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Isolate && id == other.id;
+  bool operator ==(Object other) => other is Isolate && id == other.id;
 
   String toString() => '[Isolate]';
 }
@@ -5419,7 +5419,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is IsolateGroupRef && id == other.id;
+  bool operator ==(Object other) => other is IsolateGroupRef && id == other.id;
 
   String toString() => '[IsolateGroupRef ' //
       'id: ${id}, number: ${number}, name: ${name}, isSystemIsolateGroup: ${isSystemIsolateGroup}]';
@@ -5483,7 +5483,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is IsolateGroup && id == other.id;
+  bool operator ==(Object other) => other is IsolateGroup && id == other.id;
 
   String toString() => '[IsolateGroup ' //
       'id: ${id}, number: ${number}, name: ${name}, isSystemIsolateGroup: ${isSystemIsolateGroup}, ' //
@@ -5651,7 +5651,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is LibraryRef && id == other.id;
+  bool operator ==(Object other) => other is LibraryRef && id == other.id;
 
   String toString() => '[LibraryRef id: ${id}, name: ${name}, uri: ${uri}]';
 }
@@ -5743,7 +5743,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Library && id == other.id;
+  bool operator ==(Object other) => other is Library && id == other.id;
 
   String toString() => '[Library]';
 }
@@ -6125,7 +6125,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is NullValRef && id == other.id;
+  bool operator ==(Object other) => other is NullValRef && id == other.id;
 
   String toString() => '[NullValRef ' //
       'id: ${id}, kind: ${kind}, identityHashCode: ${identityHashCode}, ' //
@@ -6177,7 +6177,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is NullVal && id == other.id;
+  bool operator ==(Object other) => other is NullVal && id == other.id;
 
   String toString() => '[NullVal ' //
       'id: ${id}, kind: ${kind}, identityHashCode: ${identityHashCode}, ' //
@@ -6225,7 +6225,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is ObjRef && id == other.id;
+  bool operator ==(Object other) => other is ObjRef && id == other.id;
 
   String toString() => '[ObjRef id: ${id}]';
 }
@@ -6301,7 +6301,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Obj && id == other.id;
+  bool operator ==(Object other) => other is Obj && id == other.id;
 
   String toString() => '[Obj id: ${id}]';
 }
@@ -6792,7 +6792,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is ScriptRef && id == other.id;
+  bool operator ==(Object other) => other is ScriptRef && id == other.id;
 
   String toString() => '[ScriptRef id: ${id}, uri: ${uri}]';
 }
@@ -6927,7 +6927,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is Script && id == other.id;
+  bool operator ==(Object other) => other is Script && id == other.id;
 
   String toString() => '[Script id: ${id}, uri: ${uri}, library: ${library}]';
 }
@@ -7474,7 +7474,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is TypeArgumentsRef && id == other.id;
+  bool operator ==(Object other) => other is TypeArgumentsRef && id == other.id;
 
   String toString() => '[TypeArgumentsRef id: ${id}, name: ${name}]';
 }
@@ -7525,7 +7525,7 @@
 
   int get hashCode => id.hashCode;
 
-  operator ==(other) => other is TypeArguments && id == other.id;
+  bool operator ==(Object other) => other is TypeArguments && id == other.id;
 
   String toString() =>
       '[TypeArguments id: ${id}, name: ${name}, types: ${types}]';
diff --git a/pkg/vm_service/tool/dart/generate_dart.dart b/pkg/vm_service/tool/dart/generate_dart.dart
index 0f9897f..2cf8fd8 100644
--- a/pkg/vm_service/tool/dart/generate_dart.dart
+++ b/pkg/vm_service/tool/dart/generate_dart.dart
@@ -1731,7 +1731,7 @@
       gen.writeln();
 
       gen.writeStatement(
-          'operator==(other) => other is ${name} && id == other.id;');
+          'bool operator ==(Object other) => other is ${name} && id == other.id;');
       gen.writeln();
     }
 
diff --git a/pkg/vm_service/tool/generate.dart b/pkg/vm_service/tool/generate.dart
index 321b125..b9ef51f 100644
--- a/pkg/vm_service/tool/generate.dart
+++ b/pkg/vm_service/tool/generate.dart
@@ -16,7 +16,7 @@
 
 /// Parse the 'service.md' into a model and generate both Dart and Java
 /// libraries.
-main(List<String> args) async {
+void main(List<String> args) async {
   String appDirPath = dirname(Platform.script.toFilePath());
 
   // Parse service.md into a model.
@@ -36,7 +36,7 @@
   await _generateAsserts(appDirPath, nodes);
 }
 
-_generateDart(String appDirPath, List<Node> nodes) async {
+Future _generateDart(String appDirPath, List<Node> nodes) async {
   var outDirPath = normalize(join(appDirPath, '..', 'lib/src'));
   var outDir = Directory(outDirPath);
   if (!outDir.existsSync()) outDir.createSync(recursive: true);
@@ -64,7 +64,7 @@
   print('Wrote Dart to ${outputFile.path}.');
 }
 
-_generateJava(String appDirPath, List<Node> nodes) async {
+Future _generateJava(String appDirPath, List<Node> nodes) async {
   var srcDirPath = normalize(join(appDirPath, '..', 'java', 'src'));
   var generator = java.JavaGenerator(srcDirPath);
   java.api = java.Api();
@@ -93,7 +93,7 @@
   print('Wrote Java to $srcDirPath.');
 }
 
-_generateAsserts(String appDirPath, List<Node> nodes) async {
+Future _generateAsserts(String appDirPath, List<Node> nodes) async {
   var outDirPath = normalize(join(appDirPath, '..', 'example'));
   var outDir = Directory(outDirPath);
   if (!outDir.existsSync()) outDir.createSync(recursive: true);
diff --git a/pkg/vm_service/tool/java/generate_java.dart b/pkg/vm_service/tool/java/generate_java.dart
index e70b0a0..9ef243d 100644
--- a/pkg/vm_service/tool/java/generate_java.dart
+++ b/pkg/vm_service/tool/java/generate_java.dart
@@ -549,14 +549,6 @@
   }
 
   void generateVmServiceMethod(TypeWriter writer, {includeOptional = false}) {
-    // TODO(danrubel) move this to the Consumer's javadoc
-//    String javadoc = docs == null ? '' : docs;
-//    if (returnType.isMultipleReturns) {
-//      javadoc += '\n\nThe return value can be one of '
-//          '${joinLast(returnType.types.map((t) => '[${t}]'), ', ', ' or ')}.';
-//      javadoc = javadoc.trim();
-//    }
-
     // Update method docs
     var javadoc = StringBuffer(docs == null ? '' : docs!);
     bool firstParamDoc = true;
@@ -594,18 +586,23 @@
       writer.addLine('final JsonObject params = new JsonObject();');
       for (MethodArg arg in args) {
         if (!includeOptional && arg.optional) continue;
-        var name = arg.name;
-        String op = arg.optional ? 'if (${name} != null) ' : '';
+        var argName = arg.name;
+        String op = arg.optional ? 'if (${argName} != null) ' : '';
         if (arg.isEnumType) {
-          writer.addLine('${op}params.addProperty("$name", $name.name());');
+          writer
+              .addLine('${op}params.addProperty("$argName", $argName.name());');
         } else if (arg.type.name == 'Map') {
           writer.addLine(
-              '${op}params.add("$name", convertMapToJsonObject($name));');
+              '${op}params.add("$argName", convertMapToJsonObject($argName));');
         } else if (arg.type.arrayDepth > 0) {
           writer.addLine(
-              '${op}params.add("$name", convertIterableToJsonArray($name));');
+              '${op}params.add("$argName", convertIterableToJsonArray($argName));');
+        } else if (name.startsWith('evaluate') && argName == 'expression') {
+          // Special case the eval expression parameters.
+          writer.addLine(
+              '${op}params.addProperty("$argName", removeNewLines($argName));');
         } else {
-          writer.addLine('${op}params.addProperty("$name", $name);');
+          writer.addLine('${op}params.addProperty("$argName", $argName);');
         }
       }
       writer.addLine('request("$name", params, consumer);');
@@ -626,7 +623,7 @@
 
   MethodArg(this.parent, this.type, this.name);
 
-  get asJavaMethodArg {
+  JavaMethodArg get asJavaMethodArg {
     if (optional && type.ref == 'int') {
       return JavaMethodArg(name, 'Integer');
     }
@@ -768,7 +765,7 @@
 
   bool get isSimple => simpleTypes.contains(name);
 
-  get jsonTypeName {
+  String? get jsonTypeName {
     if (name == 'ClassObj') return 'Class';
     if (name == 'ErrorObj') return 'Error';
     return name;
diff --git a/runtime/bin/process_win.cc b/runtime/bin/process_win.cc
index b3bc9a9..3567d21 100644
--- a/runtime/bin/process_win.cc
+++ b/runtime/bin/process_win.cc
@@ -96,7 +96,7 @@
     MutexLocker locker(mutex_);
     HANDLE wait_handle = INVALID_HANDLE_VALUE;
     BOOL success = RegisterWaitForSingleObject(
-        &wait_handle, handle, &ExitCodeCallback, reinterpret_cast<void*>(pid),
+        &wait_handle, handle, &ExitCodeCallback, reinterpret_cast<PVOID>(pid),
         INFINITE, WT_EXECUTEONLYONCE);
     if (!success) {
       FATAL("Failed to register exit code wait operation.");
@@ -151,7 +151,7 @@
     if (timed_out) {
       return;
     }
-    DWORD pid = reinterpret_cast<DWORD>(data);
+    DWORD pid = reinterpret_cast<UINT_PTR>(data);
     HANDLE handle;
     HANDLE wait_handle;
     HANDLE exit_pipe;
diff --git a/runtime/lib/isolate.cc b/runtime/lib/isolate.cc
index e15ff53..922ad2b 100644
--- a/runtime/lib/isolate.cc
+++ b/runtime/lib/isolate.cc
@@ -283,15 +283,18 @@
   GET_NON_NULL_NATIVE_ARGUMENT(Instance, obj, arguments->NativeArgAt(1));
 
   Object& validated_result = Object::Handle(zone);
-  Object& msg_obj = Object::Handle(zone, obj.ptr());
+  const Object& msg_obj = Object::Handle(zone, obj.ptr());
   validated_result = ValidateMessageObject(zone, isolate, msg_obj);
+  // msg_array = [<message>, <object-in-message-to-rehash>]
+  const Array& msg_array = Array::Handle(zone, Array::New(2));
+  msg_array.SetAt(0, msg_obj);
   if (validated_result.IsUnhandledException()) {
     Exceptions::PropagateError(Error::Cast(validated_result));
     UNREACHABLE();
   }
   PersistentHandle* handle =
       isolate->group()->api_state()->AllocatePersistentHandle();
-  handle->set_ptr(msg_obj);
+  handle->set_ptr(msg_array);
   isolate->bequeath(std::unique_ptr<Bequest>(new Bequest(handle, port.Id())));
   // TODO(aam): Ensure there are no dart api calls after this point as we want
   // to ensure that validated message won't get tampered with.
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm.cc b/runtime/vm/compiler/asm_intrinsifier_arm.cc
index 134a71d..f41c51d 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm.cc
@@ -1272,19 +1272,15 @@
 
 // Compares cid1 and cid2 to see if they're syntactically equivalent. If this
 // can be determined by this fast path, it jumps to either equal or not_equal,
-// if equal but belonging to a generic class, it falls through with the scratch
-// register containing host_type_arguments_field_offset_in_words,
-// otherwise it jumps to normal_ir_body. May clobber scratch.
+// otherwise it jumps to normal_ir_body. May clobber cid1, cid2, and scratch.
 static void EquivalentClassIds(Assembler* assembler,
                                Label* normal_ir_body,
                                Label* equal,
                                Label* not_equal,
                                Register cid1,
                                Register cid2,
-                               Register scratch,
-                               bool testing_instance_cids) {
-  Label different_cids, equal_cids_but_generic, not_integer,
-      not_integer_or_string;
+                               Register scratch) {
+  Label different_cids, not_integer, not_integer_or_string;
 
   // Check if left hand side is a closure. Closures are handled in the runtime.
   __ CompareImmediate(cid1, kClosureCid);
@@ -1300,13 +1296,10 @@
   // Check if there are no type arguments. In this case we can return true.
   // Otherwise fall through into the runtime to handle comparison.
   __ LoadClassById(scratch, cid1);
-  __ ldr(
-      scratch,
-      FieldAddress(
-          scratch,
-          target::Class::host_type_arguments_field_offset_in_words_offset()));
-  __ CompareImmediate(scratch, target::Class::kNoTypeArguments);
-  __ b(&equal_cids_but_generic, NE);
+  __ ldrh(scratch,
+          FieldAddress(scratch, target::Class::num_type_arguments_offset()));
+  __ CompareImmediate(scratch, 0);
+  __ b(normal_ir_body, NE);
   __ b(equal);
 
   // Class ids are different. Check if we are comparing two string types (with
@@ -1325,50 +1318,35 @@
 
   __ Bind(&not_integer);
   // Check if both are String types.
-  JumpIfNotString(assembler, cid1, scratch,
-                  testing_instance_cids ? &not_integer_or_string : not_equal);
+  JumpIfNotString(assembler, cid1, scratch, &not_integer_or_string);
 
   // First type is String. Check if the second is a string too.
   JumpIfString(assembler, cid2, scratch, equal);
   // String types are only equivalent to other String types.
   __ b(not_equal);
 
-  if (testing_instance_cids) {
-    __ Bind(&not_integer_or_string);
-    // Check if the first type is a Type. If it is not then types are not
-    // equivalent because they have different class ids and they are not String
-    // or integer or Type.
-    JumpIfNotType(assembler, cid1, scratch, not_equal);
+  __ Bind(&not_integer_or_string);
+  // Check if the first type is a Type. If it is not then types are not
+  // equivalent because they have different class ids and they are not String
+  // or integer or Type.
+  JumpIfNotType(assembler, cid1, scratch, not_equal);
 
-    // First type is a Type. Check if the second is a Type too.
-    JumpIfType(assembler, cid2, scratch, equal);
-    // Type types are only equivalent to other Type types.
-    __ b(not_equal);
-  }
-
-  // The caller must compare the type arguments.
-  __ Bind(&equal_cids_but_generic);
+  // First type is a Type. Check if the second is a Type too.
+  JumpIfType(assembler, cid2, scratch, equal);
+  // Type types are only equivalent to other Type types.
+  __ b(not_equal);
 }
 
 void AsmIntrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler,
                                                 Label* normal_ir_body) {
-  __ ldm(IA, SP, (1 << R1 | 1 << R2));
-  __ LoadClassIdMayBeSmi(R1, R1);
-  __ LoadClassIdMayBeSmi(R2, R2);
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));
+  __ LoadClassIdMayBeSmi(R1, R0);
+
+  __ ldr(R0, Address(SP, 1 * target::kWordSize));
+  __ LoadClassIdMayBeSmi(R2, R0);
 
   Label equal, not_equal;
-  EquivalentClassIds(assembler, normal_ir_body, &equal, &not_equal, R1, R2, R0,
-                     /* testing_instance_cids = */ true);
-
-  // Compare type arguments, host_type_arguments_field_offset_in_words in R0.
-  __ ldm(IA, SP, (1 << R1 | 1 << R2));
-  __ AddImmediate(R1, -kHeapObjectTag);
-  __ ldr(R1, Address(R1, R0, LSL, target::kWordSizeLog2));
-  __ AddImmediate(R2, -kHeapObjectTag);
-  __ ldr(R2, Address(R2, R0, LSL, target::kWordSizeLog2));
-  __ cmp(R1, Operand(R2));
-  __ b(&not_equal, NE);
-  // Fall through to equal case if type arguments are equal.
+  EquivalentClassIds(assembler, normal_ir_body, &equal, &not_equal, R1, R2, R0);
 
   __ Bind(&equal);
   __ LoadObject(R0, CastHandle<Object>(TrueObject()));
@@ -1418,16 +1396,8 @@
   __ SmiUntag(R3);
   __ ldr(R4, FieldAddress(R2, target::Type::type_class_id_offset()));
   __ SmiUntag(R4);
-  // We are not testing instance cids, but type class cids of Type instances.
   EquivalentClassIds(assembler, normal_ir_body, &equiv_cids, &not_equal, R3, R4,
-                     R0, /* testing_instance_cids = */ false);
-
-  // Compare type arguments in Type instances.
-  __ ldr(R3, FieldAddress(R1, target::Type::arguments_offset()));
-  __ ldr(R4, FieldAddress(R2, target::Type::arguments_offset()));
-  __ cmp(R3, Operand(R4));
-  __ b(normal_ir_body, NE);
-  // Fall through to check nullability if type arguments are equal.
+                     R0);
 
   // Check nullability.
   __ Bind(&equiv_cids);
diff --git a/runtime/vm/compiler/asm_intrinsifier_arm64.cc b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
index 04718ce..5749365 100644
--- a/runtime/vm/compiler/asm_intrinsifier_arm64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_arm64.cc
@@ -1418,19 +1418,15 @@
 
 // Compares cid1 and cid2 to see if they're syntactically equivalent. If this
 // can be determined by this fast path, it jumps to either equal or not_equal,
-// if equal but belonging to a generic class, it falls through with the scratch
-// register containing host_type_arguments_field_offset_in_words,
-// otherwise it jumps to normal_ir_body. May clobber scratch.
+// otherwise it jumps to normal_ir_body. May clobber cid1, cid2, and scratch.
 static void EquivalentClassIds(Assembler* assembler,
                                Label* normal_ir_body,
                                Label* equal,
                                Label* not_equal,
                                Register cid1,
                                Register cid2,
-                               Register scratch,
-                               bool testing_instance_cids) {
-  Label different_cids, equal_cids_but_generic, not_integer,
-      not_integer_or_string;
+                               Register scratch) {
+  Label different_cids, not_integer, not_integer_or_string;
 
   // Check if left hand side is a closure. Closures are handled in the runtime.
   __ CompareImmediate(cid1, kClosureCid);
@@ -1447,12 +1443,10 @@
   // Otherwise fall through into the runtime to handle comparison.
   __ LoadClassById(scratch, cid1);
   __ ldr(scratch,
-         FieldAddress(
-             scratch,
-             target::Class::host_type_arguments_field_offset_in_words_offset()),
-         kFourBytes);
-  __ CompareImmediate(scratch, target::Class::kNoTypeArguments);
-  __ b(&equal_cids_but_generic, NE);
+         FieldAddress(scratch, target::Class::num_type_arguments_offset(),
+                      kTwoBytes),
+         kTwoBytes);
+  __ cbnz(normal_ir_body, scratch);
   __ b(equal);
 
   // Class ids are different. Check if we are comparing two string types (with
@@ -1471,50 +1465,35 @@
 
   __ Bind(&not_integer);
   // Check if both are String types.
-  JumpIfNotString(assembler, cid1, scratch,
-                  testing_instance_cids ? &not_integer_or_string : not_equal);
+  JumpIfNotString(assembler, cid1, scratch, &not_integer_or_string);
 
   // First type is String. Check if the second is a string too.
   JumpIfString(assembler, cid2, scratch, equal);
   // String types are only equivalent to other String types.
   __ b(not_equal);
 
-  if (testing_instance_cids) {
-    __ Bind(&not_integer_or_string);
-    // Check if the first type is a Type. If it is not then types are not
-    // equivalent because they have different class ids and they are not String
-    // or integer or Type.
-    JumpIfNotType(assembler, cid1, scratch, not_equal);
+  __ Bind(&not_integer_or_string);
+  // Check if the first type is a Type. If it is not then types are not
+  // equivalent because they have different class ids and they are not String
+  // or integer or Type.
+  JumpIfNotType(assembler, cid1, scratch, not_equal);
 
-    // First type is a Type. Check if the second is a Type too.
-    JumpIfType(assembler, cid2, scratch, equal);
-    // Type types are only equivalent to other Type types.
-    __ b(not_equal);
-  }
-
-  // The caller must compare the type arguments.
-  __ Bind(&equal_cids_but_generic);
+  // First type is a Type. Check if the second is a Type too.
+  JumpIfType(assembler, cid2, scratch, equal);
+  // Type types are only equivalent to other Type types.
+  __ b(not_equal);
 }
 
 void AsmIntrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler,
                                                 Label* normal_ir_body) {
-  __ ldp(R0, R1, Address(SP, 0 * target::kWordSize, Address::PairOffset));
-  __ LoadClassIdMayBeSmi(R2, R1);
+  __ ldr(R0, Address(SP, 0 * target::kWordSize));
   __ LoadClassIdMayBeSmi(R1, R0);
 
-  Label equal, not_equal;
-  EquivalentClassIds(assembler, normal_ir_body, &equal, &not_equal, R1, R2, R0,
-                     /* testing_instance_cids = */ true);
+  __ ldr(R0, Address(SP, 1 * target::kWordSize));
+  __ LoadClassIdMayBeSmi(R2, R0);
 
-  // Compare type arguments, host_type_arguments_field_offset_in_words in R0.
-  __ ldp(R1, R2, Address(SP, 0 * target::kWordSize, Address::PairOffset));
-  __ AddImmediate(R1, -kHeapObjectTag);
-  __ ldr(R1, Address(R1, R0, UXTX, Address::Scaled));
-  __ AddImmediate(R2, -kHeapObjectTag);
-  __ ldr(R2, Address(R2, R0, UXTX, Address::Scaled));
-  __ CompareObjectRegisters(R1, R2);
-  __ b(&not_equal, NE);
-  // Fall through to equal case if type arguments are equal.
+  Label equal, not_equal;
+  EquivalentClassIds(assembler, normal_ir_body, &equal, &not_equal, R1, R2, R0);
 
   __ Bind(&equal);
   __ LoadObject(R0, CastHandle<Object>(TrueObject()));
@@ -1570,16 +1549,8 @@
   __ LoadCompressedSmi(R4,
                        FieldAddress(R2, target::Type::type_class_id_offset()));
   __ SmiUntag(R4);
-  // We are not testing instance cids, but type class cids of Type instances.
   EquivalentClassIds(assembler, normal_ir_body, &equiv_cids, &not_equal, R3, R4,
-                     R0, /* testing_instance_cids = */ false);
-
-  // Compare type arguments in Type instances.
-  __ LoadCompressed(R3, FieldAddress(R1, target::Type::arguments_offset()));
-  __ LoadCompressed(R4, FieldAddress(R2, target::Type::arguments_offset()));
-  __ CompareObjectRegisters(R3, R4);
-  __ b(normal_ir_body, NE);
-  // Fall through to check nullability if type arguments are equal.
+                     R0);
 
   // Check nullability.
   __ Bind(&equiv_cids);
diff --git a/runtime/vm/compiler/asm_intrinsifier_ia32.cc b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
index f1cf3ac..5909eab 100644
--- a/runtime/vm/compiler/asm_intrinsifier_ia32.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_ia32.cc
@@ -1358,19 +1358,15 @@
 
 // Compares cid1 and cid2 to see if they're syntactically equivalent. If this
 // can be determined by this fast path, it jumps to either equal or not_equal,
-// if equal but belonging to a generic class, it falls through with the scratch
-// register containing host_type_arguments_field_offset_in_words,
-// otherwise it jumps to normal_ir_body. May clobber scratch.
+// otherwise it jumps to normal_ir_body. May clobber cid1, cid2, and scratch.
 static void EquivalentClassIds(Assembler* assembler,
                                Label* normal_ir_body,
                                Label* equal,
                                Label* not_equal,
                                Register cid1,
                                Register cid2,
-                               Register scratch,
-                               bool testing_instance_cids) {
-  Label different_cids, equal_cids_but_generic, not_integer,
-      not_integer_or_string;
+                               Register scratch) {
+  Label different_cids, not_integer, not_integer_or_string;
 
   // Check if left hand side is a closure. Closures are handled in the runtime.
   __ cmpl(cid1, Immediate(kClosureCid));
@@ -1386,13 +1382,10 @@
   // Check if there are no type arguments. In this case we can return true.
   // Otherwise fall through into the runtime to handle comparison.
   __ LoadClassById(scratch, cid1);
-  __ movl(
-      scratch,
-      FieldAddress(
-          scratch,
-          target::Class::host_type_arguments_field_offset_in_words_offset()));
-  __ cmpl(scratch, Immediate(target::Class::kNoTypeArguments));
-  __ j(NOT_EQUAL, &equal_cids_but_generic, Assembler::kNearJump);
+  __ movzxw(scratch,
+            FieldAddress(scratch, target::Class::num_type_arguments_offset()));
+  __ cmpl(scratch, Immediate(0));
+  __ j(NOT_EQUAL, normal_ir_body);
   __ jmp(equal);
 
   // Class ids are different. Check if we are comparing two string types (with
@@ -1412,29 +1405,23 @@
 
   __ Bind(&not_integer);
   // Check if both are String types.
-  JumpIfNotString(assembler, cid1,
-                  testing_instance_cids ? &not_integer_or_string : not_equal);
+  JumpIfNotString(assembler, cid1, &not_integer_or_string);
 
   // First type is a String. Check if the second is a String too.
   JumpIfString(assembler, cid2, equal);
   // String types are only equivalent to other String types.
   __ jmp(not_equal);
 
-  if (testing_instance_cids) {
-    __ Bind(&not_integer_or_string);
-    // Check if the first type is a Type. If it is not then types are not
-    // equivalent because they have different class ids and they are not String
-    // or integer or Type.
-    JumpIfNotType(assembler, cid1, not_equal);
+  __ Bind(&not_integer_or_string);
+  // Check if the first type is a Type. If it is not then types are not
+  // equivalent because they have different class ids and they are not String
+  // or integer or Type.
+  JumpIfNotType(assembler, cid1, not_equal);
 
-    // First type is a Type. Check if the second is a Type too.
-    JumpIfType(assembler, cid2, equal);
-    // Type types are only equivalent to other Type types.
-    __ jmp(not_equal);
-  }
-
-  // The caller must compare the type arguments.
-  __ Bind(&equal_cids_but_generic);
+  // First type is a Type. Check if the second is a Type too.
+  JumpIfType(assembler, cid2, equal);
+  // Type types are only equivalent to other Type types.
+  __ jmp(not_equal);
 }
 
 void AsmIntrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler,
@@ -1447,16 +1434,7 @@
 
   Label equal, not_equal;
   EquivalentClassIds(assembler, normal_ir_body, &equal, &not_equal, EDI, EBX,
-                     EAX, /* testing_instance_cids = */ true);
-
-  // Compare type arguments, host_type_arguments_field_offset_in_words in EAX.
-  __ movl(EDI, Address(ESP, +1 * target::kWordSize));
-  __ movl(EBX, Address(ESP, +2 * target::kWordSize));
-  __ movl(EDI, FieldAddress(EDI, EAX, TIMES_4, 0));
-  __ movl(EBX, FieldAddress(EBX, EAX, TIMES_4, 0));
-  __ cmpl(EDI, EBX);
-  __ j(NOT_EQUAL, &not_equal, Assembler::kNearJump);
-  // Fall through to equal case if type arguments are equal.
+                     EAX);
 
   __ Bind(&equal);
   __ LoadObject(EAX, CastHandle<Object>(TrueObject()));
@@ -1511,16 +1489,8 @@
   __ SmiUntag(ECX);
   __ movl(EDX, FieldAddress(EBX, target::Type::type_class_id_offset()));
   __ SmiUntag(EDX);
-  // We are not testing instance cids, but type class cids of Type instances.
   EquivalentClassIds(assembler, normal_ir_body, &equiv_cids, &not_equal, ECX,
-                     EDX, EAX, /* testing_instance_cids = */ false);
-
-  // Compare type arguments in Type instances.
-  __ movl(ECX, FieldAddress(EDI, target::Type::arguments_offset()));
-  __ movl(EDX, FieldAddress(EBX, target::Type::arguments_offset()));
-  __ cmpl(ECX, EDX);
-  __ j(NOT_EQUAL, normal_ir_body, Assembler::kNearJump);
-  // Fall through to check nullability if type arguments are equal.
+                     EDX, EAX);
 
   // Check nullability.
   __ Bind(&equiv_cids);
diff --git a/runtime/vm/compiler/asm_intrinsifier_x64.cc b/runtime/vm/compiler/asm_intrinsifier_x64.cc
index d13388a..f691931 100644
--- a/runtime/vm/compiler/asm_intrinsifier_x64.cc
+++ b/runtime/vm/compiler/asm_intrinsifier_x64.cc
@@ -1262,19 +1262,15 @@
 
 // Compares cid1 and cid2 to see if they're syntactically equivalent. If this
 // can be determined by this fast path, it jumps to either equal or not_equal,
-// if equal but belonging to a generic class, it falls through with the scratch
-// register containing host_type_arguments_field_offset_in_words,
-// otherwise it jumps to normal_ir_body. May clobber scratch.
+// otherwise it jumps to normal_ir_body. May clobber cid1, cid2, and scratch.
 static void EquivalentClassIds(Assembler* assembler,
                                Label* normal_ir_body,
                                Label* equal,
                                Label* not_equal,
                                Register cid1,
                                Register cid2,
-                               Register scratch,
-                               bool testing_instance_cids) {
-  Label different_cids, equal_cids_but_generic, not_integer,
-      not_integer_or_string;
+                               Register scratch) {
+  Label different_cids, not_integer, not_integer_or_string;
 
   // Check if left hand side is a closure. Closures are handled in the runtime.
   __ cmpq(cid1, Immediate(kClosureCid));
@@ -1290,13 +1286,10 @@
   // Check if there are no type arguments. In this case we can return true.
   // Otherwise fall through into the runtime to handle comparison.
   __ LoadClassById(scratch, cid1);
-  __ movl(
-      scratch,
-      FieldAddress(
-          scratch,
-          target::Class::host_type_arguments_field_offset_in_words_offset()));
-  __ cmpl(scratch, Immediate(target::Class::kNoTypeArguments));
-  __ j(NOT_EQUAL, &equal_cids_but_generic, Assembler::kNearJump);
+  __ movzxw(scratch,
+            FieldAddress(scratch, target::Class::num_type_arguments_offset()));
+  __ cmpq(scratch, Immediate(0));
+  __ j(NOT_EQUAL, normal_ir_body);
   __ jmp(equal);
 
   // Class ids are different. Check if we are comparing two string types (with
@@ -1316,29 +1309,23 @@
 
   __ Bind(&not_integer);
   // Check if both are String types.
-  JumpIfNotString(assembler, cid1,
-                  testing_instance_cids ? &not_integer_or_string : not_equal);
+  JumpIfNotString(assembler, cid1, &not_integer_or_string);
 
   // First type is a String. Check if the second is a String too.
   JumpIfString(assembler, cid2, equal);
   // String types are only equivalent to other String types.
   __ jmp(not_equal);
 
-  if (testing_instance_cids) {
-    __ Bind(&not_integer_or_string);
-    // Check if the first type is a Type. If it is not then types are not
-    // equivalent because they have different class ids and they are not String
-    // or integer or Type.
-    JumpIfNotType(assembler, cid1, not_equal);
+  __ Bind(&not_integer_or_string);
+  // Check if the first type is a Type. If it is not then types are not
+  // equivalent because they have different class ids and they are not String
+  // or integer or Type.
+  JumpIfNotType(assembler, cid1, not_equal);
 
-    // First type is a Type. Check if the second is a Type too.
-    JumpIfType(assembler, cid2, equal);
-    // Type types are only equivalent to other Type types.
-    __ jmp(not_equal);
-  }
-
-  // The caller must compare the type arguments.
-  __ Bind(&equal_cids_but_generic);
+  // First type is a Type. Check if the second is a Type too.
+  JumpIfType(assembler, cid2, equal);
+  // Type types are only equivalent to other Type types.
+  __ jmp(not_equal);
 }
 
 void AsmIntrinsifier::ObjectHaveSameRuntimeType(Assembler* assembler,
@@ -1351,16 +1338,7 @@
 
   Label equal, not_equal;
   EquivalentClassIds(assembler, normal_ir_body, &equal, &not_equal, RCX, RDX,
-                     RAX, /* testing_instance_cids = */ true);
-
-  // Compare type arguments, host_type_arguments_field_offset_in_words in RAX.
-  __ movq(RCX, Address(RSP, +1 * target::kWordSize));
-  __ movq(RDX, Address(RSP, +2 * target::kWordSize));
-  __ movq(RCX, FieldAddress(RCX, RAX, TIMES_8, 0));
-  __ movq(RDX, FieldAddress(RDX, RAX, TIMES_8, 0));
-  __ cmpq(RCX, RDX);
-  __ j(NOT_EQUAL, &not_equal, Assembler::kNearJump);
-  // Fall through to equal case if type arguments are equal.
+                     RAX);
 
   __ Bind(&equal);
   __ LoadObject(RAX, CastHandle<Object>(TrueObject()));
@@ -1421,16 +1399,8 @@
   __ LoadCompressedSmi(RSI,
                        FieldAddress(RDX, target::Type::type_class_id_offset()));
   __ SmiUntag(RSI);
-  // We are not testing instance cids, but type class cids of Type instances.
   EquivalentClassIds(assembler, normal_ir_body, &equiv_cids, &not_equal, RDI,
-                     RSI, RAX, /* testing_instance_cids = */ false);
-
-  // Compare type arguments in Type instances.
-  __ LoadCompressed(RDI, FieldAddress(RCX, target::Type::arguments_offset()));
-  __ LoadCompressed(RSI, FieldAddress(RDX, target::Type::arguments_offset()));
-  __ cmpq(RDI, RSI);
-  __ j(NOT_EQUAL, normal_ir_body, Assembler::kNearJump);
-  // Fall through to check nullability if type arguments are equal.
+                     RSI, RAX);
 
   // Check nullability.
   __ Bind(&equiv_cids);
diff --git a/runtime/vm/compiler/backend/code_statistics.cc b/runtime/vm/compiler/backend/code_statistics.cc
index f18339c..3a0621b 100644
--- a/runtime/vm/compiler/backend/code_statistics.cc
+++ b/runtime/vm/compiler/backend/code_statistics.cc
@@ -175,7 +175,6 @@
 }
 
 void CodeStatistics::AppendTo(CombinedCodeStatistics* stat) {
-  intptr_t sum = 0;
   bool returns_constant = true;
   bool returns_const_with_load_field_ = true;
 
@@ -183,7 +182,6 @@
     intptr_t bytes = entries_[i].bytes;
     stat->entries_[i].count += entries_[i].count;
     if (bytes > 0) {
-      sum += bytes;
       stat->entries_[i].bytes += bytes;
       if (i != CombinedCodeStatistics::kTagParallelMove &&
           i != CombinedCodeStatistics::kTagReturn &&
diff --git a/runtime/vm/constants_arm.h b/runtime/vm/constants_arm.h
index 8130b72..620199b 100644
--- a/runtime/vm/constants_arm.h
+++ b/runtime/vm/constants_arm.h
@@ -1113,6 +1113,10 @@
   return !(r == lr);
 }
 
+inline Register ConcreteRegister(LinkRegister) {
+  return LR;
+}
+
 #undef LR
 
 #define LINK_REGISTER (LinkRegister())
diff --git a/runtime/vm/dart_entry.cc b/runtime/vm/dart_entry.cc
index 0b5b142..ab868b4 100644
--- a/runtime/vm/dart_entry.cc
+++ b/runtime/vm/dart_entry.cc
@@ -845,4 +845,24 @@
   return result.ptr();
 }
 
+ObjectPtr DartLibraryCalls::RehashObjects(
+    Thread* thread,
+    const Object& array_or_growable_array) {
+  ASSERT(array_or_growable_array.IsArray() ||
+         array_or_growable_array.IsGrowableObjectArray());
+
+  auto zone = thread->zone();
+  const Library& collections_lib =
+      Library::Handle(zone, Library::CollectionLibrary());
+  const Function& rehashing_function = Function::Handle(
+      zone,
+      collections_lib.LookupFunctionAllowPrivate(Symbols::_rehashObjects()));
+  ASSERT(!rehashing_function.IsNull());
+
+  const Array& arguments = Array::Handle(zone, Array::New(1));
+  arguments.SetAt(0, array_or_growable_array);
+
+  return DartEntry::InvokeFunction(rehashing_function, arguments);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/dart_entry.h b/runtime/vm/dart_entry.h
index 13d10fa..5f868bd 100644
--- a/runtime/vm/dart_entry.h
+++ b/runtime/vm/dart_entry.h
@@ -303,6 +303,10 @@
   // _startMicrotaskLoop from dart:async.
   // Returns null on success, an ErrorPtr on failure.
   static ObjectPtr EnsureScheduleImmediate();
+
+  // Runs the `_rehashObjects()` function.
+  static ObjectPtr RehashObjects(Thread* thread,
+                                 const Object& array_or_growable_array);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 0f18a47..8f0ed32 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -1331,8 +1331,7 @@
     TypeParameters& type_params = TypeParameters::Handle();
     Function& current = Function::Handle(function().ptr());
     intptr_t mapping_offset = num_vars;
-    for (intptr_t i = 0; !current.IsNull(); i += current.NumTypeParameters(),
-                  current = current.parent_function()) {
+    for (; !current.IsNull(); current = current.parent_function()) {
       type_params = current.type_parameters();
       if (type_params.IsNull()) continue;
       intptr_t size = current.NumTypeParameters();
diff --git a/runtime/vm/elf.cc b/runtime/vm/elf.cc
index ab90490..0db0a6d 100644
--- a/runtime/vm/elf.cc
+++ b/runtime/vm/elf.cc
@@ -9,6 +9,7 @@
 #include "vm/dwarf.h"
 #include "vm/hash_map.h"
 #include "vm/image_snapshot.h"
+#include "vm/stack_frame.h"
 #include "vm/thread.h"
 #include "vm/zone_text_buffer.h"
 
@@ -564,6 +565,11 @@
     ASSERT(index < text_.length());
     return text_.buffer() + index;
   }
+
+  static const intptr_t kNotIndexed = CStringIntMapKeyValueTrait::kNoValue;
+
+  // Returns the index of |str| if it is present in the string table
+  // and |kNotIndexed| otherwise.
   intptr_t Lookup(const char* str) const {
     return text_indices_.LookupValue(str);
   }
@@ -1208,6 +1214,126 @@
   return nullptr;
 }
 
+void Elf::FinalizeEhFrame() {
+#if defined(DART_PRECOMPILER) &&                                               \
+    (defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64))
+  // Multiplier which will be used to scale operands of DW_CFA_offset and
+  // DW_CFA_val_offset.
+  const intptr_t kDataAlignment = kWordSize;
+
+  const uint8_t DW_CFA_offset = 0x80;
+  const uint8_t DW_CFA_val_offset = 0x14;
+  const uint8_t DW_CFA_def_cfa = 0x0c;
+
+  // Relocation from .eh_frame into bytes within some previously emitted
+  // section.
+  struct Reloc {
+    intptr_t target_memory_offset;
+    intptr_t source_offset;
+  };
+
+  GrowableArray<Reloc> relocs(2);
+  ZoneWriteStream stream(zone(), kInitialDwarfBufferSize);
+  DwarfElfStream dwarf_stream(zone_, &stream, /*symtab=*/nullptr);
+
+  // Emits length prefixed CIE or FDE, returns starting offset.
+  auto emit_record = [&](auto&& body) -> intptr_t {
+    const intptr_t start = stream.Position();
+    stream.WriteFixed<uint32_t>(0);
+    body();
+    stream.Align(kWordSize);
+    const intptr_t end = stream.Position();
+    stream.SetPosition(start);
+    // Write length not counting the length field itself.
+    stream.WriteFixed(static_cast<uint32_t>(end - start - 4));
+    stream.SetPosition(end);
+    return start;
+  };
+
+  // Emit pcrel|sdata4 reference to the target memory offset.
+  auto add_pcrel_ref = [&](intptr_t target_memory_offset) {
+    relocs.Add({target_memory_offset, stream.Position()});
+    dwarf_stream.u4(0);
+  };
+
+  // Emit CIE.
+  const intptr_t cie_position = emit_record([&]() {
+    dwarf_stream.u4(0);  // CIE
+    dwarf_stream.u1(1);  // Version (must be 1 or 3)
+    // Augmentation String
+    dwarf_stream.string("zR");             // NOLINT
+    dwarf_stream.uleb128(1);               // Code alignment (must be 1).
+    dwarf_stream.sleb128(kDataAlignment);  // Data alignment
+    dwarf_stream.u1(
+        ConcreteRegister(LINK_REGISTER));  // Return address register
+    dwarf_stream.uleb128(1);               // Augmentation size
+    dwarf_stream.u1(0x1b);  // FDE encoding: DW_EH_PE_pcrel | DW_EH_PE_sdata4
+    // CFA is FP+0
+    dwarf_stream.u1(DW_CFA_def_cfa);
+    dwarf_stream.uleb128(FP);
+    dwarf_stream.uleb128(0);
+  });
+
+  // Emit an FDE covering each .text section.
+  const auto text_name = shstrtab_->Lookup(".text");
+  ASSERT(text_name != StringTable::kNotIndexed);
+  for (auto section : sections_) {
+    if (section->name() == text_name) {
+      RELEASE_ASSERT(section->memory_offset_is_set());
+      emit_record([&]() {
+        // Offset to CIE. Note that unlike pcrel this offset is encoded
+        // backwards: it will be subtracted from the current position.
+        dwarf_stream.u4(stream.Position() - cie_position);
+        add_pcrel_ref(section->memory_offset());  // Start address.
+        dwarf_stream.u4(section->MemorySize());   // Size.
+        dwarf_stream.u1(0);                       // Augmentation Data length.
+
+        // FP at FP+kSavedCallerPcSlotFromFp*kWordSize
+        COMPILE_ASSERT(kSavedCallerFpSlotFromFp >= 0);
+        dwarf_stream.u1(DW_CFA_offset | FP);
+        dwarf_stream.uleb128(kSavedCallerFpSlotFromFp);
+
+        // LR at FP+kSavedCallerPcSlotFromFp*kWordSize
+        COMPILE_ASSERT(kSavedCallerPcSlotFromFp >= 0);
+        dwarf_stream.u1(DW_CFA_offset | ConcreteRegister(LINK_REGISTER));
+        dwarf_stream.uleb128(kSavedCallerPcSlotFromFp);
+
+        // SP is FP+kCallerSpSlotFromFp*kWordSize
+        COMPILE_ASSERT(kCallerSpSlotFromFp >= 0);
+        dwarf_stream.u1(DW_CFA_val_offset);
+#if defined(TARGET_ARCH_ARM64)
+        dwarf_stream.uleb128(ConcreteRegister(CSP));
+#elif defined(TARGET_ARCH_ARM)
+        dwarf_stream.uleb128(SP);
+#else
+#error "Unsupported .eh_frame architecture"
+#endif
+        dwarf_stream.uleb128(kCallerSpSlotFromFp);
+      });
+    }
+  }
+
+  dwarf_stream.u4(0);  // end of section
+
+  // Add section and then relocate its contents.
+  auto const eh_frame = new (zone_) BitsContainer(
+      type_, false, false, stream.bytes_written(), stream.buffer());
+  AddSection(eh_frame, ".eh_frame");
+
+  // Relocate contents now that we have memory_offset assigned.
+  for (auto& reloc : relocs) {
+    const intptr_t pcrel_offset =
+        reloc.target_memory_offset -
+        (eh_frame->memory_offset() + reloc.source_offset);
+    // Note: IsInt<int32_t>(32, ...) does not work correctly.
+    RELEASE_ASSERT(kBitsPerWord == 32 || Utils::IsInt(32, pcrel_offset));
+    *reinterpret_cast<int32_t*>(stream.buffer() + reloc.source_offset) =
+        static_cast<int32_t>(pcrel_offset);
+  }
+#endif  // defined(DART_PRECOMPILER) && \
+        //   (defined(TARGET_ARCH_ARM) || defined(TARGET_ARCH_ARM64))
+}
+
 void Elf::FinalizeDwarfSections() {
   if (dwarf_ == nullptr) return;
 #if defined(DART_PRECOMPILER)
@@ -1277,6 +1403,7 @@
   }
   AddSection(shstrtab_, ".shstrtab");
   FinalizeDwarfSections();
+  FinalizeEhFrame();
 
   // At this point, all non-programmatically calculated sections and segments
   // have been added. Add any programatically calculated sections and segments
diff --git a/runtime/vm/elf.h b/runtime/vm/elf.h
index 9c7cbf5..91c8202b 100644
--- a/runtime/vm/elf.h
+++ b/runtime/vm/elf.h
@@ -109,6 +109,8 @@
   void FinalizeProgramTable();
   void ComputeFileOffsets();
 
+  void FinalizeEhFrame();
+
   void WriteHeader(ElfWriteStream* stream);
   void WriteSectionTable(ElfWriteStream* stream);
   void WriteProgramTable(ElfWriteStream* stream);
diff --git a/runtime/vm/heap/compactor.cc b/runtime/vm/heap/compactor.cc
index 462a9d2..a4bd219 100644
--- a/runtime/vm/heap/compactor.cc
+++ b/runtime/vm/heap/compactor.cc
@@ -473,7 +473,6 @@
 
   // 1. Compute bitvector of surviving allocation units in the block.
   intptr_t block_live_size = 0;
-  intptr_t block_dead_size = 0;
   uword current = first_object;
   while (current < block_end) {
     ObjectPtr obj = UntaggedObject::FromAddr(current);
@@ -483,8 +482,6 @@
       ASSERT(static_cast<intptr_t>(forwarding_block->Lookup(current)) ==
              block_live_size);
       block_live_size += size;
-    } else {
-      block_dead_size += size;
     }
     current += size;
   }
diff --git a/runtime/vm/heap/freelist.cc b/runtime/vm/heap/freelist.cc
index edc9534..881e595 100644
--- a/runtime/vm/heap/freelist.cc
+++ b/runtime/vm/heap/freelist.cc
@@ -220,16 +220,12 @@
 }
 
 void FreeList::PrintSmall() const {
-  int small_sizes = 0;
-  int small_objects = 0;
   intptr_t small_bytes = 0;
   for (int i = 0; i < kNumLists; ++i) {
     if (free_lists_[i] == NULL) {
       continue;
     }
-    small_sizes += 1;
     intptr_t list_length = LengthLocked(i);
-    small_objects += list_length;
     intptr_t list_bytes = list_length * i * kObjectAlignment;
     small_bytes += list_bytes;
     OS::PrintErr(
@@ -265,20 +261,16 @@
 };
 
 void FreeList::PrintLarge() const {
-  int large_sizes = 0;
-  int large_objects = 0;
   intptr_t large_bytes = 0;
   MallocDirectChainedHashMap<NumbersKeyValueTrait<IntptrPair> > map;
   FreeListElement* node;
   for (node = free_lists_[kNumLists]; node != NULL; node = node->next()) {
     IntptrPair* pair = map.Lookup(node->HeapSize());
     if (pair == NULL) {
-      large_sizes += 1;
       map.Insert(IntptrPair(node->HeapSize(), 1));
     } else {
       pair->set_second(pair->second() + 1);
     }
-    large_objects += 1;
   }
 
   MallocDirectChainedHashMap<NumbersKeyValueTrait<IntptrPair> >::Iterator it =
diff --git a/runtime/vm/heap/heap_test.cc b/runtime/vm/heap/heap_test.cc
index 3c174a1..ee48775 100644
--- a/runtime/vm/heap/heap_test.cc
+++ b/runtime/vm/heap/heap_test.cc
@@ -521,24 +521,23 @@
   }
 };
 
-class MergeIsolatesHeapsHandler : public MessageHandler {
+class SendAndExitMessagesHandler : public MessageHandler {
  public:
-  explicit MergeIsolatesHeapsHandler(Isolate* owner)
+  explicit SendAndExitMessagesHandler(Isolate* owner)
       : msg_(Utils::CreateCStringUniquePtr(nullptr)), owner_(owner) {}
 
   const char* name() const { return "merge-isolates-heaps-handler"; }
 
-  ~MergeIsolatesHeapsHandler() { PortMap::ClosePorts(this); }
+  ~SendAndExitMessagesHandler() { PortMap::ClosePorts(this); }
 
   MessageStatus HandleMessage(std::unique_ptr<Message> message) {
     // Parse the message.
     Object& response_obj = Object::Handle();
     if (message->IsRaw()) {
       response_obj = message->raw_obj();
-    } else if (message->IsBequest()) {
-      Bequest* bequest = message->bequest();
-      PersistentHandle* handle = bequest->handle();
-      // Object in the receiving isolate's heap.
+    } else if (message->IsPersistentHandle()) {
+      PersistentHandle* handle = message->persistent_handle();
+      // Object is in the receiving isolate's heap.
       EXPECT(isolate()->group()->heap()->Contains(
           UntaggedObject::ToAddr(handle->ptr())));
       response_obj = handle->ptr();
@@ -582,7 +581,7 @@
   Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
   EXPECT_EQ(parent, Dart_CurrentIsolate());
   {
-    MergeIsolatesHeapsHandler handler(Isolate::Current());
+    SendAndExitMessagesHandler handler(Isolate::Current());
     Dart_Port port_id = PortMap::CreatePort(&handler);
     EXPECT_EQ(PortMap::GetIsolate(port_id), Isolate::Current());
     Dart_ExitIsolate();
@@ -616,7 +615,7 @@
   const char* TEST_MESSAGE = "hello, world";
   Dart_Isolate parent = TestCase::CreateTestIsolate("parent");
   EXPECT_EQ(parent, Dart_CurrentIsolate());
-  MergeIsolatesHeapsHandler handler(Isolate::Current());
+  SendAndExitMessagesHandler handler(Isolate::Current());
   Dart_Port port_id = PortMap::CreatePort(&handler);
   EXPECT_EQ(PortMap::GetIsolate(port_id), Isolate::Current());
   Dart_ExitIsolate();
diff --git a/runtime/vm/image_snapshot.cc b/runtime/vm/image_snapshot.cc
index eaffe44..8318801 100644
--- a/runtime/vm/image_snapshot.cc
+++ b/runtime/vm/image_snapshot.cc
@@ -1282,8 +1282,10 @@
   assembly_stream_->WriteString(
       ".cfi_offset rip, 8\n");  // saved pc is *(CFA+8)
   // saved sp is CFA+16
-  // Should be ".cfi_value_offset rsp, 16", but requires gcc newer than late
-  // 2016 and not supported by Android's libunwind.
+  // Would prefer to use ".cfi_value_offset sp, 16", but this requires gcc
+  // newer than late 2016. Can't emit .cfi_value_offset using .cfi_scape
+  // because DW_CFA_val_offset uses scaled operand and we don't know what
+  // data alignment factor will be choosen by the assembler when emitting CIE.
   // DW_CFA_expression          0x10
   // uleb128 register (rsp)        7   (DWARF register number)
   // uleb128 size of operation     2
@@ -1300,19 +1302,36 @@
   assembly_stream_->WriteString(
       ".cfi_offset x30, 8\n");  // saved pc is *(CFA+8)
   // saved sp is CFA+16
-  // Should be ".cfi_value_offset sp, 16", but requires gcc newer than late
-  // 2016 and not supported by Android's libunwind.
+  // Would prefer to use ".cfi_value_offset sp, 16", but this requires gcc
+  // newer than late 2016. Can't emit .cfi_value_offset using .cfi_scape
+  // because DW_CFA_val_offset uses scaled operand and we don't know what
+  // data alignment factor will be choosen by the assembler when emitting CIE.
+#if defined(TARGET_OS_ANDROID)
+  // On Android libunwindstack has a bug (b/191113792): it does not push
+  // CFA value to the expression stack before evaluating expression given
+  // to DW_CFA_expression. We have to workaround this bug by manually pushing
+  // CFA (R11) to the stack using DW_OP_breg29 0.
+  // DW_CFA_expression          0x10
+  // uleb128 register (x31)       31
+  // uleb128 size of operation     4
+  // DW_OP_breg11               0x8d (0x70 + 29)
+  // sleb128 offset                0
+  // DW_OP_plus_uconst          0x23
+  // uleb128 addend               16
+  assembly_stream_->WriteString(".cfi_escape 0x10, 31, 4, 0x8d, 0, 0x23, 16\n");
+#else
   // DW_CFA_expression          0x10
   // uleb128 register (x31)       31
   // uleb128 size of operation     2
   // DW_OP_plus_uconst          0x23
   // uleb128 addend               16
   assembly_stream_->WriteString(".cfi_escape 0x10, 31, 2, 0x23, 16\n");
+#endif
 
 #elif defined(TARGET_ARCH_ARM)
 #if defined(TARGET_OS_MACOS) || defined(TARGET_OS_MACOS_IOS)
   COMPILE_ASSERT(FP == R7);
-  assembly_stream_->WriteString(".cfi_def_cfa r7, 0\n");  // CFA is fp+j0
+  assembly_stream_->WriteString(".cfi_def_cfa r7, 0\n");  // CFA is fp+0
   assembly_stream_->WriteString(".cfi_offset r7, 0\n");  // saved fp is *(CFA+0)
 #else
   COMPILE_ASSERT(FP == R11);
@@ -1322,14 +1341,31 @@
 #endif
   assembly_stream_->WriteString(".cfi_offset lr, 4\n");  // saved pc is *(CFA+4)
   // saved sp is CFA+8
-  // Should be ".cfi_value_offset sp, 8", but requires gcc newer than late
-  // 2016 and not supported by Android's libunwind.
+  // Would prefer to use ".cfi_value_offset sp, 16", but this requires gcc
+  // newer than late 2016. Can't emit .cfi_value_offset using .cfi_scape
+  // because DW_CFA_val_offset uses scaled operand and we don't know what
+  // data alignment factor will be choosen by the assembler when emitting CIE.
+#if defined(TARGET_OS_ANDROID)
+  // On Android libunwindstack has a bug (b/191113792): it does not push
+  // CFA value to the expression stack before evaluating expression given
+  // to DW_CFA_expression. We have to workaround this bug by manually pushing
+  // CFA (R11) to the stack using DW_OP_breg11 0.
+  // DW_CFA_expression          0x10
+  // uleb128 register (sp)        13
+  // uleb128 size of operation     4
+  // DW_OP_breg11               0x7b (0x70 + 11)
+  // sleb128 offset                0
+  // DW_OP_plus_uconst          0x23
+  // uleb128 addend                8
+  assembly_stream_->WriteString(".cfi_escape 0x10, 31, 4, 0x7b, 0, 0x23, 16\n");
+#else
   // DW_CFA_expression          0x10
   // uleb128 register (sp)        13
   // uleb128 size of operation     2
   // DW_OP_plus_uconst          0x23
   // uleb128 addend                8
   assembly_stream_->WriteString(".cfi_escape 0x10, 13, 2, 0x23, 8\n");
+#endif
 
 // libunwind on ARM may use .ARM.exidx instead of .debug_frame
 #if !defined(TARGET_OS_MACOS) && !defined(TARGET_OS_MACOS_IOS)
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index 234a43a..cb00d29 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -881,6 +881,10 @@
 }
 
 Bequest::~Bequest() {
+  if (handle_ == nullptr) {
+    return;
+  }
+
   IsolateGroup* isolate_group = IsolateGroup::Current();
   CHECK_ISOLATE_GROUP(isolate_group);
   NoSafepointScope no_safepoint_scope;
@@ -1345,11 +1349,19 @@
     msg_obj = message->raw_obj();
     // We should only be sending RawObjects that can be converted to CObjects.
     ASSERT(ApiObjectConverter::CanConvert(msg_obj.ptr()));
-  } else if (message->IsBequest()) {
-    Bequest* bequest = message->bequest();
-    PersistentHandle* handle = bequest->handle();
-    const Object& obj = Object::Handle(zone, handle->ptr());
-    msg_obj = obj.ptr();
+  } else if (message->IsPersistentHandle()) {
+    // msg_array = [<message>, <object-in-message-to-rehash>]
+    const auto& msg_array = Array::Handle(
+        zone, Array::RawCast(message->persistent_handle()->ptr()));
+    msg_obj = msg_array.At(0);
+    if (msg_array.At(1) != Object::null()) {
+      const auto& objects_to_rehash = Object::Handle(zone, msg_array.At(1));
+      const auto& result = Object::Handle(
+          zone, DartLibraryCalls::RehashObjects(thread, objects_to_rehash));
+      if (result.ptr() != Object::null()) {
+        msg_obj = result.ptr();
+      }
+    }
   } else {
     MessageSnapshotReader reader(message.get(), thread);
     msg_obj = reader.ReadObject();
@@ -2505,8 +2517,10 @@
   // This ensures that exit message comes last.
   if (bequest_.get() != nullptr) {
     auto beneficiary = bequest_->beneficiary();
-    PortMap::PostMessage(Message::New(beneficiary, bequest_.release(),
-                                      Message::kNormalPriority));
+    auto handle = bequest_->TakeHandle();
+    PortMap::PostMessage(
+        Message::New(beneficiary, handle, Message::kNormalPriority));
+    bequest_.reset();
   }
 
   LowLevelShutdown();
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 69dc7bc..c17a81d 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -956,6 +956,11 @@
   ~Bequest();
 
   PersistentHandle* handle() { return handle_; }
+  PersistentHandle* TakeHandle() {
+    auto handle = handle_;
+    handle_ = nullptr;
+    return handle;
+  }
   Dart_Port beneficiary() { return beneficiary_; }
 
  private:
diff --git a/runtime/vm/message.cc b/runtime/vm/message.cc
index e533e32..e4430e6 100644
--- a/runtime/vm/message.cc
+++ b/runtime/vm/message.cc
@@ -6,6 +6,7 @@
 
 #include <utility>
 
+#include "vm/dart_api_state.h"
 #include "vm/dart_entry.h"
 #include "vm/json_stream.h"
 #include "vm/object.h"
@@ -21,8 +22,7 @@
                  MessageFinalizableData* finalizable_data,
                  Priority priority,
                  Dart_Port delivery_failure_port)
-    : next_(NULL),
-      dest_port_(dest_port),
+    : dest_port_(dest_port),
       delivery_failure_port_(delivery_failure_port),
       payload_(snapshot),
       snapshot_length_(snapshot_length),
@@ -37,12 +37,9 @@
                  ObjectPtr raw_obj,
                  Priority priority,
                  Dart_Port delivery_failure_port)
-    : next_(NULL),
-      dest_port_(dest_port),
+    : dest_port_(dest_port),
       delivery_failure_port_(delivery_failure_port),
       payload_(raw_obj),
-      snapshot_length_(0),
-      finalizable_data_(NULL),
       priority_(priority) {
   ASSERT(!raw_obj->IsHeapObject() || raw_obj->untag()->InVMIsolateHeap());
   ASSERT((priority == kNormalPriority) ||
@@ -51,19 +48,17 @@
 }
 
 Message::Message(Dart_Port dest_port,
-                 Bequest* bequest,
+                 PersistentHandle* handle,
                  Priority priority,
                  Dart_Port delivery_failure_port)
-    : next_(nullptr),
-      dest_port_(dest_port),
+    : dest_port_(dest_port),
       delivery_failure_port_(delivery_failure_port),
-      payload_(bequest),
-      snapshot_length_(-1),
-      finalizable_data_(nullptr),
+      payload_(handle),
+      snapshot_length_(kPersistentHandleSnapshotLen),
       priority_(priority) {
   ASSERT((priority == kNormalPriority) ||
          (delivery_failure_port == kIllegalPort));
-  ASSERT(IsBequest());
+  ASSERT(IsPersistentHandle());
 }
 
 Message::~Message() {
@@ -72,8 +67,10 @@
     free(payload_.snapshot_);
   }
   delete finalizable_data_;
-  if (IsBequest()) {
-    delete (payload_.bequest_);
+  if (IsPersistentHandle()) {
+    auto isolate_group = IsolateGroup::Current();
+    isolate_group->api_state()->FreePersistentHandle(
+        payload_.persistent_handle_);
   }
 }
 
diff --git a/runtime/vm/message.h b/runtime/vm/message.h
index f6f0b02..bbdf5f9 100644
--- a/runtime/vm/message.h
+++ b/runtime/vm/message.h
@@ -19,7 +19,6 @@
 
 namespace dart {
 
-class Bequest;
 class JSONStream;
 class PersistentHandle;
 class OldPage;
@@ -68,7 +67,7 @@
           Dart_Port delivery_failure_port = kIllegalPort);
 
   Message(Dart_Port dest_port,
-          Bequest* bequest,
+          PersistentHandle* handle,
           Priority priority,
           Dart_Port delivery_failure_port = kIllegalPort);
 
@@ -101,9 +100,9 @@
     ASSERT(IsRaw());
     return payload_.raw_obj_;
   }
-  Bequest* bequest() const {
-    ASSERT(IsBequest());
-    return payload_.bequest_;
+  PersistentHandle* persistent_handle() const {
+    ASSERT(IsPersistentHandle());
+    return payload_.persistent_handle_;
   }
   Priority priority() const { return priority_; }
 
@@ -111,11 +110,14 @@
   // of at the top of the message loop. Control messages from dart:isolate or
   // vm-service requests.
   bool IsOOB() const { return priority_ == Message::kOOBPriority; }
-  bool IsSnapshot() const { return !IsRaw() && !IsBequest(); }
+  bool IsSnapshot() const { return !IsRaw() && !IsPersistentHandle(); }
   // A message whose object is an immortal object from the vm-isolate's heap.
   bool IsRaw() const { return snapshot_length_ == 0; }
-  // A message sent from sendAndExit.
-  bool IsBequest() const { return snapshot_length_ == -1; }
+  // A message sent from SendPort.send or SendPort.sendAndExit where sender and
+  // receiver are in the same isolate group.
+  bool IsPersistentHandle() const {
+    return snapshot_length_ == kPersistentHandleSnapshotLen;
+  }
 
   bool RedirectToDeliveryFailurePort();
 
@@ -130,22 +132,25 @@
   static const char* PriorityAsString(Priority priority);
 
  private:
+  static intptr_t const kPersistentHandleSnapshotLen = -1;
+
   friend class MessageQueue;
 
-  Message* next_;
+  Message* next_ = nullptr;
   Dart_Port dest_port_;
   Dart_Port delivery_failure_port_;
   union Payload {
     Payload(uint8_t* snapshot) : snapshot_(snapshot) {}
     Payload(ObjectPtr raw_obj) : raw_obj_(raw_obj) {}
-    Payload(Bequest* bequest) : bequest_(bequest) {}
+    Payload(PersistentHandle* persistent_handle)
+        : persistent_handle_(persistent_handle) {}
 
     uint8_t* snapshot_;
     ObjectPtr raw_obj_;
-    Bequest* bequest_;
+    PersistentHandle* persistent_handle_;
   } payload_;
-  intptr_t snapshot_length_;
-  MessageFinalizableData* finalizable_data_;
+  intptr_t snapshot_length_ = 0;
+  MessageFinalizableData* finalizable_data_ = nullptr;
   Priority priority_;
 
   DISALLOW_COPY_AND_ASSIGN(Message);
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 2979b4c..07f8188 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -313,7 +313,6 @@
 
   printer.Clear();
   intptr_t start = 0;
-  intptr_t final_len = 0;
   intptr_t len = sum_segment_len;
   bool is_setter = false;
   if (is_extension) {
@@ -323,7 +322,6 @@
         intptr_t slen = i + 1;
         intptr_t plen = slen - start;
         AppendSubString(&printer, unmangled_name, start, plen);
-        final_len = plen;
         unmangled_name += slen;
         len -= slen;
         break;
@@ -379,13 +377,11 @@
   intptr_t end = ((dot_pos + 1) == len) ? dot_pos : len;
 
   intptr_t substr_len = end - start;
-  final_len += substr_len;
   AppendSubString(&printer, unmangled_name, start, substr_len);
   if (is_setter) {
     const char* equals = Symbols::Equals().ToCString();
     const intptr_t equals_len = strlen(equals);
     AppendSubString(&printer, equals, 0, equals_len);
-    final_len += equals_len;
   }
 
   return printer.buffer();
@@ -7090,7 +7086,11 @@
 }
 
 uword Function::Hash() const {
-  return String::HashRawSymbol(name());
+  const uword hash = String::HashRawSymbol(name());
+  if (untag()->owner()->IsClass()) {
+    return hash ^ Class::RawCast(untag()->owner())->untag()->id();
+  }
+  return hash;
 }
 
 bool Function::HasBreakpoint() const {
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index 1d5cfa6..3620f18 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -110,33 +110,36 @@
   object##Ptr ptr() const { return static_cast<object##Ptr>(ptr_); }           \
   bool Is##object() const { return true; }                                     \
   DART_NOINLINE static object& Handle() {                                      \
-    return HandleImpl(Thread::Current()->zone(), object::null());              \
+    return static_cast<object&>(                                               \
+        HandleImpl(Thread::Current()->zone(), object::null(), kClassId));      \
   }                                                                            \
   DART_NOINLINE static object& Handle(Zone* zone) {                            \
-    return HandleImpl(zone, object::null());                                   \
+    return static_cast<object&>(HandleImpl(zone, object::null(), kClassId));   \
   }                                                                            \
   DART_NOINLINE static object& Handle(object##Ptr ptr) {                       \
-    return HandleImpl(Thread::Current()->zone(), ptr);                         \
+    return static_cast<object&>(                                               \
+        HandleImpl(Thread::Current()->zone(), ptr, kClassId));                 \
   }                                                                            \
   DART_NOINLINE static object& Handle(Zone* zone, object##Ptr ptr) {           \
-    return HandleImpl(zone, ptr);                                              \
+    return static_cast<object&>(HandleImpl(zone, ptr, kClassId));              \
   }                                                                            \
   DART_NOINLINE static object& ZoneHandle() {                                  \
-    return ZoneHandleImpl(Thread::Current()->zone(), object::null());          \
+    return static_cast<object&>(                                               \
+        ZoneHandleImpl(Thread::Current()->zone(), object::null(), kClassId));  \
   }                                                                            \
   DART_NOINLINE static object& ZoneHandle(Zone* zone) {                        \
-    return ZoneHandleImpl(zone, object::null());                               \
+    return static_cast<object&>(                                               \
+        ZoneHandleImpl(zone, object::null(), kClassId));                       \
   }                                                                            \
   DART_NOINLINE static object& ZoneHandle(object##Ptr ptr) {                   \
-    return ZoneHandleImpl(Thread::Current()->zone(), ptr);                     \
+    return static_cast<object&>(                                               \
+        ZoneHandleImpl(Thread::Current()->zone(), ptr, kClassId));             \
   }                                                                            \
   DART_NOINLINE static object& ZoneHandle(Zone* zone, object##Ptr ptr) {       \
-    return ZoneHandleImpl(zone, ptr);                                          \
+    return static_cast<object&>(ZoneHandleImpl(zone, ptr, kClassId));          \
   }                                                                            \
-  DART_NOINLINE static object* ReadOnlyHandle() {                              \
-    object* obj = reinterpret_cast<object*>(Dart::AllocateReadOnlyHandle());   \
-    initializeHandle(obj, object::null());                                     \
-    return obj;                                                                \
+  static object* ReadOnlyHandle() {                                            \
+    return static_cast<object*>(ReadOnlyHandleImpl(kClassId));                 \
   }                                                                            \
   DART_NOINLINE static object& CheckedHandle(Zone* zone, ObjectPtr ptr) {      \
     object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));  \
@@ -178,26 +181,9 @@
   static const ClassId kClassId = k##object##Cid;                              \
                                                                                \
  private: /* NOLINT */                                                         \
-  static object& HandleImpl(Zone* zone, object##Ptr ptr) {                     \
-    object* obj = reinterpret_cast<object*>(VMHandles::AllocateHandle(zone));  \
-    initializeHandle(obj, ptr);                                                \
-    return *obj;                                                               \
-  }                                                                            \
-  static object& ZoneHandleImpl(Zone* zone, object##Ptr ptr) {                 \
-    object* obj =                                                              \
-        reinterpret_cast<object*>(VMHandles::AllocateZoneHandle(zone));        \
-    initializeHandle(obj, ptr);                                                \
-    return *obj;                                                               \
-  }                                                                            \
   /* Initialize the handle based on the ptr in the presence of null. */        \
   static void initializeHandle(object* obj, ObjectPtr ptr) {                   \
-    if (ptr != Object::null()) {                                               \
-      obj->SetPtr(ptr);                                                        \
-    } else {                                                                   \
-      obj->ptr_ = Object::null();                                              \
-      object fake_object;                                                      \
-      obj->set_vtable(fake_object.vtable());                                   \
-    }                                                                          \
+    obj->SetPtr(ptr, kClassId);                                                \
   }                                                                            \
   /* Disallow allocation, copy constructors and override super assignment. */  \
  public: /* NOLINT */                                                          \
@@ -237,8 +223,10 @@
 
 #define OBJECT_IMPLEMENTATION(object, super)                                   \
  public: /* NOLINT */                                                          \
-  void operator=(object##Ptr value) { initializeHandle(this, value); }         \
-  void operator^=(ObjectPtr value) {                                           \
+  DART_NOINLINE void operator=(object##Ptr value) {                            \
+    initializeHandle(this, value);                                             \
+  }                                                                            \
+  DART_NOINLINE void operator^=(ObjectPtr value) {                             \
     initializeHandle(this, value);                                             \
     ASSERT(IsNull() || Is##object());                                          \
   }                                                                            \
@@ -637,8 +625,28 @@
 
   uword raw_value() const { return static_cast<uword>(ptr()); }
 
-  inline void SetPtr(ObjectPtr value);
+  inline void SetPtr(ObjectPtr value, intptr_t default_cid);
   void CheckHandle() const;
+  DART_NOINLINE static Object& HandleImpl(Zone* zone,
+                                          ObjectPtr ptr,
+                                          intptr_t default_cid) {
+    Object* obj = reinterpret_cast<Object*>(VMHandles::AllocateHandle(zone));
+    obj->SetPtr(ptr, default_cid);
+    return *obj;
+  }
+  DART_NOINLINE static Object& ZoneHandleImpl(Zone* zone,
+                                              ObjectPtr ptr,
+                                              intptr_t default_cid) {
+    Object* obj =
+        reinterpret_cast<Object*>(VMHandles::AllocateZoneHandle(zone));
+    obj->SetPtr(ptr, default_cid);
+    return *obj;
+  }
+  DART_NOINLINE static Object* ReadOnlyHandleImpl(intptr_t cid) {
+    Object* obj = reinterpret_cast<Object*>(Dart::AllocateReadOnlyHandle());
+    obj->SetPtr(Object::null(), cid);
+    return obj;
+  }
 
   cpp_vtable vtable() const { return bit_copy<cpp_vtable>(*this); }
   void set_vtable(cpp_vtable value) { *vtable_address() = value; }
@@ -779,13 +787,7 @@
 
   /* Initialize the handle based on the ptr in the presence of null. */
   static void initializeHandle(Object* obj, ObjectPtr ptr) {
-    if (ptr != Object::null()) {
-      obj->SetPtr(ptr);
-    } else {
-      obj->ptr_ = Object::null();
-      Object fake_object;
-      obj->set_vtable(fake_object.vtable());
-    }
+    obj->SetPtr(ptr, kObjectCid);
   }
 
   cpp_vtable* vtable_address() const {
@@ -11611,19 +11613,20 @@
 }
 
 DART_FORCE_INLINE
-void Object::SetPtr(ObjectPtr value) {
-  NoSafepointScope no_safepoint_scope;
+void Object::SetPtr(ObjectPtr value, intptr_t default_cid) {
   ptr_ = value;
   intptr_t cid = value->GetClassIdMayBeSmi();
   // Free-list elements cannot be wrapped in a handle.
   ASSERT(cid != kFreeListElement);
   ASSERT(cid != kForwardingCorpse);
-  if (cid >= kNumPredefinedCids) {
+  if (cid == kNullCid) {
+    cid = default_cid;
+  } else if (cid >= kNumPredefinedCids) {
     cid = kInstanceCid;
   }
   set_vtable(builtin_vtables_[cid]);
 #if defined(DEBUG)
-  if (FLAG_verify_handles && ptr_->IsHeapObject()) {
+  if (FLAG_verify_handles && ptr_->IsHeapObject() && (ptr_ != Object::null())) {
     Heap* isolate_heap = IsolateGroup::Current()->heap();
     // TODO(rmacnak): Remove after rewriting StackFrame::VisitObjectPointers
     // to not use handles.
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index b25b2bb..7c75e83 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -1015,6 +1015,8 @@
     kTypeFinalized,
   };
 
+  classid_t id() const { return id_; }
+
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(Class);
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index 4d9a35f..f18f6ab 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -375,17 +375,7 @@
 
 ObjectPtr SnapshotReader::RunDelayedRehashingOfMaps() {
   if (!objects_to_rehash_.IsNull()) {
-    const Library& collections_lib =
-        Library::Handle(zone_, Library::CollectionLibrary());
-    const Function& rehashing_function = Function::Handle(
-        zone_,
-        collections_lib.LookupFunctionAllowPrivate(Symbols::_rehashObjects()));
-    ASSERT(!rehashing_function.IsNull());
-
-    const Array& arguments = Array::Handle(zone_, Array::New(1));
-    arguments.SetAt(0, objects_to_rehash_);
-
-    return DartEntry::InvokeFunction(rehashing_function, arguments);
+    return DartLibraryCalls::RehashObjects(thread(), objects_to_rehash_);
   }
   return Object::null();
 }
diff --git a/samples/ffi/resource_management/arena.dart b/samples/ffi/resource_management/arena.dart
deleted file mode 100644
index 8d30382..0000000
--- a/samples/ffi/resource_management/arena.dart
+++ /dev/null
@@ -1,182 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// Explicit arena used for managing resources.
-
-import 'dart:async';
-import 'dart:ffi';
-
-import 'package:ffi/ffi.dart';
-
-/// An [Allocator] which frees all allocations at the same time.
-///
-/// The arena allows you to allocate heap memory, but ignores calls to [free].
-/// Instead you call [releaseAll] to release all the allocations at the same
-/// time.
-///
-/// Also allows other resources to be associated with the arena, through the
-/// [using] method, to have a release function called for them when the arena is
-/// released.
-///
-/// An [Allocator] can be provided to do the actual allocation and freeing.
-/// Defaults to using [calloc].
-class Arena implements Allocator {
-  /// The [Allocator] used for allocation and freeing.
-  final Allocator _wrappedAllocator;
-
-  /// Native memory under management by this [Arena].
-  final List<Pointer<NativeType>> _managedMemoryPointers = [];
-
-  /// Callbacks for releasing native resources under management by this [Arena].
-  final List<void Function()> _managedResourceReleaseCallbacks = [];
-
-  bool _inUse = true;
-
-  /// Creates a arena of allocations.
-  ///
-  /// The [allocator] is used to do the actual allocation and freeing of
-  /// memory. It defaults to using [calloc].
-  Arena([Allocator allocator = calloc]) : _wrappedAllocator = allocator;
-
-  /// Allocates memory and includes it in the arena.
-  ///
-  /// Uses the allocator provided to the [Arena] constructor to do the
-  /// allocation.
-  ///
-  /// Throws an [ArgumentError] if the number of bytes or alignment cannot be
-  /// satisfied.
-  @override
-  Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
-    _ensureInUse();
-    final p = _wrappedAllocator.allocate<T>(byteCount, alignment: alignment);
-    _managedMemoryPointers.add(p);
-    return p;
-  }
-
-  /// Registers [resource] in this arena.
-  ///
-  /// Executes [releaseCallback] on [releaseAll].
-  ///
-  /// Returns [resource] again, to allow for easily inserting
-  /// `arena.using(resource, ...)` where the resource is allocated.
-  T using<T>(T resource, void Function(T) releaseCallback) {
-    _ensureInUse();
-    releaseCallback = Zone.current.bindUnaryCallback(releaseCallback);
-    _managedResourceReleaseCallbacks.add(() => releaseCallback(resource));
-    return resource;
-  }
-
-  /// Registers [releaseResourceCallback] to be executed on [releaseAll].
-  void onReleaseAll(void Function() releaseResourceCallback) {
-    _managedResourceReleaseCallbacks.add(releaseResourceCallback);
-  }
-
-  /// Releases all resources that this [Arena] manages.
-  ///
-  /// If [reuse] is `true`, the arena can be used again after resources
-  /// have been released. If not, the default, then the [allocate]
-  /// and [using] methods must not be called after a call to `releaseAll`.
-  ///
-  /// If any of the callbacks throw, [releaseAll] is interrupted, and should
-  /// be started again.
-  void releaseAll({bool reuse = false}) {
-    if (!reuse) {
-      _inUse = false;
-    }
-    // The code below is deliberately wirtten to allow allocations to happen
-    // during `releaseAll(reuse:true)`. The arena will still be guaranteed
-    // empty when the `releaseAll` call returns.
-    while (_managedResourceReleaseCallbacks.isNotEmpty) {
-      _managedResourceReleaseCallbacks.removeLast()();
-    }
-    for (final p in _managedMemoryPointers) {
-      _wrappedAllocator.free(p);
-    }
-    _managedMemoryPointers.clear();
-  }
-
-  /// Does nothing, invoke [releaseAll] instead.
-  @override
-  void free(Pointer<NativeType> pointer) {}
-
-  void _ensureInUse() {
-    if (!_inUse) {
-      throw StateError(
-          'Arena no longer in use, `releaseAll(reuse: false)` was called.');
-    }
-  }
-}
-
-/// Runs [computation] with a new [Arena], and releases all allocations at the
-/// end.
-///
-/// If the return value of [computation] is a [Future], all allocations are
-/// released when the future completes.
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_
-/// cleaned up.
-R using<R>(R Function(Arena) computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final arena = Arena(wrappedAllocator);
-  bool isAsync = false;
-  try {
-    final result = computation(arena);
-    if (result is Future) {
-      isAsync = true;
-      return (result.whenComplete(arena.releaseAll) as R);
-    }
-    return result;
-  } finally {
-    if (!isAsync) {
-      arena.releaseAll();
-    }
-  }
-}
-
-/// Creates a zoned [Arena] to manage native resources.
-///
-/// The arena is availabe through [zoneArena].
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_ cleaned up.
-R withZoneArena<R>(R Function() computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final arena = Arena(wrappedAllocator);
-  var arenaHolder = [arena];
-  bool isAsync = false;
-  try {
-    return runZoned(() {
-      final result = computation();
-      if (result is Future) {
-        isAsync = true;
-        result.whenComplete(arena.releaseAll);
-      }
-      return result;
-    }, zoneValues: {#_arena: arenaHolder});
-  } finally {
-    if (!isAsync) {
-      arena.releaseAll();
-      arenaHolder.clear();
-    }
-  }
-}
-
-/// A zone-specific [Arena].
-///
-/// Asynchronous computations can share a [Arena]. Use [withZoneArena] to create
-/// a new zone with a fresh [Arena], and that arena will then be released
-/// automatically when the function passed to [withZoneArena] completes.
-/// All code inside that zone can use `zoneArena` to access the arena.
-///
-/// The current arena must not be accessed by code which is not running inside
-/// a zone created by [withZoneArena].
-Arena get zoneArena {
-  final List<Arena>? arenaHolder = Zone.current[#_arena];
-  if (arenaHolder == null) {
-    throw StateError('Not inside a zone created by `useArena`');
-  }
-  if (arenaHolder.isNotEmpty) {
-    return arenaHolder.single;
-  }
-  throw StateError('Arena has already been cleared with releaseAll.');
-}
diff --git a/samples/ffi/resource_management/arena_isolate_shutdown_sample.dart b/samples/ffi/resource_management/arena_isolate_shutdown_sample.dart
index 52ec773..1640554a 100644
--- a/samples/ffi/resource_management/arena_isolate_shutdown_sample.dart
+++ b/samples/ffi/resource_management/arena_isolate_shutdown_sample.dart
@@ -9,8 +9,8 @@
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
 
-import 'arena.dart';
 import '../dylib_utils.dart';
 
 void main() {
diff --git a/samples/ffi/resource_management/arena_sample.dart b/samples/ffi/resource_management/arena_sample.dart
index a12b553..8436c15 100644
--- a/samples/ffi/resource_management/arena_sample.dart
+++ b/samples/ffi/resource_management/arena_sample.dart
@@ -8,8 +8,8 @@
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
 
-import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
diff --git a/samples/ffi/resource_management/arena_test.dart b/samples/ffi/resource_management/arena_test.dart
deleted file mode 100644
index 18ffaa9..0000000
--- a/samples/ffi/resource_management/arena_test.dart
+++ /dev/null
@@ -1,208 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import 'dart:async';
-import 'dart:ffi';
-
-import 'package:ffi/ffi.dart';
-import 'package:test/test.dart';
-
-// TODO(dacoharkes): After merging into `package:ffi`, roll package in DEPS
-// and remove arena.dart.
-import 'arena.dart';
-
-void main() async {
-  test('sync', () async {
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    using((Arena arena) {
-      arena.using(1234, freeInt);
-      expect(freed.isEmpty, true);
-    });
-    expect(freed, [1234]);
-  });
-
-  test('async', () async {
-    /// Calling [using] waits with releasing its resources until after
-    /// [Future]s complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    Future<int> myFutureInt = using((Arena arena) {
-      return Future.microtask(() {
-        arena.using(1234, freeInt);
-        return 1;
-      });
-    });
-
-    expect(freed.isEmpty, true);
-    await myFutureInt;
-    expect(freed, [1234]);
-  });
-
-  test('throw', () {
-    /// [using] waits with releasing its resources until after [Future]s
-    /// complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    // Resources are freed also when abnormal control flow occurs.
-    var didThrow = false;
-    try {
-      using((Arena arena) {
-        arena.using(1234, freeInt);
-        expect(freed.isEmpty, true);
-        throw Exception('Exception 1');
-      });
-    } on Exception {
-      expect(freed.single, 1234);
-      didThrow = true;
-    }
-    expect(didThrow, true);
-  });
-
-  test(
-    'allocate',
-    () {
-      final countingAllocator = CountingAllocator();
-      // To ensure resources are freed, wrap them in a [using] call.
-      using((Arena arena) {
-        final p = arena<Int64>(2);
-        p[1] = p[0];
-      }, countingAllocator);
-      expect(countingAllocator.freeCount, 1);
-    },
-  );
-
-  test('allocate throw', () {
-    // Resources are freed also when abnormal control flow occurs.
-    bool didThrow = false;
-    final countingAllocator = CountingAllocator();
-    try {
-      using((Arena arena) {
-        final p = arena<Int64>(2);
-        p[0] = 25;
-        throw Exception('Exception 2');
-      }, countingAllocator);
-    } on Exception {
-      expect(countingAllocator.freeCount, 1);
-      didThrow = true;
-    }
-    expect(didThrow, true);
-  });
-
-  test('toNativeUtf8', () {
-    final countingAllocator = CountingAllocator();
-    using((Arena arena) {
-      final p = 'Hello world!'.toNativeUtf8(allocator: arena);
-      expect(p.toDartString(), 'Hello world!');
-    }, countingAllocator);
-    expect(countingAllocator.freeCount, 1);
-  });
-
-  test('zone', () async {
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    withZoneArena(() {
-      zoneArena.using(1234, freeInt);
-      expect(freed.isEmpty, true);
-    });
-    expect(freed.length, 1);
-    expect(freed.single, 1234);
-  });
-
-  test('zone async', () async {
-    /// [using] waits with releasing its resources until after [Future]s
-    /// complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    Future<int> myFutureInt = withZoneArena(() {
-      return Future.microtask(() {
-        zoneArena.using(1234, freeInt);
-        return 1;
-      });
-    });
-
-    expect(freed.isEmpty, true);
-    await myFutureInt;
-    expect(freed.length, 1);
-    expect(freed.single, 1234);
-  });
-
-  test('zone throw', () {
-    /// [using] waits with releasing its resources until after [Future]s
-    /// complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    // Resources are freed also when abnormal control flow occurs.
-    bool didThrow = false;
-    try {
-      withZoneArena(() {
-        zoneArena.using(1234, freeInt);
-        expect(freed.isEmpty, true);
-        throw Exception('Exception 3');
-      });
-    } on Exception {
-      expect(freed.single, 1234);
-      didThrow = true;
-    }
-    expect(didThrow, true);
-    expect(freed.single, 1234);
-  });
-
-  test('allocate during releaseAll', () {
-    final countingAllocator = CountingAllocator();
-    final arena = Arena(countingAllocator);
-
-    arena.using(arena<Uint8>(), (Pointer discard) {
-      arena<Uint8>();
-    });
-
-    expect(countingAllocator.allocationCount, 1);
-    expect(countingAllocator.freeCount, 0);
-
-    arena.releaseAll(reuse: true);
-
-    expect(countingAllocator.allocationCount, 2);
-    expect(countingAllocator.freeCount, 2);
-  });
-}
-
-/// Keeps track of the number of allocates and frees for testing purposes.
-class CountingAllocator implements Allocator {
-  final Allocator wrappedAllocator;
-
-  int allocationCount = 0;
-  int freeCount = 0;
-
-  CountingAllocator([this.wrappedAllocator = calloc]);
-
-  @override
-  Pointer<T> allocate<T extends NativeType>(int byteCount, {int? alignment}) {
-    allocationCount++;
-    return wrappedAllocator.allocate(byteCount, alignment: alignment);
-  }
-
-  @override
-  void free(Pointer<NativeType> pointer) {
-    freeCount++;
-    return wrappedAllocator.free(pointer);
-  }
-}
diff --git a/samples/ffi/resource_management/arena_zoned_sample.dart b/samples/ffi/resource_management/arena_zoned_sample.dart
index bb1defa..a26cc75 100644
--- a/samples/ffi/resource_management/arena_zoned_sample.dart
+++ b/samples/ffi/resource_management/arena_zoned_sample.dart
@@ -7,8 +7,8 @@
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
 
-import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
diff --git a/samples/ffi/sqlite/lib/src/ffi/arena.dart b/samples/ffi/sqlite/lib/src/ffi/arena.dart
deleted file mode 100644
index 290c2fe..0000000
--- a/samples/ffi/sqlite/lib/src/ffi/arena.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-import "dart:async";
-import "dart:ffi";
-
-import 'package:ffi/ffi.dart';
-
-/// [Arena] manages allocated C memory.
-///
-/// Arenas are zoned.
-class Arena {
-  Arena();
-
-  List<Pointer<Void>> _allocations = [];
-
-  /// Bound the lifetime of [ptr] to this [Arena].
-  T scoped<T extends Pointer>(T ptr) {
-    _allocations.add(ptr.cast());
-    return ptr;
-  }
-
-  /// Frees all memory pointed to by [Pointer]s in this arena.
-  void finalize() {
-    for (final ptr in _allocations) {
-      calloc.free(ptr);
-    }
-  }
-
-  /// The last [Arena] in the zone.
-  factory Arena.current() {
-    return Zone.current[#_currentArena];
-  }
-}
-
-/// Bound the lifetime of [ptr] to the current [Arena].
-T scoped<T extends Pointer>(T ptr) => Arena.current().scoped(ptr);
-
-class RethrownError {
-  dynamic original;
-  StackTrace originalStackTrace;
-  RethrownError(this.original, this.originalStackTrace);
-  toString() => """RethrownError(${original})
-${originalStackTrace}""";
-}
-
-/// Runs the [body] in an [Arena] freeing all memory which is [scoped] during
-/// execution of [body] at the end of the execution.
-R runArena<R>(R Function(Arena) body) {
-  Arena arena = Arena();
-  try {
-    return runZoned(() => body(arena),
-        zoneValues: {#_currentArena: arena},
-        onError: (error, st) => throw RethrownError(error, st));
-  } finally {
-    arena.finalize();
-  }
-}
diff --git a/samples_2/ffi/resource_management/arena.dart b/samples_2/ffi/resource_management/arena.dart
deleted file mode 100644
index 4916c3a..0000000
--- a/samples_2/ffi/resource_management/arena.dart
+++ /dev/null
@@ -1,184 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// Explicit arena used for managing resources.
-
-// @dart = 2.9
-
-import 'dart:async';
-import 'dart:ffi';
-
-import 'package:ffi/ffi.dart';
-
-/// An [Allocator] which frees all allocations at the same time.
-///
-/// The arena allows you to allocate heap memory, but ignores calls to [free].
-/// Instead you call [releaseAll] to release all the allocations at the same
-/// time.
-///
-/// Also allows other resources to be associated with the arena, through the
-/// [using] method, to have a release function called for them when the arena is
-/// released.
-///
-/// An [Allocator] can be provided to do the actual allocation and freeing.
-/// Defaults to using [calloc].
-class Arena implements Allocator {
-  /// The [Allocator] used for allocation and freeing.
-  final Allocator _wrappedAllocator;
-
-  /// Native memory under management by this [Arena].
-  final List<Pointer<NativeType>> _managedMemoryPointers = [];
-
-  /// Callbacks for releasing native resources under management by this [Arena].
-  final List<void Function()> _managedResourceReleaseCallbacks = [];
-
-  bool _inUse = true;
-
-  /// Creates a arena of allocations.
-  ///
-  /// The [allocator] is used to do the actual allocation and freeing of
-  /// memory. It defaults to using [calloc].
-  Arena([Allocator allocator = calloc]) : _wrappedAllocator = allocator;
-
-  /// Allocates memory and includes it in the arena.
-  ///
-  /// Uses the allocator provided to the [Arena] constructor to do the
-  /// allocation.
-  ///
-  /// Throws an [ArgumentError] if the number of bytes or alignment cannot be
-  /// satisfied.
-  @override
-  Pointer<T> allocate<T extends NativeType>(int byteCount, {int alignment}) {
-    _ensureInUse();
-    final p = _wrappedAllocator.allocate<T>(byteCount, alignment: alignment);
-    _managedMemoryPointers.add(p);
-    return p;
-  }
-
-  /// Registers [resource] in this arena.
-  ///
-  /// Executes [releaseCallback] on [releaseAll].
-  ///
-  /// Returns [resource] again, to allow for easily inserting
-  /// `arena.using(resource, ...)` where the resource is allocated.
-  T using<T>(T resource, void Function(T) releaseCallback) {
-    _ensureInUse();
-    releaseCallback = Zone.current.bindUnaryCallback(releaseCallback);
-    _managedResourceReleaseCallbacks.add(() => releaseCallback(resource));
-    return resource;
-  }
-
-  /// Registers [releaseResourceCallback] to be executed on [releaseAll].
-  void onReleaseAll(void Function() releaseResourceCallback) {
-    _managedResourceReleaseCallbacks.add(releaseResourceCallback);
-  }
-
-  /// Releases all resources that this [Arena] manages.
-  ///
-  /// If [reuse] is `true`, the arena can be used again after resources
-  /// have been released. If not, the default, then the [allocate]
-  /// and [using] methods must not be called after a call to `releaseAll`.
-  ///
-  /// If any of the callbacks throw, [releaseAll] is interrupted, and should
-  /// be started again.
-  void releaseAll({bool reuse = false}) {
-    if (!reuse) {
-      _inUse = false;
-    }
-    // The code below is deliberately wirtten to allow allocations to happen
-    // during `releaseAll(reuse:true)`. The arena will still be guaranteed
-    // empty when the `releaseAll` call returns.
-    while (_managedResourceReleaseCallbacks.isNotEmpty) {
-      _managedResourceReleaseCallbacks.removeLast()();
-    }
-    for (final p in _managedMemoryPointers) {
-      _wrappedAllocator.free(p);
-    }
-    _managedMemoryPointers.clear();
-  }
-
-  /// Does nothing, invoke [releaseAll] instead.
-  @override
-  void free(Pointer<NativeType> pointer) {}
-
-  void _ensureInUse() {
-    if (!_inUse) {
-      throw StateError(
-          'Arena no longer in use, `releaseAll(reuse: false)` was called.');
-    }
-  }
-}
-
-/// Runs [computation] with a new [Arena], and releases all allocations at the
-/// end.
-///
-/// If the return value of [computation] is a [Future], all allocations are
-/// released when the future completes.
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_
-/// cleaned up.
-R using<R>(R Function(Arena) computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final arena = Arena(wrappedAllocator);
-  bool isAsync = false;
-  try {
-    final result = computation(arena);
-    if (result is Future) {
-      isAsync = true;
-      return (result.whenComplete(arena.releaseAll) as R);
-    }
-    return result;
-  } finally {
-    if (!isAsync) {
-      arena.releaseAll();
-    }
-  }
-}
-
-/// Creates a zoned [Arena] to manage native resources.
-///
-/// The arena is availabe through [zoneArena].
-///
-/// If the isolate is shut down, through `Isolate.kill()`, resources are _not_ cleaned up.
-R withZoneArena<R>(R Function() computation,
-    [Allocator wrappedAllocator = calloc]) {
-  final arena = Arena(wrappedAllocator);
-  var arenaHolder = [arena];
-  bool isAsync = false;
-  try {
-    return runZoned(() {
-      final result = computation();
-      if (result is Future) {
-        isAsync = true;
-        result.whenComplete(arena.releaseAll);
-      }
-      return result;
-    }, zoneValues: {#_arena: arenaHolder});
-  } finally {
-    if (!isAsync) {
-      arena.releaseAll();
-      arenaHolder.clear();
-    }
-  }
-}
-
-/// A zone-specific [Arena].
-///
-/// Asynchronous computations can share a [Arena]. Use [withZoneArena] to create
-/// a new zone with a fresh [Arena], and that arena will then be released
-/// automatically when the function passed to [withZoneArena] completes.
-/// All code inside that zone can use `zoneArena` to access the arena.
-///
-/// The current arena must not be accessed by code which is not running inside
-/// a zone created by [withZoneArena].
-Arena get zoneArena {
-  final List<Arena> arenaHolder = Zone.current[#_arena];
-  if (arenaHolder == null) {
-    throw StateError('Not inside a zone created by `useArena`');
-  }
-  if (arenaHolder.isNotEmpty) {
-    return arenaHolder.single;
-  }
-  throw StateError('Arena has already been cleared with releaseAll.');
-}
diff --git a/samples_2/ffi/resource_management/arena_isolate_shutdown_sample.dart b/samples_2/ffi/resource_management/arena_isolate_shutdown_sample.dart
index 8d1e5c7..89dbd01 100644
--- a/samples_2/ffi/resource_management/arena_isolate_shutdown_sample.dart
+++ b/samples_2/ffi/resource_management/arena_isolate_shutdown_sample.dart
@@ -11,8 +11,8 @@
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
 
-import 'arena.dart';
 import '../dylib_utils.dart';
 
 void main() {
diff --git a/samples_2/ffi/resource_management/arena_sample.dart b/samples_2/ffi/resource_management/arena_sample.dart
index d8cbe80..d45719b 100644
--- a/samples_2/ffi/resource_management/arena_sample.dart
+++ b/samples_2/ffi/resource_management/arena_sample.dart
@@ -9,8 +9,8 @@
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
 
-import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
diff --git a/samples_2/ffi/resource_management/arena_test.dart b/samples_2/ffi/resource_management/arena_test.dart
deleted file mode 100644
index 699d94b..0000000
--- a/samples_2/ffi/resource_management/arena_test.dart
+++ /dev/null
@@ -1,210 +0,0 @@
-// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-//
-// @dart = 2.9
-
-import 'dart:async';
-import 'dart:ffi';
-
-import 'package:ffi/ffi.dart';
-import 'package:test/test.dart';
-
-// TODO(dacoharkes): After merging into `package:ffi`, roll package in DEPS
-// and remove arena.dart.
-import 'arena.dart';
-
-void main() async {
-  test('sync', () async {
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    using((Arena arena) {
-      arena.using(1234, freeInt);
-      expect(freed.isEmpty, true);
-    });
-    expect(freed, [1234]);
-  });
-
-  test('async', () async {
-    /// Calling [using] waits with releasing its resources until after
-    /// [Future]s complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    Future<int> myFutureInt = using((Arena arena) {
-      return Future.microtask(() {
-        arena.using(1234, freeInt);
-        return 1;
-      });
-    });
-
-    expect(freed.isEmpty, true);
-    await myFutureInt;
-    expect(freed, [1234]);
-  });
-
-  test('throw', () {
-    /// [using] waits with releasing its resources until after [Future]s
-    /// complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    // Resources are freed also when abnormal control flow occurs.
-    var didThrow = false;
-    try {
-      using((Arena arena) {
-        arena.using(1234, freeInt);
-        expect(freed.isEmpty, true);
-        throw Exception('Exception 1');
-      });
-    } on Exception {
-      expect(freed.single, 1234);
-      didThrow = true;
-    }
-    expect(didThrow, true);
-  });
-
-  test(
-    'allocate',
-    () {
-      final countingAllocator = CountingAllocator();
-      // To ensure resources are freed, wrap them in a [using] call.
-      using((Arena arena) {
-        final p = arena<Int64>(2);
-        p[1] = p[0];
-      }, countingAllocator);
-      expect(countingAllocator.freeCount, 1);
-    },
-  );
-
-  test('allocate throw', () {
-    // Resources are freed also when abnormal control flow occurs.
-    bool didThrow = false;
-    final countingAllocator = CountingAllocator();
-    try {
-      using((Arena arena) {
-        final p = arena<Int64>(2);
-        p[0] = 25;
-        throw Exception('Exception 2');
-      }, countingAllocator);
-    } on Exception {
-      expect(countingAllocator.freeCount, 1);
-      didThrow = true;
-    }
-    expect(didThrow, true);
-  });
-
-  test('toNativeUtf8', () {
-    final countingAllocator = CountingAllocator();
-    using((Arena arena) {
-      final p = 'Hello world!'.toNativeUtf8(allocator: arena);
-      expect(p.toDartString(), 'Hello world!');
-    }, countingAllocator);
-    expect(countingAllocator.freeCount, 1);
-  });
-
-  test('zone', () async {
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    withZoneArena(() {
-      zoneArena.using(1234, freeInt);
-      expect(freed.isEmpty, true);
-    });
-    expect(freed.length, 1);
-    expect(freed.single, 1234);
-  });
-
-  test('zone async', () async {
-    /// [using] waits with releasing its resources until after [Future]s
-    /// complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    Future<int> myFutureInt = withZoneArena(() {
-      return Future.microtask(() {
-        zoneArena.using(1234, freeInt);
-        return 1;
-      });
-    });
-
-    expect(freed.isEmpty, true);
-    await myFutureInt;
-    expect(freed.length, 1);
-    expect(freed.single, 1234);
-  });
-
-  test('zone throw', () {
-    /// [using] waits with releasing its resources until after [Future]s
-    /// complete.
-    List<int> freed = [];
-    void freeInt(int i) {
-      freed.add(i);
-    }
-
-    // Resources are freed also when abnormal control flow occurs.
-    bool didThrow = false;
-    try {
-      withZoneArena(() {
-        zoneArena.using(1234, freeInt);
-        expect(freed.isEmpty, true);
-        throw Exception('Exception 3');
-      });
-    } on Exception {
-      expect(freed.single, 1234);
-      didThrow = true;
-    }
-    expect(didThrow, true);
-    expect(freed.single, 1234);
-  });
-
-  test('allocate during releaseAll', () {
-    final countingAllocator = CountingAllocator();
-    final arena = Arena(countingAllocator);
-
-    arena.using(arena<Uint8>(), (Pointer discard) {
-      arena<Uint8>();
-    });
-
-    expect(countingAllocator.allocationCount, 1);
-    expect(countingAllocator.freeCount, 0);
-
-    arena.releaseAll(reuse: true);
-
-    expect(countingAllocator.allocationCount, 2);
-    expect(countingAllocator.freeCount, 2);
-  });
-}
-
-/// Keeps track of the number of allocates and frees for testing purposes.
-class CountingAllocator implements Allocator {
-  final Allocator wrappedAllocator;
-
-  int allocationCount = 0;
-  int freeCount = 0;
-
-  CountingAllocator([this.wrappedAllocator = calloc]);
-
-  @override
-  Pointer<T> allocate<T extends NativeType>(int byteCount, {int alignment}) {
-    allocationCount++;
-    return wrappedAllocator.allocate(byteCount, alignment: alignment);
-  }
-
-  @override
-  void free(Pointer<NativeType> pointer) {
-    freeCount++;
-    return wrappedAllocator.free(pointer);
-  }
-}
diff --git a/samples_2/ffi/resource_management/arena_zoned_sample.dart b/samples_2/ffi/resource_management/arena_zoned_sample.dart
index a22e279..54839bd 100644
--- a/samples_2/ffi/resource_management/arena_zoned_sample.dart
+++ b/samples_2/ffi/resource_management/arena_zoned_sample.dart
@@ -9,8 +9,8 @@
 import 'dart:ffi';
 
 import 'package:expect/expect.dart';
+import 'package:ffi/ffi.dart';
 
-import 'arena.dart';
 import 'utf8_helpers.dart';
 import '../dylib_utils.dart';
 
diff --git a/samples_2/ffi/sqlite/lib/src/ffi/arena.dart b/samples_2/ffi/sqlite/lib/src/ffi/arena.dart
deleted file mode 100644
index 56b6fea..0000000
--- a/samples_2/ffi/sqlite/lib/src/ffi/arena.dart
+++ /dev/null
@@ -1,61 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-import "dart:async";
-import "dart:ffi";
-
-import 'package:ffi/ffi.dart';
-
-/// [Arena] manages allocated C memory.
-///
-/// Arenas are zoned.
-class Arena {
-  Arena();
-
-  List<Pointer<Void>> _allocations = [];
-
-  /// Bound the lifetime of [ptr] to this [Arena].
-  T scoped<T extends Pointer>(T ptr) {
-    _allocations.add(ptr.cast());
-    return ptr;
-  }
-
-  /// Frees all memory pointed to by [Pointer]s in this arena.
-  void finalize() {
-    for (final ptr in _allocations) {
-      calloc.free(ptr);
-    }
-  }
-
-  /// The last [Arena] in the zone.
-  factory Arena.current() {
-    return Zone.current[#_currentArena];
-  }
-}
-
-/// Bound the lifetime of [ptr] to the current [Arena].
-T scoped<T extends Pointer>(T ptr) => Arena.current().scoped(ptr);
-
-class RethrownError {
-  dynamic original;
-  StackTrace originalStackTrace;
-  RethrownError(this.original, this.originalStackTrace);
-  toString() => """RethrownError(${original})
-${originalStackTrace}""";
-}
-
-/// Runs the [body] in an [Arena] freeing all memory which is [scoped] during
-/// execution of [body] at the end of the execution.
-R runArena<R>(R Function(Arena) body) {
-  Arena arena = Arena();
-  try {
-    return runZoned(() => body(arena),
-        zoneValues: {#_currentArena: arena},
-        onError: (error, st) => throw RethrownError(error, st));
-  } finally {
-    arena.finalize();
-  }
-}
diff --git a/sdk/lib/_internal/vm/lib/compact_hash.dart b/sdk/lib/_internal/vm/lib/compact_hash.dart
index b491dd6..7ff2354 100644
--- a/sdk/lib/_internal/vm/lib/compact_hash.dart
+++ b/sdk/lib/_internal/vm/lib/compact_hash.dart
@@ -238,7 +238,10 @@
     final int tmpUsed = _usedData;
     _usedData = 0;
     for (int i = 0; i < tmpUsed; i += 2) {
-      this[_data[i]] = _data[i + 1];
+      final key = _data[i];
+      if (!_HashBase._isDeleted(_data, key)) {
+        this[key] = _data[i + 1];
+      }
     }
   }
 
diff --git a/tests/language/identifier/built_in_illegal_test.dart b/tests/language/identifier/built_in_illegal_test.dart
index 12be975..0fd6336 100644
--- a/tests/language/identifier/built_in_illegal_test.dart
+++ b/tests/language/identifier/built_in_illegal_test.dart
@@ -18,24 +18,8 @@
 // [cfe] Can't use 'dynamic' as a name here.
 class export { }
 //    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.DIRECTIVE_AFTER_DECLARATION
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] Directives must appear before any declarations.
-//    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'export'.
-// [error line 19, column 14, length 0]
-// [cfe] Expected ';' after this.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [cfe] Expected a String, but got '{'.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_STRING_LITERAL
-// [cfe] Expected a declaration, but got '{'.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'export' as a name here.
 class external { }
 //    ^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
@@ -46,132 +30,47 @@
 // [cfe] Can't use 'factory' as a name here.
 class get { }
 //    ^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_FUNCTION_PARAMETERS
-// [cfe] A function declaration needs an explicit list of parameters.
-//    ^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'get'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'get' as a name here.
 class interface { }
 //    ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
 // [cfe] Can't use 'interface' as a name here.
 class implements { }
 //    ^^^^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'implements'.
-// [error line 61, column 18, length 0]
-// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
-// [cfe] Expected a type, but got '{'.
-//               ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TYPE_NAME
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'implements' as a name here.
 class import { }
 //    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.DIRECTIVE_AFTER_DECLARATION
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] Directives must appear before any declarations.
-//    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'import'.
-// [error line 70, column 14, length 0]
-// [cfe] Expected ';' after this.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [cfe] Expected a String, but got '{'.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_STRING_LITERAL
-// [cfe] Expected a declaration, but got '{'.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'import' as a name here.
 class mixin { }
 //    ^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'mixin'.
-//          ^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got '{'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'mixin' as a name here.
 class library { }
 //    ^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.LIBRARY_DIRECTIVE_NOT_FIRST
-// [cfe] Expected an identifier, but got 'library'.
-//    ^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] The library directive must appear before all other directives.
-//            ^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got '{'.
-//              ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [cfe] Expected ';' after this.
-//              ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-// [cfe] Expected a declaration, but got '}'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'library' as a name here.
 class operator { }
 //    ^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
 // [cfe] Can't use 'operator' as a name here.
 class part { }
 //    ^^^^
-// [analyzer] SYNTACTIC_ERROR.DIRECTIVE_AFTER_DECLARATION
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] Directives must appear before any declarations.
-//    ^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'part'.
-// [error line 123, column 12, length 0]
-// [cfe] Expected ';' after this.
-//         ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [cfe] Expected a String, but got '{'.
-//         ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_STRING_LITERAL
-// [cfe] Expected a declaration, but got '{'.
-//         ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'part' as a name here.
 class set { }
 //    ^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_FUNCTION_PARAMETERS
-// [cfe] A function declaration needs an explicit list of parameters.
-//    ^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'set'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'set' as a name here.
 class static { }
 //    ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
 // [cfe] Can't use 'static' as a name here.
 class typedef { }
 //    ^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [cfe] A class declaration must have a body, even if it is empty.
-//    ^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'typedef'.
-//            ^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got '{'.
-//              ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [cfe] A typedef needs an explicit list of parameters.
-//              ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-// [cfe] Expected ';' after this.
-//              ^
-// [analyzer] SYNTACTIC_ERROR.MISSING_TYPEDEF_PARAMETERS
-// [cfe] Expected a declaration, but got '}'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'typedef' as a name here.
 
 main() {}
diff --git a/tests/language/vm/regression_38412.dart b/tests/language/vm/regression_38412_test.dart
similarity index 100%
rename from tests/language/vm/regression_38412.dart
rename to tests/language/vm/regression_38412_test.dart
diff --git a/tests/language/vm/regression_38436.dart b/tests/language/vm/regression_38436.dart
deleted file mode 100644
index ea5fafd..0000000
--- a/tests/language/vm/regression_38436.dart
+++ /dev/null
@@ -1,2362 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--optimization_counter_threshold=1
-
-import "package:expect/expect.dart";
-
-// Found by DartFuzzing: would sometimes crash on OSR
-// https://github.com/dart-lang/sdk/issues/38436
-
-import 'dart:async';
-import 'dart:cli';
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:core';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-import 'dart:typed_data';
-
-String var0 = '';
-bool var1 = true;
-int var2 = -30;
-double var3 = 0.895077679110543;
-String var4 = '';
-List<int> var5 = [55, -70];
-Set<int> var6 = {
-  1024,
-  for (int loc0 in [
-    79,
-    ...[23],
-    ...[90, -89, -24],
-    -90,
-    11,
-    -19,
-    -91
-  ])
-    -55,
-  67,
-  -80,
-  for (int loc0 = 0; loc0 < 29; loc0++) 20,
-  for (int loc0 = 0; loc0 < 24; loc0++) ...{23, -41},
-  ...{
-    -75,
-    128,
-    9223372034707292159,
-    -56,
-    -59,
-    for (int loc0 in {
-      -67,
-      for (int loc1 in [-27, -59, 31, 32, -66, -87]) -9223372036854775680,
-      85,
-      -45,
-      if (false) 70,
-      13,
-      43,
-      48
-    })
-      if (true) 63,
-    ...{-90, -24, -9223372036854743041, -9223372032559808383, 86},
-    -25
-  }
-};
-Map<int, String> var7 = {
-  6: '',
-  ...{56: 'B\u2665pwO', 73: 'ZJDi\u{1f600}m'},
-  ...{73: ')', 14: '93Q'},
-  98: 'xA0jQL',
-  21: ')\u2665TOy',
-  for (int loc0 = 0; loc0 < 82; loc0++) 34: 'Q3\u2665#61',
-  ...{70: 'XXRXl3O', 56: '\u2665lda2Zy', 38: 'Dr#mtz', 6: 'nx'},
-  27: '('
-};
-
-Set<int> foo0() {
-  var3 += ((((var0 + var7[var5[88]])).isEmpty ? true : var1)
-      ? (var1 ? (var3 ?? var3) : var3)
-      : (var1 ? 0.24414824314186978 : var3));
-  var1 ??= true;
-  return {(var2--), Duration.secondsPerHour, var5[var2]};
-}
-
-Map<int, String> foo1(List<int> par1, bool par2) {
-  throw ((-(var3)) * (-(0.943305664017911)));
-}
-
-List<int> foo2(Set<int> par1, List<int> par2, Map<int, String> par3) {
-  switch (-49) {
-    case 4149672951:
-      {
-        for (int loc0 in foo0()) {
-          var6 = var6;
-          try {
-            for (int loc1 = 0; loc1 < 70; loc1++) {
-              switch (((var1
-                      ? ((var1 ? var1 : true) ? Float32x4.xzzw : (--var2))
-                      : (4295032831 % (loc1 + 93))))
-                  .floor()) {
-                case 3294548737:
-                  {
-                    var5[Int32x4.xxwy] ^=
-                        (loc0 * ('!').compareTo(((!(true)) ? var4 : 'S')));
-                  }
-                  break;
-                case 3294548738:
-                  {
-                    var0 = var4;
-                    loc0 <<= Int32x4.zwxz;
-                  }
-                  break;
-              }
-              {
-                int loc2 = 0;
-                do {
-                  var1 = ('Ncb\u2665P9K').isEmpty;
-                  var1 ??= (!(true));
-                } while (++loc2 < 91);
-              }
-            }
-            par3 ??= {
-              44: ((false
-                      ? false
-                      : ((true
-                              ? var7
-                              : {
-                                  17: par3[(var5[-73] - -20)],
-                                  80: var7[
-                                      ((++loc0) ~/ ((!(false)) ? 47 : var2))],
-                                  30: '8Qvz3',
-                                  36: '',
-                                  10: (('@B!0bW6' + var4)).toLowerCase(),
-                                  89: var7[-9223372036854775296],
-                                  4: ') '
-                                }) !=
-                          var7))
-                  ? ((var1 || (!(var1))) ? var7[Float32x4.wxzw] : var7[-7])
-                  : '8h'),
-              for (int loc1 in [
-                (false
-                    ? ((([
-                                  var2,
-                                  -39,
-                                  -74,
-                                  Float32x4.zzxy,
-                                  (~(var5[(67 + -86)])),
-                                  -53
-                                ] +
-                                [(var2++), var5[par2[(--loc0)]]]) !=
-                            [
-                              var5[var5[var5[(loc0++)]]],
-                              loc0,
-                              loc0,
-                              -55,
-                              -69,
-                              loc0
-                            ])
-                        ? (loc0--)
-                        : loc0)
-                    : var2),
-                (75 ^ 93),
-                (false ? var5[Float32x4.xzyw] : (loc0++)),
-                ...[
-                  for (int loc2 in {
-                    -22,
-                    (loc0 ^ 2),
-                    var5[(-((par2[-79] * 86)))],
-                    (++loc0),
-                    ((par2[var5[-45]] ?? 55) >> (true ? Int32x4.wyww : -45)),
-                    (~((++var2))),
-                    par2[var2]
-                  })
-                    (loc0--),
-                  if ((var7[(false ? (-(loc0)) : 19)]).endsWith(var4))
-                    (++var2)
-                  else
-                    (var1 ? loc0 : 39),
-                  (((var2++) & var2) & -26),
-                  if (false) (var1 ? Float32x4.wzzw : var5[129]),
-                  for (int loc2 in {
-                    (loc0--),
-                    (true ? loc0 : loc0),
-                    var2,
-                    var5[(0.4452451921266031).floor()],
-                    (~(-4294967196)),
-                    (loc0--),
-                    (--var2)
-                  })
-                    (var1 ? -30 : (loc0++)),
-                  (~((var1 ? 51 : var2))),
-                  (((var3 ?? pi) < 0.9098824013356337)
-                      ? ((true ? 57 : -48) << (--var2))
-                      : par2[-59])
-                ]
-              ])
-                84: var4,
-              57: var4
-            };
-          } catch (exception, stackTrace) {
-            /**
-           ** Multi-line
-           ** documentation comment.
-           */
-            for (int loc1 = 0; loc1 < 89; loc1++) {
-              switch ((var2--)) {
-                case 3807258589:
-                  {
-                    print(({
-                          (-34 ^
-                              ((false || var1)
-                                  ? 24
-                                  : (-(((-((var1
-                                          ? par2[(-(71))]
-                                          : 9223372032559808768))) +
-                                      (~(loc1))))))),
-                          (~((true ? loc0 : (false ? -75 : 33)))),
-                          Float32x4.zxwz,
-                          (false ? (15 * -83) : (var2--)),
-                          ((var7 !=
-                                  ((true ? var1 : false)
-                                      ? var7
-                                      : {
-                                          99: (true ? 'TobD' : var0),
-                                          59: (var4 ?? var4),
-                                          13: var4,
-                                          58: Uri.encodeFull(var4),
-                                          99: var7[loc1]
-                                        }))
-                              ? loc1
-                              : (var1
-                                  ? ((72 >> -15) ~/ (loc0--))
-                                  : -9223372030412324864)),
-                          32
-                        } ??
-                        par1));
-                  }
-                  break;
-                case 3807258592:
-                  {
-                    var1 ??= true;
-                    try {
-                      var7 = {9: (var1 ? 'ON' : 'f\u{1f600}b')};
-                      par2 = (true
-                          ? var5
-                          : [
-                              DateTime.january,
-                              (40 - (~(var2))),
-                              (var1 ? (--loc0) : 23),
-                              var5[(--var2)]
-                            ]);
-                    } catch (exception, stackTrace) {
-                      var3 /= 0.9998663372091022;
-                    } finally {
-                      par2 ??= ((var1
-                              ? false
-                              : (((par1 ??
-                                          {
-                                            -68,
-                                            86,
-                                            -33,
-                                            var5[(-9223372034707292159 - 90)],
-                                            (24 - (++var2)),
-                                            (-(var2)),
-                                            (loc1 * Int32x4.wyxx)
-                                          }))
-                                      .difference({
-                                    (var1 ? Float32x4.yzyw : (loc1 % loc0)),
-                                    6,
-                                    22,
-                                    91,
-                                    loc0,
-                                    (true ? loc1 : loc1)
-                                  }) ==
-                                  foo0()))
-                          ? par2
-                          : [
-                              (var2--),
-                              (-((++loc0))),
-                              ((-(var5[-52])) ~/
-                                  (true ? Int32x4.wyyy : (loc0--))),
-                              (var3).toInt()
-                            ]);
-                      var5[99] += (~(Float32x4.ywxw));
-                    }
-                  }
-                  break;
-              }
-              var5 = (par2 ??
-                  [
-                    ...[72],
-                    for (int loc2 in {Float32x4.xxwz, loc1})
-                      ((loc0--) ~/ (var2++)),
-                    par2[(++var2)],
-                    (-((--var2))),
-                    (var2++),
-                    -56,
-                    (~((~(loc0)))),
-                    for (int loc2 in {
-                      (-((~(17)))),
-                      Float32x4.zzzw,
-                      Float32x4.zyyz,
-                      (var2--),
-                      (Int32x4.wzwz % 78),
-                      loc0
-                    })
-                      Int32x4.xzzy
-                  ]);
-            }
-            {
-              int loc1 = 0;
-              do {
-                loc0 &= (-(4295000065));
-              } while (++loc1 < 94);
-            }
-          } finally {
-            var3 -= 0.020483900923215503;
-            try {
-              return [
-                ...[
-                  (loc0--),
-                  for (int loc1 in {Float32x4.yxyz})
-                    if (var1) (~(-35)) else loc0,
-                  (++loc0),
-                  for (int loc1 = 0; loc1 < 43; loc1++)
-                    (var5[var5[par2[var5[-9223372032559808384]]]] &
-                        Int32x4.yzxy),
-                  for (int loc1 = 0; loc1 < 98; loc1++) (-((~(Int32x4.xwwy)))),
-                  Float32x4.yzzz
-                ],
-                (-(Int32x4.xzxz))
-              ];
-            } catch (exception, stackTrace) {
-              for (int loc1
-                  in (((((!((((0.13101852551635873 == 0.4825498460563603)
-                                          ? var7
-                                          : var7) !=
-                                      var7)))
-                                  ? 1
-                                  : par2[var2]))
-                              .isEven
-                          ? {
-                              (var2++),
-                              (-48 | -54),
-                              (~(par2[loc0])),
-                              par2[var5[Int32x4.zyzz]],
-                              -2,
-                              (true ? (~((-(((!(false)) ? -11 : var2))))) : 73),
-                              if ((0.15992181539430828).isInfinite) (++var2)
-                            }
-                          : (false ? {-6} : {((++loc0) % 27), 92})) ??
-                      Set.identity())) {
-                var6 ??= foo0();
-              }
-              var5[(~(((true ? -10 : Float32x4.zzwy) -
-                  Duration.millisecondsPerSecond)))] = (~((var2--)));
-            }
-          }
-        }
-        par3.forEach((loc0, loc1) {
-          // Single-line comment.
-          var6 = (var6 ?? foo0());
-          par1 = {
-            if (('X2yPgV').endsWith('b'))
-              Float32x4.yxxy
-            else if (true)
-              Int32x4.xzyw
-            else
-              for (int loc2 = 0; loc2 < 9; loc2++) (++loc0),
-            (4294967551 ?? (-((loc0--)))),
-            (-69 ~/
-                ((!(false))
-                    ? ((((par2[Int32x4.zwzw]).isEven
-                                ? (var3).truncateToDouble()
-                                : 0.14035347150303745))
-                            .isInfinite
-                        ? Int32x4.yzxx
-                        : par2[loc0])
-                    : (var2++))),
-            ((loc0++) - ((++var2) >> (~(par2[(var2--)]))))
-          };
-        });
-      }
-      break;
-    case 4149672955:
-      {
-        par2[((var2 ^ (~((--var2)))) | -98)] *= -62;
-        {
-          int loc0 = 0;
-          do {
-            var0 = par3[(var5[4294967808] >> Float32x4.wwyx)];
-          } while (++loc0 < 46);
-        }
-      }
-      break;
-  }
-  var1 ??= (!((var3).isNaN));
-  return (var1
-      ? par2
-      : Uri.parseIPv6Address(
-          (var1 ? '' : '26DgiI'), (ZLibOption.maxMemLevel % 65), 68));
-}
-
-class X0 {
-  bool fld0_0 = true;
-  Set<int> fld0_1 = {
-    31,
-    if (true) ...{
-      -93,
-      -4294967041,
-      -4294934527,
-      if (false) 92,
-      if (true) 69
-    } else
-      85,
-    ...{
-      ...{73, 27},
-      for (int loc0 in {
-        for (int loc1 = 0; loc1 < 56; loc1++) -36,
-        -23,
-        -99,
-        20,
-        16,
-        11,
-        if (false) -24,
-        if (true) 14
-      })
-        if (false) 69,
-      -9223372032559808513,
-      -9223372036854775553,
-      -9223372036854774784,
-      -22
-    },
-    81,
-    ...{16, if (false) 67 else -30, if (true) 21 else -61, -84},
-    -69
-  };
-
-  List<int> foo0_0(Map<int, String> par1) {
-    if ((var1 ? ((!(fld0_0)) ? true : false) : true)) {
-      return ((var4).trim()).codeUnits;
-    } else {
-      for (int loc0 in var6) {
-        fld0_0 ??= var1;
-        for (int loc1 = 0; loc1 < 57; loc1++) {
-          {
-            Map<int, String> loc2 = Map.identity();
-            par1 ??= Map.unmodifiable(Map.unmodifiable(Map.unmodifiable((true
-                ? loc2
-                : ((true
-                        ? loc2
-                        : foo1(
-                            [var5[-60], loc0, var5[-48], -80, var5[var5[37]]],
-                            var1)) ??
-                    {
-                      60: var0,
-                      93: ((false ? var0 : '') + 'r\u{1f600}2B#p')
-                    })))));
-            var4 = ' ';
-          }
-          try {
-            var5 = foo2(
-                ({loc0, 37, Float32x4.wwyw} ?? var6),
-                ((fld0_0
-                        ? [
-                            for (int loc2 = 0; loc2 < 1; loc2++)
-                              (~(Float32x4.zyzz)),
-                            (~((true
-                                ? (Float32x4.yyzw >> (48 - (-((var2--)))))
-                                : (~(loc0))))),
-                            ((var4 ==
-                                    String.fromEnvironment(
-                                        (var1 ? 'l9FM' : par1[var5[loc0]])))
-                                ? (++loc0)
-                                : 4),
-                            ...[
-                              (~((var5[-9223372032559808448] - (++var2)))),
-                              ...[
-                                for (int loc2 in [
-                                  ((-12 <= 55) ? 9223372032559841280 : loc0),
-                                  var5[var5[(~(var5[var5[loc1]]))]],
-                                  (var1 ? 67 : -74)
-                                ])
-                                  (var5[var2]).sign,
-                                var5[-65],
-                                if (fld0_0)
-                                  var5[(var5[var5[-90]] ~/ 22)]
-                                else
-                                  (-9223372036854775679 + var5[16]),
-                                76,
-                                7
-                              ],
-                              (++var2),
-                              -9223372034707292160,
-                              (var2--),
-                              var5[(var2--)]
-                            ],
-                            loc1,
-                            Float32x4.ywxz,
-                            ((++loc0) + (--loc0)),
-                            for (int loc2 in [
-                              for (int loc3 = 0; loc3 < 4; loc3++) loc1,
-                              ...[
-                                Float32x4.zxwy,
-                                Float32x4.xzwx,
-                                var2,
-                                (++var2),
-                                Int32x4.xzyy,
-                                (var5[loc1] | (true ? -97 : -93)),
-                                Float32x4.xwyz,
-                                ((true || var1)
-                                    ? (~((--loc0)))
-                                    : (~((var5[18] % (-55 + loc0)))))
-                              ],
-                              (~((++loc0))),
-                              -85,
-                              (~((var2++))),
-                              (true
-                                  ? ZLibOption.maxMemLevel
-                                  : var5[var5[var5[var5[var2]]]]),
-                              ((true
-                                      ? ((!((false
-                                              ? (true ? fld0_0 : (!(false)))
-                                              : fld0_0)))
-                                          ? fld0_0
-                                          : (({
-                                                96: var4,
-                                                60: '(0yBGn\u{1f600}',
-                                                57: var4,
-                                                73: var7[-43],
-                                                38: var0
-                                              })
-                                                  .isNotEmpty ||
-                                              ({
-                                                67: var4,
-                                                14: 'M\u{1f600}1HNbP',
-                                                6: 's',
-                                                85: 'uyq',
-                                                95: var7[(-(Int32x4.wwxw))],
-                                                33: ''
-                                              })
-                                                  .isNotEmpty))
-                                      : false)
-                                  ? var2
-                                  : (++var2))
-                            ]) ...[-27]
-                          ]
-                        : [
-                            for (int loc2 = 0; loc2 < 87; loc2++)
-                              (-47 * (~((((--var2) ^ loc0) ?? 78)))),
-                            (-(((({
-                                  14: (var3).toStringAsExponential(
-                                      (false ? var5[-62] : 33)),
-                                  16: '',
-                                  71: var4,
-                                  78: (([var5[(-(91))]] == var5) ? var4 : var0),
-                                  9: par1[loc1],
-                                  51: '-8ht',
-                                  26: ('(2l3\u2665h' ?? var0),
-                                  79: var4
-                                })
-                                        .isNotEmpty
-                                    ? var5[(var2 % loc0)]
-                                    : var2) %
-                                ((!(NetworkInterface.listSupported))
-                                    ? -22
-                                    : ((var1
-                                            ? ([
-                                                  ZLibOption.STRATEGY_DEFAULT,
-                                                  21,
-                                                  loc1,
-                                                  loc1,
-                                                  loc0,
-                                                  5,
-                                                  loc0,
-                                                  98
-                                                ] ==
-                                                Uri.parseIPv4Address(
-                                                    var7[loc1]))
-                                            : var1)
-                                        ? (~((-20 %
-                                            (var5).removeAt(Float32x4.wyxw))))
-                                        : var5[var5[82]]))))),
-                            (-(Float32x4.wwwz)),
-                            Int32x4.wxxz,
-                            ...[
-                              (loc0++),
-                              ...[
-                                (--loc0),
-                                -2,
-                                ZLibOption.DEFAULT_WINDOW_BITS,
-                                -42,
-                                for (int loc2 = 0; loc2 < 2; loc2++) (-(-22)),
-                                (~(-81))
-                              ],
-                              (--var2)
-                            ],
-                            (++var2),
-                            ((!(false)) ? (--var2) : (((~(34)) >> 48) << 79)),
-                            loc1
-                          ]) +
-                    foo2(
-                        foo0(),
-                        ([
-                              (((~(var5[(-(var5[(87 % var5[(++var2)])]))])) ??
-                                      -11) ~/
-                                  (var2++)),
-                              ((((!(var1)) && true) ? loc1 : 98) <<
-                                  ((!((true != (var4 == par1[var5[(~(-83))]]))))
-                                      ? -44
-                                      : var5[88])),
-                              Float32x4.yyyz,
-                              -44,
-                              Int32x4.xzyx,
-                              (++loc0)
-                            ] ??
-                            [
-                              ((foo1([((!(var1)) ? 24 : 81), -93], true))
-                                      .isEmpty
-                                  ? 52
-                                  : (~(Int32x4.zyww))),
-                              Int32x4.xxwz,
-                              (-(-11)),
-                              (loc0--),
-                              ((!(bool.fromEnvironment('U\u2665')))
-                                  ? (loc0++)
-                                  : (++var2))
-                            ]),
-                        {
-                          70: var7[7],
-                          18: '\u2665(#&c\u{1f600}-',
-                          58: 'KuNr',
-                          96: '\u{1f600}2\u2665YY',
-                          94: var0,
-                          28: 'l-'
-                        })),
-                par1);
-            {
-              double loc2 = double.infinity;
-              /*
-               * Multi-line
-               * comment.
-               */
-              return ('a!wNh!').codeUnits;
-            }
-          } catch (exception, stackTrace) {
-            continue;
-          } finally {
-            fld0_0 = (!(fld0_0));
-            var5 ??= ((Uri.parseIPv4Address('H') ??
-                    (foo2({
-                          loc1,
-                          ([
-                                if (((true ? loc0 : (loc0++)) <
-                                    ((!(var1)) ? -90 : Int32x4.yyzx)))
-                                  (~(var2))
-                                else
-                                  for (int loc2 in {
-                                    if (SecurityContext.alpnSupported)
-                                      var2
-                                    else
-                                      Int32x4.wzzy,
-                                    -9223372036754112763,
-                                    (-((var1
-                                        ? var5[62]
-                                        : (-(Float32x4.wzwz))))),
-                                    (~(Float32x4.yxzy))
-                                  })
-                                    ((((true && (false ? fld0_0 : var1))
-                                                ? fld0_0
-                                                : false)
-                                            ? true
-                                            : (fld0_0 && var1))
-                                        ? (true ? (~(loc1)) : var5[-16])
-                                        : loc0),
-                                for (int loc2 = 0; loc2 < 1; loc2++)
-                                  ((false && var1) ? Float32x4.yzyy : 50)
-                              ][var2] *
-                              [
-                                ...[
-                                  (((-10 >> Int32x4.wxzw) *
-                                          ((0.42979687169554437 >=
-                                                  0.17848133910264385)
-                                              ? -4
-                                              : var5[-15])) |
-                                      var5[(loc0++)]),
-                                  ...[
-                                    (('@jcNl\u2665P')
-                                            .compareTo(var7[(loc0--)]) &
-                                        (~((~(loc0))))),
-                                    if ((!(((!(true)) && true)))) 2,
-                                    loc1,
-                                    ((var5[(loc0--)] | -38) & (loc0++)),
-                                    var2,
-                                    (~(-22)),
-                                    if (false) loc0 else 80,
-                                    (--loc0)
-                                  ],
-                                  ...[15],
-                                  ((~((~(-5)))) ^ Int32x4.xxxz),
-                                  79,
-                                  for (int loc2 in [
-                                    (fld0_0 ? -0 : (loc0++)),
-                                    -49,
-                                    for (int loc3 in [
-                                      -16,
-                                      (var2--),
-                                      35,
-                                      ((14 * -68) ~/ Int32x4.wwyy)
-                                    ])
-                                      var5[(fld0_0 ? 28 : (-41 ?? 19))],
-                                    loc0,
-                                    (var3).round(),
-                                    if ((!((!((!(false))))))) loc1,
-                                    (loc0++),
-                                    Int32x4.wyww
-                                  ])
-                                    ((--var2) * var5[(6 & var5[(~(-53))])]),
-                                  (loc0++),
-                                  Float32x4.xwxx
-                                ],
-                                Int32x4.ywyw,
-                                (-(ZLibOption.strategyFixed)),
-                                (80 % (loc0--)),
-                                var5[Int32x4.zxww]
-                              ][var5[50]]),
-                          (false ? -71 : 39),
-                          (var5[-61]).toSigned(loc0),
-                          -50,
-                          4294967296
-                        }, [
-                          (16 *
-                              (~(((var1 ? ZLibOption.STRATEGY_FIXED : -66) *
-                                  4)))),
-                          Float32x4.wwwx
-                        ], {
-                          63: var0,
-                          52: (fld0_0 ? 'uG\u2665V@4' : '62'),
-                          98: var7[var5[-83]],
-                          70: (false
-                              ? 'bSg'
-                              : base64UrlEncode(([
-                                    (~(var2)),
-                                    -52,
-                                    68,
-                                    [
-                                      10,
-                                      loc1,
-                                      92,
-                                      53,
-                                      Int32x4.zzyw,
-                                      (true ? 12 : 19),
-                                      (~(var5[(++var2)]))
-                                    ][-64],
-                                    (++loc0),
-                                    (loc0 << -26)
-                                  ] +
-                                  [
-                                    var5[(--loc0)],
-                                    (((var1 ? var5[var5[(var2--)]] : loc1) +
-                                            (--var2)) <<
-                                        Int32x4.wyyx)
-                                  ]))),
-                          16: 'YsD\u2665\u2665K',
-                          0: var0,
-                          93: var7[(-(var5[-43]))]
-                        }) ??
-                        var5)) ??
-                [
-                  if (fld0_0) -90,
-                  (--var2),
-                  ...[
-                    for (int loc2 in [
-                      (false ? (~(-9)) : -4294901760),
-                      (-(-7)),
-                      -51,
-                      (var1 ? -75 : [Float32x4.wwxw, Int32x4.zxyx][-7]),
-                      Float32x4.xyww,
-                      Int32x4.wwzx,
-                      (loc0++),
-                      (NetworkInterface.listSupported
-                          ? [1000][Float32x4.zzyx]
-                          : -71)
-                    ])
-                      -27,
-                    Float32x4.wyzy,
-                    (++var2)
-                  ]
-                ]);
-          }
-        }
-      }
-      throw Map.unmodifiable(foo1(
-          (MapBase.mapToString(foo1((false ? [var2] : var5), false))).codeUnits,
-          true));
-    }
-  }
-
-  void run() {}
-}
-
-class X1 extends X0 {
-  double fld1_0 = 0.47694301047645304;
-  bool fld1_1 = true;
-
-  Map<int, String> foo1_0(
-      Map<int, String> par1, Map<int, String> par2, double par3) {
-    // Single-line comment.
-    for (int loc0 = 0; loc0 < 91; loc0++) {
-      par2.forEach((loc1, loc2) {
-        {
-          bool loc3 = (fld1_1 || ('U\u2665').isEmpty);
-          var3 /= 0.8504341352135224;
-        }
-      });
-      {
-        int loc1 = 66;
-        while (--loc1 > 0) {
-          if (((!((true || fld1_1))) == true)) {
-            var0 ??= par2[var5[(~((false ? ((!(var1)) ? -95 : var2) : -37)))]];
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            return Map.unmodifiable({
-              55: var4,
-              73: 'c#',
-              17: (fld1_1
-                  ? '7\u{1f600}e'
-                  : ((!(var1)) ? '8E7AK2e' : 'Fm\u{1f600} F')),
-              40: 'mb(\u{1f600}\u2665l',
-              36: Uri.decodeFull((true ? par2[-32769] : var7[Float32x4.zyxz])),
-              51: ((false &&
-                      (((var1 ? true : true) || false)
-                          ? (var7[(var2--)]).isEmpty
-                          : true))
-                  ? (fld1_1
-                      ? (fld1_1 ? (var1).toString() : 'r9M')
-                      : ((true ? (0.2863696758528199 != par3) : false)
-                          ? (fld1_1 ? par1[Int32x4.zwyz] : var4)
-                          : var4))
-                  : var4),
-              8: '6G',
-              62: '+z@Gp'
-            });
-          } else {
-            var5[Int32x4.zzyy] ??= (-(var5[((!(false)) ? loc1 : -34)]));
-            {
-              int loc2 = (-(7));
-              var3 /= (true
-                  ? (-(((-9223372032459145467).isEven
-                      ? fld1_0
-                      : (-((-(0.7008573255099826)))))))
-                  : par3);
-            }
-          }
-          for (int loc2 in foo2(var6, var5, {
-            if (false) 11: par1[((var4).isEmpty ? 55 : -61)],
-            12: 'f5j2v\u{1f600}',
-            52: (((foo1(
-                            (((var1
-                                        ? {var5[-66], var2, 88, 12, 6, -96}
-                                        : (var1
-                                            ? {-25, 84, (var2--), var5[83]}
-                                            : {-36, var5[51], var2})) !=
-                                    {var5[(++var2)]})
-                                ? [-2147483648, 46, loc0, var5[loc0], -21]
-                                : foo2(
-                                    {var5[var5[loc0]]},
-                                    (true
-                                        ? var5
-                                        : [
-                                            -30,
-                                            var5[(-(-42))],
-                                            var2,
-                                            Float32x4.zywx,
-                                            loc1,
-                                            63,
-                                            -25,
-                                            -28
-                                          ]),
-                                    {30: 'j\u2665U', 98: var4})),
-                            false))
-                        .isNotEmpty
-                    ? (false ? fld1_0 : 0.3202297128057393)
-                    : 0.1301025669674245))
-                .toStringAsFixed(((fld1_1 ? 79 : -88) + Int32x4.xyzw)),
-            88: (false ? var7[(var2++)] : (var4 ?? '')),
-            31: (var1
-                ? (var1 ? par2[-87] : (true ? par2[-14] : var4))
-                : ((fld1_1 != true) ? '3nd9t&' : var4)),
-            22: ('(Czi' + '-Y')
-          })) {
-            var7[(loc2--)] = 's';
-          }
-        }
-      }
-    }
-    return par1;
-  }
-
-  String foo1_1(int par1) => var0;
-  Set<int> foo1_2(String par1) {
-    for (int loc0 = 0; loc0 < 58; loc0++) {
-      switch ((~(13))) {
-        case 746492976:
-          {
-            switch (Duration.millisecondsPerDay) {
-              case 3635015902:
-                {
-                  var7[var5[(var5[var2] * (-(var5[Float32x4.yxxz])))]] ??=
-                      (var7[-79] + '(O@');
-                  var7[loc0] ??= String.fromCharCode(var5[(true
-                      ? (var5[((var1 ? true : (false ? fld1_1 : var1))
-                              ? var5[Float32x4.wyyz]
-                              : 73)] ~/
-                          (-(84)))
-                      : -15)]);
-                }
-                break;
-              case 3635015905:
-                {
-                  var1 = (var1
-                      ? (foo1_0(
-                              (((!(false)) || fld1_1) ? var7 : var7),
-                              foo1_0(
-                                  {74: '\u2665e', 10: 'tw8jc0R'},
-                                  foo1_0(
-                                      var7,
-                                      foo1_0(
-                                          ({
-                                                17: var7[Int32x4.zyxy],
-                                                82: var7[64],
-                                                27: 'VEtj',
-                                                90: Uri.encodeQueryComponent(
-                                                    foo1_1(var2)),
-                                                68: 'wew0\u{1f600}'
-                                              } ??
-                                              foo1_0(var7, var7, var3)),
-                                          ({
-                                                65: 'mBeBfUj',
-                                                81: var4,
-                                                35: (var7[-43] + 'l'),
-                                                68: var4
-                                              } ??
-                                              {
-                                                33: ('N\u{1f600}xaY+' ?? par1),
-                                                44: var7[var5[var2]],
-                                                83: var4,
-                                                86: 'k'
-                                              }),
-                                          asin(0.4245871535895427)),
-                                      (-(0.2913717674787144))),
-                                  0.9439800024935644),
-                              (-((true
-                                  ? ((var1 ? false : var1)
-                                      ? 0.09441225978923817
-                                      : 0.42622157485045953)
-                                  : (-(0.29370792038584836)))))))
-                          .isNotEmpty
-                      : (false && true));
-                  var3 += (-(fld1_0));
-                }
-                break;
-            }
-          }
-          break;
-        case 746492979:
-          {
-            var4 = var0;
-            for (int loc1 = 0; loc1 < 88; loc1++) {
-              var2 += 32;
-            }
-          }
-          break;
-      }
-    }
-    {
-      int loc0 = 0;
-      do {
-        return foo0();
-      } while (++loc0 < 57);
-    }
-    return foo0();
-  }
-
-  String foo1_3() {
-    if ((0.42144855521066793).isNegative) {
-      print((false ? (-(fld1_0)) : (-((-((-(0.26854952952179667))))))));
-      switch (30) {
-        case 3830102525:
-          {
-            try {
-              var7.forEach((loc0, loc1) {
-                var1 = (!(true));
-                var6 = (foo1_2(var7[99]) ?? var6);
-              });
-              var6 ??= var6;
-            } catch (exception, stackTrace) {
-              var4 ??= ListBase.listToString([
-                (Duration.microsecondsPerSecond + -82),
-                (true
-                    ? var5[(var2 ~/ (false ? (~((var1 ? 46 : var2))) : var2))]
-                    : (-9223372034707292161 >> var5[var5[-86]])),
-                Float32x4.wxyx
-              ]);
-            } finally {
-              /**
-             ** Multi-line
-             ** documentation comment.
-             */
-              fld1_1 = (var5[var5[var2]]).isOdd;
-            }
-            /*
-           * Multi-line
-           * comment.
-           */
-            if ((SetBase.setToString((fld1_1
-                    ? {12, (fld1_1 ? (-(-22)) : (-(4395630341)))}
-                    : var6)))
-                .isNotEmpty) {
-              try {
-                {
-                  int loc0 = 86;
-                  while (--loc0 > 0) {
-                    {
-                      int loc1 = 0;
-                      do {
-                        var0 = var7[(-(((--var2) &
-                            ((var1 ? (fld1_0).isNaN : true)
-                                ? (-16 | -20)
-                                : ((0.7513819161190503).isNaN ? 45 : loc1)))))];
-
-                        /// Single-line documentation comment.
-                        var5[(true ? loc0 : Float32x4.zxzx)] %= loc0;
-                      } while (++loc1 < 17);
-                    }
-                    for (int loc1 = 0; loc1 < 25; loc1++) {
-                      var5[Float32x4.zywy] <<= Int32x4.ywwx;
-                    }
-                  }
-                }
-              } catch (exception, stackTrace) {
-                var7 = Map.from(foo1_0({
-                  81: (foo1_1(((++var2) * (-(var5[21])))) +
-                      (var7[8] + (var7[var5[53]] ?? var0))),
-                  for (int loc0 in [
-                    (true ? 58 : Float32x4.wyww),
-                    var5[(fld1_1 ? 46 : var2)]
-                  ])
-                    63: var7[(false
-                        ? var5[((24 >> -9223372036854710272) & var2)]
-                        : var5[(80 << var5[-31])])],
-                  67: var0,
-                  1: '3mlOA',
-                  30: ('OQbG').substring((var2--), (--var2)),
-                  93: ((var7[74] ?? var7[(++var2)])).toLowerCase(),
-                  ...{
-                    85: foo1_1(-21),
-                    if ((!((!(false))))) 86: var0,
-                    49: '62+v',
-                    59: foo1_1((--var2)),
-                    for (int loc0 in [
-                      -10,
-                      -65,
-                      (var2++),
-                      (var2++),
-                      ((({
-                                    ((var7[60] == var7[-30])
-                                        ? var5[(-((var2++)))]
-                                        : (var2--))
-                                  } ==
-                                  {var5[var2], -40, -81, (var2++), 93, 26})
-                              ? 38
-                              : (var1 ? var5[97] : -82)) *
-                          (--var2)),
-                      (~((true ? 5 : Float32x4.yxyy))),
-                      (var2++),
-                      ((++var2) << ((var2 % Int32x4.yxxw) >> (++var2)))
-                    ])
-                      54: (var0 + 'ANyqN'),
-                    94: (var1 ? '0T\u2665#w' : (var0).toUpperCase()),
-                    68: '@n',
-                    67: base64UrlEncode(((0.07857744084458451).isInfinite
-                        ? ([
-                              var2,
-                              var5[70],
-                              -32,
-                              Float32x4.yxwz,
-                              31,
-                              (~(var2)),
-                              (var2 ?? (-70 + 57)),
-                              -91
-                            ] +
-                            [
-                              var2,
-                              var5[((!(var1))
-                                  ? var5[(var2 ~/ Float32x4.zwyw)]
-                                  : var5[var5[(var5[(~(var2))] % var2)]])],
-                              (var2 | (false ? (-(var2)) : var5[80])),
-                              (var2--),
-                              DateTime.daysPerWeek,
-                              (var2 ~/ var2)
-                            ])
-                        : (var1 ? var5 : [(var2++)])))
-                  },
-                  if (false)
-                    if (false)
-                      26: (Uri.encodeComponent(foo1_1(var2)) + var7[var5[var2]])
-                    else ...{
-                      4: (double.negativeInfinity).toStringAsFixed(var2),
-                      46: Uri.decodeQueryComponent('bst3jz'),
-                      5: ((true
-                              ? (true ? '(-f' : var7[(-(Int32x4.yzxz))])
-                              : var7[(var5[(fld1_1 ? (var2--) : var2)] >>
-                                  (-((false ? 8589934591 : 33))))]) ??
-                          '4ov'),
-                      37: var7[var5[100663045]],
-                      13: '2B'
-                    }
-                }, {
-                  71: 'Hxbq',
-                  22: ('\u{1f600}Jtj').substring(
-                      (-36 | var5[(~((var2++)))]), 9223372032559874048)
-                }, 0.3710694748818374));
-                fld1_0 ??= 0.010604823956237519;
-              } finally {
-                for (int loc0 = 0; loc0 < 84; loc0++) {
-                  var5[Float32x4.xwwz] <<=
-                      ((((fld1_1 ? false : ('e\u{1f600}O+Vc').isNotEmpty) &&
-                                  (!(fld1_1)))
-                              ? (-73 | var5[Int32x4.yzwx])
-                              : Uint16List.bytesPerElement) ~/
-                          var2);
-                }
-              }
-            }
-          }
-          break;
-        case 3830102528:
-          {
-            fld1_1 ??= true;
-            throw (-((-17).ceilToDouble()));
-          }
-          break;
-      }
-    }
-    return var0;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = 61;
-      while (--loc0 > 0) {
-        {
-          int loc1 = 77;
-          while (--loc1 > 0) {
-            {
-              int loc2 = 0;
-              do {
-                break;
-              } while (++loc2 < 84);
-            }
-          }
-        }
-        if (((var1 || fld1_1) && (!((!((!((!((!(true)))))))))))) {
-          switch (Int32x4.yyzx) {
-            case 900727295:
-              {
-                /// Single-line documentation comment.
-                fld1_1 ??= (!(true));
-                for (int loc1 in ((var5 ??
-                        Uri.parseIPv6Address(
-                            foo1_3(), var5[(loc0 + var5[4096])], -34)) ??
-                    var5)) {
-                  var7[(38 << (false ? (~(-58)) : Float32x4.yyxy))] =
-                      Uri.decodeFull(foo1_3());
-                  var5 ??= var5;
-                }
-              }
-              break;
-            case 900727304:
-              {
-                fld1_1 =
-                    (SecurityContext.alpnSupported ? (var3).isFinite : var1);
-                fld1_0 += 0.3154406798513474;
-              }
-              break;
-          }
-          var2 ^= var2;
-        } else {
-          if (((-(var3)) <= (-(fld1_0)))) {
-            var6 = foo1_2('0vsDWF9');
-          } else {
-            var6 ??= ((fld1_0 <= 0.16230005903410238)
-                ? ((!((0.5144029832155854 > (0.8199455895430549 / var3))))
-                    ? foo1_2('ken')
-                    : var6)
-                : (fld1_1 ? {56, 6442450945, 2} : {34}));
-          }
-          var5[Float32x4.zwzw] += (true ? var2 : (~(Float32x4.wyyx)));
-        }
-      }
-    }
-  }
-}
-
-class X2 extends X0 with X1 {
-  Set<int> fld2_0 = {for (int loc0 = 0; loc0 < 60; loc0++) -56, 29};
-
-  bool foo2_0(int par1) => var1;
-  bool foo2_1(bool par1) {
-    for (int loc0 in var6) {
-      var2 ~/= ((((((fld2_0 ?? (true ? var6 : var6)) ?? fld2_0))
-                      .union({(~(-21)), 10}) !=
-                  {(var5[90] ~/ (-(-90)))})
-              ? par1
-              : (var7[(~(82))]).isNotEmpty)
-          ? ((~(loc0)) *
-              ((true ? (-4294966272 ?? -21) : var2) +
-                  Duration.millisecondsPerMinute))
-          : (-9223372032559807488 ~/ 4294968296));
-    }
-    if (('DeAm#f' ==
-        ((Uri.encodeQueryComponent((0.3687340601979223).toString()) ??
-                var7[-23]) ??
-            foo1_3()))) {
-      throw (([Float32x4.wyyz, -9223372036854743039])
-              .sublist((--var2), (--var2)) +
-          ((true ? var1 : (!(false)))
-              ? foo2(
-                  foo1_2('JLXt'),
-                  [
-                    var5[Int32x4.zxzx],
-                    Int32x4.xxwy,
-                    (var2++),
-                    Float32x4.yzxx,
-                    (var2++),
-                    -15
-                  ],
-                  foo1_0(var7, var7, 0.7904389283184639))
-              : (var1
-                  ? [Float32x4.yzyz, Int32x4.wxxy, var2, (~(var5[-47]))]
-                  : var5)));
-    } else {
-      var7[var2] ??= ((({
-            ...{
-              for (int loc0 = 0; loc0 < 19; loc0++)
-                36: (var7[var2] ?? (par1 ? ('ccb9z' + 'iM') : var0)),
-              3: ('1sG' + var0),
-              for (int loc0 in {
-                (-(var5[var2])),
-                if (var1) Int32x4.zxxx,
-                -4294967168,
-                -61,
-                (~((par1 ? (~(-70)) : (var2--)))),
-                (-(7)),
-                -96,
-                Uint32List.bytesPerElement
-              })
-                85: var4
-            },
-            if (foo2_0(-91)) 38: (var3).toString() else 30: 'uI\u2665\u{1f600}',
-            72: '@'
-          }[(par1 ? 14 : var2)])
-                  .trim())
-              .substring((36 ~/ var5[(++var2)]), var5[((-(25)) * -53)]) ??
-          foo1_3());
-      /*
-       * Multi-line
-       * comment.
-       */
-      {
-        int loc0 = 0;
-        do {
-          {
-            String loc1 = 'jG7t';
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            {
-              int loc2 = 57;
-              while (--loc2 > 0) {
-                print((var6 ??
-                    (foo1_2(var0)).union(foo1_2(('n' + var7[(++var2)])))));
-              }
-            }
-          }
-        } while (++loc0 < 69);
-      }
-    }
-    return (!(((!((par1 && false)))
-        ? (true && foo2_0(-9223372036854771712))
-        : (!(par1)))));
-  }
-
-  double foo2_2(Map<int, String> par1, int par2) {
-    switch (var2) {
-      case 3816231196:
-        {
-          throw (-(Int32x4.xxwx));
-        }
-        break;
-      case 3816231204:
-        {
-          var7.forEach((loc0, loc1) {
-            switch ((-43 ^ (-(Float32x4.wwxx)))) {
-              case 2839002105:
-                {
-                  var0 ??= (SetBase.setToString(((var1 ? var1 : (true || var1))
-                          ? fld2_0
-                          : {
-                              Int32x4.yyzw,
-                              Int32x4.yyxy,
-                              (2 >> Int32x4.ywzx),
-                              (var1
-                                  ? ((foo2_1(var1) ? 17 : loc0) ~/
-                                      (-(var5[var2])))
-                                  : par2),
-                              Float32x4.zwwx,
-                              par2,
-                              Int32x4.wzzz,
-                              Int32x4.zyzw
-                            })) ??
-                      (loc1 +
-                          var7[((true
-                                  ? (var1 &&
-                                      bool.fromEnvironment(var7[(var2--)]))
-                                  : foo2_1(false))
-                              ? 35
-                              : (-(66)))]));
-                  for (int loc2 = 0; loc2 < 23; loc2++) {
-                    switch ((-73 ^ (Int32x4.xyzz >> Float32x4.yzzz))) {
-                      case 1710454916:
-                        {
-                          var3 = 0.3372913861348876;
-                          print(((-(var3)) * var3));
-                        }
-                        break;
-                      case 1710454922:
-                        {
-                          var4 ??= ((false
-                                  ? (var1
-                                      ? var1
-                                      : (fld2_0 ==
-                                          {
-                                            (false ? -27 : (-(92))),
-                                            loc2,
-                                            var5[loc2],
-                                            (var1
-                                                ? Float32x4.yywy
-                                                : (false ? -74 : 2)),
-                                            ((-(-50)) ^ 32),
-                                            (var2++)
-                                          }))
-                                  : var1)
-                              ? base64UrlEncode([
-                                  for (int loc3 in {
-                                    (-(par2)),
-                                    loc0,
-                                    (-((par2++))),
-                                    Float32x4.yyyx
-                                  })
-                                    (par2--),
-                                  (-((-(var5[var5[var5[-41]]])))),
-                                  if (({
-                                        loc2,
-                                        Duration.microsecondsPerSecond,
-                                        (([
-                                                  (par2++),
-                                                  (-90 ^ -5),
-                                                  var5[(~(0))],
-                                                  loc2
-                                                ] !=
-                                                var5)
-                                            ? -9223372032559808512
-                                            : (par2++))
-                                      } ==
-                                      {
-                                        (var1 ? (-((loc2 % loc2))) : loc2),
-                                        -94,
-                                        -62
-                                      }))
-                                    (++var2),
-                                  loc2,
-                                  for (int loc3 in {
-                                    55,
-                                    (~(var5[var5[(++par2)]])),
-                                    ((var1
-                                            ? (-((++var2)))
-                                            : var5[(true ? var5[68] : 10)]) -
-                                        par2),
-                                    (-(Float32x4.wzxx))
-                                  })
-                                    (Int32x4.yxzy | var5[-1]),
-                                  (foo2_1(false) ? (-(32)) : loc0),
-                                  (--par2),
-                                  if ((!(false))) (var1 ? var5[loc0] : 30)
-                                ])
-                              : ('b1TKp3' ??
-                                  (var4 +
-                                      var7[(~(var5[
-                                          ((var1 ? var2 : loc2) - 72)]))])));
-                        }
-                        break;
-                    }
-                    fld2_0 = ((!((false
-                            ? false
-                            : (false ? (!((var7[-28] != ''))) : var1))))
-                        ? (((var1
-                                    ? (true ? Set.identity() : var6)
-                                    : {
-                                        -63,
-                                        Int32x4.xxyx,
-                                        var5[((var1
-                                                ? (var5[-9223372032559808496] >>
-                                                    59)
-                                                : Int32x4.wxxy) ~/
-                                            var5[var5[-48]])],
-                                        (par2 ?? par2),
-                                        44,
-                                        var5[(var1 ? -26 : (-(par2)))]
-                                      }) ??
-                                ({
-                                      loc2,
-                                      var2,
-                                      ZLibOption.defaultMemLevel,
-                                      (true ? Int32x4.wyzz : 40),
-                                      (false ? loc2 : var5[42]),
-                                      -16
-                                    } ??
-                                    var6)))
-                            .union({loc0, (var2++), (-1 * (~(var2)))})
-                        : (bool.fromEnvironment((var3)
-                                .toStringAsFixed(Uint64List.bytesPerElement))
-                            ? fld2_0
-                            : {
-                                (par2++),
-                                (var1 ? loc2 : (++var2)),
-                                ((false || false) ? Int32x4.xyyz : (++par2)),
-                                var5[-98],
-                                Float32x4.zwwy,
-                                var5[var5[62]],
-                                (~(Float32x4.ywww))
-                              }));
-                  }
-                }
-                break;
-              case 2839002106:
-                {
-                  for (int loc2 = 0; loc2 < 13; loc2++) {
-                    {
-                      int loc3 = 0;
-                      do {
-                        switch ((loc3 | -76)) {
-                          case 2164097105:
-                            {
-                              var4 ??= (var1).toString();
-                              var5 = ((!(((true || var1) !=
-                                      (false ? var1 : (!(foo2_1(var1)))))))
-                                  ? foo2(
-                                      ((var6).union(foo1_2(loc1))).toSet(),
-                                      [
-                                        -67,
-                                        if (((var1
-                                                ? 59
-                                                : (-((false ? -97 : par2)))) !=
-                                            (false
-                                                ? ((var1 || var1)
-                                                    ? (-((par2++)))
-                                                    : 4)
-                                                : (--var2)))) ...[
-                                          ((92 ~/ Int32x4.yzwx) << 70),
-                                          Float32x4.xxyz,
-                                          Int8List.bytesPerElement
-                                        ] else
-                                          69
-                                      ],
-                                      var7)
-                                  : foo2(foo0(), Uri.parseIPv4Address(var0),
-                                      var7));
-                            }
-                            break;
-                          case 2164097111:
-                            {
-                              var4 ??= var7[Float32x4.zxzw];
-                            }
-                            break;
-                        }
-                      } while (++loc3 < 96);
-                    }
-                    fld2_0 = var6;
-                  }
-                }
-                break;
-            }
-          });
-          for (int loc0 in (foo2_1((var5 !=
-                  (false
-                      ? [par2]
-                      : foo2(
-                          var6,
-                          [20],
-                          ({
-                                21: var0,
-                                68: foo1_3(),
-                                24: ('1MF' + '8s\u2665yx+ ')
-                              } ??
-                              {
-                                9: var7[var2],
-                                48: 'mB(wW\u{1f600}',
-                                74: 'ojEw\u{1f600}\u{1f600}',
-                                80: '\u26655E-hj\u{1f600}',
-                                10: (false ? 'W7i5\u2665YX' : '! Ed9&'),
-                                88: (false ? var0 : 'N0D9(H\u{1f600}'),
-                                5: 'QZ'
-                              })))))
-              ? foo1_2('XP')
-              : {
-                  if ((foo2_1(var1)
-                      ? (foo2_1((fld2_0).add(-9223372036854774784)) || var1)
-                      : var1))
-                    (~(Float32x4.zyww)),
-                  Float32x4.xwyw,
-                  ((((var1 ? true : var1) ? 0.3447071353935154 : var3) >=
-                          0.5995056331958718)
-                      ? ZLibOption.MAX_LEVEL
-                      : 16),
-                  9223372032559841279,
-                  Int32x4.zwyy
-                })) {
-            for (int loc1 = 0; loc1 < 19; loc1++) {
-              var1 = (!(bool.fromEnvironment(MapBase.mapToString({
-                1: '4',
-                56: var0,
-                85: var0,
-                51: var7[-4],
-                42: ((!((!(false)))) ? par1[72] : MapBase.mapToString(var7))
-              }))));
-            }
-          }
-        }
-        break;
-    }
-    print((((var1 ? 'kP' : (var1 ? 'irjF' : var7[var5[90]])) ??
-            ((!(false)) ? 'vWa\u{1f600}' : var0)) +
-        'xzpK'));
-    return var3;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = (~(-24));
-      var0 ??= ((false
-              ? foo2_1((true
-                  ? (var1 && (var2).isOdd)
-                  : (('dTYR' ?? 'G\u{1f600}P14\u{1f600}a')).isEmpty))
-              : ((var1 && true) || (!(var1))))
-          ? (var4 ?? 'I')
-          : 'QO');
-    }
-  }
-}
-
-class X3 extends X1 {
-  Map<int, String> fld3_0 = {
-    if (true) if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
-    if (true) 30: '6\u2665P!Pbi',
-    81: 't',
-    82: '17fx#!',
-    92: 'H',
-    if (true) 69: ')Ls'
-  };
-  Set<int> fld3_1 = {27};
-  int fld3_2 = 34;
-
-  String foo1_1(int par1) {
-    throw (ListBase.listToString(foo2({
-          -4294967169,
-          par1
-        }, [
-          -97,
-          (var5[(var1 ? var5[87] : Int32x4.yxxy)] * Int32x4.yyxx),
-          var2,
-          (false ? 10 : var5[var5[(par1++)]])
-        ], var7)) ??
-        'o');
-  }
-
-  bool foo3_0(double par1) {
-    {
-      Set<int> loc0 = (true ? fld3_1 : var6);
-      {
-        Set<int> loc1 = (false
-            ? foo0()
-            : {
-                for (int loc2 in [var2, (-(Float32x4.xzzw))])
-                  if (false) Float32x4.wxyz else (++fld3_2),
-                ((var1
-                        ? 5
-                        : var5[(((var5[(true ? fld3_2 : fld3_2)] ~/ 48) | 56) %
-                            var5[-4])]) ??
-                    (var2++))
-              });
-        for (int loc2 = 0; loc2 < 90; loc2++) {
-          {
-            int loc3 = 95;
-            while (--loc3 > 0) {
-              return (((0.7073184699576396).isNaN
-                      ? var7
-                      : (Map.of(Map.from(var7)) ??
-                          Map.unmodifiable(Map.identity()))))
-                  .isEmpty;
-            }
-          }
-          try {
-            var1 = (((12 >= Int32x4.ywxx) ? true : true)
-                ? false
-                : (((var1 ? fld3_0[Int32x4.wyxy] : '') ?? var7[Float32x4.xwwx]))
-                    .isEmpty);
-            var2 |= ((fld3_2++) ?? (fld3_2--));
-          } catch (exception, stackTrace) {
-            var5 ??= var5;
-          } finally {
-            var4 = 'A';
-            break;
-          }
-        }
-        {
-          double loc2 = (-(exp((acos(0.06129144867031855) ?? var3))));
-          fld3_0 = (((({Int32x4.ywxw, 6442450943}).union(foo0()))
-                      .add((++fld3_2))
-                  ? false
-                  : false)
-              ? foo1_0(
-                  (foo1([var5[var2], var5[75], 42], false) ?? var7), var7, loc2)
-              : (var1
-                  ? {
-                      for (int loc3 = 0; loc3 < 48; loc3++) 78: 'dWek8',
-                      40: fld3_0[(var5[-81] & Int32x4.xzyw)],
-                      73: (' )G\u2665-d(').substring(
-                          (NetworkInterface.listSupported
-                              ? (~(((++var2) ?? (fld3_2 * fld3_2))))
-                              : var5[-75]),
-                          fld3_2),
-                      74: ('k9O\u2665').trimLeft(),
-                      88: var7[(++var2)],
-                      for (int loc3 = 0; loc3 < 27; loc3++)
-                        60: ((false || var1) ? var7[46] : var0),
-                      99: ((var3).isNaN
-                          ? (Uri.decodeComponent(foo1_3()) + var4)
-                          : var7[-77]),
-                      92: (true
-                          ? ('').padLeft(82, '')
-                          : ('' ?? var7[(false ? 94 : 58)]))
-                    }
-                  : var7));
-
-          /// Single-line documentation comment.
-          fld3_1 ??= ((loc1 ?? foo1_2(fld3_0[(var2--)])) ?? foo1_2(foo1_3()));
-        }
-      }
-    }
-    return (var1 ? (!(var1)) : var1);
-  }
-
-  String foo3_1(int par1, String par2, String par3) {
-    switch (var2) {
-      case 3768780679:
-        {
-          {
-            int loc0 = (++par1);
-            var0 ??= ListBase.listToString(var5);
-            if (true) {
-              var5 = [
-                Float32x4.xyxz,
-                (var1
-                    ? ((!(false)) ? Float32x4.xyyw : (++fld3_2))
-                    : var5[fld3_2]),
-                par1,
-                (~(Float32x4.zxwy)),
-                if ((foo3_0(var3)
-                    ? ([
-                          (++fld3_2),
-                          ...[
-                            ...[
-                              var5[(true ? Float32x4.xxzx : (--fld3_2))],
-                              54,
-                              (-((((foo3_0(var3)
-                                          ? (!(false))
-                                          : ((var1 ? (~(-63)) : var5[-40]))
-                                              .isOdd)
-                                      ? ((0.8329420640871532 != var3) && var1)
-                                      : var1)
-                                  ? 43
-                                  : (Float32x4.zxxy - Float32x4.zxxw)))),
-                              Int32x4.zzwx
-                            ],
-                            ...[
-                              (var5[-48] * (fld3_2++)),
-                              Int32x4.wyyw,
-                              (~(-76)),
-                              ((par1).isEven ? (--par1) : -13),
-                              Float32x4.wxyx
-                            ],
-                            for (int loc1 in [
-                              (++fld3_2),
-                              -15,
-                              (SecurityContext.alpnSupported
-                                  ? Int32x4.yxyw
-                                  : Float32x4.yxxw),
-                              if (true) var5[(var1 ? -32768 : par1)],
-                              ((--var2) ^ (++fld3_2))
-                            ])
-                              (fld3_2--),
-                            93,
-                            (~((-(ZLibOption.minMemLevel)))),
-                            ((Float32x4.zyzx >> -14) & Float32x4.yxxw)
-                          ],
-                          (var1
-                              ? (++par1)
-                              : ((var3).isInfinite ? Float32x4.zwww : -84)),
-                          var2
-                        ] ==
-                        [
-                          9223372032559808639,
-                          -85,
-                          Float32x4.wzyy,
-                          loc0,
-                          [
-                            ((-(36)) <<
-                                ((var1
-                                        ? var1
-                                        : ({
-                                            45: 'ay',
-                                            7: par3,
-                                            69: Uri.decodeFull(
-                                                (foo1_3() + 'LX+'))
-                                          })
-                                            .isEmpty)
-                                    ? (~((13 | 64)))
-                                    : (-(var2)))),
-                            (par1--),
-                            ((~((true ? (var2--) : -31))) >> 9),
-                            (-((35 % (~(var5[var5[39]]))))),
-                            4395630341,
-                            Int32x4.zxxy,
-                            if ((var1
-                                ? foo3_0(var3)
-                                : (0.6201792653929837).isInfinite)) ...[
-                              Int32x4.wxxx,
-                              (fld3_2 * (--fld3_2)),
-                              var5[((~(var5[var5[var5[(-(-23))]]])) +
-                                  (~(-4294966296)))],
-                              loc0,
-                              for (int loc1 in [var5[Float32x4.yzww]]) 17,
-                              (~(var5[(++par1)])),
-                              -58,
-                              ((!(('').isEmpty))
-                                  ? ((-(Float32x4.ywwx)) * (++par1))
-                                  : Int32x4.yxyz)
-                            ]
-                          ][((var1 ? var1 : var1) ? var5[0] : par1)],
-                          ((~(70)) +
-                              (par1 + (-77 | ZLibOption.MAX_WINDOW_BITS))),
-                          (-(Int32x4.zywy)),
-                          (~(Float32x4.zywz))
-                        ])
-                    : (var1 ? true : true)))
-                  fld3_2
-              ];
-            }
-          }
-          var3 *= ((var3 + 0.6761038672016147) ?? (-(double.minPositive)));
-        }
-        break;
-      case 3768780685:
-        {
-          {
-            int loc0 = 67;
-            while (--loc0 > 0) {
-              {
-                Map<int, String> loc1 = foo1(
-                    Uri.parseIPv4Address(('E Hu\u{1f600}' + '\u2665l&#!')),
-                    (!(false)));
-                var3 ??= var3;
-              }
-              var5 = (var5 +
-                  ((({
-                    79: (foo1_3() ?? 'eD'),
-                    73: (var1 ? par2 : ' xdXgW'),
-                    4: 'pUc(q',
-                    15: 'K\u{1f600}hmdZ\u2665',
-                    95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  })
-                              .isNotEmpty
-                          ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
-                              foo3_0(var3))
-                          : (!(((false || true) ? var1 : false))))
-                      ? [
-                          (~((-61 ??
-                              (~((-(var5[(var1 ? fld3_2 : var5[34])]))))))),
-                          (var5[13] ^ (var1 ? 35 : -76)),
-                          (-(((~(-47)) ~/ (--par1))))
-                        ]
-                      : foo2({
-                          -36,
-                          ((0.3910802543332075).isNegative
-                              ? (~((var2++)))
-                              : (var2 &
-                                  (var1
-                                      ? [
-                                          -67,
-                                          (fld3_2++),
-                                          if ((!((!((var1
-                                              ? true
-                                              : (!(false))))))))
-                                            (false
-                                                ? (~(Float32x4.wyyy))
-                                                : (var1
-                                                    ? (1 ^ (-(16)))
-                                                    : var5[94])),
-                                          fld3_2,
-                                          var2,
-                                          67
-                                        ][-12]
-                                      : Float32x4.wwxw))),
-                          26,
-                          [
-                            (var1
-                                ? (--fld3_2)
-                                : (((!(var1))
-                                        ? (~((foo3_0(0.9959805940480148)
-                                            ? (33 ~/ loc0)
-                                            : Float32x4.xywx)))
-                                        : (15 % var5[var5[-47]])) <<
-                                    -86)),
-                            (-((~(RawSocketOption.levelIPv6))))
-                          ][var5[var5[(ZLibOption.maxMemLevel ^ -3)]]],
-                          -29
-                        }, [
-                          (var1 ? Float32x4.wxxw : (--par1)),
-                          ...[
-                            52,
-                            (-((true ? -12 : 44))),
-                            var5[((var5[34] * 30) >> 4294967360)],
-                            ((--var2) <<
-                                (true
-                                    ? var5[(-4 ~/ Int32x4.yyww)]
-                                    : (bool.fromEnvironment(var7[fld3_2])
-                                        ? (~((false ? loc0 : var5[(++par1)])))
-                                        : ((!(false))
-                                            ? (var5[var5[loc0]] ^ Int32x4.wxzz)
-                                            : par1)))),
-                            (((false ? var0 : '') !=
-                                    (true
-                                        ? MapBase.mapToString(({
-                                              7: 'WTT7\u{1f600}e3',
-                                              22: '',
-                                              36: (var1
-                                                  ? 'F'
-                                                  : (var1 ? fld3_0[var2] : '')),
-                                              37: 'l@a',
-                                              85: (var1 ? '' : par3),
-                                              82: 'eb',
-                                              37: '11',
-                                              41: var7[94]
-                                            } ??
-                                            var7))
-                                        : (var1 ? var4 : par2)))
-                                ? (~(var5[-71]))
-                                : 9),
-                            32,
-                            if (bool.fromEnvironment(
-                                fld3_0[var5[ZLibOption.MIN_MEM_LEVEL]]))
-                              var5[(--par1)],
-                            (par1--)
-                          ],
-                          for (int loc1 in {
-                            for (int loc2 in [
-                              ((!((Map.unmodifiable({
-                                        86: var4,
-                                        31: var0,
-                                        85: (par3 + ''),
-                                        91: (var1
-                                            ? fld3_0[4]
-                                            : '!M\u{1f600}!vOw'),
-                                        45: '7T',
-                                        19: 'fha+',
-                                        38: (false ? '' : fld3_0[70])
-                                      }) !=
-                                      {
-                                        92: '@4',
-                                        41: var7[loc0],
-                                        24: (foo3_0(0.06591134699771606)
-                                            ? '\u2665)\u2665NnO+'
-                                            : 'JM3Hn\u{1f600}'),
-                                        26: 'aQ51Yz',
-                                        64: var7[
-                                            (-((var5[18] & (36).bitLength)))]
-                                      })))
-                                  ? (89 ^
-                                      (((44 - par1) * -9223372034707292160) &
-                                          var5[128]))
-                                  : -46),
-                              (fld3_2++),
-                              ((([
-                                            -89,
-                                            var2,
-                                            (fld3_2++),
-                                            var5[-4294967264],
-                                            -25,
-                                            var2,
-                                            var5[((!(var1))
-                                                ? (var1 ? -3 : -81)
-                                                : var5[loc0])],
-                                            (var1
-                                                ? par1
-                                                : ((~((fld3_2++))) >>
-                                                    (-((-(-64))))))
-                                          ] ??
-                                          foo2(var6, [
-                                            4295032831
-                                          ], {
-                                            53: foo1_3(),
-                                            94: var7[13],
-                                            82: var7[-60],
-                                            30: fld3_0[-9223372032559742976],
-                                            98: foo1_3()
-                                          })) !=
-                                      var5)
-                                  ? (--par1)
-                                  : loc0),
-                              56,
-                              if (((var5[21]).isOdd ? true : false))
-                                ((++par1) -
-                                    (var1 ? var5[DateTime.january] : (par1--)))
-                              else
-                                fld3_2,
-                              if ((!(var1))) 74,
-                              (par1 ^ var5[26])
-                            ])
-                              (~(var2)),
-                            for (int loc2 in {
-                              6442450944,
-                              Float32x4.ywyw,
-                              -9223372032559804416,
-                              (~(var5[var5[26]])),
-                              Float32x4.xyxy,
-                              (--fld3_2),
-                              var5[98]
-                            })
-                              if (false) -26,
-                            (~((-((-((-48 - -9223372036854775680))))))),
-                            ...{
-                              (-((var2--))),
-                              if (true) -100663046 else var5[(~(par1))]
-                            },
-                            (~((~((fld3_2++))))),
-                            ...{
-                              ((List.filled(0, 26) ==
-                                      [
-                                        (-(-52)),
-                                        -29,
-                                        (--fld3_2),
-                                        (0.22302566014161784).floor(),
-                                        (par1 % -56)
-                                      ])
-                                  ? (var1
-                                      ? (var2++)
-                                      : ((!((!(true))))
-                                          ? ((var1 || foo3_0(var3)) ? 76 : par1)
-                                          : (-(-13))))
-                                  : ((foo1_0((var1 ? fld3_0 : var7), var7,
-                                              var3))
-                                          .isEmpty
-                                      ? 97
-                                      : (var1 ? var2 : -9223372036854774784))),
-                              (-(Float32x4.zyzw)),
-                              (--var2)
-                            }
-                          })
-                            ((var3 < (-(var3))) ? -9223372032559808000 : -71),
-                          -100663046,
-                          if ((var1
-                              ? bool.fromEnvironment('vV0')
-                              : (Map.from({
-                                  78: '',
-                                  49: '\u{1f600}\u{1f600}4Mz',
-                                  70: fld3_0[par1],
-                                  95: '\u{1f600}2tIYqE',
-                                  43: (true ? 'baf-\u2665' : var4),
-                                  30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                }))
-                                  .isNotEmpty))
-                            -13
-                          else
-                            (var1 ? (-((-(var5[56])))) : (var2--)),
-                          (~((~((-((var2++)))))))
-                        ], {
-                          88: ('bV\u{1f600}iqO').toLowerCase(),
-                          42: '(hZ4S',
-                          37: var7[-79],
-                          36: var0
-                        })));
-            }
-          }
-          {
-            int loc0 = 0;
-            do {
-              try {
-                print(foo2(
-                    fld3_1,
-                    (fld3_0[var5[-12]]).codeUnits,
-                    (({
-                              36: var4,
-                              30: '0\u{1f600}EYWqr',
-                              66: 'S',
-                              3: '+J3Gj',
-                              71: '\u{1f600}-q',
-                              13: 'V3QN',
-                              34: ''
-                            } ??
-                            {
-                              54: fld3_0[(var2--)],
-                              74: (foo3_0(
-                                      ((-(var3)) * (0.8613045491468889 + var3)))
-                                  ? var7[78]
-                                  : (((var1 ? (47).isEven : var1) ? true : true)
-                                      ? (var4 ?? 'UzK')
-                                      : 'fH1smd')),
-                              12: '\u2665',
-                              18: 'V'
-                            }) ??
-                        var7)));
-              } catch (exception, stackTrace) {
-                fld3_1 = foo0();
-                for (int loc1 = 0; loc1 < 29; loc1++) {
-                  if (var1) {
-                    {
-                      int loc2 = 0;
-                      do {
-                        var5 = (foo3_0(var3)
-                            ? [
-                                ((--par1) ^ (~(93))),
-                                if ((var3).isFinite)
-                                  for (int loc3 in [
-                                    -5,
-                                    Int32x4.zxyy,
-                                    (true
-                                        ? var5[var5[(var1 ? -23 : var5[68])]]
-                                        : -99),
-                                    ((!(var1))
-                                        ? ((false
-                                                ? var1
-                                                : foo3_0(0.3133865362301862))
-                                            ? Float64List.bytesPerElement
-                                            : [
-                                                Float32x4.yxzx,
-                                                if (var1)
-                                                  (false ? 40 : 85)
-                                                else
-                                                  ((String.fromCharCode((foo3_0(
-                                                                  0.414460580942719)
-                                                              ? var5[-14]
-                                                              : var2)) ==
-                                                          'mII\u{1f600}zkM')
-                                                      ? var5[(~(-51))]
-                                                      : ((var1
-                                                              ? (!(var1))
-                                                              : var1)
-                                                          ? var5[0]
-                                                          : (-(var2))))
-                                              ][5])
-                                        : fld3_2),
-                                    (par1++),
-                                    -72,
-                                    Int32x4.zzxy
-                                  ])
-                                    Int32x4.zyww
-                                else
-                                  Int32x4.wxyz
-                              ]
-                            : [
-                                ...[
-                                  if ((false ? false : var1)) (-(52)),
-                                  (++par1),
-                                  (par1--),
-                                  (-((-([
-                                    (((var0 + fld3_0[(++var2)])).isNotEmpty
-                                        ? Float32x4.yzxw
-                                        : var5[35])
-                                  ][loc0])))),
-                                  (~(-17))
-                                ],
-                                38,
-                                ...[
-                                  (var1 ? (par1++) : -10),
-                                  if (true) -62 else var2,
-                                  if ((!((var3).isFinite)))
-                                    Int32x4.xxzz
-                                  else
-                                    -45
-                                ],
-                                if ((true || false)) (-(-93)),
-                                (--fld3_2),
-                                ([
-                                      (fld3_2--),
-                                      if ((base64UrlEncode(var5) == 'RY'))
-                                        (++fld3_2)
-                                      else
-                                        -9223372032559808383,
-                                      Float32x4.zyxy,
-                                      loc0,
-                                      -55,
-                                      if (('O \u{1f600}e\u2665').isNotEmpty)
-                                        if (var1)
-                                          (--var2)
-                                        else
-                                          for (int loc3 in {
-                                            loc0,
-                                            (~((--var2))),
-                                            (-(-35)),
-                                            Float32x4.xxyw,
-                                            65,
-                                            -4,
-                                            -4194304251,
-                                            -54
-                                          })
-                                            (((0.671280258888436 ==
-                                                        (0.16535430333243706 *
-                                                            0.18316039550464436)) ||
-                                                    var1)
-                                                ? var5[12]
-                                                : (~((--var2))))
-                                      else if (false)
-                                        if (var1) (-(Int32x4.zzwx)) else loc2
-                                      else
-                                        Int32x4.yzyw
-                                    ][loc1] *
-                                    (--par1)),
-                                (-71 * 38)
-                              ]);
-                      } while (++loc2 < 89);
-                    }
-                  } else {
-                    {
-                      int loc2 = 0;
-                      do {
-                        fld3_0 ??= ((((Map.unmodifiable(var7)).isEmpty ||
-                                    (!(({
-                                      11: 'v+MHeiB',
-                                      48: var7[(true
-                                          ? ((var2--) ?? fld3_2)
-                                          : var5[(fld3_2--)])],
-                                      52: '(('
-                                    })
-                                        .isEmpty)))
-                                ? fld3_0
-                                : {
-                                    39: foo1_3(),
-                                    21: 'IXzJ+',
-                                    76: 'K2C#',
-                                    16: ('\u{1f600}Gh' + '#i'),
-                                    62: foo1_3(),
-                                    19: foo1_3(),
-                                    32: par3,
-                                    for (int loc3 in [
-                                      (par1--),
-                                      -66,
-                                      -96,
-                                      -35,
-                                      Float32x4.zzyz
-                                    ])
-                                      72: 'y vxi'
-                                  }) ??
-                            {13: par2});
-                        switch (4096) {
-                          case 3159134388:
-                            {
-                              /// Single-line documentation comment.
-                              {
-                                int loc3 = 0;
-                                do {
-                                  fld3_0 ??= foo1(
-                                      var5,
-                                      ((((true ? par2 : var7[var5[loc1]]))
-                                                  .isNotEmpty
-                                              ? 9
-                                              : -55) !=
-                                          var5[-36]));
-                                  fld3_1 = foo0();
-                                } while (++loc3 < 79);
-                              }
-                            }
-                            break;
-                          case 3159134393:
-                            {
-                              throw Int32x4.zxxw;
-                            }
-                            break;
-                        }
-                      } while (++loc2 < 77);
-                    }
-                  }
-                }
-              }
-            } while (++loc0 < 98);
-          }
-        }
-        break;
-    }
-    /*
-     * Multi-line
-     * comment.
-     */
-    return ((0.7728524536008519).isNaN ? 'BjzeSsJ' : foo1_3());
-  }
-
-  void run() {
-    super.run();
-    var5 ??= var5;
-    print({4294968296});
-  }
-}
-
-main() {
-  int count = 0;
-  try {
-    foo0();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo1(('  MQz').codeUnits, var1);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo2(
-        (var6).toSet(),
-        (var1
-            ? [-9223372036854775681, -66, 9223372032559874047, -3, 74]
-            : var5),
-        Map.identity());
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X0().foo0_0(var7);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_0(
-        (false
-            ? {
-                7: 'QMNg',
-                12: 'wzc5-Iq',
-                63: '29an-z',
-                86: 'sF5',
-                59: '\u2665L',
-                43: 'k',
-                62: 'NvF\u{1f600}k',
-                84: 'ZW 1-o'
-              }
-            : var7),
-        {
-          28: '@smXqKl',
-          66: 'oL',
-          if (false) 74: 'B' else 81: 'X',
-          if (false) 18: 'j' else 25: 'N',
-          44: '\u{1f600}lrx8m',
-          20: 'hC',
-          73: 'q',
-          63: '\u{1f600}nE'
-        },
-        0.18875619647922648);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_1((-((++var2))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_2((var1
-        ? (false
-            ? (true ? var7[((!(var1)) ? var5[Int32x4.xxyx] : 3)] : var4)
-            : Uri.encodeComponent(('yd' ?? (var0).padLeft(1, 'Q'))))
-        : var7[-2147483649]));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_3();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_0(Int32x4.xyyw);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_1((!(((!(var1)) && (!((var1 ? false : var1)))))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_2(var7, ((-(var5[(--var2)])) << 98));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_0(0.37767598562234317);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_1(
-        -6, var0, (Uri.decodeComponent('yQg') + ((var4 ?? var4) + var0)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo1_0(
-        Map.unmodifiable({77: 'hG'}),
-        ((false
-                ? {
-                    88: 'Sv-EbnG',
-                    73: 'G',
-                    46: 'O#',
-                    16: 'm1nf(',
-                    91: 'F',
-                    11: 'Q+O@K',
-                    70: '3q\u2665BJ'
-                  }
-                : Map.identity()) ??
-            {
-              68: 'r',
-              56: 'IH&',
-              31: '9cqu',
-              49: '8ug',
-              84: 'mR2VyC',
-              41: 'gk&(asy'
-            }),
-        (var3 * sin(var3)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().run();
-  } catch (e, st) {
-    count++;
-  } finally {}
-  Expect.equals(-47639, var2);
-  Expect.equals(9, count);
-}
diff --git a/tests/language/vm/regression_38741.dart b/tests/language/vm/regression_38741.dart
deleted file mode 100644
index 2dd1223..0000000
--- a/tests/language/vm/regression_38741.dart
+++ /dev/null
@@ -1,27 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// VMOptions=--deterministic
-
-// Found by DartFuzzing: would fail during deopt:
-// https://github.com/dart-lang/sdk/issues/38741
-
-import 'package:expect/expect.dart';
-
-@pragma('vm:prefer-inline')
-bool foo(int x) => x < 10;
-
-@pragma('vm:never-inline')
-bool bar(bool f) => f && foo(1);
-
-void main() {
-  try {
-    foo(null); // seed feedback for x < 10 with null receiver cid
-  } catch (e) {}
-  // Now when foo will be inlined into bar we will know that x is Smi,
-  // this hower disagrees with type feedback (which currently is monomorphic and
-  // expects null receiver for x < 10).
-  for (var i = 0; i < 10000; i++) Expect.isFalse(bar(false));
-  Expect.isTrue(bar(true));
-}
diff --git a/tests/language_2/identifier/built_in_illegal_test.dart b/tests/language_2/identifier/built_in_illegal_test.dart
index 822bfc9..652199e 100644
--- a/tests/language_2/identifier/built_in_illegal_test.dart
+++ b/tests/language_2/identifier/built_in_illegal_test.dart
@@ -20,19 +20,8 @@
 // [cfe] Can't use 'dynamic' as a name here.
 class export { }
 //    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.DIRECTIVE_AFTER_DECLARATION
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] Directives must appear before any declarations.
-// [cfe] Expected an identifier, but got 'export'.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_STRING_LITERAL
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-// [cfe] Expected ';' after this.
-// [cfe] Expected a String, but got '{'.
-// [cfe] Expected a declaration, but got '{'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'export' as a name here.
 class external { }
 //    ^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
@@ -43,111 +32,47 @@
 // [cfe] Can't use 'factory' as a name here.
 class get { }
 //    ^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.MISSING_FUNCTION_PARAMETERS
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] A function declaration needs an explicit list of parameters.
-// [cfe] Expected an identifier, but got 'get'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'get' as a name here.
 class interface { }
 //    ^^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
 // [cfe] Can't use 'interface' as a name here.
 class implements { }
 //    ^^^^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got 'implements'.
-// [error line 56, column 18, length 0]
-// [analyzer] COMPILE_TIME_ERROR.IMPLEMENTS_NON_CLASS
-//               ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TYPE_NAME
-// [cfe] Expected a type, but got '{'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'implements' as a name here.
 class import { }
 //    ^^^^^^
-// [analyzer] SYNTACTIC_ERROR.DIRECTIVE_AFTER_DECLARATION
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] Directives must appear before any declarations.
-// [cfe] Expected an identifier, but got 'import'.
-//           ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_STRING_LITERAL
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-// [cfe] Expected ';' after this.
-// [cfe] Expected a String, but got '{'.
-// [cfe] Expected a declaration, but got '{'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'import' as a name here.
 class mixin { }
 //    ^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] Expected an identifier, but got 'mixin'.
-//          ^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got '{'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'mixin' as a name here.
 class library { }
 //    ^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.LIBRARY_DIRECTIVE_NOT_FIRST
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] Expected an identifier, but got 'library'.
-// [cfe] The library directive must appear before all other directives.
-//            ^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got '{'.
-//              ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-// [cfe] Expected ';' after this.
-// [cfe] Expected a declaration, but got '}'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'library' as a name here.
 class operator { }
 //    ^^^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
 // [cfe] Can't use 'operator' as a name here.
 class part { }
 //    ^^^^
-// [analyzer] SYNTACTIC_ERROR.DIRECTIVE_AFTER_DECLARATION
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] Directives must appear before any declarations.
-// [cfe] Expected an identifier, but got 'part'.
-//         ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_STRING_LITERAL
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-// [cfe] Expected ';' after this.
-// [cfe] Expected a String, but got '{'.
-// [cfe] Expected a declaration, but got '{'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'part' as a name here.
 class set { }
 //    ^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.MISSING_FUNCTION_PARAMETERS
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] A function declaration needs an explicit list of parameters.
-// [cfe] Expected an identifier, but got 'set'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'set' as a name here.
 class static { }
 //    ^^^^^^
 // [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
 // [cfe] Can't use 'static' as a name here.
 class typedef { }
 //    ^^^^^^^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_BODY
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] A class declaration must have a body, even if it is empty.
-// [cfe] Expected an identifier, but got 'typedef'.
-//            ^
-// [analyzer] SYNTACTIC_ERROR.MISSING_IDENTIFIER
-// [cfe] Expected an identifier, but got '{'.
-//              ^
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_EXECUTABLE
-// [analyzer] SYNTACTIC_ERROR.EXPECTED_TOKEN
-// [analyzer] SYNTACTIC_ERROR.MISSING_TYPEDEF_PARAMETERS
-// [cfe] A typedef needs an explicit list of parameters.
-// [cfe] Expected ';' after this.
-// [cfe] Expected a declaration, but got '}'.
+// [analyzer] COMPILE_TIME_ERROR.BUILT_IN_IDENTIFIER_IN_DECLARATION
+// [cfe] Can't use 'typedef' as a name here.
 
 main() {}
diff --git a/tests/language_2/vm/regression_38412.dart b/tests/language_2/vm/regression_38412_test.dart
similarity index 100%
rename from tests/language_2/vm/regression_38412.dart
rename to tests/language_2/vm/regression_38412_test.dart
diff --git a/tests/language_2/vm/regression_38436.dart b/tests/language_2/vm/regression_38436.dart
deleted file mode 100644
index f350f6c..0000000
--- a/tests/language_2/vm/regression_38436.dart
+++ /dev/null
@@ -1,2364 +0,0 @@
-// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-// @dart = 2.9
-
-// VMOptions=--optimization_counter_threshold=1
-
-import "package:expect/expect.dart";
-
-// Found by DartFuzzing: would sometimes crash on OSR
-// https://github.com/dart-lang/sdk/issues/38436
-
-import 'dart:async';
-import 'dart:cli';
-import 'dart:collection';
-import 'dart:convert';
-import 'dart:core';
-import 'dart:io';
-import 'dart:isolate';
-import 'dart:math';
-import 'dart:typed_data';
-
-String var0 = '';
-bool var1 = true;
-int var2 = -30;
-double var3 = 0.895077679110543;
-String var4 = '';
-List<int> var5 = [55, -70];
-Set<int> var6 = {
-  1024,
-  for (int loc0 in [
-    79,
-    ...[23],
-    ...[90, -89, -24],
-    -90,
-    11,
-    -19,
-    -91
-  ])
-    -55,
-  67,
-  -80,
-  for (int loc0 = 0; loc0 < 29; loc0++) 20,
-  for (int loc0 = 0; loc0 < 24; loc0++) ...{23, -41},
-  ...{
-    -75,
-    128,
-    9223372034707292159,
-    -56,
-    -59,
-    for (int loc0 in {
-      -67,
-      for (int loc1 in [-27, -59, 31, 32, -66, -87]) -9223372036854775680,
-      85,
-      -45,
-      if (false) 70,
-      13,
-      43,
-      48
-    })
-      if (true) 63,
-    ...{-90, -24, -9223372036854743041, -9223372032559808383, 86},
-    -25
-  }
-};
-Map<int, String> var7 = {
-  6: '',
-  ...{56: 'B\u2665pwO', 73: 'ZJDi\u{1f600}m'},
-  ...{73: ')', 14: '93Q'},
-  98: 'xA0jQL',
-  21: ')\u2665TOy',
-  for (int loc0 = 0; loc0 < 82; loc0++) 34: 'Q3\u2665#61',
-  ...{70: 'XXRXl3O', 56: '\u2665lda2Zy', 38: 'Dr#mtz', 6: 'nx'},
-  27: '('
-};
-
-Set<int> foo0() {
-  var3 += ((((var0 + var7[var5[88]])).isEmpty ? true : var1)
-      ? (var1 ? (var3 ?? var3) : var3)
-      : (var1 ? 0.24414824314186978 : var3));
-  var1 ??= true;
-  return {(var2--), Duration.secondsPerHour, var5[var2]};
-}
-
-Map<int, String> foo1(List<int> par1, bool par2) {
-  throw ((-(var3)) * (-(0.943305664017911)));
-}
-
-List<int> foo2(Set<int> par1, List<int> par2, Map<int, String> par3) {
-  switch (-49) {
-    case 4149672951:
-      {
-        for (int loc0 in foo0()) {
-          var6 = var6;
-          try {
-            for (int loc1 = 0; loc1 < 70; loc1++) {
-              switch (((var1
-                      ? ((var1 ? var1 : true) ? Float32x4.xzzw : (--var2))
-                      : (4295032831 % (loc1 + 93))))
-                  .floor()) {
-                case 3294548737:
-                  {
-                    var5[Int32x4.xxwy] ^=
-                        (loc0 * ('!').compareTo(((!(true)) ? var4 : 'S')));
-                  }
-                  break;
-                case 3294548738:
-                  {
-                    var0 = var4;
-                    loc0 <<= Int32x4.zwxz;
-                  }
-                  break;
-              }
-              {
-                int loc2 = 0;
-                do {
-                  var1 = ('Ncb\u2665P9K').isEmpty;
-                  var1 ??= (!(true));
-                } while (++loc2 < 91);
-              }
-            }
-            par3 ??= {
-              44: ((false
-                      ? false
-                      : ((true
-                              ? var7
-                              : {
-                                  17: par3[(var5[-73] - -20)],
-                                  80: var7[
-                                      ((++loc0) ~/ ((!(false)) ? 47 : var2))],
-                                  30: '8Qvz3',
-                                  36: '',
-                                  10: (('@B!0bW6' + var4)).toLowerCase(),
-                                  89: var7[-9223372036854775296],
-                                  4: ') '
-                                }) !=
-                          var7))
-                  ? ((var1 || (!(var1))) ? var7[Float32x4.wxzw] : var7[-7])
-                  : '8h'),
-              for (int loc1 in [
-                (false
-                    ? ((([
-                                  var2,
-                                  -39,
-                                  -74,
-                                  Float32x4.zzxy,
-                                  (~(var5[(67 + -86)])),
-                                  -53
-                                ] +
-                                [(var2++), var5[par2[(--loc0)]]]) !=
-                            [
-                              var5[var5[var5[(loc0++)]]],
-                              loc0,
-                              loc0,
-                              -55,
-                              -69,
-                              loc0
-                            ])
-                        ? (loc0--)
-                        : loc0)
-                    : var2),
-                (75 ^ 93),
-                (false ? var5[Float32x4.xzyw] : (loc0++)),
-                ...[
-                  for (int loc2 in {
-                    -22,
-                    (loc0 ^ 2),
-                    var5[(-((par2[-79] * 86)))],
-                    (++loc0),
-                    ((par2[var5[-45]] ?? 55) >> (true ? Int32x4.wyww : -45)),
-                    (~((++var2))),
-                    par2[var2]
-                  })
-                    (loc0--),
-                  if ((var7[(false ? (-(loc0)) : 19)]).endsWith(var4))
-                    (++var2)
-                  else
-                    (var1 ? loc0 : 39),
-                  (((var2++) & var2) & -26),
-                  if (false) (var1 ? Float32x4.wzzw : var5[129]),
-                  for (int loc2 in {
-                    (loc0--),
-                    (true ? loc0 : loc0),
-                    var2,
-                    var5[(0.4452451921266031).floor()],
-                    (~(-4294967196)),
-                    (loc0--),
-                    (--var2)
-                  })
-                    (var1 ? -30 : (loc0++)),
-                  (~((var1 ? 51 : var2))),
-                  (((var3 ?? pi) < 0.9098824013356337)
-                      ? ((true ? 57 : -48) << (--var2))
-                      : par2[-59])
-                ]
-              ])
-                84: var4,
-              57: var4
-            };
-          } catch (exception, stackTrace) {
-            /**
-           ** Multi-line
-           ** documentation comment.
-           */
-            for (int loc1 = 0; loc1 < 89; loc1++) {
-              switch ((var2--)) {
-                case 3807258589:
-                  {
-                    print(({
-                          (-34 ^
-                              ((false || var1)
-                                  ? 24
-                                  : (-(((-((var1
-                                          ? par2[(-(71))]
-                                          : 9223372032559808768))) +
-                                      (~(loc1))))))),
-                          (~((true ? loc0 : (false ? -75 : 33)))),
-                          Float32x4.zxwz,
-                          (false ? (15 * -83) : (var2--)),
-                          ((var7 !=
-                                  ((true ? var1 : false)
-                                      ? var7
-                                      : {
-                                          99: (true ? 'TobD' : var0),
-                                          59: (var4 ?? var4),
-                                          13: var4,
-                                          58: Uri.encodeFull(var4),
-                                          99: var7[loc1]
-                                        }))
-                              ? loc1
-                              : (var1
-                                  ? ((72 >> -15) ~/ (loc0--))
-                                  : -9223372030412324864)),
-                          32
-                        } ??
-                        par1));
-                  }
-                  break;
-                case 3807258592:
-                  {
-                    var1 ??= true;
-                    try {
-                      var7 = {9: (var1 ? 'ON' : 'f\u{1f600}b')};
-                      par2 = (true
-                          ? var5
-                          : [
-                              DateTime.january,
-                              (40 - (~(var2))),
-                              (var1 ? (--loc0) : 23),
-                              var5[(--var2)]
-                            ]);
-                    } catch (exception, stackTrace) {
-                      var3 /= 0.9998663372091022;
-                    } finally {
-                      par2 ??= ((var1
-                              ? false
-                              : (((par1 ??
-                                          {
-                                            -68,
-                                            86,
-                                            -33,
-                                            var5[(-9223372034707292159 - 90)],
-                                            (24 - (++var2)),
-                                            (-(var2)),
-                                            (loc1 * Int32x4.wyxx)
-                                          }))
-                                      .difference({
-                                    (var1 ? Float32x4.yzyw : (loc1 % loc0)),
-                                    6,
-                                    22,
-                                    91,
-                                    loc0,
-                                    (true ? loc1 : loc1)
-                                  }) ==
-                                  foo0()))
-                          ? par2
-                          : [
-                              (var2--),
-                              (-((++loc0))),
-                              ((-(var5[-52])) ~/
-                                  (true ? Int32x4.wyyy : (loc0--))),
-                              (var3).toInt()
-                            ]);
-                      var5[99] += (~(Float32x4.ywxw));
-                    }
-                  }
-                  break;
-              }
-              var5 = (par2 ??
-                  [
-                    ...[72],
-                    for (int loc2 in {Float32x4.xxwz, loc1})
-                      ((loc0--) ~/ (var2++)),
-                    par2[(++var2)],
-                    (-((--var2))),
-                    (var2++),
-                    -56,
-                    (~((~(loc0)))),
-                    for (int loc2 in {
-                      (-((~(17)))),
-                      Float32x4.zzzw,
-                      Float32x4.zyyz,
-                      (var2--),
-                      (Int32x4.wzwz % 78),
-                      loc0
-                    })
-                      Int32x4.xzzy
-                  ]);
-            }
-            {
-              int loc1 = 0;
-              do {
-                loc0 &= (-(4295000065));
-              } while (++loc1 < 94);
-            }
-          } finally {
-            var3 -= 0.020483900923215503;
-            try {
-              return [
-                ...[
-                  (loc0--),
-                  for (int loc1 in {Float32x4.yxyz})
-                    if (var1) (~(-35)) else loc0,
-                  (++loc0),
-                  for (int loc1 = 0; loc1 < 43; loc1++)
-                    (var5[var5[par2[var5[-9223372032559808384]]]] &
-                        Int32x4.yzxy),
-                  for (int loc1 = 0; loc1 < 98; loc1++) (-((~(Int32x4.xwwy)))),
-                  Float32x4.yzzz
-                ],
-                (-(Int32x4.xzxz))
-              ];
-            } catch (exception, stackTrace) {
-              for (int loc1
-                  in (((((!((((0.13101852551635873 == 0.4825498460563603)
-                                          ? var7
-                                          : var7) !=
-                                      var7)))
-                                  ? 1
-                                  : par2[var2]))
-                              .isEven
-                          ? {
-                              (var2++),
-                              (-48 | -54),
-                              (~(par2[loc0])),
-                              par2[var5[Int32x4.zyzz]],
-                              -2,
-                              (true ? (~((-(((!(false)) ? -11 : var2))))) : 73),
-                              if ((0.15992181539430828).isInfinite) (++var2)
-                            }
-                          : (false ? {-6} : {((++loc0) % 27), 92})) ??
-                      Set.identity())) {
-                var6 ??= foo0();
-              }
-              var5[(~(((true ? -10 : Float32x4.zzwy) -
-                  Duration.millisecondsPerSecond)))] = (~((var2--)));
-            }
-          }
-        }
-        par3.forEach((loc0, loc1) {
-          // Single-line comment.
-          var6 = (var6 ?? foo0());
-          par1 = {
-            if (('X2yPgV').endsWith('b'))
-              Float32x4.yxxy
-            else if (true)
-              Int32x4.xzyw
-            else
-              for (int loc2 = 0; loc2 < 9; loc2++) (++loc0),
-            (4294967551 ?? (-((loc0--)))),
-            (-69 ~/
-                ((!(false))
-                    ? ((((par2[Int32x4.zwzw]).isEven
-                                ? (var3).truncateToDouble()
-                                : 0.14035347150303745))
-                            .isInfinite
-                        ? Int32x4.yzxx
-                        : par2[loc0])
-                    : (var2++))),
-            ((loc0++) - ((++var2) >> (~(par2[(var2--)]))))
-          };
-        });
-      }
-      break;
-    case 4149672955:
-      {
-        par2[((var2 ^ (~((--var2)))) | -98)] *= -62;
-        {
-          int loc0 = 0;
-          do {
-            var0 = par3[(var5[4294967808] >> Float32x4.wwyx)];
-          } while (++loc0 < 46);
-        }
-      }
-      break;
-  }
-  var1 ??= (!((var3).isNaN));
-  return (var1
-      ? par2
-      : Uri.parseIPv6Address(
-          (var1 ? '' : '26DgiI'), (ZLibOption.maxMemLevel % 65), 68));
-}
-
-class X0 {
-  bool fld0_0 = true;
-  Set<int> fld0_1 = {
-    31,
-    if (true) ...{
-      -93,
-      -4294967041,
-      -4294934527,
-      if (false) 92,
-      if (true) 69
-    } else
-      85,
-    ...{
-      ...{73, 27},
-      for (int loc0 in {
-        for (int loc1 = 0; loc1 < 56; loc1++) -36,
-        -23,
-        -99,
-        20,
-        16,
-        11,
-        if (false) -24,
-        if (true) 14
-      })
-        if (false) 69,
-      -9223372032559808513,
-      -9223372036854775553,
-      -9223372036854774784,
-      -22
-    },
-    81,
-    ...{16, if (false) 67 else -30, if (true) 21 else -61, -84},
-    -69
-  };
-
-  List<int> foo0_0(Map<int, String> par1) {
-    if ((var1 ? ((!(fld0_0)) ? true : false) : true)) {
-      return ((var4).trim()).codeUnits;
-    } else {
-      for (int loc0 in var6) {
-        fld0_0 ??= var1;
-        for (int loc1 = 0; loc1 < 57; loc1++) {
-          {
-            Map<int, String> loc2 = Map.identity();
-            par1 ??= Map.unmodifiable(Map.unmodifiable(Map.unmodifiable((true
-                ? loc2
-                : ((true
-                        ? loc2
-                        : foo1(
-                            [var5[-60], loc0, var5[-48], -80, var5[var5[37]]],
-                            var1)) ??
-                    {
-                      60: var0,
-                      93: ((false ? var0 : '') + 'r\u{1f600}2B#p')
-                    })))));
-            var4 = ' ';
-          }
-          try {
-            var5 = foo2(
-                ({loc0, 37, Float32x4.wwyw} ?? var6),
-                ((fld0_0
-                        ? [
-                            for (int loc2 = 0; loc2 < 1; loc2++)
-                              (~(Float32x4.zyzz)),
-                            (~((true
-                                ? (Float32x4.yyzw >> (48 - (-((var2--)))))
-                                : (~(loc0))))),
-                            ((var4 ==
-                                    String.fromEnvironment(
-                                        (var1 ? 'l9FM' : par1[var5[loc0]])))
-                                ? (++loc0)
-                                : 4),
-                            ...[
-                              (~((var5[-9223372032559808448] - (++var2)))),
-                              ...[
-                                for (int loc2 in [
-                                  ((-12 <= 55) ? 9223372032559841280 : loc0),
-                                  var5[var5[(~(var5[var5[loc1]]))]],
-                                  (var1 ? 67 : -74)
-                                ])
-                                  (var5[var2]).sign,
-                                var5[-65],
-                                if (fld0_0)
-                                  var5[(var5[var5[-90]] ~/ 22)]
-                                else
-                                  (-9223372036854775679 + var5[16]),
-                                76,
-                                7
-                              ],
-                              (++var2),
-                              -9223372034707292160,
-                              (var2--),
-                              var5[(var2--)]
-                            ],
-                            loc1,
-                            Float32x4.ywxz,
-                            ((++loc0) + (--loc0)),
-                            for (int loc2 in [
-                              for (int loc3 = 0; loc3 < 4; loc3++) loc1,
-                              ...[
-                                Float32x4.zxwy,
-                                Float32x4.xzwx,
-                                var2,
-                                (++var2),
-                                Int32x4.xzyy,
-                                (var5[loc1] | (true ? -97 : -93)),
-                                Float32x4.xwyz,
-                                ((true || var1)
-                                    ? (~((--loc0)))
-                                    : (~((var5[18] % (-55 + loc0)))))
-                              ],
-                              (~((++loc0))),
-                              -85,
-                              (~((var2++))),
-                              (true
-                                  ? ZLibOption.maxMemLevel
-                                  : var5[var5[var5[var5[var2]]]]),
-                              ((true
-                                      ? ((!((false
-                                              ? (true ? fld0_0 : (!(false)))
-                                              : fld0_0)))
-                                          ? fld0_0
-                                          : (({
-                                                96: var4,
-                                                60: '(0yBGn\u{1f600}',
-                                                57: var4,
-                                                73: var7[-43],
-                                                38: var0
-                                              })
-                                                  .isNotEmpty ||
-                                              ({
-                                                67: var4,
-                                                14: 'M\u{1f600}1HNbP',
-                                                6: 's',
-                                                85: 'uyq',
-                                                95: var7[(-(Int32x4.wwxw))],
-                                                33: ''
-                                              })
-                                                  .isNotEmpty))
-                                      : false)
-                                  ? var2
-                                  : (++var2))
-                            ]) ...[-27]
-                          ]
-                        : [
-                            for (int loc2 = 0; loc2 < 87; loc2++)
-                              (-47 * (~((((--var2) ^ loc0) ?? 78)))),
-                            (-(((({
-                                  14: (var3).toStringAsExponential(
-                                      (false ? var5[-62] : 33)),
-                                  16: '',
-                                  71: var4,
-                                  78: (([var5[(-(91))]] == var5) ? var4 : var0),
-                                  9: par1[loc1],
-                                  51: '-8ht',
-                                  26: ('(2l3\u2665h' ?? var0),
-                                  79: var4
-                                })
-                                        .isNotEmpty
-                                    ? var5[(var2 % loc0)]
-                                    : var2) %
-                                ((!(NetworkInterface.listSupported))
-                                    ? -22
-                                    : ((var1
-                                            ? ([
-                                                  ZLibOption.STRATEGY_DEFAULT,
-                                                  21,
-                                                  loc1,
-                                                  loc1,
-                                                  loc0,
-                                                  5,
-                                                  loc0,
-                                                  98
-                                                ] ==
-                                                Uri.parseIPv4Address(
-                                                    var7[loc1]))
-                                            : var1)
-                                        ? (~((-20 %
-                                            (var5).removeAt(Float32x4.wyxw))))
-                                        : var5[var5[82]]))))),
-                            (-(Float32x4.wwwz)),
-                            Int32x4.wxxz,
-                            ...[
-                              (loc0++),
-                              ...[
-                                (--loc0),
-                                -2,
-                                ZLibOption.DEFAULT_WINDOW_BITS,
-                                -42,
-                                for (int loc2 = 0; loc2 < 2; loc2++) (-(-22)),
-                                (~(-81))
-                              ],
-                              (--var2)
-                            ],
-                            (++var2),
-                            ((!(false)) ? (--var2) : (((~(34)) >> 48) << 79)),
-                            loc1
-                          ]) +
-                    foo2(
-                        foo0(),
-                        ([
-                              (((~(var5[(-(var5[(87 % var5[(++var2)])]))])) ??
-                                      -11) ~/
-                                  (var2++)),
-                              ((((!(var1)) && true) ? loc1 : 98) <<
-                                  ((!((true != (var4 == par1[var5[(~(-83))]]))))
-                                      ? -44
-                                      : var5[88])),
-                              Float32x4.yyyz,
-                              -44,
-                              Int32x4.xzyx,
-                              (++loc0)
-                            ] ??
-                            [
-                              ((foo1([((!(var1)) ? 24 : 81), -93], true))
-                                      .isEmpty
-                                  ? 52
-                                  : (~(Int32x4.zyww))),
-                              Int32x4.xxwz,
-                              (-(-11)),
-                              (loc0--),
-                              ((!(bool.fromEnvironment('U\u2665')))
-                                  ? (loc0++)
-                                  : (++var2))
-                            ]),
-                        {
-                          70: var7[7],
-                          18: '\u2665(#&c\u{1f600}-',
-                          58: 'KuNr',
-                          96: '\u{1f600}2\u2665YY',
-                          94: var0,
-                          28: 'l-'
-                        })),
-                par1);
-            {
-              double loc2 = double.infinity;
-              /*
-               * Multi-line
-               * comment.
-               */
-              return ('a!wNh!').codeUnits;
-            }
-          } catch (exception, stackTrace) {
-            continue;
-          } finally {
-            fld0_0 = (!(fld0_0));
-            var5 ??= ((Uri.parseIPv4Address('H') ??
-                    (foo2({
-                          loc1,
-                          ([
-                                if (((true ? loc0 : (loc0++)) <
-                                    ((!(var1)) ? -90 : Int32x4.yyzx)))
-                                  (~(var2))
-                                else
-                                  for (int loc2 in {
-                                    if (SecurityContext.alpnSupported)
-                                      var2
-                                    else
-                                      Int32x4.wzzy,
-                                    -9223372036754112763,
-                                    (-((var1
-                                        ? var5[62]
-                                        : (-(Float32x4.wzwz))))),
-                                    (~(Float32x4.yxzy))
-                                  })
-                                    ((((true && (false ? fld0_0 : var1))
-                                                ? fld0_0
-                                                : false)
-                                            ? true
-                                            : (fld0_0 && var1))
-                                        ? (true ? (~(loc1)) : var5[-16])
-                                        : loc0),
-                                for (int loc2 = 0; loc2 < 1; loc2++)
-                                  ((false && var1) ? Float32x4.yzyy : 50)
-                              ][var2] *
-                              [
-                                ...[
-                                  (((-10 >> Int32x4.wxzw) *
-                                          ((0.42979687169554437 >=
-                                                  0.17848133910264385)
-                                              ? -4
-                                              : var5[-15])) |
-                                      var5[(loc0++)]),
-                                  ...[
-                                    (('@jcNl\u2665P')
-                                            .compareTo(var7[(loc0--)]) &
-                                        (~((~(loc0))))),
-                                    if ((!(((!(true)) && true)))) 2,
-                                    loc1,
-                                    ((var5[(loc0--)] | -38) & (loc0++)),
-                                    var2,
-                                    (~(-22)),
-                                    if (false) loc0 else 80,
-                                    (--loc0)
-                                  ],
-                                  ...[15],
-                                  ((~((~(-5)))) ^ Int32x4.xxxz),
-                                  79,
-                                  for (int loc2 in [
-                                    (fld0_0 ? -0 : (loc0++)),
-                                    -49,
-                                    for (int loc3 in [
-                                      -16,
-                                      (var2--),
-                                      35,
-                                      ((14 * -68) ~/ Int32x4.wwyy)
-                                    ])
-                                      var5[(fld0_0 ? 28 : (-41 ?? 19))],
-                                    loc0,
-                                    (var3).round(),
-                                    if ((!((!((!(false))))))) loc1,
-                                    (loc0++),
-                                    Int32x4.wyww
-                                  ])
-                                    ((--var2) * var5[(6 & var5[(~(-53))])]),
-                                  (loc0++),
-                                  Float32x4.xwxx
-                                ],
-                                Int32x4.ywyw,
-                                (-(ZLibOption.strategyFixed)),
-                                (80 % (loc0--)),
-                                var5[Int32x4.zxww]
-                              ][var5[50]]),
-                          (false ? -71 : 39),
-                          (var5[-61]).toSigned(loc0),
-                          -50,
-                          4294967296
-                        }, [
-                          (16 *
-                              (~(((var1 ? ZLibOption.STRATEGY_FIXED : -66) *
-                                  4)))),
-                          Float32x4.wwwx
-                        ], {
-                          63: var0,
-                          52: (fld0_0 ? 'uG\u2665V@4' : '62'),
-                          98: var7[var5[-83]],
-                          70: (false
-                              ? 'bSg'
-                              : base64UrlEncode(([
-                                    (~(var2)),
-                                    -52,
-                                    68,
-                                    [
-                                      10,
-                                      loc1,
-                                      92,
-                                      53,
-                                      Int32x4.zzyw,
-                                      (true ? 12 : 19),
-                                      (~(var5[(++var2)]))
-                                    ][-64],
-                                    (++loc0),
-                                    (loc0 << -26)
-                                  ] +
-                                  [
-                                    var5[(--loc0)],
-                                    (((var1 ? var5[var5[(var2--)]] : loc1) +
-                                            (--var2)) <<
-                                        Int32x4.wyyx)
-                                  ]))),
-                          16: 'YsD\u2665\u2665K',
-                          0: var0,
-                          93: var7[(-(var5[-43]))]
-                        }) ??
-                        var5)) ??
-                [
-                  if (fld0_0) -90,
-                  (--var2),
-                  ...[
-                    for (int loc2 in [
-                      (false ? (~(-9)) : -4294901760),
-                      (-(-7)),
-                      -51,
-                      (var1 ? -75 : [Float32x4.wwxw, Int32x4.zxyx][-7]),
-                      Float32x4.xyww,
-                      Int32x4.wwzx,
-                      (loc0++),
-                      (NetworkInterface.listSupported
-                          ? [1000][Float32x4.zzyx]
-                          : -71)
-                    ])
-                      -27,
-                    Float32x4.wyzy,
-                    (++var2)
-                  ]
-                ]);
-          }
-        }
-      }
-      throw Map.unmodifiable(foo1(
-          (MapBase.mapToString(foo1((false ? [var2] : var5), false))).codeUnits,
-          true));
-    }
-  }
-
-  void run() {}
-}
-
-class X1 extends X0 {
-  double fld1_0 = 0.47694301047645304;
-  bool fld1_1 = true;
-
-  Map<int, String> foo1_0(
-      Map<int, String> par1, Map<int, String> par2, double par3) {
-    // Single-line comment.
-    for (int loc0 = 0; loc0 < 91; loc0++) {
-      par2.forEach((loc1, loc2) {
-        {
-          bool loc3 = (fld1_1 || ('U\u2665').isEmpty);
-          var3 /= 0.8504341352135224;
-        }
-      });
-      {
-        int loc1 = 66;
-        while (--loc1 > 0) {
-          if (((!((true || fld1_1))) == true)) {
-            var0 ??= par2[var5[(~((false ? ((!(var1)) ? -95 : var2) : -37)))]];
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            return Map.unmodifiable({
-              55: var4,
-              73: 'c#',
-              17: (fld1_1
-                  ? '7\u{1f600}e'
-                  : ((!(var1)) ? '8E7AK2e' : 'Fm\u{1f600} F')),
-              40: 'mb(\u{1f600}\u2665l',
-              36: Uri.decodeFull((true ? par2[-32769] : var7[Float32x4.zyxz])),
-              51: ((false &&
-                      (((var1 ? true : true) || false)
-                          ? (var7[(var2--)]).isEmpty
-                          : true))
-                  ? (fld1_1
-                      ? (fld1_1 ? (var1).toString() : 'r9M')
-                      : ((true ? (0.2863696758528199 != par3) : false)
-                          ? (fld1_1 ? par1[Int32x4.zwyz] : var4)
-                          : var4))
-                  : var4),
-              8: '6G',
-              62: '+z@Gp'
-            });
-          } else {
-            var5[Int32x4.zzyy] ??= (-(var5[((!(false)) ? loc1 : -34)]));
-            {
-              int loc2 = (-(7));
-              var3 /= (true
-                  ? (-(((-9223372032459145467).isEven
-                      ? fld1_0
-                      : (-((-(0.7008573255099826)))))))
-                  : par3);
-            }
-          }
-          for (int loc2 in foo2(var6, var5, {
-            if (false) 11: par1[((var4).isEmpty ? 55 : -61)],
-            12: 'f5j2v\u{1f600}',
-            52: (((foo1(
-                            (((var1
-                                        ? {var5[-66], var2, 88, 12, 6, -96}
-                                        : (var1
-                                            ? {-25, 84, (var2--), var5[83]}
-                                            : {-36, var5[51], var2})) !=
-                                    {var5[(++var2)]})
-                                ? [-2147483648, 46, loc0, var5[loc0], -21]
-                                : foo2(
-                                    {var5[var5[loc0]]},
-                                    (true
-                                        ? var5
-                                        : [
-                                            -30,
-                                            var5[(-(-42))],
-                                            var2,
-                                            Float32x4.zywx,
-                                            loc1,
-                                            63,
-                                            -25,
-                                            -28
-                                          ]),
-                                    {30: 'j\u2665U', 98: var4})),
-                            false))
-                        .isNotEmpty
-                    ? (false ? fld1_0 : 0.3202297128057393)
-                    : 0.1301025669674245))
-                .toStringAsFixed(((fld1_1 ? 79 : -88) + Int32x4.xyzw)),
-            88: (false ? var7[(var2++)] : (var4 ?? '')),
-            31: (var1
-                ? (var1 ? par2[-87] : (true ? par2[-14] : var4))
-                : ((fld1_1 != true) ? '3nd9t&' : var4)),
-            22: ('(Czi' + '-Y')
-          })) {
-            var7[(loc2--)] = 's';
-          }
-        }
-      }
-    }
-    return par1;
-  }
-
-  String foo1_1(int par1) => var0;
-  Set<int> foo1_2(String par1) {
-    for (int loc0 = 0; loc0 < 58; loc0++) {
-      switch ((~(13))) {
-        case 746492976:
-          {
-            switch (Duration.millisecondsPerDay) {
-              case 3635015902:
-                {
-                  var7[var5[(var5[var2] * (-(var5[Float32x4.yxxz])))]] ??=
-                      (var7[-79] + '(O@');
-                  var7[loc0] ??= String.fromCharCode(var5[(true
-                      ? (var5[((var1 ? true : (false ? fld1_1 : var1))
-                              ? var5[Float32x4.wyyz]
-                              : 73)] ~/
-                          (-(84)))
-                      : -15)]);
-                }
-                break;
-              case 3635015905:
-                {
-                  var1 = (var1
-                      ? (foo1_0(
-                              (((!(false)) || fld1_1) ? var7 : var7),
-                              foo1_0(
-                                  {74: '\u2665e', 10: 'tw8jc0R'},
-                                  foo1_0(
-                                      var7,
-                                      foo1_0(
-                                          ({
-                                                17: var7[Int32x4.zyxy],
-                                                82: var7[64],
-                                                27: 'VEtj',
-                                                90: Uri.encodeQueryComponent(
-                                                    foo1_1(var2)),
-                                                68: 'wew0\u{1f600}'
-                                              } ??
-                                              foo1_0(var7, var7, var3)),
-                                          ({
-                                                65: 'mBeBfUj',
-                                                81: var4,
-                                                35: (var7[-43] + 'l'),
-                                                68: var4
-                                              } ??
-                                              {
-                                                33: ('N\u{1f600}xaY+' ?? par1),
-                                                44: var7[var5[var2]],
-                                                83: var4,
-                                                86: 'k'
-                                              }),
-                                          asin(0.4245871535895427)),
-                                      (-(0.2913717674787144))),
-                                  0.9439800024935644),
-                              (-((true
-                                  ? ((var1 ? false : var1)
-                                      ? 0.09441225978923817
-                                      : 0.42622157485045953)
-                                  : (-(0.29370792038584836)))))))
-                          .isNotEmpty
-                      : (false && true));
-                  var3 += (-(fld1_0));
-                }
-                break;
-            }
-          }
-          break;
-        case 746492979:
-          {
-            var4 = var0;
-            for (int loc1 = 0; loc1 < 88; loc1++) {
-              var2 += 32;
-            }
-          }
-          break;
-      }
-    }
-    {
-      int loc0 = 0;
-      do {
-        return foo0();
-      } while (++loc0 < 57);
-    }
-    return foo0();
-  }
-
-  String foo1_3() {
-    if ((0.42144855521066793).isNegative) {
-      print((false ? (-(fld1_0)) : (-((-((-(0.26854952952179667))))))));
-      switch (30) {
-        case 3830102525:
-          {
-            try {
-              var7.forEach((loc0, loc1) {
-                var1 = (!(true));
-                var6 = (foo1_2(var7[99]) ?? var6);
-              });
-              var6 ??= var6;
-            } catch (exception, stackTrace) {
-              var4 ??= ListBase.listToString([
-                (Duration.microsecondsPerSecond + -82),
-                (true
-                    ? var5[(var2 ~/ (false ? (~((var1 ? 46 : var2))) : var2))]
-                    : (-9223372034707292161 >> var5[var5[-86]])),
-                Float32x4.wxyx
-              ]);
-            } finally {
-              /**
-             ** Multi-line
-             ** documentation comment.
-             */
-              fld1_1 = (var5[var5[var2]]).isOdd;
-            }
-            /*
-           * Multi-line
-           * comment.
-           */
-            if ((SetBase.setToString((fld1_1
-                    ? {12, (fld1_1 ? (-(-22)) : (-(4395630341)))}
-                    : var6)))
-                .isNotEmpty) {
-              try {
-                {
-                  int loc0 = 86;
-                  while (--loc0 > 0) {
-                    {
-                      int loc1 = 0;
-                      do {
-                        var0 = var7[(-(((--var2) &
-                            ((var1 ? (fld1_0).isNaN : true)
-                                ? (-16 | -20)
-                                : ((0.7513819161190503).isNaN ? 45 : loc1)))))];
-
-                        /// Single-line documentation comment.
-                        var5[(true ? loc0 : Float32x4.zxzx)] %= loc0;
-                      } while (++loc1 < 17);
-                    }
-                    for (int loc1 = 0; loc1 < 25; loc1++) {
-                      var5[Float32x4.zywy] <<= Int32x4.ywwx;
-                    }
-                  }
-                }
-              } catch (exception, stackTrace) {
-                var7 = Map.from(foo1_0({
-                  81: (foo1_1(((++var2) * (-(var5[21])))) +
-                      (var7[8] + (var7[var5[53]] ?? var0))),
-                  for (int loc0 in [
-                    (true ? 58 : Float32x4.wyww),
-                    var5[(fld1_1 ? 46 : var2)]
-                  ])
-                    63: var7[(false
-                        ? var5[((24 >> -9223372036854710272) & var2)]
-                        : var5[(80 << var5[-31])])],
-                  67: var0,
-                  1: '3mlOA',
-                  30: ('OQbG').substring((var2--), (--var2)),
-                  93: ((var7[74] ?? var7[(++var2)])).toLowerCase(),
-                  ...{
-                    85: foo1_1(-21),
-                    if ((!((!(false))))) 86: var0,
-                    49: '62+v',
-                    59: foo1_1((--var2)),
-                    for (int loc0 in [
-                      -10,
-                      -65,
-                      (var2++),
-                      (var2++),
-                      ((({
-                                    ((var7[60] == var7[-30])
-                                        ? var5[(-((var2++)))]
-                                        : (var2--))
-                                  } ==
-                                  {var5[var2], -40, -81, (var2++), 93, 26})
-                              ? 38
-                              : (var1 ? var5[97] : -82)) *
-                          (--var2)),
-                      (~((true ? 5 : Float32x4.yxyy))),
-                      (var2++),
-                      ((++var2) << ((var2 % Int32x4.yxxw) >> (++var2)))
-                    ])
-                      54: (var0 + 'ANyqN'),
-                    94: (var1 ? '0T\u2665#w' : (var0).toUpperCase()),
-                    68: '@n',
-                    67: base64UrlEncode(((0.07857744084458451).isInfinite
-                        ? ([
-                              var2,
-                              var5[70],
-                              -32,
-                              Float32x4.yxwz,
-                              31,
-                              (~(var2)),
-                              (var2 ?? (-70 + 57)),
-                              -91
-                            ] +
-                            [
-                              var2,
-                              var5[((!(var1))
-                                  ? var5[(var2 ~/ Float32x4.zwyw)]
-                                  : var5[var5[(var5[(~(var2))] % var2)]])],
-                              (var2 | (false ? (-(var2)) : var5[80])),
-                              (var2--),
-                              DateTime.daysPerWeek,
-                              (var2 ~/ var2)
-                            ])
-                        : (var1 ? var5 : [(var2++)])))
-                  },
-                  if (false)
-                    if (false)
-                      26: (Uri.encodeComponent(foo1_1(var2)) + var7[var5[var2]])
-                    else ...{
-                      4: (double.negativeInfinity).toStringAsFixed(var2),
-                      46: Uri.decodeQueryComponent('bst3jz'),
-                      5: ((true
-                              ? (true ? '(-f' : var7[(-(Int32x4.yzxz))])
-                              : var7[(var5[(fld1_1 ? (var2--) : var2)] >>
-                                  (-((false ? 8589934591 : 33))))]) ??
-                          '4ov'),
-                      37: var7[var5[100663045]],
-                      13: '2B'
-                    }
-                }, {
-                  71: 'Hxbq',
-                  22: ('\u{1f600}Jtj').substring(
-                      (-36 | var5[(~((var2++)))]), 9223372032559874048)
-                }, 0.3710694748818374));
-                fld1_0 ??= 0.010604823956237519;
-              } finally {
-                for (int loc0 = 0; loc0 < 84; loc0++) {
-                  var5[Float32x4.xwwz] <<=
-                      ((((fld1_1 ? false : ('e\u{1f600}O+Vc').isNotEmpty) &&
-                                  (!(fld1_1)))
-                              ? (-73 | var5[Int32x4.yzwx])
-                              : Uint16List.bytesPerElement) ~/
-                          var2);
-                }
-              }
-            }
-          }
-          break;
-        case 3830102528:
-          {
-            fld1_1 ??= true;
-            throw (-((-17).ceilToDouble()));
-          }
-          break;
-      }
-    }
-    return var0;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = 61;
-      while (--loc0 > 0) {
-        {
-          int loc1 = 77;
-          while (--loc1 > 0) {
-            {
-              int loc2 = 0;
-              do {
-                break;
-              } while (++loc2 < 84);
-            }
-          }
-        }
-        if (((var1 || fld1_1) && (!((!((!((!((!(true)))))))))))) {
-          switch (Int32x4.yyzx) {
-            case 900727295:
-              {
-                /// Single-line documentation comment.
-                fld1_1 ??= (!(true));
-                for (int loc1 in ((var5 ??
-                        Uri.parseIPv6Address(
-                            foo1_3(), var5[(loc0 + var5[4096])], -34)) ??
-                    var5)) {
-                  var7[(38 << (false ? (~(-58)) : Float32x4.yyxy))] =
-                      Uri.decodeFull(foo1_3());
-                  var5 ??= var5;
-                }
-              }
-              break;
-            case 900727304:
-              {
-                fld1_1 =
-                    (SecurityContext.alpnSupported ? (var3).isFinite : var1);
-                fld1_0 += 0.3154406798513474;
-              }
-              break;
-          }
-          var2 ^= var2;
-        } else {
-          if (((-(var3)) <= (-(fld1_0)))) {
-            var6 = foo1_2('0vsDWF9');
-          } else {
-            var6 ??= ((fld1_0 <= 0.16230005903410238)
-                ? ((!((0.5144029832155854 > (0.8199455895430549 / var3))))
-                    ? foo1_2('ken')
-                    : var6)
-                : (fld1_1 ? {56, 6442450945, 2} : {34}));
-          }
-          var5[Float32x4.zwzw] += (true ? var2 : (~(Float32x4.wyyx)));
-        }
-      }
-    }
-  }
-}
-
-class X2 extends X0 with X1 {
-  Set<int> fld2_0 = {for (int loc0 = 0; loc0 < 60; loc0++) -56, 29};
-
-  bool foo2_0(int par1) => var1;
-  bool foo2_1(bool par1) {
-    for (int loc0 in var6) {
-      var2 ~/= ((((((fld2_0 ?? (true ? var6 : var6)) ?? fld2_0))
-                      .union({(~(-21)), 10}) !=
-                  {(var5[90] ~/ (-(-90)))})
-              ? par1
-              : (var7[(~(82))]).isNotEmpty)
-          ? ((~(loc0)) *
-              ((true ? (-4294966272 ?? -21) : var2) +
-                  Duration.millisecondsPerMinute))
-          : (-9223372032559807488 ~/ 4294968296));
-    }
-    if (('DeAm#f' ==
-        ((Uri.encodeQueryComponent((0.3687340601979223).toString()) ??
-                var7[-23]) ??
-            foo1_3()))) {
-      throw (([Float32x4.wyyz, -9223372036854743039])
-              .sublist((--var2), (--var2)) +
-          ((true ? var1 : (!(false)))
-              ? foo2(
-                  foo1_2('JLXt'),
-                  [
-                    var5[Int32x4.zxzx],
-                    Int32x4.xxwy,
-                    (var2++),
-                    Float32x4.yzxx,
-                    (var2++),
-                    -15
-                  ],
-                  foo1_0(var7, var7, 0.7904389283184639))
-              : (var1
-                  ? [Float32x4.yzyz, Int32x4.wxxy, var2, (~(var5[-47]))]
-                  : var5)));
-    } else {
-      var7[var2] ??= ((({
-            ...{
-              for (int loc0 = 0; loc0 < 19; loc0++)
-                36: (var7[var2] ?? (par1 ? ('ccb9z' + 'iM') : var0)),
-              3: ('1sG' + var0),
-              for (int loc0 in {
-                (-(var5[var2])),
-                if (var1) Int32x4.zxxx,
-                -4294967168,
-                -61,
-                (~((par1 ? (~(-70)) : (var2--)))),
-                (-(7)),
-                -96,
-                Uint32List.bytesPerElement
-              })
-                85: var4
-            },
-            if (foo2_0(-91)) 38: (var3).toString() else 30: 'uI\u2665\u{1f600}',
-            72: '@'
-          }[(par1 ? 14 : var2)])
-                  .trim())
-              .substring((36 ~/ var5[(++var2)]), var5[((-(25)) * -53)]) ??
-          foo1_3());
-      /*
-       * Multi-line
-       * comment.
-       */
-      {
-        int loc0 = 0;
-        do {
-          {
-            String loc1 = 'jG7t';
-            /**
-             ** Multi-line
-             ** documentation comment.
-             */
-            {
-              int loc2 = 57;
-              while (--loc2 > 0) {
-                print((var6 ??
-                    (foo1_2(var0)).union(foo1_2(('n' + var7[(++var2)])))));
-              }
-            }
-          }
-        } while (++loc0 < 69);
-      }
-    }
-    return (!(((!((par1 && false)))
-        ? (true && foo2_0(-9223372036854771712))
-        : (!(par1)))));
-  }
-
-  double foo2_2(Map<int, String> par1, int par2) {
-    switch (var2) {
-      case 3816231196:
-        {
-          throw (-(Int32x4.xxwx));
-        }
-        break;
-      case 3816231204:
-        {
-          var7.forEach((loc0, loc1) {
-            switch ((-43 ^ (-(Float32x4.wwxx)))) {
-              case 2839002105:
-                {
-                  var0 ??= (SetBase.setToString(((var1 ? var1 : (true || var1))
-                          ? fld2_0
-                          : {
-                              Int32x4.yyzw,
-                              Int32x4.yyxy,
-                              (2 >> Int32x4.ywzx),
-                              (var1
-                                  ? ((foo2_1(var1) ? 17 : loc0) ~/
-                                      (-(var5[var2])))
-                                  : par2),
-                              Float32x4.zwwx,
-                              par2,
-                              Int32x4.wzzz,
-                              Int32x4.zyzw
-                            })) ??
-                      (loc1 +
-                          var7[((true
-                                  ? (var1 &&
-                                      bool.fromEnvironment(var7[(var2--)]))
-                                  : foo2_1(false))
-                              ? 35
-                              : (-(66)))]));
-                  for (int loc2 = 0; loc2 < 23; loc2++) {
-                    switch ((-73 ^ (Int32x4.xyzz >> Float32x4.yzzz))) {
-                      case 1710454916:
-                        {
-                          var3 = 0.3372913861348876;
-                          print(((-(var3)) * var3));
-                        }
-                        break;
-                      case 1710454922:
-                        {
-                          var4 ??= ((false
-                                  ? (var1
-                                      ? var1
-                                      : (fld2_0 ==
-                                          {
-                                            (false ? -27 : (-(92))),
-                                            loc2,
-                                            var5[loc2],
-                                            (var1
-                                                ? Float32x4.yywy
-                                                : (false ? -74 : 2)),
-                                            ((-(-50)) ^ 32),
-                                            (var2++)
-                                          }))
-                                  : var1)
-                              ? base64UrlEncode([
-                                  for (int loc3 in {
-                                    (-(par2)),
-                                    loc0,
-                                    (-((par2++))),
-                                    Float32x4.yyyx
-                                  })
-                                    (par2--),
-                                  (-((-(var5[var5[var5[-41]]])))),
-                                  if (({
-                                        loc2,
-                                        Duration.microsecondsPerSecond,
-                                        (([
-                                                  (par2++),
-                                                  (-90 ^ -5),
-                                                  var5[(~(0))],
-                                                  loc2
-                                                ] !=
-                                                var5)
-                                            ? -9223372032559808512
-                                            : (par2++))
-                                      } ==
-                                      {
-                                        (var1 ? (-((loc2 % loc2))) : loc2),
-                                        -94,
-                                        -62
-                                      }))
-                                    (++var2),
-                                  loc2,
-                                  for (int loc3 in {
-                                    55,
-                                    (~(var5[var5[(++par2)]])),
-                                    ((var1
-                                            ? (-((++var2)))
-                                            : var5[(true ? var5[68] : 10)]) -
-                                        par2),
-                                    (-(Float32x4.wzxx))
-                                  })
-                                    (Int32x4.yxzy | var5[-1]),
-                                  (foo2_1(false) ? (-(32)) : loc0),
-                                  (--par2),
-                                  if ((!(false))) (var1 ? var5[loc0] : 30)
-                                ])
-                              : ('b1TKp3' ??
-                                  (var4 +
-                                      var7[(~(var5[
-                                          ((var1 ? var2 : loc2) - 72)]))])));
-                        }
-                        break;
-                    }
-                    fld2_0 = ((!((false
-                            ? false
-                            : (false ? (!((var7[-28] != ''))) : var1))))
-                        ? (((var1
-                                    ? (true ? Set.identity() : var6)
-                                    : {
-                                        -63,
-                                        Int32x4.xxyx,
-                                        var5[((var1
-                                                ? (var5[-9223372032559808496] >>
-                                                    59)
-                                                : Int32x4.wxxy) ~/
-                                            var5[var5[-48]])],
-                                        (par2 ?? par2),
-                                        44,
-                                        var5[(var1 ? -26 : (-(par2)))]
-                                      }) ??
-                                ({
-                                      loc2,
-                                      var2,
-                                      ZLibOption.defaultMemLevel,
-                                      (true ? Int32x4.wyzz : 40),
-                                      (false ? loc2 : var5[42]),
-                                      -16
-                                    } ??
-                                    var6)))
-                            .union({loc0, (var2++), (-1 * (~(var2)))})
-                        : (bool.fromEnvironment((var3)
-                                .toStringAsFixed(Uint64List.bytesPerElement))
-                            ? fld2_0
-                            : {
-                                (par2++),
-                                (var1 ? loc2 : (++var2)),
-                                ((false || false) ? Int32x4.xyyz : (++par2)),
-                                var5[-98],
-                                Float32x4.zwwy,
-                                var5[var5[62]],
-                                (~(Float32x4.ywww))
-                              }));
-                  }
-                }
-                break;
-              case 2839002106:
-                {
-                  for (int loc2 = 0; loc2 < 13; loc2++) {
-                    {
-                      int loc3 = 0;
-                      do {
-                        switch ((loc3 | -76)) {
-                          case 2164097105:
-                            {
-                              var4 ??= (var1).toString();
-                              var5 = ((!(((true || var1) !=
-                                      (false ? var1 : (!(foo2_1(var1)))))))
-                                  ? foo2(
-                                      ((var6).union(foo1_2(loc1))).toSet(),
-                                      [
-                                        -67,
-                                        if (((var1
-                                                ? 59
-                                                : (-((false ? -97 : par2)))) !=
-                                            (false
-                                                ? ((var1 || var1)
-                                                    ? (-((par2++)))
-                                                    : 4)
-                                                : (--var2)))) ...[
-                                          ((92 ~/ Int32x4.yzwx) << 70),
-                                          Float32x4.xxyz,
-                                          Int8List.bytesPerElement
-                                        ] else
-                                          69
-                                      ],
-                                      var7)
-                                  : foo2(foo0(), Uri.parseIPv4Address(var0),
-                                      var7));
-                            }
-                            break;
-                          case 2164097111:
-                            {
-                              var4 ??= var7[Float32x4.zxzw];
-                            }
-                            break;
-                        }
-                      } while (++loc3 < 96);
-                    }
-                    fld2_0 = var6;
-                  }
-                }
-                break;
-            }
-          });
-          for (int loc0 in (foo2_1((var5 !=
-                  (false
-                      ? [par2]
-                      : foo2(
-                          var6,
-                          [20],
-                          ({
-                                21: var0,
-                                68: foo1_3(),
-                                24: ('1MF' + '8s\u2665yx+ ')
-                              } ??
-                              {
-                                9: var7[var2],
-                                48: 'mB(wW\u{1f600}',
-                                74: 'ojEw\u{1f600}\u{1f600}',
-                                80: '\u26655E-hj\u{1f600}',
-                                10: (false ? 'W7i5\u2665YX' : '! Ed9&'),
-                                88: (false ? var0 : 'N0D9(H\u{1f600}'),
-                                5: 'QZ'
-                              })))))
-              ? foo1_2('XP')
-              : {
-                  if ((foo2_1(var1)
-                      ? (foo2_1((fld2_0).add(-9223372036854774784)) || var1)
-                      : var1))
-                    (~(Float32x4.zyww)),
-                  Float32x4.xwyw,
-                  ((((var1 ? true : var1) ? 0.3447071353935154 : var3) >=
-                          0.5995056331958718)
-                      ? ZLibOption.MAX_LEVEL
-                      : 16),
-                  9223372032559841279,
-                  Int32x4.zwyy
-                })) {
-            for (int loc1 = 0; loc1 < 19; loc1++) {
-              var1 = (!(bool.fromEnvironment(MapBase.mapToString({
-                1: '4',
-                56: var0,
-                85: var0,
-                51: var7[-4],
-                42: ((!((!(false)))) ? par1[72] : MapBase.mapToString(var7))
-              }))));
-            }
-          }
-        }
-        break;
-    }
-    print((((var1 ? 'kP' : (var1 ? 'irjF' : var7[var5[90]])) ??
-            ((!(false)) ? 'vWa\u{1f600}' : var0)) +
-        'xzpK'));
-    return var3;
-  }
-
-  void run() {
-    super.run();
-    {
-      int loc0 = (~(-24));
-      var0 ??= ((false
-              ? foo2_1((true
-                  ? (var1 && (var2).isOdd)
-                  : (('dTYR' ?? 'G\u{1f600}P14\u{1f600}a')).isEmpty))
-              : ((var1 && true) || (!(var1))))
-          ? (var4 ?? 'I')
-          : 'QO');
-    }
-  }
-}
-
-class X3 extends X1 {
-  Map<int, String> fld3_0 = {
-    if (true) if (false) 45: 'ynEn\u2665nG' else 70: 'c\u{1f600}mN4\u2665a',
-    if (true) 30: '6\u2665P!Pbi',
-    81: 't',
-    82: '17fx#!',
-    92: 'H',
-    if (true) 69: ')Ls'
-  };
-  Set<int> fld3_1 = {27};
-  int fld3_2 = 34;
-
-  String foo1_1(int par1) {
-    throw (ListBase.listToString(foo2({
-          -4294967169,
-          par1
-        }, [
-          -97,
-          (var5[(var1 ? var5[87] : Int32x4.yxxy)] * Int32x4.yyxx),
-          var2,
-          (false ? 10 : var5[var5[(par1++)]])
-        ], var7)) ??
-        'o');
-  }
-
-  bool foo3_0(double par1) {
-    {
-      Set<int> loc0 = (true ? fld3_1 : var6);
-      {
-        Set<int> loc1 = (false
-            ? foo0()
-            : {
-                for (int loc2 in [var2, (-(Float32x4.xzzw))])
-                  if (false) Float32x4.wxyz else (++fld3_2),
-                ((var1
-                        ? 5
-                        : var5[(((var5[(true ? fld3_2 : fld3_2)] ~/ 48) | 56) %
-                            var5[-4])]) ??
-                    (var2++))
-              });
-        for (int loc2 = 0; loc2 < 90; loc2++) {
-          {
-            int loc3 = 95;
-            while (--loc3 > 0) {
-              return (((0.7073184699576396).isNaN
-                      ? var7
-                      : (Map.of(Map.from(var7)) ??
-                          Map.unmodifiable(Map.identity()))))
-                  .isEmpty;
-            }
-          }
-          try {
-            var1 = (((12 >= Int32x4.ywxx) ? true : true)
-                ? false
-                : (((var1 ? fld3_0[Int32x4.wyxy] : '') ?? var7[Float32x4.xwwx]))
-                    .isEmpty);
-            var2 |= ((fld3_2++) ?? (fld3_2--));
-          } catch (exception, stackTrace) {
-            var5 ??= var5;
-          } finally {
-            var4 = 'A';
-            break;
-          }
-        }
-        {
-          double loc2 = (-(exp((acos(0.06129144867031855) ?? var3))));
-          fld3_0 = (((({Int32x4.ywxw, 6442450943}).union(foo0()))
-                      .add((++fld3_2))
-                  ? false
-                  : false)
-              ? foo1_0(
-                  (foo1([var5[var2], var5[75], 42], false) ?? var7), var7, loc2)
-              : (var1
-                  ? {
-                      for (int loc3 = 0; loc3 < 48; loc3++) 78: 'dWek8',
-                      40: fld3_0[(var5[-81] & Int32x4.xzyw)],
-                      73: (' )G\u2665-d(').substring(
-                          (NetworkInterface.listSupported
-                              ? (~(((++var2) ?? (fld3_2 * fld3_2))))
-                              : var5[-75]),
-                          fld3_2),
-                      74: ('k9O\u2665').trimLeft(),
-                      88: var7[(++var2)],
-                      for (int loc3 = 0; loc3 < 27; loc3++)
-                        60: ((false || var1) ? var7[46] : var0),
-                      99: ((var3).isNaN
-                          ? (Uri.decodeComponent(foo1_3()) + var4)
-                          : var7[-77]),
-                      92: (true
-                          ? ('').padLeft(82, '')
-                          : ('' ?? var7[(false ? 94 : 58)]))
-                    }
-                  : var7));
-
-          /// Single-line documentation comment.
-          fld3_1 ??= ((loc1 ?? foo1_2(fld3_0[(var2--)])) ?? foo1_2(foo1_3()));
-        }
-      }
-    }
-    return (var1 ? (!(var1)) : var1);
-  }
-
-  String foo3_1(int par1, String par2, String par3) {
-    switch (var2) {
-      case 3768780679:
-        {
-          {
-            int loc0 = (++par1);
-            var0 ??= ListBase.listToString(var5);
-            if (true) {
-              var5 = [
-                Float32x4.xyxz,
-                (var1
-                    ? ((!(false)) ? Float32x4.xyyw : (++fld3_2))
-                    : var5[fld3_2]),
-                par1,
-                (~(Float32x4.zxwy)),
-                if ((foo3_0(var3)
-                    ? ([
-                          (++fld3_2),
-                          ...[
-                            ...[
-                              var5[(true ? Float32x4.xxzx : (--fld3_2))],
-                              54,
-                              (-((((foo3_0(var3)
-                                          ? (!(false))
-                                          : ((var1 ? (~(-63)) : var5[-40]))
-                                              .isOdd)
-                                      ? ((0.8329420640871532 != var3) && var1)
-                                      : var1)
-                                  ? 43
-                                  : (Float32x4.zxxy - Float32x4.zxxw)))),
-                              Int32x4.zzwx
-                            ],
-                            ...[
-                              (var5[-48] * (fld3_2++)),
-                              Int32x4.wyyw,
-                              (~(-76)),
-                              ((par1).isEven ? (--par1) : -13),
-                              Float32x4.wxyx
-                            ],
-                            for (int loc1 in [
-                              (++fld3_2),
-                              -15,
-                              (SecurityContext.alpnSupported
-                                  ? Int32x4.yxyw
-                                  : Float32x4.yxxw),
-                              if (true) var5[(var1 ? -32768 : par1)],
-                              ((--var2) ^ (++fld3_2))
-                            ])
-                              (fld3_2--),
-                            93,
-                            (~((-(ZLibOption.minMemLevel)))),
-                            ((Float32x4.zyzx >> -14) & Float32x4.yxxw)
-                          ],
-                          (var1
-                              ? (++par1)
-                              : ((var3).isInfinite ? Float32x4.zwww : -84)),
-                          var2
-                        ] ==
-                        [
-                          9223372032559808639,
-                          -85,
-                          Float32x4.wzyy,
-                          loc0,
-                          [
-                            ((-(36)) <<
-                                ((var1
-                                        ? var1
-                                        : ({
-                                            45: 'ay',
-                                            7: par3,
-                                            69: Uri.decodeFull(
-                                                (foo1_3() + 'LX+'))
-                                          })
-                                            .isEmpty)
-                                    ? (~((13 | 64)))
-                                    : (-(var2)))),
-                            (par1--),
-                            ((~((true ? (var2--) : -31))) >> 9),
-                            (-((35 % (~(var5[var5[39]]))))),
-                            4395630341,
-                            Int32x4.zxxy,
-                            if ((var1
-                                ? foo3_0(var3)
-                                : (0.6201792653929837).isInfinite)) ...[
-                              Int32x4.wxxx,
-                              (fld3_2 * (--fld3_2)),
-                              var5[((~(var5[var5[var5[(-(-23))]]])) +
-                                  (~(-4294966296)))],
-                              loc0,
-                              for (int loc1 in [var5[Float32x4.yzww]]) 17,
-                              (~(var5[(++par1)])),
-                              -58,
-                              ((!(('').isEmpty))
-                                  ? ((-(Float32x4.ywwx)) * (++par1))
-                                  : Int32x4.yxyz)
-                            ]
-                          ][((var1 ? var1 : var1) ? var5[0] : par1)],
-                          ((~(70)) +
-                              (par1 + (-77 | ZLibOption.MAX_WINDOW_BITS))),
-                          (-(Int32x4.zywy)),
-                          (~(Float32x4.zywz))
-                        ])
-                    : (var1 ? true : true)))
-                  fld3_2
-              ];
-            }
-          }
-          var3 *= ((var3 + 0.6761038672016147) ?? (-(double.minPositive)));
-        }
-        break;
-      case 3768780685:
-        {
-          {
-            int loc0 = 67;
-            while (--loc0 > 0) {
-              {
-                Map<int, String> loc1 = foo1(
-                    Uri.parseIPv4Address(('E Hu\u{1f600}' + '\u2665l&#!')),
-                    (!(false)));
-                var3 ??= var3;
-              }
-              var5 = (var5 +
-                  ((({
-                    79: (foo1_3() ?? 'eD'),
-                    73: (var1 ? par2 : ' xdXgW'),
-                    4: 'pUc(q',
-                    15: 'K\u{1f600}hmdZ\u2665',
-                    95: (var1 ? var4 : (var1 ? fld3_0[-45] : foo1_3()))
-                  })
-                              .isNotEmpty
-                          ? ((var1 ? var1 : (var1 ? var1 : foo3_0(var3))) ||
-                              foo3_0(var3))
-                          : (!(((false || true) ? var1 : false))))
-                      ? [
-                          (~((-61 ??
-                              (~((-(var5[(var1 ? fld3_2 : var5[34])]))))))),
-                          (var5[13] ^ (var1 ? 35 : -76)),
-                          (-(((~(-47)) ~/ (--par1))))
-                        ]
-                      : foo2({
-                          -36,
-                          ((0.3910802543332075).isNegative
-                              ? (~((var2++)))
-                              : (var2 &
-                                  (var1
-                                      ? [
-                                          -67,
-                                          (fld3_2++),
-                                          if ((!((!((var1
-                                              ? true
-                                              : (!(false))))))))
-                                            (false
-                                                ? (~(Float32x4.wyyy))
-                                                : (var1
-                                                    ? (1 ^ (-(16)))
-                                                    : var5[94])),
-                                          fld3_2,
-                                          var2,
-                                          67
-                                        ][-12]
-                                      : Float32x4.wwxw))),
-                          26,
-                          [
-                            (var1
-                                ? (--fld3_2)
-                                : (((!(var1))
-                                        ? (~((foo3_0(0.9959805940480148)
-                                            ? (33 ~/ loc0)
-                                            : Float32x4.xywx)))
-                                        : (15 % var5[var5[-47]])) <<
-                                    -86)),
-                            (-((~(RawSocketOption.levelIPv6))))
-                          ][var5[var5[(ZLibOption.maxMemLevel ^ -3)]]],
-                          -29
-                        }, [
-                          (var1 ? Float32x4.wxxw : (--par1)),
-                          ...[
-                            52,
-                            (-((true ? -12 : 44))),
-                            var5[((var5[34] * 30) >> 4294967360)],
-                            ((--var2) <<
-                                (true
-                                    ? var5[(-4 ~/ Int32x4.yyww)]
-                                    : (bool.fromEnvironment(var7[fld3_2])
-                                        ? (~((false ? loc0 : var5[(++par1)])))
-                                        : ((!(false))
-                                            ? (var5[var5[loc0]] ^ Int32x4.wxzz)
-                                            : par1)))),
-                            (((false ? var0 : '') !=
-                                    (true
-                                        ? MapBase.mapToString(({
-                                              7: 'WTT7\u{1f600}e3',
-                                              22: '',
-                                              36: (var1
-                                                  ? 'F'
-                                                  : (var1 ? fld3_0[var2] : '')),
-                                              37: 'l@a',
-                                              85: (var1 ? '' : par3),
-                                              82: 'eb',
-                                              37: '11',
-                                              41: var7[94]
-                                            } ??
-                                            var7))
-                                        : (var1 ? var4 : par2)))
-                                ? (~(var5[-71]))
-                                : 9),
-                            32,
-                            if (bool.fromEnvironment(
-                                fld3_0[var5[ZLibOption.MIN_MEM_LEVEL]]))
-                              var5[(--par1)],
-                            (par1--)
-                          ],
-                          for (int loc1 in {
-                            for (int loc2 in [
-                              ((!((Map.unmodifiable({
-                                        86: var4,
-                                        31: var0,
-                                        85: (par3 + ''),
-                                        91: (var1
-                                            ? fld3_0[4]
-                                            : '!M\u{1f600}!vOw'),
-                                        45: '7T',
-                                        19: 'fha+',
-                                        38: (false ? '' : fld3_0[70])
-                                      }) !=
-                                      {
-                                        92: '@4',
-                                        41: var7[loc0],
-                                        24: (foo3_0(0.06591134699771606)
-                                            ? '\u2665)\u2665NnO+'
-                                            : 'JM3Hn\u{1f600}'),
-                                        26: 'aQ51Yz',
-                                        64: var7[
-                                            (-((var5[18] & (36).bitLength)))]
-                                      })))
-                                  ? (89 ^
-                                      (((44 - par1) * -9223372034707292160) &
-                                          var5[128]))
-                                  : -46),
-                              (fld3_2++),
-                              ((([
-                                            -89,
-                                            var2,
-                                            (fld3_2++),
-                                            var5[-4294967264],
-                                            -25,
-                                            var2,
-                                            var5[((!(var1))
-                                                ? (var1 ? -3 : -81)
-                                                : var5[loc0])],
-                                            (var1
-                                                ? par1
-                                                : ((~((fld3_2++))) >>
-                                                    (-((-(-64))))))
-                                          ] ??
-                                          foo2(var6, [
-                                            4295032831
-                                          ], {
-                                            53: foo1_3(),
-                                            94: var7[13],
-                                            82: var7[-60],
-                                            30: fld3_0[-9223372032559742976],
-                                            98: foo1_3()
-                                          })) !=
-                                      var5)
-                                  ? (--par1)
-                                  : loc0),
-                              56,
-                              if (((var5[21]).isOdd ? true : false))
-                                ((++par1) -
-                                    (var1 ? var5[DateTime.january] : (par1--)))
-                              else
-                                fld3_2,
-                              if ((!(var1))) 74,
-                              (par1 ^ var5[26])
-                            ])
-                              (~(var2)),
-                            for (int loc2 in {
-                              6442450944,
-                              Float32x4.ywyw,
-                              -9223372032559804416,
-                              (~(var5[var5[26]])),
-                              Float32x4.xyxy,
-                              (--fld3_2),
-                              var5[98]
-                            })
-                              if (false) -26,
-                            (~((-((-((-48 - -9223372036854775680))))))),
-                            ...{
-                              (-((var2--))),
-                              if (true) -100663046 else var5[(~(par1))]
-                            },
-                            (~((~((fld3_2++))))),
-                            ...{
-                              ((List.filled(0, 26) ==
-                                      [
-                                        (-(-52)),
-                                        -29,
-                                        (--fld3_2),
-                                        (0.22302566014161784).floor(),
-                                        (par1 % -56)
-                                      ])
-                                  ? (var1
-                                      ? (var2++)
-                                      : ((!((!(true))))
-                                          ? ((var1 || foo3_0(var3)) ? 76 : par1)
-                                          : (-(-13))))
-                                  : ((foo1_0((var1 ? fld3_0 : var7), var7,
-                                              var3))
-                                          .isEmpty
-                                      ? 97
-                                      : (var1 ? var2 : -9223372036854774784))),
-                              (-(Float32x4.zyzw)),
-                              (--var2)
-                            }
-                          })
-                            ((var3 < (-(var3))) ? -9223372032559808000 : -71),
-                          -100663046,
-                          if ((var1
-                              ? bool.fromEnvironment('vV0')
-                              : (Map.from({
-                                  78: '',
-                                  49: '\u{1f600}\u{1f600}4Mz',
-                                  70: fld3_0[par1],
-                                  95: '\u{1f600}2tIYqE',
-                                  43: (true ? 'baf-\u2665' : var4),
-                                  30: var7[(-((-68 % ZLibOption.defaultLevel)))]
-                                }))
-                                  .isNotEmpty))
-                            -13
-                          else
-                            (var1 ? (-((-(var5[56])))) : (var2--)),
-                          (~((~((-((var2++)))))))
-                        ], {
-                          88: ('bV\u{1f600}iqO').toLowerCase(),
-                          42: '(hZ4S',
-                          37: var7[-79],
-                          36: var0
-                        })));
-            }
-          }
-          {
-            int loc0 = 0;
-            do {
-              try {
-                print(foo2(
-                    fld3_1,
-                    (fld3_0[var5[-12]]).codeUnits,
-                    (({
-                              36: var4,
-                              30: '0\u{1f600}EYWqr',
-                              66: 'S',
-                              3: '+J3Gj',
-                              71: '\u{1f600}-q',
-                              13: 'V3QN',
-                              34: ''
-                            } ??
-                            {
-                              54: fld3_0[(var2--)],
-                              74: (foo3_0(
-                                      ((-(var3)) * (0.8613045491468889 + var3)))
-                                  ? var7[78]
-                                  : (((var1 ? (47).isEven : var1) ? true : true)
-                                      ? (var4 ?? 'UzK')
-                                      : 'fH1smd')),
-                              12: '\u2665',
-                              18: 'V'
-                            }) ??
-                        var7)));
-              } catch (exception, stackTrace) {
-                fld3_1 = foo0();
-                for (int loc1 = 0; loc1 < 29; loc1++) {
-                  if (var1) {
-                    {
-                      int loc2 = 0;
-                      do {
-                        var5 = (foo3_0(var3)
-                            ? [
-                                ((--par1) ^ (~(93))),
-                                if ((var3).isFinite)
-                                  for (int loc3 in [
-                                    -5,
-                                    Int32x4.zxyy,
-                                    (true
-                                        ? var5[var5[(var1 ? -23 : var5[68])]]
-                                        : -99),
-                                    ((!(var1))
-                                        ? ((false
-                                                ? var1
-                                                : foo3_0(0.3133865362301862))
-                                            ? Float64List.bytesPerElement
-                                            : [
-                                                Float32x4.yxzx,
-                                                if (var1)
-                                                  (false ? 40 : 85)
-                                                else
-                                                  ((String.fromCharCode((foo3_0(
-                                                                  0.414460580942719)
-                                                              ? var5[-14]
-                                                              : var2)) ==
-                                                          'mII\u{1f600}zkM')
-                                                      ? var5[(~(-51))]
-                                                      : ((var1
-                                                              ? (!(var1))
-                                                              : var1)
-                                                          ? var5[0]
-                                                          : (-(var2))))
-                                              ][5])
-                                        : fld3_2),
-                                    (par1++),
-                                    -72,
-                                    Int32x4.zzxy
-                                  ])
-                                    Int32x4.zyww
-                                else
-                                  Int32x4.wxyz
-                              ]
-                            : [
-                                ...[
-                                  if ((false ? false : var1)) (-(52)),
-                                  (++par1),
-                                  (par1--),
-                                  (-((-([
-                                    (((var0 + fld3_0[(++var2)])).isNotEmpty
-                                        ? Float32x4.yzxw
-                                        : var5[35])
-                                  ][loc0])))),
-                                  (~(-17))
-                                ],
-                                38,
-                                ...[
-                                  (var1 ? (par1++) : -10),
-                                  if (true) -62 else var2,
-                                  if ((!((var3).isFinite)))
-                                    Int32x4.xxzz
-                                  else
-                                    -45
-                                ],
-                                if ((true || false)) (-(-93)),
-                                (--fld3_2),
-                                ([
-                                      (fld3_2--),
-                                      if ((base64UrlEncode(var5) == 'RY'))
-                                        (++fld3_2)
-                                      else
-                                        -9223372032559808383,
-                                      Float32x4.zyxy,
-                                      loc0,
-                                      -55,
-                                      if (('O \u{1f600}e\u2665').isNotEmpty)
-                                        if (var1)
-                                          (--var2)
-                                        else
-                                          for (int loc3 in {
-                                            loc0,
-                                            (~((--var2))),
-                                            (-(-35)),
-                                            Float32x4.xxyw,
-                                            65,
-                                            -4,
-                                            -4194304251,
-                                            -54
-                                          })
-                                            (((0.671280258888436 ==
-                                                        (0.16535430333243706 *
-                                                            0.18316039550464436)) ||
-                                                    var1)
-                                                ? var5[12]
-                                                : (~((--var2))))
-                                      else if (false)
-                                        if (var1) (-(Int32x4.zzwx)) else loc2
-                                      else
-                                        Int32x4.yzyw
-                                    ][loc1] *
-                                    (--par1)),
-                                (-71 * 38)
-                              ]);
-                      } while (++loc2 < 89);
-                    }
-                  } else {
-                    {
-                      int loc2 = 0;
-                      do {
-                        fld3_0 ??= ((((Map.unmodifiable(var7)).isEmpty ||
-                                    (!(({
-                                      11: 'v+MHeiB',
-                                      48: var7[(true
-                                          ? ((var2--) ?? fld3_2)
-                                          : var5[(fld3_2--)])],
-                                      52: '(('
-                                    })
-                                        .isEmpty)))
-                                ? fld3_0
-                                : {
-                                    39: foo1_3(),
-                                    21: 'IXzJ+',
-                                    76: 'K2C#',
-                                    16: ('\u{1f600}Gh' + '#i'),
-                                    62: foo1_3(),
-                                    19: foo1_3(),
-                                    32: par3,
-                                    for (int loc3 in [
-                                      (par1--),
-                                      -66,
-                                      -96,
-                                      -35,
-                                      Float32x4.zzyz
-                                    ])
-                                      72: 'y vxi'
-                                  }) ??
-                            {13: par2});
-                        switch (4096) {
-                          case 3159134388:
-                            {
-                              /// Single-line documentation comment.
-                              {
-                                int loc3 = 0;
-                                do {
-                                  fld3_0 ??= foo1(
-                                      var5,
-                                      ((((true ? par2 : var7[var5[loc1]]))
-                                                  .isNotEmpty
-                                              ? 9
-                                              : -55) !=
-                                          var5[-36]));
-                                  fld3_1 = foo0();
-                                } while (++loc3 < 79);
-                              }
-                            }
-                            break;
-                          case 3159134393:
-                            {
-                              throw Int32x4.zxxw;
-                            }
-                            break;
-                        }
-                      } while (++loc2 < 77);
-                    }
-                  }
-                }
-              }
-            } while (++loc0 < 98);
-          }
-        }
-        break;
-    }
-    /*
-     * Multi-line
-     * comment.
-     */
-    return ((0.7728524536008519).isNaN ? 'BjzeSsJ' : foo1_3());
-  }
-
-  void run() {
-    super.run();
-    var5 ??= var5;
-    print({4294968296});
-  }
-}
-
-main() {
-  int count = 0;
-  try {
-    foo0();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo1(('  MQz').codeUnits, var1);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    foo2(
-        (var6).toSet(),
-        (var1
-            ? [-9223372036854775681, -66, 9223372032559874047, -3, 74]
-            : var5),
-        Map.identity());
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X0().foo0_0(var7);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_0(
-        (false
-            ? {
-                7: 'QMNg',
-                12: 'wzc5-Iq',
-                63: '29an-z',
-                86: 'sF5',
-                59: '\u2665L',
-                43: 'k',
-                62: 'NvF\u{1f600}k',
-                84: 'ZW 1-o'
-              }
-            : var7),
-        {
-          28: '@smXqKl',
-          66: 'oL',
-          if (false) 74: 'B' else 81: 'X',
-          if (false) 18: 'j' else 25: 'N',
-          44: '\u{1f600}lrx8m',
-          20: 'hC',
-          73: 'q',
-          63: '\u{1f600}nE'
-        },
-        0.18875619647922648);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_1((-((++var2))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_2((var1
-        ? (false
-            ? (true ? var7[((!(var1)) ? var5[Int32x4.xxyx] : 3)] : var4)
-            : Uri.encodeComponent(('yd' ?? (var0).padLeft(1, 'Q'))))
-        : var7[-2147483649]));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X1().foo1_3();
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_0(Int32x4.xyyw);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_1((!(((!(var1)) && (!((var1 ? false : var1)))))));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X2().foo2_2(var7, ((-(var5[(--var2)])) << 98));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_0(0.37767598562234317);
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo3_1(
-        -6, var0, (Uri.decodeComponent('yQg') + ((var4 ?? var4) + var0)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().foo1_0(
-        Map.unmodifiable({77: 'hG'}),
-        ((false
-                ? {
-                    88: 'Sv-EbnG',
-                    73: 'G',
-                    46: 'O#',
-                    16: 'm1nf(',
-                    91: 'F',
-                    11: 'Q+O@K',
-                    70: '3q\u2665BJ'
-                  }
-                : Map.identity()) ??
-            {
-              68: 'r',
-              56: 'IH&',
-              31: '9cqu',
-              49: '8ug',
-              84: 'mR2VyC',
-              41: 'gk&(asy'
-            }),
-        (var3 * sin(var3)));
-  } catch (e, st) {
-    count++;
-  }
-  try {
-    X3().run();
-  } catch (e, st) {
-    count++;
-  } finally {}
-  Expect.equals(-47639, var2);
-  Expect.equals(9, count);
-}
diff --git a/tests/language_2/vm/regression_38741.dart b/tests/language_2/vm/regression_38741_test.dart
similarity index 100%
rename from tests/language_2/vm/regression_38741.dart
rename to tests/language_2/vm/regression_38741_test.dart
diff --git a/tests/web/regress/190814734a_test.dart b/tests/web/regress/190814734a_test.dart
new file mode 100644
index 0000000..435d2f1
--- /dev/null
+++ b/tests/web/regress/190814734a_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// dart2jsOptions=--null-assertions
+
+@pragma('dart2js:noInline')
+confuse(x) => x;
+
+class MyObject {
+  // Operator == _not_ overridden.
+}
+
+class MyObject2 {
+  @override
+  bool operator ==(other) => other is MyObject2;
+}
+
+void main() {
+  confuse(MyObject2());
+  print(confuse(MyObject()) == confuse(null));
+}
diff --git a/tests/web/regress/190814734b_test.dart b/tests/web/regress/190814734b_test.dart
new file mode 100644
index 0000000..25fcc5d
--- /dev/null
+++ b/tests/web/regress/190814734b_test.dart
@@ -0,0 +1,22 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+//
+// dart2jsOptions=--null-assertions --enable-asserts
+
+@pragma('dart2js:noInline')
+confuse(x) => x;
+
+class MyObject {
+  // Operator == _not_ overridden.
+}
+
+class MyObject2 {
+  @override
+  bool operator ==(other) => other is MyObject2;
+}
+
+void main() {
+  confuse(MyObject2());
+  print(confuse(MyObject()) == confuse(null));
+}
diff --git a/tools/VERSION b/tools/VERSION
index a1c0feb..ba5c6a0 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 14
 PATCH 0
-PRERELEASE 223
+PRERELEASE 224
 PRERELEASE_PATCH 0
\ No newline at end of file