diff --git a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
index 930f1b0..306c9aa 100644
--- a/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/named_type_builder.dart
@@ -285,6 +285,10 @@
       Uri fileUri,
       TypeAliasBuilder aliasBuilder,
       DartType type) {
+    // Don't report the error in case of InvalidType. An error has already been
+    // reported in this case.
+    if (type is InvalidType) return null;
+
     Message message;
     if (declaration!.isTypeVariable) {
       message =
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index 2950121..77ec205 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -811,7 +811,8 @@
         supertype is TypeVariableBuilder ||
         supertype is DynamicTypeDeclarationBuilder ||
         supertype is VoidTypeDeclarationBuilder ||
-        supertype is NeverTypeDeclarationBuilder) {
+        supertype is NeverTypeDeclarationBuilder ||
+        supertype is TypeAliasBuilder) {
       builder.addSyntheticConstructor(_makeDefaultConstructor(
           builder, constructorReference, tearOffReference));
     } else {
diff --git a/pkg/front_end/lib/src/fasta/source/outline_builder.dart b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
index 47f59d8..358b947 100644
--- a/pkg/front_end/lib/src/fasta/source/outline_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/outline_builder.dart
@@ -2260,7 +2260,7 @@
     List<TypeVariableBuilder>? typeVariables;
     Object? name;
     int charOffset;
-    TypeBuilder? aliasedType;
+    TypeBuilder aliasedType;
     if (equals == null) {
       List<FormalParameterBuilder>? formals =
           pop() as List<FormalParameterBuilder>?;
@@ -2310,6 +2310,14 @@
           // elsewhere.
           addProblem(
               messageTypedefNullableType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNullableType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
         } else {
           // TODO(ahe): We need to start a nested declaration when parsing the
           // formals and return type so we can correctly bind
@@ -2323,18 +2331,40 @@
           aliasedType = type;
         } else {
           addProblem(messageTypedefNotType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
         }
       } else {
+        assert(type is! FunctionTypeBuilder);
         // TODO(ahe): Improve this error message.
-        addProblem(messageTypedefNotFunction, equals.charOffset, equals.length);
-        aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
-            new InvalidTypeDeclarationBuilder(
-                "${name}",
-                messageTypedefNotType.withLocation(
-                    uri, equals.charOffset, equals.length)),
-            const NullabilityBuilder.omitted(),
-            instanceTypeVariableAccess:
-                InstanceTypeVariableAccessState.Allowed);
+        if (type is TypeBuilder) {
+          addProblem(
+              messageTypedefNotFunction, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotFunction.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
+        } else {
+          addProblem(messageTypedefNotType, equals.charOffset, equals.length);
+          aliasedType = new NamedTypeBuilder.fromTypeDeclarationBuilder(
+              new InvalidTypeDeclarationBuilder(
+                  "${name}",
+                  messageTypedefNotType.withLocation(
+                      uri, equals.charOffset, equals.length)),
+              const NullabilityBuilder.omitted(),
+              instanceTypeVariableAccess:
+                  InstanceTypeVariableAccessState.Allowed);
+        }
       }
     }
     List<MetadataBuilder>? metadata = pop() as List<MetadataBuilder>?;
diff --git a/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart b/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart
index 57ae59a..e731acd 100644
--- a/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart
+++ b/pkg/front_end/lib/src/fasta/util/abstracted_ast_nodes.dart
@@ -3,14 +3,14 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 enum Coloring { Untouched, Marked }
 
 abstract class AstNode {
   Map<String, List<AstNode>> scope = {};
   Container? parent;
-  DirectParserASTContent get node;
+  ParserAstNode get node;
   Token get startInclusive;
   Token get endInclusive;
 
@@ -30,7 +30,7 @@
   List<AstNode> _children = [];
   Iterable<AstNode> get children => _children;
 
-  void addChild(AstNode child, Map<DirectParserASTContent, AstNode> map) {
+  void addChild(AstNode child, Map<ParserAstNode, AstNode> map) {
     child.parent = this;
     _children.add(child);
     map[child.node] = child;
@@ -42,9 +42,9 @@
   final Uri uri;
 
   @override
-  final DirectParserASTContent node;
+  final ParserAstNode node;
 
-  final Map<DirectParserASTContent, AstNode> map;
+  final Map<ParserAstNode, AstNode> map;
 
   TopLevel(this.sourceText, this.uri, this.node, this.map);
 
@@ -91,7 +91,7 @@
 
 class Class extends Container {
   @override
-  final DirectParserASTContentTopLevelDeclarationEnd node;
+  final TopLevelDeclarationEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -138,7 +138,7 @@
 
 class Mixin extends Container {
   @override
-  final DirectParserASTContentTopLevelDeclarationEnd node;
+  final TopLevelDeclarationEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -185,7 +185,7 @@
 
 class Extension extends Container {
   @override
-  final DirectParserASTContentTopLevelDeclarationEnd node;
+  final TopLevelDeclarationEnd node;
   final String? name;
   @override
   final Token startInclusive;
@@ -236,7 +236,7 @@
 
 class ClassConstructor extends AstNode {
   @override
-  final DirectParserASTContentClassConstructorEnd node;
+  final ClassConstructorEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -269,7 +269,7 @@
 
 class ClassFactoryMethod extends AstNode {
   @override
-  final DirectParserASTContentClassFactoryMethodEnd node;
+  final ClassFactoryMethodEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -302,7 +302,7 @@
 
 class ClassMethod extends AstNode {
   @override
-  final DirectParserASTContentClassMethodEnd node;
+  final ClassMethodEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -333,7 +333,7 @@
 
 class ExtensionMethod extends AstNode {
   @override
-  final DirectParserASTContentExtensionMethodEnd node;
+  final ExtensionMethodEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -364,7 +364,7 @@
 
 class MixinMethod extends AstNode {
   @override
-  final DirectParserASTContentMixinMethodEnd node;
+  final MixinMethodEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -395,7 +395,7 @@
 
 class Enum extends AstNode {
   @override
-  final DirectParserASTContentEnumEnd node;
+  final EnumEnd node;
   final String name;
   final List<String> members;
   @override
@@ -432,7 +432,7 @@
 
 class Import extends AstNode {
   @override
-  final DirectParserASTContentImportEnd node;
+  final ImportEnd node;
   final Uri firstUri;
   final List<Uri>? conditionalUris;
   final String? asName;
@@ -475,7 +475,7 @@
 
 class Export extends AstNode {
   @override
-  final DirectParserASTContentExportEnd node;
+  final ExportEnd node;
   final Uri firstUri;
   final List<Uri>? conditionalUris;
   @override
@@ -510,7 +510,7 @@
 
 class Part extends AstNode {
   @override
-  final DirectParserASTContentPartEnd node;
+  final PartEnd node;
   final Uri uri;
   @override
   final Token startInclusive;
@@ -541,7 +541,7 @@
 
 class TopLevelFields extends AstNode {
   @override
-  final DirectParserASTContentTopLevelFieldsEnd node;
+  final TopLevelFieldsEnd node;
   final List<String> names;
   @override
   final Token startInclusive;
@@ -576,7 +576,7 @@
 
 class TopLevelMethod extends AstNode {
   @override
-  final DirectParserASTContentTopLevelMethodEnd node;
+  final TopLevelMethodEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -607,7 +607,7 @@
 
 class Typedef extends AstNode {
   @override
-  final DirectParserASTContentTypedefEnd node;
+  final TypedefEnd node;
   final String name;
   @override
   final Token startInclusive;
@@ -638,7 +638,7 @@
 
 class ClassFields extends AstNode {
   @override
-  final DirectParserASTContentClassFieldsEnd node;
+  final ClassFieldsEnd node;
   final List<String> names;
   @override
   final Token startInclusive;
@@ -673,7 +673,7 @@
 
 class MixinFields extends AstNode {
   @override
-  final DirectParserASTContentMixinFieldsEnd node;
+  final MixinFieldsEnd node;
   final List<String> names;
   @override
   final Token startInclusive;
@@ -708,7 +708,7 @@
 
 class ExtensionFields extends AstNode {
   @override
-  final DirectParserASTContentExtensionFieldsEnd node;
+  final ExtensionFieldsEnd node;
   final List<String> names;
   @override
   final Token startInclusive;
@@ -744,7 +744,7 @@
 
 class Metadata extends AstNode {
   @override
-  final DirectParserASTContentMetadataEnd node;
+  final MetadataEnd node;
   @override
   final Token startInclusive;
   @override
@@ -774,7 +774,7 @@
 
 class LibraryName extends AstNode {
   @override
-  final DirectParserASTContentLibraryNameEnd node;
+  final LibraryNameEnd node;
   @override
   final Token startInclusive;
   @override
@@ -804,7 +804,7 @@
 
 class PartOf extends AstNode {
   @override
-  final DirectParserASTContentPartOfEnd node;
+  final PartOfEnd node;
   @override
   final Token startInclusive;
   @override
@@ -835,7 +835,7 @@
 
 class LanguageVersion extends AstNode {
   @override
-  final DirectParserASTContent node;
+  final ParserAstNode node;
   @override
   final Token startInclusive;
   @override
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
deleted file mode 100644
index a5bb20a..0000000
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast.dart
+++ /dev/null
@@ -1,1618 +0,0 @@
-// Copyright (c) 2020, 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:typed_data' show Uint8List;
-
-import 'dart:io' show File;
-
-import 'package:_fe_analyzer_shared/src/messages/codes.dart';
-import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
-    show ScannerConfiguration;
-
-import 'package:_fe_analyzer_shared/src/parser/parser.dart'
-    show ClassMemberParser, Parser;
-
-import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
-    show Utf8BytesScanner;
-
-import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
-
-import 'package:_fe_analyzer_shared/src/parser/listener.dart'
-    show UnescapeErrorListener;
-
-import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
-
-import 'package:_fe_analyzer_shared/src/parser/quote.dart' show unescapeString;
-
-import '../source/diet_parser.dart';
-
-import 'direct_parser_ast_helper.dart';
-
-DirectParserASTContentCompilationUnitEnd getAST(List<int> rawBytes,
-    {bool includeBody: true,
-    bool includeComments: false,
-    bool enableExtensionMethods: false,
-    bool enableNonNullable: false,
-    bool enableTripleShift: false,
-    List<Token>? languageVersionsSeen}) {
-  Uint8List bytes = new Uint8List(rawBytes.length + 1);
-  bytes.setRange(0, rawBytes.length, rawBytes);
-
-  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
-      enableExtensionMethods: enableExtensionMethods,
-      enableNonNullable: enableNonNullable,
-      enableTripleShift: enableTripleShift);
-
-  Utf8BytesScanner scanner = new Utf8BytesScanner(
-    bytes,
-    includeComments: includeComments,
-    configuration: scannerConfiguration,
-    languageVersionChanged: (scanner, languageVersion) {
-      // For now don't do anything, but having it (making it non-null) means the
-      // configuration won't be reset.
-      languageVersionsSeen?.add(languageVersion);
-    },
-  );
-  Token firstToken = scanner.tokenize();
-  // ignore: unnecessary_null_comparison
-  if (firstToken == null) {
-    throw "firstToken is null";
-  }
-
-  DirectParserASTListener listener = new DirectParserASTListener();
-  Parser parser;
-  if (includeBody) {
-    parser = new Parser(listener,
-        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-  } else {
-    parser = new ClassMemberParser(listener,
-        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
-  }
-  parser.parseUnit(firstToken);
-  return listener.data.single as DirectParserASTContentCompilationUnitEnd;
-}
-
-/// Best-effort visitor for DirectParserASTContent that visits top-level entries
-/// and class members only (i.e. no bodies, no field initializer content, no
-/// names etc).
-class DirectParserASTContentVisitor {
-  void accept(DirectParserASTContent node) {
-    if (node is DirectParserASTContentCompilationUnitEnd ||
-        node is DirectParserASTContentTopLevelDeclarationEnd ||
-        node is DirectParserASTContentClassOrMixinOrExtensionBodyEnd ||
-        node is DirectParserASTContentMemberEnd) {
-      visitChildren(node);
-      return;
-    }
-
-    if (node.type == DirectParserASTType.BEGIN) {
-      // Ignored. These are basically just dummy nodes anyway.
-      assert(node.children == null);
-      return;
-    }
-    if (node.type == DirectParserASTType.HANDLE) {
-      // Ignored at least for know.
-      assert(node.children == null);
-      return;
-    }
-    if (node is DirectParserASTContentTypeVariablesEnd ||
-        node is DirectParserASTContentTypeArgumentsEnd ||
-        node is DirectParserASTContentTypeListEnd ||
-        node is DirectParserASTContentFunctionTypeEnd ||
-        node is DirectParserASTContentBlockEnd) {
-      // Ignored at least for know.
-      return;
-    }
-    if (node is DirectParserASTContentMetadataStarEnd) {
-      DirectParserASTContentMetadataStarEnd metadata = node;
-      visitMetadataStar(metadata);
-      return;
-    }
-    if (node is DirectParserASTContentTypedefEnd) {
-      DirectParserASTContentTypedefEnd typedefDecl = node;
-      visitTypedef(
-          typedefDecl, typedefDecl.typedefKeyword, typedefDecl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassDeclarationEnd) {
-      DirectParserASTContentClassDeclarationEnd cls = node;
-      visitClass(cls, cls.beginToken, cls.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentTopLevelMethodEnd) {
-      DirectParserASTContentTopLevelMethodEnd method = node;
-      visitTopLevelMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassMethodEnd) {
-      DirectParserASTContentClassMethodEnd method = node;
-      visitClassMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionMethodEnd) {
-      DirectParserASTContentExtensionMethodEnd method = node;
-      visitExtensionMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinMethodEnd) {
-      DirectParserASTContentMixinMethodEnd method = node;
-      visitMixinMethod(method, method.beginToken, method.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentImportEnd) {
-      DirectParserASTContentImportEnd import = node;
-      visitImport(import, import.importKeyword, import.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentExportEnd) {
-      DirectParserASTContentExportEnd export = node;
-      visitExport(export, export.exportKeyword, export.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentTopLevelFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentTopLevelFieldsEnd fields = node;
-      visitTopLevelFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentClassFieldsEnd fields = node;
-      visitClassFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentExtensionFieldsEnd fields = node;
-      visitExtensionFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinFieldsEnd) {
-      // TODO(jensj): Possibly this could go into more details too
-      // (e.g. to split up a field declaration).
-      DirectParserASTContentMixinFieldsEnd fields = node;
-      visitMixinFields(fields, fields.beginToken, fields.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentNamedMixinApplicationEnd) {
-      DirectParserASTContentNamedMixinApplicationEnd namedMixin = node;
-      visitNamedMixin(namedMixin, namedMixin.begin, namedMixin.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMixinDeclarationEnd) {
-      DirectParserASTContentMixinDeclarationEnd declaration = node;
-      visitMixin(declaration, declaration.mixinKeyword, declaration.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentEnumEnd) {
-      DirectParserASTContentEnumEnd declaration = node;
-      visitEnum(declaration, declaration.enumKeyword,
-          declaration.leftBrace.endGroup!);
-      return;
-    }
-    if (node is DirectParserASTContentLibraryNameEnd) {
-      DirectParserASTContentLibraryNameEnd name = node;
-      visitLibraryName(name, name.libraryKeyword, name.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentPartEnd) {
-      DirectParserASTContentPartEnd part = node;
-      visitPart(part, part.partKeyword, part.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentPartOfEnd) {
-      DirectParserASTContentPartOfEnd partOf = node;
-      visitPartOf(partOf, partOf.partKeyword, partOf.semicolon);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionDeclarationEnd) {
-      DirectParserASTContentExtensionDeclarationEnd ext = node;
-      visitExtension(ext, ext.extensionKeyword, ext.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassConstructorEnd) {
-      DirectParserASTContentClassConstructorEnd decl = node;
-      visitClassConstructor(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionConstructorEnd) {
-      DirectParserASTContentExtensionConstructorEnd decl = node;
-      visitExtensionConstructor(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentClassFactoryMethodEnd) {
-      DirectParserASTContentClassFactoryMethodEnd decl = node;
-      visitClassFactoryMethod(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentExtensionFactoryMethodEnd) {
-      DirectParserASTContentExtensionFactoryMethodEnd decl = node;
-      visitExtensionFactoryMethod(decl, decl.beginToken, decl.endToken);
-      return;
-    }
-    if (node is DirectParserASTContentMetadataEnd) {
-      DirectParserASTContentMetadataEnd decl = node;
-      // TODO(jensj): endToken is not part of the metadata! It's the first token
-      // of the next thing.
-      visitMetadata(decl, decl.beginToken, decl.endToken.previous!);
-      return;
-    }
-
-    throw "Unknown: $node (${node.runtimeType} @ ${node.what})";
-  }
-
-  void visitChildren(DirectParserASTContent node) {
-    if (node.children == null) return;
-    final int numChildren = node.children!.length;
-    for (int i = 0; i < numChildren; i++) {
-      DirectParserASTContent child = node.children![i];
-      accept(child);
-    }
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token? endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTypedef(DirectParserASTContentTypedefEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitMetadataStar(DirectParserASTContentMetadataStarEnd node) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitClass(DirectParserASTContentClassDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTopLevelMethod(DirectParserASTContentTopLevelMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassMethod(DirectParserASTContentClassMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionMethod(DirectParserASTContentExtensionMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMixinMethod(DirectParserASTContentMixinMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitTopLevelFields(DirectParserASTContentTopLevelFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassFields(DirectParserASTContentClassFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionFields(DirectParserASTContentExtensionFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMixinFields(DirectParserASTContentMixinFieldsEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitNamedMixin(DirectParserASTContentNamedMixinApplicationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitMixin(DirectParserASTContentMixinDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitEnum(DirectParserASTContentEnumEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitLibraryName(DirectParserASTContentLibraryNameEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitPart(DirectParserASTContentPartEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitPartOf(DirectParserASTContentPartOfEnd node, Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers can call visitChildren on this node.
-  void visitExtension(DirectParserASTContentExtensionDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    visitChildren(node);
-  }
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassConstructor(DirectParserASTContentClassConstructorEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionConstructor(
-      DirectParserASTContentExtensionConstructorEnd node,
-      Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitClassFactoryMethod(DirectParserASTContentClassFactoryMethodEnd node,
-      Token startInclusive, Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitExtensionFactoryMethod(
-      DirectParserASTContentExtensionFactoryMethodEnd node,
-      Token startInclusive,
-      Token endInclusive) {}
-
-  /// Note: Implementers are NOT expected to call visitChildren on this node.
-  void visitMetadata(DirectParserASTContentMetadataEnd node,
-      Token startInclusive, Token endInclusive) {}
-}
-
-extension GeneralASTContentExtension on DirectParserASTContent {
-  bool isClass() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentClassDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentClassDeclarationEnd asClass() {
-    if (!isClass()) throw "Not class";
-    return children!.last as DirectParserASTContentClassDeclarationEnd;
-  }
-
-  bool isImport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentImportEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentImportEnd asImport() {
-    if (!isImport()) throw "Not import";
-    return children!.last as DirectParserASTContentImportEnd;
-  }
-
-  bool isExport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentExportEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentExportEnd asExport() {
-    if (!isExport()) throw "Not export";
-    return children!.last as DirectParserASTContentExportEnd;
-  }
-
-  bool isEnum() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentEnumEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentEnumEnd asEnum() {
-    if (!isEnum()) throw "Not enum";
-    return children!.last as DirectParserASTContentEnumEnd;
-  }
-
-  bool isTypedef() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTypedefEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTypedefEnd asTypedef() {
-    if (!isTypedef()) throw "Not typedef";
-    return children!.last as DirectParserASTContentTypedefEnd;
-  }
-
-  bool isScript() {
-    if (this is! DirectParserASTContentScriptHandle) {
-      return false;
-    }
-    return true;
-  }
-
-  DirectParserASTContentScriptHandle asScript() {
-    if (!isScript()) throw "Not script";
-    return this as DirectParserASTContentScriptHandle;
-  }
-
-  bool isExtension() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentExtensionDeclarationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentExtensionDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentExtensionDeclarationEnd asExtension() {
-    if (!isExtension()) throw "Not extension";
-    return children!.last as DirectParserASTContentExtensionDeclarationEnd;
-  }
-
-  bool isInvalidTopLevelDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last
-        is! DirectParserASTContentInvalidTopLevelDeclarationHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isRecoverableError() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentRecoverableErrorHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isRecoverImport() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentRecoverImportHandle) {
-      return false;
-    }
-
-    return true;
-  }
-
-  bool isMixinDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentMixinDeclarationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentMixinDeclarationEnd asMixinDeclaration() {
-    if (!isMixinDeclaration()) throw "Not mixin declaration";
-    return children!.last as DirectParserASTContentMixinDeclarationEnd;
-  }
-
-  bool isNamedMixinDeclaration() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        // ignore: lines_longer_than_80_chars
-        is! DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentNamedMixinApplicationEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentNamedMixinApplicationEnd asNamedMixinDeclaration() {
-    if (!isNamedMixinDeclaration()) throw "Not named mixin declaration";
-    return children!.last as DirectParserASTContentNamedMixinApplicationEnd;
-  }
-
-  bool isTopLevelMethod() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTopLevelMethodEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTopLevelMethodEnd asTopLevelMethod() {
-    if (!isTopLevelMethod()) throw "Not top level method";
-    return children!.last as DirectParserASTContentTopLevelMethodEnd;
-  }
-
-  bool isTopLevelFields() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentTopLevelMemberBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentTopLevelFieldsEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentTopLevelFieldsEnd asTopLevelFields() {
-    if (!isTopLevelFields()) throw "Not top level fields";
-    return children!.last as DirectParserASTContentTopLevelFieldsEnd;
-  }
-
-  bool isLibraryName() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentLibraryNameEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentLibraryNameEnd asLibraryName() {
-    if (!isLibraryName()) throw "Not library name";
-    return children!.last as DirectParserASTContentLibraryNameEnd;
-  }
-
-  bool isPart() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentPartEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentPartEnd asPart() {
-    if (!isPart()) throw "Not part";
-    return children!.last as DirectParserASTContentPartEnd;
-  }
-
-  bool isPartOf() {
-    if (this is! DirectParserASTContentTopLevelDeclarationEnd) {
-      return false;
-    }
-    if (children!.first
-        is! DirectParserASTContentUncategorizedTopLevelDeclarationBegin) {
-      return false;
-    }
-    if (children!.last is! DirectParserASTContentPartOfEnd) {
-      return false;
-    }
-
-    return true;
-  }
-
-  DirectParserASTContentPartOfEnd asPartOf() {
-    if (!isPartOf()) throw "Not part of";
-    return children!.last as DirectParserASTContentPartOfEnd;
-  }
-
-  bool isMetadata() {
-    if (this is! DirectParserASTContentMetadataStarEnd) {
-      return false;
-    }
-    if (children!.first is! DirectParserASTContentMetadataStarBegin) {
-      return false;
-    }
-    return true;
-  }
-
-  DirectParserASTContentMetadataStarEnd asMetadata() {
-    if (!isMetadata()) throw "Not metadata";
-    return this as DirectParserASTContentMetadataStarEnd;
-  }
-
-  bool isFunctionBody() {
-    if (this is DirectParserASTContentBlockFunctionBodyEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentBlockFunctionBodyEnd asFunctionBody() {
-    if (!isFunctionBody()) throw "Not function body";
-    return this as DirectParserASTContentBlockFunctionBodyEnd;
-  }
-
-  List<E> recursivelyFind<E extends DirectParserASTContent>() {
-    Set<E> result = {};
-    _recursivelyFindInternal(this, result);
-    return result.toList();
-  }
-
-  static void _recursivelyFindInternal<E extends DirectParserASTContent>(
-      DirectParserASTContent node, Set<E> result) {
-    if (node is E) {
-      result.add(node);
-      return;
-    }
-    if (node.children == null) return;
-    for (DirectParserASTContent child in node.children!) {
-      _recursivelyFindInternal(child, result);
-    }
-  }
-
-  void debugDumpNodeRecursively({String indent = ""}) {
-    print("$indent${runtimeType} (${what}) "
-        "(${deprecatedArguments})");
-    if (children == null) return;
-    for (DirectParserASTContent child in children!) {
-      child.debugDumpNodeRecursively(indent: "  $indent");
-    }
-  }
-}
-
-extension MetadataStarExtension on DirectParserASTContentMetadataStarEnd {
-  List<DirectParserASTContentMetadataEnd> getMetadataEntries() {
-    List<DirectParserASTContentMetadataEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (topLevel is! DirectParserASTContentMetadataEnd) continue;
-      result.add(topLevel);
-    }
-    return result;
-  }
-}
-
-extension CompilationUnitExtension on DirectParserASTContentCompilationUnitEnd {
-  List<DirectParserASTContentTopLevelDeclarationEnd> getClasses() {
-    List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isClass()) continue;
-      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentTopLevelDeclarationEnd> getMixinDeclarations() {
-    List<DirectParserASTContentTopLevelDeclarationEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isMixinDeclaration()) continue;
-      result.add(topLevel as DirectParserASTContentTopLevelDeclarationEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentImportEnd> getImports() {
-    List<DirectParserASTContentImportEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isImport()) continue;
-      result.add(topLevel.children!.last as DirectParserASTContentImportEnd);
-    }
-    return result;
-  }
-
-  List<DirectParserASTContentExportEnd> getExports() {
-    List<DirectParserASTContentExportEnd> result = [];
-    for (DirectParserASTContent topLevel in children!) {
-      if (!topLevel.isExport()) continue;
-      result.add(topLevel.children!.last as DirectParserASTContentExportEnd);
-    }
-    return result;
-  }
-
-  // List<DirectParserASTContentMetadataStarEnd> getMetadata() {
-  //   List<DirectParserASTContentMetadataStarEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isMetadata()) continue;
-  //     result.add(topLevel);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentEnumEnd> getEnums() {
-  //   List<DirectParserASTContentEnumEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isEnum()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentFunctionTypeAliasEnd> getTypedefs() {
-  //   List<DirectParserASTContentFunctionTypeAliasEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isTypedef()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentMixinDeclarationEnd> getMixinDeclarations() {
-  //   List<DirectParserASTContentMixinDeclarationEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isMixinDeclaration()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  // List<DirectParserASTContentTopLevelMethodEnd> getTopLevelMethods() {
-  //   List<DirectParserASTContentTopLevelMethodEnd> result = [];
-  //   for (DirectParserASTContent topLevel in children) {
-  //     if (!topLevel.isTopLevelMethod()) continue;
-  //     result.add(topLevel.children.last);
-  //   }
-  //   return result;
-  // }
-
-  DirectParserASTContentCompilationUnitBegin getBegin() {
-    return children!.first as DirectParserASTContentCompilationUnitBegin;
-  }
-}
-
-extension TopLevelDeclarationExtension
-    on DirectParserASTContentTopLevelDeclarationEnd {
-  DirectParserASTContentIdentifierHandle getIdentifier() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) return child;
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassDeclarationEnd getClassDeclaration() {
-    if (!isClass()) {
-      throw "Not a class";
-    }
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassDeclarationEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-}
-
-extension MixinDeclarationExtension
-    on DirectParserASTContentMixinDeclarationEnd {
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-      getClassOrMixinOrExtensionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinOrExtensionBodyEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-}
-
-extension ClassDeclarationExtension
-    on DirectParserASTContentClassDeclarationEnd {
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-      getClassOrMixinOrExtensionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinOrExtensionBodyEnd) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassExtendsHandle getClassExtends() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassExtendsHandle) return child;
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassOrMixinImplementsHandle getClassImplements() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassOrMixinImplementsHandle) {
-        return child;
-      }
-    }
-    throw "Not found.";
-  }
-
-  DirectParserASTContentClassWithClauseHandle? getClassWithClause() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentClassWithClauseHandle) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension ClassOrMixinBodyExtension
-    on DirectParserASTContentClassOrMixinOrExtensionBodyEnd {
-  List<DirectParserASTContentMemberEnd> getMembers() {
-    List<DirectParserASTContentMemberEnd> members = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentMemberEnd) {
-        members.add(child);
-      }
-    }
-    return members;
-  }
-}
-
-extension MemberExtension on DirectParserASTContentMemberEnd {
-  bool isClassConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassConstructorEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassConstructorEnd getClassConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassConstructorEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFactoryMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassFactoryMethodEnd getClassFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFactoryMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFieldsEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassFieldsEnd getClassFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassFieldsEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFieldsEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinFieldsEnd getMixinFields() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFieldsEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinMethodEnd getMixinMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFactoryMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinFactoryMethodEnd getMixinFactoryMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinFactoryMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isMixinConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinConstructorEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentMixinConstructorEnd getMixinConstructor() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentMixinConstructorEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassMethodEnd) return true;
-    return false;
-  }
-
-  DirectParserASTContentClassMethodEnd getClassMethod() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentClassMethodEnd) return child;
-    throw "Not found";
-  }
-
-  bool isClassRecoverableError() {
-    DirectParserASTContent child = children![1];
-    if (child is DirectParserASTContentRecoverableErrorHandle) return true;
-    return false;
-  }
-}
-
-extension MixinFieldsExtension on DirectParserASTContentMixinFieldsEnd {
-  List<DirectParserASTContentIdentifierHandle> getFieldIdentifiers() {
-    int countLeft = count;
-    List<DirectParserASTContentIdentifierHandle>? identifiers;
-    for (int i = children!.length - 1; i >= 0; i--) {
-      DirectParserASTContent child = children![i];
-      if (child is DirectParserASTContentIdentifierHandle &&
-          child.context == IdentifierContext.fieldDeclaration) {
-        countLeft--;
-        if (identifiers == null) {
-          identifiers = new List<DirectParserASTContentIdentifierHandle>.filled(
-              count, child);
-        } else {
-          identifiers[countLeft] = child;
-        }
-        if (countLeft == 0) break;
-      }
-    }
-    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
-    return identifiers ?? [];
-  }
-}
-
-extension ExtensionFieldsExtension on DirectParserASTContentExtensionFieldsEnd {
-  List<DirectParserASTContentIdentifierHandle> getFieldIdentifiers() {
-    int countLeft = count;
-    List<DirectParserASTContentIdentifierHandle>? identifiers;
-    for (int i = children!.length - 1; i >= 0; i--) {
-      DirectParserASTContent child = children![i];
-      if (child is DirectParserASTContentIdentifierHandle &&
-          child.context == IdentifierContext.fieldDeclaration) {
-        countLeft--;
-        if (identifiers == null) {
-          identifiers = new List<DirectParserASTContentIdentifierHandle>.filled(
-              count, child);
-        } else {
-          identifiers[countLeft] = child;
-        }
-        if (countLeft == 0) break;
-      }
-    }
-    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
-    return identifiers ?? [];
-  }
-}
-
-extension ClassFieldsExtension on DirectParserASTContentClassFieldsEnd {
-  List<DirectParserASTContentIdentifierHandle> getFieldIdentifiers() {
-    int countLeft = count;
-    List<DirectParserASTContentIdentifierHandle>? identifiers;
-    for (int i = children!.length - 1; i >= 0; i--) {
-      DirectParserASTContent child = children![i];
-      if (child is DirectParserASTContentIdentifierHandle &&
-          child.context == IdentifierContext.fieldDeclaration) {
-        countLeft--;
-        if (identifiers == null) {
-          identifiers = new List<DirectParserASTContentIdentifierHandle>.filled(
-              count, child);
-        } else {
-          identifiers[countLeft] = child;
-        }
-        if (countLeft == 0) break;
-      }
-    }
-    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
-    return identifiers ?? [];
-  }
-
-  DirectParserASTContentTypeHandle? getFirstType() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentTypeHandle) return child;
-    }
-    return null;
-  }
-
-  DirectParserASTContentFieldInitializerEnd? getFieldInitializer() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFieldInitializerEnd) return child;
-    }
-    return null;
-  }
-}
-
-extension EnumExtension on DirectParserASTContentEnumEnd {
-  List<DirectParserASTContentIdentifierHandle> getIdentifiers() {
-    List<DirectParserASTContentIdentifierHandle> ids = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) ids.add(child);
-    }
-    return ids;
-  }
-}
-
-extension ExtensionDeclarationExtension
-    on DirectParserASTContentExtensionDeclarationEnd {
-  List<DirectParserASTContentIdentifierHandle> getIdentifiers() {
-    List<DirectParserASTContentIdentifierHandle> ids = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) ids.add(child);
-    }
-    return ids;
-  }
-}
-
-extension TopLevelMethodExtension on DirectParserASTContentTopLevelMethodEnd {
-  DirectParserASTContentIdentifierHandle getNameIdentifier() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) {
-        if (child.context == IdentifierContext.topLevelFunctionDeclaration) {
-          return child;
-        }
-      }
-    }
-    throw "Didn't find the name identifier!";
-  }
-}
-
-extension TypedefExtension on DirectParserASTContentTypedefEnd {
-  DirectParserASTContentIdentifierHandle getNameIdentifier() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) {
-        if (child.context == IdentifierContext.typedefDeclaration) {
-          return child;
-        }
-      }
-    }
-    throw "Didn't find the name identifier!";
-  }
-}
-
-extension ImportExtension on DirectParserASTContentImportEnd {
-  DirectParserASTContentIdentifierHandle? getImportPrefix() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) {
-        if (child.context == IdentifierContext.importPrefixDeclaration) {
-          return child;
-        }
-      }
-    }
-  }
-
-  String getImportUriString() {
-    StringBuffer sb = new StringBuffer();
-    bool foundOne = false;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentLiteralStringEnd) {
-        DirectParserASTContentLiteralStringBegin uri =
-            child.children!.single as DirectParserASTContentLiteralStringBegin;
-        sb.write(unescapeString(
-            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
-        foundOne = true;
-      }
-    }
-    if (!foundOne) throw "Didn't find any";
-    return sb.toString();
-  }
-
-  List<String>? getConditionalImportUriStrings() {
-    List<String>? result;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentConditionalUrisEnd) {
-        for (DirectParserASTContent child2 in child.children!) {
-          if (child2 is DirectParserASTContentConditionalUriEnd) {
-            DirectParserASTContentLiteralStringEnd end =
-                child2.children!.last as DirectParserASTContentLiteralStringEnd;
-            DirectParserASTContentLiteralStringBegin uri = end.children!.single
-                as DirectParserASTContentLiteralStringBegin;
-            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
-                const UnescapeErrorListenerDummy()));
-          }
-        }
-        return result;
-      }
-    }
-    return result;
-  }
-}
-
-extension ExportExtension on DirectParserASTContentExportEnd {
-  String getExportUriString() {
-    StringBuffer sb = new StringBuffer();
-    bool foundOne = false;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentLiteralStringEnd) {
-        DirectParserASTContentLiteralStringBegin uri =
-            child.children!.single as DirectParserASTContentLiteralStringBegin;
-        sb.write(unescapeString(
-            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
-        foundOne = true;
-      }
-    }
-    if (!foundOne) throw "Didn't find any";
-    return sb.toString();
-  }
-
-  List<String>? getConditionalExportUriStrings() {
-    List<String>? result;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentConditionalUrisEnd) {
-        for (DirectParserASTContent child2 in child.children!) {
-          if (child2 is DirectParserASTContentConditionalUriEnd) {
-            DirectParserASTContentLiteralStringEnd end =
-                child2.children!.last as DirectParserASTContentLiteralStringEnd;
-            DirectParserASTContentLiteralStringBegin uri = end.children!.single
-                as DirectParserASTContentLiteralStringBegin;
-            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
-                const UnescapeErrorListenerDummy()));
-          }
-        }
-        return result;
-      }
-    }
-    return result;
-  }
-}
-
-extension PartExtension on DirectParserASTContentPartEnd {
-  String getPartUriString() {
-    StringBuffer sb = new StringBuffer();
-    bool foundOne = false;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentLiteralStringEnd) {
-        DirectParserASTContentLiteralStringBegin uri =
-            child.children!.single as DirectParserASTContentLiteralStringBegin;
-        sb.write(unescapeString(
-            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
-        foundOne = true;
-      }
-    }
-    if (!foundOne) throw "Didn't find any";
-    return sb.toString();
-  }
-}
-
-class UnescapeErrorListenerDummy implements UnescapeErrorListener {
-  const UnescapeErrorListenerDummy();
-
-  @override
-  void handleUnescapeError(
-      Message message, covariant location, int offset, int length) {
-    // Purposely doesn't do anything.
-  }
-}
-
-extension TopLevelFieldsExtension on DirectParserASTContentTopLevelFieldsEnd {
-  List<DirectParserASTContentIdentifierHandle> getFieldIdentifiers() {
-    int countLeft = count;
-    List<DirectParserASTContentIdentifierHandle>? identifiers;
-    for (int i = children!.length - 1; i >= 0; i--) {
-      DirectParserASTContent child = children![i];
-      if (child is DirectParserASTContentIdentifierHandle &&
-          child.context == IdentifierContext.topLevelVariableDeclaration) {
-        countLeft--;
-        if (identifiers == null) {
-          identifiers = new List<DirectParserASTContentIdentifierHandle>.filled(
-              count, child);
-        } else {
-          identifiers[countLeft] = child;
-        }
-        if (countLeft == 0) break;
-      }
-    }
-    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
-    return identifiers ?? [];
-  }
-}
-
-extension ClassMethodExtension on DirectParserASTContentClassMethodEnd {
-  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentBlockFunctionBodyEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-
-  String getNameIdentifier() {
-    bool foundType = false;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentTypeHandle ||
-          child is DirectParserASTContentNoTypeHandle ||
-          child is DirectParserASTContentVoidKeywordHandle ||
-          child is DirectParserASTContentFunctionTypeEnd) {
-        foundType = true;
-      }
-      if (foundType && child is DirectParserASTContentIdentifierHandle) {
-        return child.token.lexeme;
-      } else if (foundType &&
-          child is DirectParserASTContentOperatorNameHandle) {
-        return child.token.lexeme;
-      }
-    }
-    throw "No identifier found: $children";
-  }
-}
-
-extension MixinMethodExtension on DirectParserASTContentMixinMethodEnd {
-  String getNameIdentifier() {
-    bool foundType = false;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentTypeHandle ||
-          child is DirectParserASTContentNoTypeHandle ||
-          child is DirectParserASTContentVoidKeywordHandle) {
-        foundType = true;
-      }
-      if (foundType && child is DirectParserASTContentIdentifierHandle) {
-        return child.token.lexeme;
-      } else if (foundType &&
-          child is DirectParserASTContentOperatorNameHandle) {
-        return child.token.lexeme;
-      }
-    }
-    throw "No identifier found: $children";
-  }
-}
-
-extension ExtensionMethodExtension on DirectParserASTContentExtensionMethodEnd {
-  String getNameIdentifier() {
-    bool foundType = false;
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentTypeHandle ||
-          child is DirectParserASTContentNoTypeHandle ||
-          child is DirectParserASTContentVoidKeywordHandle) {
-        foundType = true;
-      }
-      if (foundType && child is DirectParserASTContentIdentifierHandle) {
-        return child.token.lexeme;
-      } else if (foundType &&
-          child is DirectParserASTContentOperatorNameHandle) {
-        return child.token.lexeme;
-      }
-    }
-    throw "No identifier found: $children";
-  }
-}
-
-extension ClassFactoryMethodExtension
-    on DirectParserASTContentClassFactoryMethodEnd {
-  List<DirectParserASTContentIdentifierHandle> getIdentifiers() {
-    List<DirectParserASTContentIdentifierHandle> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) {
-        result.add(child);
-      } else if (child is DirectParserASTContentFormalParametersEnd) {
-        break;
-      }
-    }
-    return result;
-  }
-}
-
-extension ClassConstructorExtension
-    on DirectParserASTContentClassConstructorEnd {
-  DirectParserASTContentFormalParametersEnd getFormalParameters() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParametersEnd) {
-        return child;
-      }
-    }
-    throw "Not found";
-  }
-
-  DirectParserASTContentInitializersEnd? getInitializers() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentInitializersEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-
-  DirectParserASTContentBlockFunctionBodyEnd? getBlockFunctionBody() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentBlockFunctionBodyEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-
-  List<DirectParserASTContentIdentifierHandle> getIdentifiers() {
-    List<DirectParserASTContentIdentifierHandle> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentIdentifierHandle) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-}
-
-extension FormalParametersExtension
-    on DirectParserASTContentFormalParametersEnd {
-  List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
-    List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParameterEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-
-  DirectParserASTContentOptionalFormalParametersEnd?
-      getOptionalFormalParameters() {
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentOptionalFormalParametersEnd) {
-        return child;
-      }
-    }
-    return null;
-  }
-}
-
-extension FormalParameterExtension on DirectParserASTContentFormalParameterEnd {
-  DirectParserASTContentFormalParameterBegin getBegin() {
-    return children!.first as DirectParserASTContentFormalParameterBegin;
-  }
-}
-
-extension OptionalFormalParametersExtension
-    on DirectParserASTContentOptionalFormalParametersEnd {
-  List<DirectParserASTContentFormalParameterEnd> getFormalParameters() {
-    List<DirectParserASTContentFormalParameterEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentFormalParameterEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-}
-
-extension InitializersExtension on DirectParserASTContentInitializersEnd {
-  List<DirectParserASTContentInitializerEnd> getInitializers() {
-    List<DirectParserASTContentInitializerEnd> result = [];
-    for (DirectParserASTContent child in children!) {
-      if (child is DirectParserASTContentInitializerEnd) {
-        result.add(child);
-      }
-    }
-    return result;
-  }
-
-  DirectParserASTContentInitializersBegin getBegin() {
-    return children!.first as DirectParserASTContentInitializersBegin;
-  }
-}
-
-extension InitializerExtension on DirectParserASTContentInitializerEnd {
-  DirectParserASTContentInitializerBegin getBegin() {
-    return children!.first as DirectParserASTContentInitializerBegin;
-  }
-}
-
-void main(List<String> args) {
-  File f = new File(args[0]);
-  Uint8List data = f.readAsBytesSync();
-  DirectParserASTContent ast = getAST(data);
-  if (args.length > 1 && args[1] == "--benchmark") {
-    Stopwatch stopwatch = new Stopwatch()..start();
-    int numRuns = 100;
-    for (int i = 0; i < numRuns; i++) {
-      DirectParserASTContent ast2 = getAST(data);
-      if (ast.what != ast2.what) {
-        throw "Not the same result every time";
-      }
-    }
-    stopwatch.stop();
-    print("First $numRuns took ${stopwatch.elapsedMilliseconds} ms "
-        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
-    stopwatch = new Stopwatch()..start();
-    numRuns = 2500;
-    for (int i = 0; i < numRuns; i++) {
-      DirectParserASTContent ast2 = getAST(data);
-      if (ast.what != ast2.what) {
-        throw "Not the same result every time";
-      }
-    }
-    stopwatch.stop();
-    print("Next $numRuns took ${stopwatch.elapsedMilliseconds} ms "
-        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
-  } else {
-    print(ast);
-  }
-}
-
-class DirectParserASTListener extends AbstractDirectParserASTListener {
-  @override
-  void seen(DirectParserASTContent entry) {
-    switch (entry.type) {
-      case DirectParserASTType.BEGIN:
-      case DirectParserASTType.HANDLE:
-        // This just adds stuff.
-        data.add(entry);
-        break;
-      case DirectParserASTType.END:
-        // End should gobble up everything until the corresponding begin (which
-        // should be the latest begin).
-        int? beginIndex;
-        for (int i = data.length - 1; i >= 0; i--) {
-          if (data[i].type == DirectParserASTType.BEGIN) {
-            beginIndex = i;
-            break;
-          }
-        }
-        if (beginIndex == null) {
-          throw "Couldn't find a begin for ${entry.what}. Has:\n"
-              "${data.map((e) => "${e.what}: ${e.type}").join("\n")}";
-        }
-        String begin = data[beginIndex].what;
-        String end = entry.what;
-        if (begin == end) {
-          // Exact match.
-        } else if (end == "TopLevelDeclaration" &&
-            (begin == "ExtensionDeclarationPrelude" ||
-                begin == "ClassOrMixinOrNamedMixinApplicationPrelude" ||
-                begin == "TopLevelMember" ||
-                begin == "UncategorizedTopLevelDeclaration")) {
-          // endTopLevelDeclaration is started by one of
-          // beginExtensionDeclarationPrelude,
-          // beginClassOrNamedMixinApplicationPrelude
-          // beginTopLevelMember or beginUncategorizedTopLevelDeclaration.
-        } else if (begin == "Method" &&
-            (end == "ClassConstructor" ||
-                end == "ClassMethod" ||
-                end == "ExtensionConstructor" ||
-                end == "ExtensionMethod" ||
-                end == "MixinConstructor" ||
-                end == "MixinMethod")) {
-          // beginMethod is ended by one of endClassConstructor, endClassMethod,
-          // endExtensionMethod, endMixinConstructor or endMixinMethod.
-        } else if (begin == "Fields" &&
-            (end == "TopLevelFields" ||
-                end == "ClassFields" ||
-                end == "MixinFields" ||
-                end == "ExtensionFields")) {
-          // beginFields is ended by one of endTopLevelFields, endMixinFields or
-          // endExtensionFields.
-        } else if (begin == "ForStatement" && end == "ForIn") {
-          // beginForStatement is ended by either endForStatement or endForIn.
-        } else if (begin == "FactoryMethod" &&
-            (end == "ClassFactoryMethod" ||
-                end == "MixinFactoryMethod" ||
-                end == "ExtensionFactoryMethod")) {
-          // beginFactoryMethod is ended by either endClassFactoryMethod,
-          // endMixinFactoryMethod or endExtensionFactoryMethod.
-        } else if (begin == "ForControlFlow" && (end == "ForInControlFlow")) {
-          // beginForControlFlow is ended by either endForControlFlow or
-          // endForInControlFlow.
-        } else if (begin == "IfControlFlow" && (end == "IfElseControlFlow")) {
-          // beginIfControlFlow is ended by either endIfControlFlow or
-          // endIfElseControlFlow.
-        } else if (begin == "AwaitExpression" &&
-            (end == "InvalidAwaitExpression")) {
-          // beginAwaitExpression is ended by either endAwaitExpression or
-          // endInvalidAwaitExpression.
-        } else if (begin == "YieldStatement" &&
-            (end == "InvalidYieldStatement")) {
-          // beginYieldStatement is ended by either endYieldStatement or
-          // endInvalidYieldStatement.
-        } else {
-          throw "Unknown combination: begin$begin and end$end";
-        }
-        List<DirectParserASTContent> children = data.sublist(beginIndex);
-        for (DirectParserASTContent child in children) {
-          child.parent = entry;
-        }
-        data.length = beginIndex;
-        data.add(entry..children = children);
-        break;
-    }
-  }
-
-  @override
-  void reportVarianceModifierNotEnabled(Token? variance) {
-    throw new UnimplementedError();
-  }
-
-  @override
-  Uri get uri => throw new UnimplementedError();
-
-  @override
-  void logEvent(String name) {
-    throw new UnimplementedError();
-  }
-}
diff --git a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
deleted file mode 100644
index b0a2688..0000000
--- a/pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart
+++ /dev/null
@@ -1,7642 +0,0 @@
-// Copyright (c) 2020, 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:_fe_analyzer_shared/src/parser/assert.dart';
-import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
-import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
-import 'package:_fe_analyzer_shared/src/parser/listener.dart';
-import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
-import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
-import 'package:_fe_analyzer_shared/src/scanner/token.dart';
-import 'package:front_end/src/fasta/messages.dart';
-
-// ignore_for_file: lines_longer_than_80_chars
-
-// THIS FILE IS AUTO GENERATED BY
-// 'tool/_fasta/direct_parser_ast_helper_creator.dart'
-// Run this command to update it:
-// 'dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart'
-
-abstract class DirectParserASTContent {
-  final String what;
-  final DirectParserASTType type;
-  Map<String, Object?> get deprecatedArguments;
-  List<DirectParserASTContent>? children;
-  DirectParserASTContent? parent;
-
-  DirectParserASTContent(this.what, this.type);
-
-  // TODO(jensj): Compare two ASTs.
-}
-
-enum DirectParserASTType { BEGIN, END, HANDLE }
-
-abstract class AbstractDirectParserASTListener implements Listener {
-  List<DirectParserASTContent> data = [];
-
-  void seen(DirectParserASTContent entry);
-
-  @override
-  void beginArguments(Token token) {
-    DirectParserASTContentArgumentsBegin data =
-        new DirectParserASTContentArgumentsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endArguments(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentArgumentsEnd data =
-        new DirectParserASTContentArgumentsEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
-    DirectParserASTContentAsyncModifierHandle data =
-        new DirectParserASTContentAsyncModifierHandle(
-            DirectParserASTType.HANDLE,
-            asyncToken: asyncToken,
-            starToken: starToken);
-    seen(data);
-  }
-
-  @override
-  void beginAwaitExpression(Token token) {
-    DirectParserASTContentAwaitExpressionBegin data =
-        new DirectParserASTContentAwaitExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endAwaitExpression(Token beginToken, Token endToken) {
-    DirectParserASTContentAwaitExpressionEnd data =
-        new DirectParserASTContentAwaitExpressionEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endInvalidAwaitExpression(
-      Token beginToken, Token endToken, MessageCode errorCode) {
-    DirectParserASTContentInvalidAwaitExpressionEnd data =
-        new DirectParserASTContentInvalidAwaitExpressionEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            endToken: endToken,
-            errorCode: errorCode);
-    seen(data);
-  }
-
-  @override
-  void beginBlock(Token token, BlockKind blockKind) {
-    DirectParserASTContentBlockBegin data =
-        new DirectParserASTContentBlockBegin(DirectParserASTType.BEGIN,
-            token: token, blockKind: blockKind);
-    seen(data);
-  }
-
-  @override
-  void endBlock(
-      int count, Token beginToken, Token endToken, BlockKind blockKind) {
-    DirectParserASTContentBlockEnd data = new DirectParserASTContentBlockEnd(
-        DirectParserASTType.END,
-        count: count,
-        beginToken: beginToken,
-        endToken: endToken,
-        blockKind: blockKind);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTopLevelBlock(Token token) {
-    DirectParserASTContentInvalidTopLevelBlockHandle data =
-        new DirectParserASTContentInvalidTopLevelBlockHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginCascade(Token token) {
-    DirectParserASTContentCascadeBegin data =
-        new DirectParserASTContentCascadeBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCascade() {
-    DirectParserASTContentCascadeEnd data =
-        new DirectParserASTContentCascadeEnd(DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void beginCaseExpression(Token caseKeyword) {
-    DirectParserASTContentCaseExpressionBegin data =
-        new DirectParserASTContentCaseExpressionBegin(DirectParserASTType.BEGIN,
-            caseKeyword: caseKeyword);
-    seen(data);
-  }
-
-  @override
-  void endCaseExpression(Token colon) {
-    DirectParserASTContentCaseExpressionEnd data =
-        new DirectParserASTContentCaseExpressionEnd(DirectParserASTType.END,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginClassOrMixinOrExtensionBody(DeclarationKind kind, Token token) {
-    DirectParserASTContentClassOrMixinOrExtensionBodyBegin data =
-        new DirectParserASTContentClassOrMixinOrExtensionBodyBegin(
-            DirectParserASTType.BEGIN,
-            kind: kind,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endClassOrMixinOrExtensionBody(
-      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
-    DirectParserASTContentClassOrMixinOrExtensionBodyEnd data =
-        new DirectParserASTContentClassOrMixinOrExtensionBodyEnd(
-            DirectParserASTType.END,
-            kind: kind,
-            memberCount: memberCount,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginClassOrMixinOrNamedMixinApplicationPrelude(Token token) {
-    DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin data =
-        new DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
-    DirectParserASTContentClassDeclarationBegin data =
-        new DirectParserASTContentClassDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            begin: begin,
-            abstractToken: abstractToken,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleClassExtends(Token? extendsKeyword, int typeCount) {
-    DirectParserASTContentClassExtendsHandle data =
-        new DirectParserASTContentClassExtendsHandle(DirectParserASTType.HANDLE,
-            extendsKeyword: extendsKeyword, typeCount: typeCount);
-    seen(data);
-  }
-
-  @override
-  void handleClassOrMixinImplements(
-      Token? implementsKeyword, int interfacesCount) {
-    DirectParserASTContentClassOrMixinImplementsHandle data =
-        new DirectParserASTContentClassOrMixinImplementsHandle(
-            DirectParserASTType.HANDLE,
-            implementsKeyword: implementsKeyword,
-            interfacesCount: interfacesCount);
-    seen(data);
-  }
-
-  @override
-  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
-      Token? hideKeyword, int hideElementCount) {
-    DirectParserASTContentExtensionShowHideHandle data =
-        new DirectParserASTContentExtensionShowHideHandle(
-            DirectParserASTType.HANDLE,
-            showKeyword: showKeyword,
-            showElementCount: showElementCount,
-            hideKeyword: hideKeyword,
-            hideElementCount: hideElementCount);
-    seen(data);
-  }
-
-  @override
-  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
-    DirectParserASTContentClassHeaderHandle data =
-        new DirectParserASTContentClassHeaderHandle(DirectParserASTType.HANDLE,
-            begin: begin, classKeyword: classKeyword, nativeToken: nativeToken);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverClassHeader() {
-    DirectParserASTContentRecoverClassHeaderHandle data =
-        new DirectParserASTContentRecoverClassHeaderHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endClassDeclaration(Token beginToken, Token endToken) {
-    DirectParserASTContentClassDeclarationEnd data =
-        new DirectParserASTContentClassDeclarationEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginMixinDeclaration(Token mixinKeyword, Token name) {
-    DirectParserASTContentMixinDeclarationBegin data =
-        new DirectParserASTContentMixinDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            mixinKeyword: mixinKeyword,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleMixinOn(Token? onKeyword, int typeCount) {
-    DirectParserASTContentMixinOnHandle data =
-        new DirectParserASTContentMixinOnHandle(DirectParserASTType.HANDLE,
-            onKeyword: onKeyword, typeCount: typeCount);
-    seen(data);
-  }
-
-  @override
-  void handleMixinHeader(Token mixinKeyword) {
-    DirectParserASTContentMixinHeaderHandle data =
-        new DirectParserASTContentMixinHeaderHandle(DirectParserASTType.HANDLE,
-            mixinKeyword: mixinKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverMixinHeader() {
-    DirectParserASTContentRecoverMixinHeaderHandle data =
-        new DirectParserASTContentRecoverMixinHeaderHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
-    DirectParserASTContentMixinDeclarationEnd data =
-        new DirectParserASTContentMixinDeclarationEnd(DirectParserASTType.END,
-            mixinKeyword: mixinKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginUncategorizedTopLevelDeclaration(Token token) {
-    DirectParserASTContentUncategorizedTopLevelDeclarationBegin data =
-        new DirectParserASTContentUncategorizedTopLevelDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginExtensionDeclarationPrelude(Token extensionKeyword) {
-    DirectParserASTContentExtensionDeclarationPreludeBegin data =
-        new DirectParserASTContentExtensionDeclarationPreludeBegin(
-            DirectParserASTType.BEGIN,
-            extensionKeyword: extensionKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
-    DirectParserASTContentExtensionDeclarationBegin data =
-        new DirectParserASTContentExtensionDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            extensionKeyword: extensionKeyword,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
-      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
-    DirectParserASTContentExtensionDeclarationEnd data =
-        new DirectParserASTContentExtensionDeclarationEnd(
-            DirectParserASTType.END,
-            extensionKeyword: extensionKeyword,
-            typeKeyword: typeKeyword,
-            onKeyword: onKeyword,
-            showKeyword: showKeyword,
-            hideKeyword: hideKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginCombinators(Token token) {
-    DirectParserASTContentCombinatorsBegin data =
-        new DirectParserASTContentCombinatorsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCombinators(int count) {
-    DirectParserASTContentCombinatorsEnd data =
-        new DirectParserASTContentCombinatorsEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginCompilationUnit(Token token) {
-    DirectParserASTContentCompilationUnitBegin data =
-        new DirectParserASTContentCompilationUnitBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleDirectivesOnly() {
-    DirectParserASTContentDirectivesOnlyHandle data =
-        new DirectParserASTContentDirectivesOnlyHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endCompilationUnit(int count, Token token) {
-    DirectParserASTContentCompilationUnitEnd data =
-        new DirectParserASTContentCompilationUnitEnd(DirectParserASTType.END,
-            count: count, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConstLiteral(Token token) {
-    DirectParserASTContentConstLiteralBegin data =
-        new DirectParserASTContentConstLiteralBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endConstLiteral(Token token) {
-    DirectParserASTContentConstLiteralEnd data =
-        new DirectParserASTContentConstLiteralEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConstructorReference(Token start) {
-    DirectParserASTContentConstructorReferenceBegin data =
-        new DirectParserASTContentConstructorReferenceBegin(
-            DirectParserASTType.BEGIN,
-            start: start);
-    seen(data);
-  }
-
-  @override
-  void endConstructorReference(Token start, Token? periodBeforeName,
-      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
-    DirectParserASTContentConstructorReferenceEnd data =
-        new DirectParserASTContentConstructorReferenceEnd(
-            DirectParserASTType.END,
-            start: start,
-            periodBeforeName: periodBeforeName,
-            endToken: endToken,
-            constructorReferenceContext: constructorReferenceContext);
-    seen(data);
-  }
-
-  @override
-  void beginDoWhileStatement(Token token) {
-    DirectParserASTContentDoWhileStatementBegin data =
-        new DirectParserASTContentDoWhileStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endDoWhileStatement(
-      Token doKeyword, Token whileKeyword, Token endToken) {
-    DirectParserASTContentDoWhileStatementEnd data =
-        new DirectParserASTContentDoWhileStatementEnd(DirectParserASTType.END,
-            doKeyword: doKeyword,
-            whileKeyword: whileKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginDoWhileStatementBody(Token token) {
-    DirectParserASTContentDoWhileStatementBodyBegin data =
-        new DirectParserASTContentDoWhileStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endDoWhileStatementBody(Token token) {
-    DirectParserASTContentDoWhileStatementBodyEnd data =
-        new DirectParserASTContentDoWhileStatementBodyEnd(
-            DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginWhileStatementBody(Token token) {
-    DirectParserASTContentWhileStatementBodyBegin data =
-        new DirectParserASTContentWhileStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endWhileStatementBody(Token token) {
-    DirectParserASTContentWhileStatementBodyEnd data =
-        new DirectParserASTContentWhileStatementBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginEnum(Token enumKeyword) {
-    DirectParserASTContentEnumBegin data = new DirectParserASTContentEnumBegin(
-        DirectParserASTType.BEGIN,
-        enumKeyword: enumKeyword);
-    seen(data);
-  }
-
-  @override
-  void endEnum(Token enumKeyword, Token leftBrace, int count) {
-    DirectParserASTContentEnumEnd data = new DirectParserASTContentEnumEnd(
-        DirectParserASTType.END,
-        enumKeyword: enumKeyword,
-        leftBrace: leftBrace,
-        count: count);
-    seen(data);
-  }
-
-  @override
-  void beginExport(Token token) {
-    DirectParserASTContentExportBegin data =
-        new DirectParserASTContentExportBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endExport(Token exportKeyword, Token semicolon) {
-    DirectParserASTContentExportEnd data = new DirectParserASTContentExportEnd(
-        DirectParserASTType.END,
-        exportKeyword: exportKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleExtraneousExpression(Token token, Message message) {
-    DirectParserASTContentExtraneousExpressionHandle data =
-        new DirectParserASTContentExtraneousExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            message: message);
-    seen(data);
-  }
-
-  @override
-  void handleExpressionStatement(Token token) {
-    DirectParserASTContentExpressionStatementHandle data =
-        new DirectParserASTContentExpressionStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFactoryMethod(DeclarationKind declarationKind, Token lastConsumed,
-      Token? externalToken, Token? constToken) {
-    DirectParserASTContentFactoryMethodBegin data =
-        new DirectParserASTContentFactoryMethodBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            lastConsumed: lastConsumed,
-            externalToken: externalToken,
-            constToken: constToken);
-    seen(data);
-  }
-
-  @override
-  void endClassFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentClassFactoryMethodEnd data =
-        new DirectParserASTContentClassFactoryMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentMixinFactoryMethodEnd data =
-        new DirectParserASTContentMixinFactoryMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionFactoryMethod(
-      Token beginToken, Token factoryKeyword, Token endToken) {
-    DirectParserASTContentExtensionFactoryMethodEnd data =
-        new DirectParserASTContentExtensionFactoryMethodEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            factoryKeyword: factoryKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
-      Token? covariantToken, Token? varFinalOrConst) {
-    DirectParserASTContentFormalParameterBegin data =
-        new DirectParserASTContentFormalParameterBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            kind: kind,
-            requiredToken: requiredToken,
-            covariantToken: covariantToken,
-            varFinalOrConst: varFinalOrConst);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameter(
-      Token? thisKeyword,
-      Token? superKeyword,
-      Token? periodAfterThisOrSuper,
-      Token nameToken,
-      Token? initializerStart,
-      Token? initializerEnd,
-      FormalParameterKind kind,
-      MemberKind memberKind) {
-    DirectParserASTContentFormalParameterEnd data =
-        new DirectParserASTContentFormalParameterEnd(DirectParserASTType.END,
-            thisKeyword: thisKeyword,
-            superKeyword: superKeyword,
-            periodAfterThisOrSuper: periodAfterThisOrSuper,
-            nameToken: nameToken,
-            initializerStart: initializerStart,
-            initializerEnd: initializerEnd,
-            kind: kind,
-            memberKind: memberKind);
-    seen(data);
-  }
-
-  @override
-  void handleNoFormalParameters(Token token, MemberKind kind) {
-    DirectParserASTContentNoFormalParametersHandle data =
-        new DirectParserASTContentNoFormalParametersHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameters(Token token, MemberKind kind) {
-    DirectParserASTContentFormalParametersBegin data =
-        new DirectParserASTContentFormalParametersBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameters(
-      int count, Token beginToken, Token endToken, MemberKind kind) {
-    DirectParserASTContentFormalParametersEnd data =
-        new DirectParserASTContentFormalParametersEnd(DirectParserASTType.END,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken,
-            kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endClassFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentClassFieldsEnd data =
-        new DirectParserASTContentClassFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentMixinFieldsEnd data =
-        new DirectParserASTContentMixinFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionFields(
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentExtensionFieldsEnd data =
-        new DirectParserASTContentExtensionFieldsEnd(DirectParserASTType.END,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerEmptyStatement(Token token) {
-    DirectParserASTContentForInitializerEmptyStatementHandle data =
-        new DirectParserASTContentForInitializerEmptyStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerExpressionStatement(Token token, bool forIn) {
-    DirectParserASTContentForInitializerExpressionStatementHandle data =
-        new DirectParserASTContentForInitializerExpressionStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            forIn: forIn);
-    seen(data);
-  }
-
-  @override
-  void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
-    DirectParserASTContentForInitializerLocalVariableDeclarationHandle data =
-        new DirectParserASTContentForInitializerLocalVariableDeclarationHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            forIn: forIn);
-    seen(data);
-  }
-
-  @override
-  void beginForStatement(Token token) {
-    DirectParserASTContentForStatementBegin data =
-        new DirectParserASTContentForStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForLoopParts(Token forKeyword, Token leftParen,
-      Token leftSeparator, int updateExpressionCount) {
-    DirectParserASTContentForLoopPartsHandle data =
-        new DirectParserASTContentForLoopPartsHandle(DirectParserASTType.HANDLE,
-            forKeyword: forKeyword,
-            leftParen: leftParen,
-            leftSeparator: leftSeparator,
-            updateExpressionCount: updateExpressionCount);
-    seen(data);
-  }
-
-  @override
-  void endForStatement(Token endToken) {
-    DirectParserASTContentForStatementEnd data =
-        new DirectParserASTContentForStatementEnd(DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginForStatementBody(Token token) {
-    DirectParserASTContentForStatementBodyBegin data =
-        new DirectParserASTContentForStatementBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForStatementBody(Token token) {
-    DirectParserASTContentForStatementBodyEnd data =
-        new DirectParserASTContentForStatementBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleForInLoopParts(Token? awaitToken, Token forToken,
-      Token leftParenthesis, Token inKeyword) {
-    DirectParserASTContentForInLoopPartsHandle data =
-        new DirectParserASTContentForInLoopPartsHandle(
-            DirectParserASTType.HANDLE,
-            awaitToken: awaitToken,
-            forToken: forToken,
-            leftParenthesis: leftParenthesis,
-            inKeyword: inKeyword);
-    seen(data);
-  }
-
-  @override
-  void endForIn(Token endToken) {
-    DirectParserASTContentForInEnd data = new DirectParserASTContentForInEnd(
-        DirectParserASTType.END,
-        endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginForInExpression(Token token) {
-    DirectParserASTContentForInExpressionBegin data =
-        new DirectParserASTContentForInExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInExpression(Token token) {
-    DirectParserASTContentForInExpressionEnd data =
-        new DirectParserASTContentForInExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginForInBody(Token token) {
-    DirectParserASTContentForInBodyBegin data =
-        new DirectParserASTContentForInBodyBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInBody(Token token) {
-    DirectParserASTContentForInBodyEnd data =
-        new DirectParserASTContentForInBodyEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginNamedFunctionExpression(Token token) {
-    DirectParserASTContentNamedFunctionExpressionBegin data =
-        new DirectParserASTContentNamedFunctionExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endNamedFunctionExpression(Token endToken) {
-    DirectParserASTContentNamedFunctionExpressionEnd data =
-        new DirectParserASTContentNamedFunctionExpressionEnd(
-            DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLocalFunctionDeclaration(Token token) {
-    DirectParserASTContentLocalFunctionDeclarationBegin data =
-        new DirectParserASTContentLocalFunctionDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLocalFunctionDeclaration(Token endToken) {
-    DirectParserASTContentLocalFunctionDeclarationEnd data =
-        new DirectParserASTContentLocalFunctionDeclarationEnd(
-            DirectParserASTType.END,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginBlockFunctionBody(Token token) {
-    DirectParserASTContentBlockFunctionBodyBegin data =
-        new DirectParserASTContentBlockFunctionBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentBlockFunctionBodyEnd data =
-        new DirectParserASTContentBlockFunctionBodyEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleNoFunctionBody(Token token) {
-    DirectParserASTContentNoFunctionBodyHandle data =
-        new DirectParserASTContentNoFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
-    DirectParserASTContentFunctionBodySkippedHandle data =
-        new DirectParserASTContentFunctionBodySkippedHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            isExpressionBody: isExpressionBody);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionName(Token token) {
-    DirectParserASTContentFunctionNameBegin data =
-        new DirectParserASTContentFunctionNameBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionName(Token beginToken, Token token) {
-    DirectParserASTContentFunctionNameEnd data =
-        new DirectParserASTContentFunctionNameEnd(DirectParserASTType.END,
-            beginToken: beginToken, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginTypedef(Token token) {
-    DirectParserASTContentTypedefBegin data =
-        new DirectParserASTContentTypedefBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypedef(Token typedefKeyword, Token? equals, Token endToken) {
-    DirectParserASTContentTypedefEnd data =
-        new DirectParserASTContentTypedefEnd(DirectParserASTType.END,
-            typedefKeyword: typedefKeyword, equals: equals, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleClassWithClause(Token withKeyword) {
-    DirectParserASTContentClassWithClauseHandle data =
-        new DirectParserASTContentClassWithClauseHandle(
-            DirectParserASTType.HANDLE,
-            withKeyword: withKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleClassNoWithClause() {
-    DirectParserASTContentClassNoWithClauseHandle data =
-        new DirectParserASTContentClassNoWithClauseHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void beginNamedMixinApplication(
-      Token begin, Token? abstractToken, Token name) {
-    DirectParserASTContentNamedMixinApplicationBegin data =
-        new DirectParserASTContentNamedMixinApplicationBegin(
-            DirectParserASTType.BEGIN,
-            begin: begin,
-            abstractToken: abstractToken,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void handleNamedMixinApplicationWithClause(Token withKeyword) {
-    DirectParserASTContentNamedMixinApplicationWithClauseHandle data =
-        new DirectParserASTContentNamedMixinApplicationWithClauseHandle(
-            DirectParserASTType.HANDLE,
-            withKeyword: withKeyword);
-    seen(data);
-  }
-
-  @override
-  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
-      Token? implementsKeyword, Token endToken) {
-    DirectParserASTContentNamedMixinApplicationEnd data =
-        new DirectParserASTContentNamedMixinApplicationEnd(
-            DirectParserASTType.END,
-            begin: begin,
-            classKeyword: classKeyword,
-            equals: equals,
-            implementsKeyword: implementsKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginHide(Token hideKeyword) {
-    DirectParserASTContentHideBegin data = new DirectParserASTContentHideBegin(
-        DirectParserASTType.BEGIN,
-        hideKeyword: hideKeyword);
-    seen(data);
-  }
-
-  @override
-  void endHide(Token hideKeyword) {
-    DirectParserASTContentHideEnd data = new DirectParserASTContentHideEnd(
-        DirectParserASTType.END,
-        hideKeyword: hideKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleIdentifierList(int count) {
-    DirectParserASTContentIdentifierListHandle data =
-        new DirectParserASTContentIdentifierListHandle(
-            DirectParserASTType.HANDLE,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginTypeList(Token token) {
-    DirectParserASTContentTypeListBegin data =
-        new DirectParserASTContentTypeListBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeList(int count) {
-    DirectParserASTContentTypeListEnd data =
-        new DirectParserASTContentTypeListEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginIfStatement(Token token) {
-    DirectParserASTContentIfStatementBegin data =
-        new DirectParserASTContentIfStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endIfStatement(Token ifToken, Token? elseToken) {
-    DirectParserASTContentIfStatementEnd data =
-        new DirectParserASTContentIfStatementEnd(DirectParserASTType.END,
-            ifToken: ifToken, elseToken: elseToken);
-    seen(data);
-  }
-
-  @override
-  void beginThenStatement(Token token) {
-    DirectParserASTContentThenStatementBegin data =
-        new DirectParserASTContentThenStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endThenStatement(Token token) {
-    DirectParserASTContentThenStatementEnd data =
-        new DirectParserASTContentThenStatementEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginElseStatement(Token token) {
-    DirectParserASTContentElseStatementBegin data =
-        new DirectParserASTContentElseStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endElseStatement(Token token) {
-    DirectParserASTContentElseStatementEnd data =
-        new DirectParserASTContentElseStatementEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginImport(Token importKeyword) {
-    DirectParserASTContentImportBegin data =
-        new DirectParserASTContentImportBegin(DirectParserASTType.BEGIN,
-            importKeyword: importKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
-    DirectParserASTContentImportPrefixHandle data =
-        new DirectParserASTContentImportPrefixHandle(DirectParserASTType.HANDLE,
-            deferredKeyword: deferredKeyword, asKeyword: asKeyword);
-    seen(data);
-  }
-
-  @override
-  void endImport(Token importKeyword, Token? semicolon) {
-    DirectParserASTContentImportEnd data = new DirectParserASTContentImportEnd(
-        DirectParserASTType.END,
-        importKeyword: importKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverImport(Token? semicolon) {
-    DirectParserASTContentRecoverImportHandle data =
-        new DirectParserASTContentRecoverImportHandle(
-            DirectParserASTType.HANDLE,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalUris(Token token) {
-    DirectParserASTContentConditionalUrisBegin data =
-        new DirectParserASTContentConditionalUrisBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endConditionalUris(int count) {
-    DirectParserASTContentConditionalUrisEnd data =
-        new DirectParserASTContentConditionalUrisEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalUri(Token ifKeyword) {
-    DirectParserASTContentConditionalUriBegin data =
-        new DirectParserASTContentConditionalUriBegin(DirectParserASTType.BEGIN,
-            ifKeyword: ifKeyword);
-    seen(data);
-  }
-
-  @override
-  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
-    DirectParserASTContentConditionalUriEnd data =
-        new DirectParserASTContentConditionalUriEnd(DirectParserASTType.END,
-            ifKeyword: ifKeyword, leftParen: leftParen, equalSign: equalSign);
-    seen(data);
-  }
-
-  @override
-  void handleDottedName(int count, Token firstIdentifier) {
-    DirectParserASTContentDottedNameHandle data =
-        new DirectParserASTContentDottedNameHandle(DirectParserASTType.HANDLE,
-            count: count, firstIdentifier: firstIdentifier);
-    seen(data);
-  }
-
-  @override
-  void beginImplicitCreationExpression(Token token) {
-    DirectParserASTContentImplicitCreationExpressionBegin data =
-        new DirectParserASTContentImplicitCreationExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endImplicitCreationExpression(Token token, Token openAngleBracket) {
-    DirectParserASTContentImplicitCreationExpressionEnd data =
-        new DirectParserASTContentImplicitCreationExpressionEnd(
-            DirectParserASTType.END,
-            token: token,
-            openAngleBracket: openAngleBracket);
-    seen(data);
-  }
-
-  @override
-  void beginInitializedIdentifier(Token token) {
-    DirectParserASTContentInitializedIdentifierBegin data =
-        new DirectParserASTContentInitializedIdentifierBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializedIdentifier(Token nameToken) {
-    DirectParserASTContentInitializedIdentifierEnd data =
-        new DirectParserASTContentInitializedIdentifierEnd(
-            DirectParserASTType.END,
-            nameToken: nameToken);
-    seen(data);
-  }
-
-  @override
-  void beginFieldInitializer(Token token) {
-    DirectParserASTContentFieldInitializerBegin data =
-        new DirectParserASTContentFieldInitializerBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFieldInitializer(Token assignment, Token token) {
-    DirectParserASTContentFieldInitializerEnd data =
-        new DirectParserASTContentFieldInitializerEnd(DirectParserASTType.END,
-            assignment: assignment, token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoFieldInitializer(Token token) {
-    DirectParserASTContentNoFieldInitializerHandle data =
-        new DirectParserASTContentNoFieldInitializerHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginVariableInitializer(Token token) {
-    DirectParserASTContentVariableInitializerBegin data =
-        new DirectParserASTContentVariableInitializerBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endVariableInitializer(Token assignmentOperator) {
-    DirectParserASTContentVariableInitializerEnd data =
-        new DirectParserASTContentVariableInitializerEnd(
-            DirectParserASTType.END,
-            assignmentOperator: assignmentOperator);
-    seen(data);
-  }
-
-  @override
-  void handleNoVariableInitializer(Token token) {
-    DirectParserASTContentNoVariableInitializerHandle data =
-        new DirectParserASTContentNoVariableInitializerHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginInitializer(Token token) {
-    DirectParserASTContentInitializerBegin data =
-        new DirectParserASTContentInitializerBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializer(Token token) {
-    DirectParserASTContentInitializerEnd data =
-        new DirectParserASTContentInitializerEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginInitializers(Token token) {
-    DirectParserASTContentInitializersBegin data =
-        new DirectParserASTContentInitializersBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endInitializers(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentInitializersEnd data =
-        new DirectParserASTContentInitializersEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleNoInitializers() {
-    DirectParserASTContentNoInitializersHandle data =
-        new DirectParserASTContentNoInitializersHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidExpression(Token token) {
-    DirectParserASTContentInvalidExpressionHandle data =
-        new DirectParserASTContentInvalidExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidFunctionBody(Token token) {
-    DirectParserASTContentInvalidFunctionBodyHandle data =
-        new DirectParserASTContentInvalidFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTypeReference(Token token) {
-    DirectParserASTContentInvalidTypeReferenceHandle data =
-        new DirectParserASTContentInvalidTypeReferenceHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLabel(Token token) {
-    DirectParserASTContentLabelHandle data =
-        new DirectParserASTContentLabelHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginLabeledStatement(Token token, int labelCount) {
-    DirectParserASTContentLabeledStatementBegin data =
-        new DirectParserASTContentLabeledStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            labelCount: labelCount);
-    seen(data);
-  }
-
-  @override
-  void endLabeledStatement(int labelCount) {
-    DirectParserASTContentLabeledStatementEnd data =
-        new DirectParserASTContentLabeledStatementEnd(DirectParserASTType.END,
-            labelCount: labelCount);
-    seen(data);
-  }
-
-  @override
-  void beginLibraryName(Token token) {
-    DirectParserASTContentLibraryNameBegin data =
-        new DirectParserASTContentLibraryNameBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLibraryName(Token libraryKeyword, Token semicolon) {
-    DirectParserASTContentLibraryNameEnd data =
-        new DirectParserASTContentLibraryNameEnd(DirectParserASTType.END,
-            libraryKeyword: libraryKeyword, semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralMapEntry(Token colon, Token endToken) {
-    DirectParserASTContentLiteralMapEntryHandle data =
-        new DirectParserASTContentLiteralMapEntryHandle(
-            DirectParserASTType.HANDLE,
-            colon: colon,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLiteralString(Token token) {
-    DirectParserASTContentLiteralStringBegin data =
-        new DirectParserASTContentLiteralStringBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
-    DirectParserASTContentInterpolationExpressionHandle data =
-        new DirectParserASTContentInterpolationExpressionHandle(
-            DirectParserASTType.HANDLE,
-            leftBracket: leftBracket,
-            rightBracket: rightBracket);
-    seen(data);
-  }
-
-  @override
-  void endLiteralString(int interpolationCount, Token endToken) {
-    DirectParserASTContentLiteralStringEnd data =
-        new DirectParserASTContentLiteralStringEnd(DirectParserASTType.END,
-            interpolationCount: interpolationCount, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleStringJuxtaposition(Token startToken, int literalCount) {
-    DirectParserASTContentStringJuxtapositionHandle data =
-        new DirectParserASTContentStringJuxtapositionHandle(
-            DirectParserASTType.HANDLE,
-            startToken: startToken,
-            literalCount: literalCount);
-    seen(data);
-  }
-
-  @override
-  void beginMember() {
-    DirectParserASTContentMemberBegin data =
-        new DirectParserASTContentMemberBegin(DirectParserASTType.BEGIN);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidMember(Token endToken) {
-    DirectParserASTContentInvalidMemberHandle data =
-        new DirectParserASTContentInvalidMemberHandle(
-            DirectParserASTType.HANDLE,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMember() {
-    DirectParserASTContentMemberEnd data =
-        new DirectParserASTContentMemberEnd(DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void beginMethod(
-      DeclarationKind declarationKind,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? varFinalOrConst,
-      Token? getOrSet,
-      Token name) {
-    DirectParserASTContentMethodBegin data =
-        new DirectParserASTContentMethodBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            varFinalOrConst: varFinalOrConst,
-            getOrSet: getOrSet,
-            name: name);
-    seen(data);
-  }
-
-  @override
-  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentClassMethodEnd data =
-        new DirectParserASTContentClassMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentMixinMethodEnd data =
-        new DirectParserASTContentMixinMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentExtensionMethodEnd data =
-        new DirectParserASTContentExtensionMethodEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentClassConstructorEnd data =
-        new DirectParserASTContentClassConstructorEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
-      Token? beginInitializers, Token endToken) {
-    DirectParserASTContentMixinConstructorEnd data =
-        new DirectParserASTContentMixinConstructorEnd(DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endExtensionConstructor(Token? getOrSet, Token beginToken,
-      Token beginParam, Token? beginInitializers, Token endToken) {
-    DirectParserASTContentExtensionConstructorEnd data =
-        new DirectParserASTContentExtensionConstructorEnd(
-            DirectParserASTType.END,
-            getOrSet: getOrSet,
-            beginToken: beginToken,
-            beginParam: beginParam,
-            beginInitializers: beginInitializers,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginMetadataStar(Token token) {
-    DirectParserASTContentMetadataStarBegin data =
-        new DirectParserASTContentMetadataStarBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endMetadataStar(int count) {
-    DirectParserASTContentMetadataStarEnd data =
-        new DirectParserASTContentMetadataStarEnd(DirectParserASTType.END,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void beginMetadata(Token token) {
-    DirectParserASTContentMetadataBegin data =
-        new DirectParserASTContentMetadataBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
-    DirectParserASTContentMetadataEnd data =
-        new DirectParserASTContentMetadataEnd(DirectParserASTType.END,
-            beginToken: beginToken,
-            periodBeforeName: periodBeforeName,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginOptionalFormalParameters(Token token) {
-    DirectParserASTContentOptionalFormalParametersBegin data =
-        new DirectParserASTContentOptionalFormalParametersBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endOptionalFormalParameters(
-      int count, Token beginToken, Token endToken) {
-    DirectParserASTContentOptionalFormalParametersEnd data =
-        new DirectParserASTContentOptionalFormalParametersEnd(
-            DirectParserASTType.END,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginPart(Token token) {
-    DirectParserASTContentPartBegin data = new DirectParserASTContentPartBegin(
-        DirectParserASTType.BEGIN,
-        token: token);
-    seen(data);
-  }
-
-  @override
-  void endPart(Token partKeyword, Token semicolon) {
-    DirectParserASTContentPartEnd data = new DirectParserASTContentPartEnd(
-        DirectParserASTType.END,
-        partKeyword: partKeyword,
-        semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void beginPartOf(Token token) {
-    DirectParserASTContentPartOfBegin data =
-        new DirectParserASTContentPartOfBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endPartOf(
-      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
-    DirectParserASTContentPartOfEnd data = new DirectParserASTContentPartOfEnd(
-        DirectParserASTType.END,
-        partKeyword: partKeyword,
-        ofKeyword: ofKeyword,
-        semicolon: semicolon,
-        hasName: hasName);
-    seen(data);
-  }
-
-  @override
-  void beginRedirectingFactoryBody(Token token) {
-    DirectParserASTContentRedirectingFactoryBodyBegin data =
-        new DirectParserASTContentRedirectingFactoryBodyBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
-    DirectParserASTContentRedirectingFactoryBodyEnd data =
-        new DirectParserASTContentRedirectingFactoryBodyEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginReturnStatement(Token token) {
-    DirectParserASTContentReturnStatementBegin data =
-        new DirectParserASTContentReturnStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodyHandle data =
-        new DirectParserASTContentNativeFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodyIgnoredHandle data =
-        new DirectParserASTContentNativeFunctionBodyIgnoredHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
-    DirectParserASTContentNativeFunctionBodySkippedHandle data =
-        new DirectParserASTContentNativeFunctionBodySkippedHandle(
-            DirectParserASTType.HANDLE,
-            nativeToken: nativeToken,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleEmptyFunctionBody(Token semicolon) {
-    DirectParserASTContentEmptyFunctionBodyHandle data =
-        new DirectParserASTContentEmptyFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            semicolon: semicolon);
-    seen(data);
-  }
-
-  @override
-  void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
-    DirectParserASTContentExpressionFunctionBodyHandle data =
-        new DirectParserASTContentExpressionFunctionBodyHandle(
-            DirectParserASTType.HANDLE,
-            arrowToken: arrowToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endReturnStatement(
-      bool hasExpression, Token beginToken, Token endToken) {
-    DirectParserASTContentReturnStatementEnd data =
-        new DirectParserASTContentReturnStatementEnd(DirectParserASTType.END,
-            hasExpression: hasExpression,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleSend(Token beginToken, Token endToken) {
-    DirectParserASTContentSendHandle data =
-        new DirectParserASTContentSendHandle(DirectParserASTType.HANDLE,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginShow(Token showKeyword) {
-    DirectParserASTContentShowBegin data = new DirectParserASTContentShowBegin(
-        DirectParserASTType.BEGIN,
-        showKeyword: showKeyword);
-    seen(data);
-  }
-
-  @override
-  void endShow(Token showKeyword) {
-    DirectParserASTContentShowEnd data = new DirectParserASTContentShowEnd(
-        DirectParserASTType.END,
-        showKeyword: showKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchStatement(Token token) {
-    DirectParserASTContentSwitchStatementBegin data =
-        new DirectParserASTContentSwitchStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endSwitchStatement(Token switchKeyword, Token endToken) {
-    DirectParserASTContentSwitchStatementEnd data =
-        new DirectParserASTContentSwitchStatementEnd(DirectParserASTType.END,
-            switchKeyword: switchKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchBlock(Token token) {
-    DirectParserASTContentSwitchBlockBegin data =
-        new DirectParserASTContentSwitchBlockBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
-    DirectParserASTContentSwitchBlockEnd data =
-        new DirectParserASTContentSwitchBlockEnd(DirectParserASTType.END,
-            caseCount: caseCount, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginLiteralSymbol(Token token) {
-    DirectParserASTContentLiteralSymbolBegin data =
-        new DirectParserASTContentLiteralSymbolBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endLiteralSymbol(Token hashToken, int identifierCount) {
-    DirectParserASTContentLiteralSymbolEnd data =
-        new DirectParserASTContentLiteralSymbolEnd(DirectParserASTType.END,
-            hashToken: hashToken, identifierCount: identifierCount);
-    seen(data);
-  }
-
-  @override
-  void handleThrowExpression(Token throwToken, Token endToken) {
-    DirectParserASTContentThrowExpressionHandle data =
-        new DirectParserASTContentThrowExpressionHandle(
-            DirectParserASTType.HANDLE,
-            throwToken: throwToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginRethrowStatement(Token token) {
-    DirectParserASTContentRethrowStatementBegin data =
-        new DirectParserASTContentRethrowStatementBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endRethrowStatement(Token rethrowToken, Token endToken) {
-    DirectParserASTContentRethrowStatementEnd data =
-        new DirectParserASTContentRethrowStatementEnd(DirectParserASTType.END,
-            rethrowToken: rethrowToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelDeclaration(Token nextToken) {
-    DirectParserASTContentTopLevelDeclarationEnd data =
-        new DirectParserASTContentTopLevelDeclarationEnd(
-            DirectParserASTType.END,
-            nextToken: nextToken);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTopLevelDeclaration(Token endToken) {
-    DirectParserASTContentInvalidTopLevelDeclarationHandle data =
-        new DirectParserASTContentInvalidTopLevelDeclarationHandle(
-            DirectParserASTType.HANDLE,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTopLevelMember(Token token) {
-    DirectParserASTContentTopLevelMemberBegin data =
-        new DirectParserASTContentTopLevelMemberBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFields(
-      DeclarationKind declarationKind,
-      Token? abstractToken,
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      Token lastConsumed) {
-    DirectParserASTContentFieldsBegin data =
-        new DirectParserASTContentFieldsBegin(DirectParserASTType.BEGIN,
-            declarationKind: declarationKind,
-            abstractToken: abstractToken,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            lastConsumed: lastConsumed);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelFields(
-      Token? externalToken,
-      Token? staticToken,
-      Token? covariantToken,
-      Token? lateToken,
-      Token? varFinalOrConst,
-      int count,
-      Token beginToken,
-      Token endToken) {
-    DirectParserASTContentTopLevelFieldsEnd data =
-        new DirectParserASTContentTopLevelFieldsEnd(DirectParserASTType.END,
-            externalToken: externalToken,
-            staticToken: staticToken,
-            covariantToken: covariantToken,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst,
-            count: count,
-            beginToken: beginToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
-    DirectParserASTContentTopLevelMethodBegin data =
-        new DirectParserASTContentTopLevelMethodBegin(DirectParserASTType.BEGIN,
-            lastConsumed: lastConsumed, externalToken: externalToken);
-    seen(data);
-  }
-
-  @override
-  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
-    DirectParserASTContentTopLevelMethodEnd data =
-        new DirectParserASTContentTopLevelMethodEnd(DirectParserASTType.END,
-            beginToken: beginToken, getOrSet: getOrSet, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginTryStatement(Token token) {
-    DirectParserASTContentTryStatementBegin data =
-        new DirectParserASTContentTryStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCaseMatch(Token caseKeyword, Token colon) {
-    DirectParserASTContentCaseMatchHandle data =
-        new DirectParserASTContentCaseMatchHandle(DirectParserASTType.HANDLE,
-            caseKeyword: caseKeyword, colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginCatchClause(Token token) {
-    DirectParserASTContentCatchClauseBegin data =
-        new DirectParserASTContentCatchClauseBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endCatchClause(Token token) {
-    DirectParserASTContentCatchClauseEnd data =
-        new DirectParserASTContentCatchClauseEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
-    DirectParserASTContentCatchBlockHandle data =
-        new DirectParserASTContentCatchBlockHandle(DirectParserASTType.HANDLE,
-            onKeyword: onKeyword, catchKeyword: catchKeyword, comma: comma);
-    seen(data);
-  }
-
-  @override
-  void handleFinallyBlock(Token finallyKeyword) {
-    DirectParserASTContentFinallyBlockHandle data =
-        new DirectParserASTContentFinallyBlockHandle(DirectParserASTType.HANDLE,
-            finallyKeyword: finallyKeyword);
-    seen(data);
-  }
-
-  @override
-  void endTryStatement(
-      int catchCount, Token tryKeyword, Token? finallyKeyword) {
-    DirectParserASTContentTryStatementEnd data =
-        new DirectParserASTContentTryStatementEnd(DirectParserASTType.END,
-            catchCount: catchCount,
-            tryKeyword: tryKeyword,
-            finallyKeyword: finallyKeyword);
-    seen(data);
-  }
-
-  @override
-  void handleType(Token beginToken, Token? questionMark) {
-    DirectParserASTContentTypeHandle data =
-        new DirectParserASTContentTypeHandle(DirectParserASTType.HANDLE,
-            beginToken: beginToken, questionMark: questionMark);
-    seen(data);
-  }
-
-  @override
-  void handleNonNullAssertExpression(Token bang) {
-    DirectParserASTContentNonNullAssertExpressionHandle data =
-        new DirectParserASTContentNonNullAssertExpressionHandle(
-            DirectParserASTType.HANDLE,
-            bang: bang);
-    seen(data);
-  }
-
-  @override
-  void handleNoName(Token token) {
-    DirectParserASTContentNoNameHandle data =
-        new DirectParserASTContentNoNameHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionType(Token beginToken) {
-    DirectParserASTContentFunctionTypeBegin data =
-        new DirectParserASTContentFunctionTypeBegin(DirectParserASTType.BEGIN,
-            beginToken: beginToken);
-    seen(data);
-  }
-
-  @override
-  void endFunctionType(Token functionToken, Token? questionMark) {
-    DirectParserASTContentFunctionTypeEnd data =
-        new DirectParserASTContentFunctionTypeEnd(DirectParserASTType.END,
-            functionToken: functionToken, questionMark: questionMark);
-    seen(data);
-  }
-
-  @override
-  void beginTypeArguments(Token token) {
-    DirectParserASTContentTypeArgumentsBegin data =
-        new DirectParserASTContentTypeArgumentsBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeArguments(int count, Token beginToken, Token endToken) {
-    DirectParserASTContentTypeArgumentsEnd data =
-        new DirectParserASTContentTypeArgumentsEnd(DirectParserASTType.END,
-            count: count, beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidTypeArguments(Token token) {
-    DirectParserASTContentInvalidTypeArgumentsHandle data =
-        new DirectParserASTContentInvalidTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoTypeArguments(Token token) {
-    DirectParserASTContentNoTypeArgumentsHandle data =
-        new DirectParserASTContentNoTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginTypeVariable(Token token) {
-    DirectParserASTContentTypeVariableBegin data =
-        new DirectParserASTContentTypeVariableBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleTypeVariablesDefined(Token token, int count) {
-    DirectParserASTContentTypeVariablesDefinedHandle data =
-        new DirectParserASTContentTypeVariablesDefinedHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            count: count);
-    seen(data);
-  }
-
-  @override
-  void endTypeVariable(
-      Token token, int index, Token? extendsOrSuper, Token? variance) {
-    DirectParserASTContentTypeVariableEnd data =
-        new DirectParserASTContentTypeVariableEnd(DirectParserASTType.END,
-            token: token,
-            index: index,
-            extendsOrSuper: extendsOrSuper,
-            variance: variance);
-    seen(data);
-  }
-
-  @override
-  void beginTypeVariables(Token token) {
-    DirectParserASTContentTypeVariablesBegin data =
-        new DirectParserASTContentTypeVariablesBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endTypeVariables(Token beginToken, Token endToken) {
-    DirectParserASTContentTypeVariablesEnd data =
-        new DirectParserASTContentTypeVariablesEnd(DirectParserASTType.END,
-            beginToken: beginToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionExpression(Token token) {
-    DirectParserASTContentFunctionExpressionBegin data =
-        new DirectParserASTContentFunctionExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionExpression(Token beginToken, Token token) {
-    DirectParserASTContentFunctionExpressionEnd data =
-        new DirectParserASTContentFunctionExpressionEnd(DirectParserASTType.END,
-            beginToken: beginToken, token: token);
-    seen(data);
-  }
-
-  @override
-  void beginVariablesDeclaration(
-      Token token, Token? lateToken, Token? varFinalOrConst) {
-    DirectParserASTContentVariablesDeclarationBegin data =
-        new DirectParserASTContentVariablesDeclarationBegin(
-            DirectParserASTType.BEGIN,
-            token: token,
-            lateToken: lateToken,
-            varFinalOrConst: varFinalOrConst);
-    seen(data);
-  }
-
-  @override
-  void endVariablesDeclaration(int count, Token? endToken) {
-    DirectParserASTContentVariablesDeclarationEnd data =
-        new DirectParserASTContentVariablesDeclarationEnd(
-            DirectParserASTType.END,
-            count: count,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginWhileStatement(Token token) {
-    DirectParserASTContentWhileStatementBegin data =
-        new DirectParserASTContentWhileStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endWhileStatement(Token whileKeyword, Token endToken) {
-    DirectParserASTContentWhileStatementEnd data =
-        new DirectParserASTContentWhileStatementEnd(DirectParserASTType.END,
-            whileKeyword: whileKeyword, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void beginAsOperatorType(Token operator) {
-    DirectParserASTContentAsOperatorTypeBegin data =
-        new DirectParserASTContentAsOperatorTypeBegin(DirectParserASTType.BEGIN,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void endAsOperatorType(Token operator) {
-    DirectParserASTContentAsOperatorTypeEnd data =
-        new DirectParserASTContentAsOperatorTypeEnd(DirectParserASTType.END,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleAsOperator(Token operator) {
-    DirectParserASTContentAsOperatorHandle data =
-        new DirectParserASTContentAsOperatorHandle(DirectParserASTType.HANDLE,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleAssignmentExpression(Token token) {
-    DirectParserASTContentAssignmentExpressionHandle data =
-        new DirectParserASTContentAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginBinaryExpression(Token token) {
-    DirectParserASTContentBinaryExpressionBegin data =
-        new DirectParserASTContentBinaryExpressionBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endBinaryExpression(Token token) {
-    DirectParserASTContentBinaryExpressionEnd data =
-        new DirectParserASTContentBinaryExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleEndingBinaryExpression(Token token) {
-    DirectParserASTContentEndingBinaryExpressionHandle data =
-        new DirectParserASTContentEndingBinaryExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginConditionalExpression(Token question) {
-    DirectParserASTContentConditionalExpressionBegin data =
-        new DirectParserASTContentConditionalExpressionBegin(
-            DirectParserASTType.BEGIN,
-            question: question);
-    seen(data);
-  }
-
-  @override
-  void handleConditionalExpressionColon() {
-    DirectParserASTContentConditionalExpressionColonHandle data =
-        new DirectParserASTContentConditionalExpressionColonHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void endConditionalExpression(Token question, Token colon) {
-    DirectParserASTContentConditionalExpressionEnd data =
-        new DirectParserASTContentConditionalExpressionEnd(
-            DirectParserASTType.END,
-            question: question,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginConstExpression(Token constKeyword) {
-    DirectParserASTContentConstExpressionBegin data =
-        new DirectParserASTContentConstExpressionBegin(
-            DirectParserASTType.BEGIN,
-            constKeyword: constKeyword);
-    seen(data);
-  }
-
-  @override
-  void endConstExpression(Token token) {
-    DirectParserASTContentConstExpressionEnd data =
-        new DirectParserASTContentConstExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleConstFactory(Token constKeyword) {
-    DirectParserASTContentConstFactoryHandle data =
-        new DirectParserASTContentConstFactoryHandle(DirectParserASTType.HANDLE,
-            constKeyword: constKeyword);
-    seen(data);
-  }
-
-  @override
-  void beginForControlFlow(Token? awaitToken, Token forToken) {
-    DirectParserASTContentForControlFlowBegin data =
-        new DirectParserASTContentForControlFlowBegin(DirectParserASTType.BEGIN,
-            awaitToken: awaitToken, forToken: forToken);
-    seen(data);
-  }
-
-  @override
-  void endForControlFlow(Token token) {
-    DirectParserASTContentForControlFlowEnd data =
-        new DirectParserASTContentForControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endForInControlFlow(Token token) {
-    DirectParserASTContentForInControlFlowEnd data =
-        new DirectParserASTContentForInControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginIfControlFlow(Token ifToken) {
-    DirectParserASTContentIfControlFlowBegin data =
-        new DirectParserASTContentIfControlFlowBegin(DirectParserASTType.BEGIN,
-            ifToken: ifToken);
-    seen(data);
-  }
-
-  @override
-  void handleThenControlFlow(Token token) {
-    DirectParserASTContentThenControlFlowHandle data =
-        new DirectParserASTContentThenControlFlowHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleElseControlFlow(Token elseToken) {
-    DirectParserASTContentElseControlFlowHandle data =
-        new DirectParserASTContentElseControlFlowHandle(
-            DirectParserASTType.HANDLE,
-            elseToken: elseToken);
-    seen(data);
-  }
-
-  @override
-  void endIfControlFlow(Token token) {
-    DirectParserASTContentIfControlFlowEnd data =
-        new DirectParserASTContentIfControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endIfElseControlFlow(Token token) {
-    DirectParserASTContentIfElseControlFlowEnd data =
-        new DirectParserASTContentIfElseControlFlowEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSpreadExpression(Token spreadToken) {
-    DirectParserASTContentSpreadExpressionHandle data =
-        new DirectParserASTContentSpreadExpressionHandle(
-            DirectParserASTType.HANDLE,
-            spreadToken: spreadToken);
-    seen(data);
-  }
-
-  @override
-  void beginFunctionTypedFormalParameter(Token token) {
-    DirectParserASTContentFunctionTypedFormalParameterBegin data =
-        new DirectParserASTContentFunctionTypedFormalParameterBegin(
-            DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
-    DirectParserASTContentFunctionTypedFormalParameterEnd data =
-        new DirectParserASTContentFunctionTypedFormalParameterEnd(
-            DirectParserASTType.END,
-            nameToken: nameToken,
-            question: question);
-    seen(data);
-  }
-
-  @override
-  void handleIdentifier(Token token, IdentifierContext context) {
-    DirectParserASTContentIdentifierHandle data =
-        new DirectParserASTContentIdentifierHandle(DirectParserASTType.HANDLE,
-            token: token, context: context);
-    seen(data);
-  }
-
-  @override
-  void handleShowHideIdentifier(Token? modifier, Token identifier) {
-    DirectParserASTContentShowHideIdentifierHandle data =
-        new DirectParserASTContentShowHideIdentifierHandle(
-            DirectParserASTType.HANDLE,
-            modifier: modifier,
-            identifier: identifier);
-    seen(data);
-  }
-
-  @override
-  void handleIndexedExpression(
-      Token? question, Token openSquareBracket, Token closeSquareBracket) {
-    DirectParserASTContentIndexedExpressionHandle data =
-        new DirectParserASTContentIndexedExpressionHandle(
-            DirectParserASTType.HANDLE,
-            question: question,
-            openSquareBracket: openSquareBracket,
-            closeSquareBracket: closeSquareBracket);
-    seen(data);
-  }
-
-  @override
-  void beginIsOperatorType(Token operator) {
-    DirectParserASTContentIsOperatorTypeBegin data =
-        new DirectParserASTContentIsOperatorTypeBegin(DirectParserASTType.BEGIN,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void endIsOperatorType(Token operator) {
-    DirectParserASTContentIsOperatorTypeEnd data =
-        new DirectParserASTContentIsOperatorTypeEnd(DirectParserASTType.END,
-            operator: operator);
-    seen(data);
-  }
-
-  @override
-  void handleIsOperator(Token isOperator, Token? not) {
-    DirectParserASTContentIsOperatorHandle data =
-        new DirectParserASTContentIsOperatorHandle(DirectParserASTType.HANDLE,
-            isOperator: isOperator, not: not);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralBool(Token token) {
-    DirectParserASTContentLiteralBoolHandle data =
-        new DirectParserASTContentLiteralBoolHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleBreakStatement(
-      bool hasTarget, Token breakKeyword, Token endToken) {
-    DirectParserASTContentBreakStatementHandle data =
-        new DirectParserASTContentBreakStatementHandle(
-            DirectParserASTType.HANDLE,
-            hasTarget: hasTarget,
-            breakKeyword: breakKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleContinueStatement(
-      bool hasTarget, Token continueKeyword, Token endToken) {
-    DirectParserASTContentContinueStatementHandle data =
-        new DirectParserASTContentContinueStatementHandle(
-            DirectParserASTType.HANDLE,
-            hasTarget: hasTarget,
-            continueKeyword: continueKeyword,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleEmptyStatement(Token token) {
-    DirectParserASTContentEmptyStatementHandle data =
-        new DirectParserASTContentEmptyStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginAssert(Token assertKeyword, Assert kind) {
-    DirectParserASTContentAssertBegin data =
-        new DirectParserASTContentAssertBegin(DirectParserASTType.BEGIN,
-            assertKeyword: assertKeyword, kind: kind);
-    seen(data);
-  }
-
-  @override
-  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
-      Token? commaToken, Token semicolonToken) {
-    DirectParserASTContentAssertEnd data = new DirectParserASTContentAssertEnd(
-        DirectParserASTType.END,
-        assertKeyword: assertKeyword,
-        kind: kind,
-        leftParenthesis: leftParenthesis,
-        commaToken: commaToken,
-        semicolonToken: semicolonToken);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralDouble(Token token) {
-    DirectParserASTContentLiteralDoubleHandle data =
-        new DirectParserASTContentLiteralDoubleHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralInt(Token token) {
-    DirectParserASTContentLiteralIntHandle data =
-        new DirectParserASTContentLiteralIntHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralList(
-      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
-    DirectParserASTContentLiteralListHandle data =
-        new DirectParserASTContentLiteralListHandle(DirectParserASTType.HANDLE,
-            count: count,
-            leftBracket: leftBracket,
-            constKeyword: constKeyword,
-            rightBracket: rightBracket);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralSetOrMap(
-    int count,
-    Token leftBrace,
-    Token? constKeyword,
-    Token rightBrace,
-    bool hasSetEntry,
-  ) {
-    DirectParserASTContentLiteralSetOrMapHandle data =
-        new DirectParserASTContentLiteralSetOrMapHandle(
-            DirectParserASTType.HANDLE,
-            count: count,
-            leftBrace: leftBrace,
-            constKeyword: constKeyword,
-            rightBrace: rightBrace,
-            hasSetEntry: hasSetEntry);
-    seen(data);
-  }
-
-  @override
-  void handleLiteralNull(Token token) {
-    DirectParserASTContentLiteralNullHandle data =
-        new DirectParserASTContentLiteralNullHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNativeClause(Token nativeToken, bool hasName) {
-    DirectParserASTContentNativeClauseHandle data =
-        new DirectParserASTContentNativeClauseHandle(DirectParserASTType.HANDLE,
-            nativeToken: nativeToken, hasName: hasName);
-    seen(data);
-  }
-
-  @override
-  void handleNamedArgument(Token colon) {
-    DirectParserASTContentNamedArgumentHandle data =
-        new DirectParserASTContentNamedArgumentHandle(
-            DirectParserASTType.HANDLE,
-            colon: colon);
-    seen(data);
-  }
-
-  @override
-  void beginNewExpression(Token token) {
-    DirectParserASTContentNewExpressionBegin data =
-        new DirectParserASTContentNewExpressionBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endNewExpression(Token token) {
-    DirectParserASTContentNewExpressionEnd data =
-        new DirectParserASTContentNewExpressionEnd(DirectParserASTType.END,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoArguments(Token token) {
-    DirectParserASTContentNoArgumentsHandle data =
-        new DirectParserASTContentNoArgumentsHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
-    DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle
-        data =
-        new DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoType(Token lastConsumed) {
-    DirectParserASTContentNoTypeHandle data =
-        new DirectParserASTContentNoTypeHandle(DirectParserASTType.HANDLE,
-            lastConsumed: lastConsumed);
-    seen(data);
-  }
-
-  @override
-  void handleNoTypeVariables(Token token) {
-    DirectParserASTContentNoTypeVariablesHandle data =
-        new DirectParserASTContentNoTypeVariablesHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleOperator(Token token) {
-    DirectParserASTContentOperatorHandle data =
-        new DirectParserASTContentOperatorHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSymbolVoid(Token token) {
-    DirectParserASTContentSymbolVoidHandle data =
-        new DirectParserASTContentSymbolVoidHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleOperatorName(Token operatorKeyword, Token token) {
-    DirectParserASTContentOperatorNameHandle data =
-        new DirectParserASTContentOperatorNameHandle(DirectParserASTType.HANDLE,
-            operatorKeyword: operatorKeyword, token: token);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
-    DirectParserASTContentInvalidOperatorNameHandle data =
-        new DirectParserASTContentInvalidOperatorNameHandle(
-            DirectParserASTType.HANDLE,
-            operatorKeyword: operatorKeyword,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleParenthesizedCondition(Token token) {
-    DirectParserASTContentParenthesizedConditionHandle data =
-        new DirectParserASTContentParenthesizedConditionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleParenthesizedExpression(Token token) {
-    DirectParserASTContentParenthesizedExpressionHandle data =
-        new DirectParserASTContentParenthesizedExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleQualified(Token period) {
-    DirectParserASTContentQualifiedHandle data =
-        new DirectParserASTContentQualifiedHandle(DirectParserASTType.HANDLE,
-            period: period);
-    seen(data);
-  }
-
-  @override
-  void handleStringPart(Token token) {
-    DirectParserASTContentStringPartHandle data =
-        new DirectParserASTContentStringPartHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleSuperExpression(Token token, IdentifierContext context) {
-    DirectParserASTContentSuperExpressionHandle data =
-        new DirectParserASTContentSuperExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            context: context);
-    seen(data);
-  }
-
-  @override
-  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
-    DirectParserASTContentSwitchCaseBegin data =
-        new DirectParserASTContentSwitchCaseBegin(DirectParserASTType.BEGIN,
-            labelCount: labelCount,
-            expressionCount: expressionCount,
-            firstToken: firstToken);
-    seen(data);
-  }
-
-  @override
-  void endSwitchCase(
-      int labelCount,
-      int expressionCount,
-      Token? defaultKeyword,
-      Token? colonAfterDefault,
-      int statementCount,
-      Token firstToken,
-      Token endToken) {
-    DirectParserASTContentSwitchCaseEnd data =
-        new DirectParserASTContentSwitchCaseEnd(DirectParserASTType.END,
-            labelCount: labelCount,
-            expressionCount: expressionCount,
-            defaultKeyword: defaultKeyword,
-            colonAfterDefault: colonAfterDefault,
-            statementCount: statementCount,
-            firstToken: firstToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleThisExpression(Token token, IdentifierContext context) {
-    DirectParserASTContentThisExpressionHandle data =
-        new DirectParserASTContentThisExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            context: context);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPostfixAssignmentExpression(Token token) {
-    DirectParserASTContentUnaryPostfixAssignmentExpressionHandle data =
-        new DirectParserASTContentUnaryPostfixAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPrefixExpression(Token token) {
-    DirectParserASTContentUnaryPrefixExpressionHandle data =
-        new DirectParserASTContentUnaryPrefixExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnaryPrefixAssignmentExpression(Token token) {
-    DirectParserASTContentUnaryPrefixAssignmentExpressionHandle data =
-        new DirectParserASTContentUnaryPrefixAssignmentExpressionHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginFormalParameterDefaultValueExpression() {
-    DirectParserASTContentFormalParameterDefaultValueExpressionBegin data =
-        new DirectParserASTContentFormalParameterDefaultValueExpressionBegin(
-            DirectParserASTType.BEGIN);
-    seen(data);
-  }
-
-  @override
-  void endFormalParameterDefaultValueExpression() {
-    DirectParserASTContentFormalParameterDefaultValueExpressionEnd data =
-        new DirectParserASTContentFormalParameterDefaultValueExpressionEnd(
-            DirectParserASTType.END);
-    seen(data);
-  }
-
-  @override
-  void handleValuedFormalParameter(Token equals, Token token) {
-    DirectParserASTContentValuedFormalParameterHandle data =
-        new DirectParserASTContentValuedFormalParameterHandle(
-            DirectParserASTType.HANDLE,
-            equals: equals,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleFormalParameterWithoutValue(Token token) {
-    DirectParserASTContentFormalParameterWithoutValueHandle data =
-        new DirectParserASTContentFormalParameterWithoutValueHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleVoidKeyword(Token token) {
-    DirectParserASTContentVoidKeywordHandle data =
-        new DirectParserASTContentVoidKeywordHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleVoidKeywordWithTypeArguments(Token token) {
-    DirectParserASTContentVoidKeywordWithTypeArgumentsHandle data =
-        new DirectParserASTContentVoidKeywordWithTypeArgumentsHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void beginYieldStatement(Token token) {
-    DirectParserASTContentYieldStatementBegin data =
-        new DirectParserASTContentYieldStatementBegin(DirectParserASTType.BEGIN,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
-    DirectParserASTContentYieldStatementEnd data =
-        new DirectParserASTContentYieldStatementEnd(DirectParserASTType.END,
-            yieldToken: yieldToken, starToken: starToken, endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void endInvalidYieldStatement(Token beginToken, Token? starToken,
-      Token endToken, MessageCode errorCode) {
-    DirectParserASTContentInvalidYieldStatementEnd data =
-        new DirectParserASTContentInvalidYieldStatementEnd(
-            DirectParserASTType.END,
-            beginToken: beginToken,
-            starToken: starToken,
-            endToken: endToken,
-            errorCode: errorCode);
-    seen(data);
-  }
-
-  @override
-  void handleRecoverableError(
-      Message message, Token startToken, Token endToken) {
-    DirectParserASTContentRecoverableErrorHandle data =
-        new DirectParserASTContentRecoverableErrorHandle(
-            DirectParserASTType.HANDLE,
-            message: message,
-            startToken: startToken,
-            endToken: endToken);
-    seen(data);
-  }
-
-  @override
-  void handleErrorToken(ErrorToken token) {
-    DirectParserASTContentErrorTokenHandle data =
-        new DirectParserASTContentErrorTokenHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleUnescapeError(
-      Message message, Token location, int stringOffset, int length) {
-    DirectParserASTContentUnescapeErrorHandle data =
-        new DirectParserASTContentUnescapeErrorHandle(
-            DirectParserASTType.HANDLE,
-            message: message,
-            location: location,
-            stringOffset: stringOffset,
-            length: length);
-    seen(data);
-  }
-
-  @override
-  void handleInvalidStatement(Token token, Message message) {
-    DirectParserASTContentInvalidStatementHandle data =
-        new DirectParserASTContentInvalidStatementHandle(
-            DirectParserASTType.HANDLE,
-            token: token,
-            message: message);
-    seen(data);
-  }
-
-  @override
-  void handleScript(Token token) {
-    DirectParserASTContentScriptHandle data =
-        new DirectParserASTContentScriptHandle(DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
-    DirectParserASTContentCommentReferenceTextHandle data =
-        new DirectParserASTContentCommentReferenceTextHandle(
-            DirectParserASTType.HANDLE,
-            referenceSource: referenceSource,
-            referenceOffset: referenceOffset);
-    seen(data);
-  }
-
-  @override
-  void handleCommentReference(
-      Token? newKeyword, Token? prefix, Token? period, Token token) {
-    DirectParserASTContentCommentReferenceHandle data =
-        new DirectParserASTContentCommentReferenceHandle(
-            DirectParserASTType.HANDLE,
-            newKeyword: newKeyword,
-            prefix: prefix,
-            period: period,
-            token: token);
-    seen(data);
-  }
-
-  @override
-  void handleNoCommentReference() {
-    DirectParserASTContentNoCommentReferenceHandle data =
-        new DirectParserASTContentNoCommentReferenceHandle(
-            DirectParserASTType.HANDLE);
-    seen(data);
-  }
-
-  @override
-  void handleTypeArgumentApplication(Token openAngleBracket) {
-    DirectParserASTContentTypeArgumentApplicationHandle data =
-        new DirectParserASTContentTypeArgumentApplicationHandle(
-            DirectParserASTType.HANDLE,
-            openAngleBracket: openAngleBracket);
-    seen(data);
-  }
-
-  @override
-  void handleNewAsIdentifier(Token token) {
-    DirectParserASTContentNewAsIdentifierHandle data =
-        new DirectParserASTContentNewAsIdentifierHandle(
-            DirectParserASTType.HANDLE,
-            token: token);
-    seen(data);
-  }
-}
-
-class DirectParserASTContentArgumentsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentArgumentsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Arguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentArgumentsEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentArgumentsEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("Arguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentAsyncModifierHandle extends DirectParserASTContent {
-  final Token? asyncToken;
-  final Token? starToken;
-
-  DirectParserASTContentAsyncModifierHandle(DirectParserASTType type,
-      {this.asyncToken, this.starToken})
-      : super("AsyncModifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "asyncToken": asyncToken,
-        "starToken": starToken,
-      };
-}
-
-class DirectParserASTContentAwaitExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentAwaitExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("AwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentAwaitExpressionEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentAwaitExpressionEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("AwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidAwaitExpressionEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-  final MessageCode errorCode;
-
-  DirectParserASTContentInvalidAwaitExpressionEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.endToken,
-      required this.errorCode})
-      : super("InvalidAwaitExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "errorCode": errorCode,
-      };
-}
-
-class DirectParserASTContentBlockBegin extends DirectParserASTContent {
-  final Token token;
-  final BlockKind blockKind;
-
-  DirectParserASTContentBlockBegin(DirectParserASTType type,
-      {required this.token, required this.blockKind})
-      : super("Block", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "blockKind": blockKind,
-      };
-}
-
-class DirectParserASTContentBlockEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-  final BlockKind blockKind;
-
-  DirectParserASTContentBlockEnd(DirectParserASTType type,
-      {required this.count,
-      required this.beginToken,
-      required this.endToken,
-      required this.blockKind})
-      : super("Block", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "blockKind": blockKind,
-      };
-}
-
-class DirectParserASTContentInvalidTopLevelBlockHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTopLevelBlockHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTopLevelBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCascadeBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCascadeBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Cascade", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCascadeEnd extends DirectParserASTContent {
-  DirectParserASTContentCascadeEnd(DirectParserASTType type)
-      : super("Cascade", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentCaseExpressionBegin extends DirectParserASTContent {
-  final Token caseKeyword;
-
-  DirectParserASTContentCaseExpressionBegin(DirectParserASTType type,
-      {required this.caseKeyword})
-      : super("CaseExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseKeyword": caseKeyword,
-      };
-}
-
-class DirectParserASTContentCaseExpressionEnd extends DirectParserASTContent {
-  final Token colon;
-
-  DirectParserASTContentCaseExpressionEnd(DirectParserASTType type,
-      {required this.colon})
-      : super("CaseExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrExtensionBodyBegin
-    extends DirectParserASTContent {
-  final DeclarationKind kind;
-  final Token token;
-
-  DirectParserASTContentClassOrMixinOrExtensionBodyBegin(
-      DirectParserASTType type,
-      {required this.kind,
-      required this.token})
-      : super("ClassOrMixinOrExtensionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "kind": kind,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrExtensionBodyEnd
-    extends DirectParserASTContent {
-  final DeclarationKind kind;
-  final int memberCount;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassOrMixinOrExtensionBodyEnd(DirectParserASTType type,
-      {required this.kind,
-      required this.memberCount,
-      required this.beginToken,
-      required this.endToken})
-      : super("ClassOrMixinOrExtensionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "kind": kind,
-        "memberCount": memberCount,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentClassOrMixinOrNamedMixinApplicationPreludeBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ClassOrMixinOrNamedMixinApplicationPrelude", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentClassDeclarationBegin
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token? abstractToken;
-  final Token name;
-
-  DirectParserASTContentClassDeclarationBegin(DirectParserASTType type,
-      {required this.begin, this.abstractToken, required this.name})
-      : super("ClassDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "abstractToken": abstractToken,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentClassExtendsHandle extends DirectParserASTContent {
-  final Token? extendsKeyword;
-  final int typeCount;
-
-  DirectParserASTContentClassExtendsHandle(DirectParserASTType type,
-      {this.extendsKeyword, required this.typeCount})
-      : super("ClassExtends", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extendsKeyword": extendsKeyword,
-        "typeCount": typeCount,
-      };
-}
-
-class DirectParserASTContentClassOrMixinImplementsHandle
-    extends DirectParserASTContent {
-  final Token? implementsKeyword;
-  final int interfacesCount;
-
-  DirectParserASTContentClassOrMixinImplementsHandle(DirectParserASTType type,
-      {this.implementsKeyword, required this.interfacesCount})
-      : super("ClassOrMixinImplements", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "implementsKeyword": implementsKeyword,
-        "interfacesCount": interfacesCount,
-      };
-}
-
-class DirectParserASTContentExtensionShowHideHandle
-    extends DirectParserASTContent {
-  final Token? showKeyword;
-  final int showElementCount;
-  final Token? hideKeyword;
-  final int hideElementCount;
-
-  DirectParserASTContentExtensionShowHideHandle(DirectParserASTType type,
-      {this.showKeyword,
-      required this.showElementCount,
-      this.hideKeyword,
-      required this.hideElementCount})
-      : super("ExtensionShowHide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-        "showElementCount": showElementCount,
-        "hideKeyword": hideKeyword,
-        "hideElementCount": hideElementCount,
-      };
-}
-
-class DirectParserASTContentClassHeaderHandle extends DirectParserASTContent {
-  final Token begin;
-  final Token classKeyword;
-  final Token? nativeToken;
-
-  DirectParserASTContentClassHeaderHandle(DirectParserASTType type,
-      {required this.begin, required this.classKeyword, this.nativeToken})
-      : super("ClassHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "classKeyword": classKeyword,
-        "nativeToken": nativeToken,
-      };
-}
-
-class DirectParserASTContentRecoverClassHeaderHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentRecoverClassHeaderHandle(DirectParserASTType type)
-      : super("RecoverClassHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentClassDeclarationEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassDeclarationEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("ClassDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinDeclarationBegin
-    extends DirectParserASTContent {
-  final Token mixinKeyword;
-  final Token name;
-
-  DirectParserASTContentMixinDeclarationBegin(DirectParserASTType type,
-      {required this.mixinKeyword, required this.name})
-      : super("MixinDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentMixinOnHandle extends DirectParserASTContent {
-  final Token? onKeyword;
-  final int typeCount;
-
-  DirectParserASTContentMixinOnHandle(DirectParserASTType type,
-      {this.onKeyword, required this.typeCount})
-      : super("MixinOn", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "onKeyword": onKeyword,
-        "typeCount": typeCount,
-      };
-}
-
-class DirectParserASTContentMixinHeaderHandle extends DirectParserASTContent {
-  final Token mixinKeyword;
-
-  DirectParserASTContentMixinHeaderHandle(DirectParserASTType type,
-      {required this.mixinKeyword})
-      : super("MixinHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-      };
-}
-
-class DirectParserASTContentRecoverMixinHeaderHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentRecoverMixinHeaderHandle(DirectParserASTType type)
-      : super("RecoverMixinHeader", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentMixinDeclarationEnd extends DirectParserASTContent {
-  final Token mixinKeyword;
-  final Token endToken;
-
-  DirectParserASTContentMixinDeclarationEnd(DirectParserASTType type,
-      {required this.mixinKeyword, required this.endToken})
-      : super("MixinDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "mixinKeyword": mixinKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentUncategorizedTopLevelDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUncategorizedTopLevelDeclarationBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UncategorizedTopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationPreludeBegin
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-
-  DirectParserASTContentExtensionDeclarationPreludeBegin(
-      DirectParserASTType type,
-      {required this.extensionKeyword})
-      : super("ExtensionDeclarationPrelude", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationBegin
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-  final Token? name;
-
-  DirectParserASTContentExtensionDeclarationBegin(DirectParserASTType type,
-      {required this.extensionKeyword, this.name})
-      : super("ExtensionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentExtensionDeclarationEnd
-    extends DirectParserASTContent {
-  final Token extensionKeyword;
-  final Token? typeKeyword;
-  final Token onKeyword;
-  final Token? showKeyword;
-  final Token? hideKeyword;
-  final Token endToken;
-
-  DirectParserASTContentExtensionDeclarationEnd(DirectParserASTType type,
-      {required this.extensionKeyword,
-      this.typeKeyword,
-      required this.onKeyword,
-      this.showKeyword,
-      this.hideKeyword,
-      required this.endToken})
-      : super("ExtensionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "extensionKeyword": extensionKeyword,
-        "typeKeyword": typeKeyword,
-        "onKeyword": onKeyword,
-        "showKeyword": showKeyword,
-        "hideKeyword": hideKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentCombinatorsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCombinatorsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Combinators", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCombinatorsEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentCombinatorsEnd(DirectParserASTType type,
-      {required this.count})
-      : super("Combinators", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentCompilationUnitBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCompilationUnitBegin(DirectParserASTType type,
-      {required this.token})
-      : super("CompilationUnit", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDirectivesOnlyHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentDirectivesOnlyHandle(DirectParserASTType type)
-      : super("DirectivesOnly", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentCompilationUnitEnd extends DirectParserASTContent {
-  final int count;
-  final Token token;
-
-  DirectParserASTContentCompilationUnitEnd(DirectParserASTType type,
-      {required this.count, required this.token})
-      : super("CompilationUnit", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstLiteralBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstLiteralBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ConstLiteral", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstLiteralEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstLiteralEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ConstLiteral", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstructorReferenceBegin
-    extends DirectParserASTContent {
-  final Token start;
-
-  DirectParserASTContentConstructorReferenceBegin(DirectParserASTType type,
-      {required this.start})
-      : super("ConstructorReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "start": start,
-      };
-}
-
-class DirectParserASTContentConstructorReferenceEnd
-    extends DirectParserASTContent {
-  final Token start;
-  final Token? periodBeforeName;
-  final Token endToken;
-  final ConstructorReferenceContext constructorReferenceContext;
-
-  DirectParserASTContentConstructorReferenceEnd(DirectParserASTType type,
-      {required this.start,
-      this.periodBeforeName,
-      required this.endToken,
-      required this.constructorReferenceContext})
-      : super("ConstructorReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "start": start,
-        "periodBeforeName": periodBeforeName,
-        "endToken": endToken,
-        "constructorReferenceContext": constructorReferenceContext,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementEnd extends DirectParserASTContent {
-  final Token doKeyword;
-  final Token whileKeyword;
-  final Token endToken;
-
-  DirectParserASTContentDoWhileStatementEnd(DirectParserASTType type,
-      {required this.doKeyword,
-      required this.whileKeyword,
-      required this.endToken})
-      : super("DoWhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "doKeyword": doKeyword,
-        "whileKeyword": whileKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentDoWhileStatementBodyEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentDoWhileStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("DoWhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementBodyEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentEnumBegin extends DirectParserASTContent {
-  final Token enumKeyword;
-
-  DirectParserASTContentEnumBegin(DirectParserASTType type,
-      {required this.enumKeyword})
-      : super("Enum", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "enumKeyword": enumKeyword,
-      };
-}
-
-class DirectParserASTContentEnumEnd extends DirectParserASTContent {
-  final Token enumKeyword;
-  final Token leftBrace;
-  final int count;
-
-  DirectParserASTContentEnumEnd(DirectParserASTType type,
-      {required this.enumKeyword, required this.leftBrace, required this.count})
-      : super("Enum", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "enumKeyword": enumKeyword,
-        "leftBrace": leftBrace,
-        "count": count,
-      };
-}
-
-class DirectParserASTContentExportBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentExportBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Export", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentExportEnd extends DirectParserASTContent {
-  final Token exportKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentExportEnd(DirectParserASTType type,
-      {required this.exportKeyword, required this.semicolon})
-      : super("Export", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "exportKeyword": exportKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentExtraneousExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final Message message;
-
-  DirectParserASTContentExtraneousExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.message})
-      : super("ExtraneousExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "message": message,
-      };
-}
-
-class DirectParserASTContentExpressionStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentExpressionStatementHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ExpressionStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFactoryMethodBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token lastConsumed;
-  final Token? externalToken;
-  final Token? constToken;
-
-  DirectParserASTContentFactoryMethodBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      required this.lastConsumed,
-      this.externalToken,
-      this.constToken})
-      : super("FactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "lastConsumed": lastConsumed,
-        "externalToken": externalToken,
-        "constToken": constToken,
-      };
-}
-
-class DirectParserASTContentClassFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentClassFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("ClassFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentMixinFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("MixinFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionFactoryMethodEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token factoryKeyword;
-  final Token endToken;
-
-  DirectParserASTContentExtensionFactoryMethodEnd(DirectParserASTType type,
-      {required this.beginToken,
-      required this.factoryKeyword,
-      required this.endToken})
-      : super("ExtensionFactoryMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "factoryKeyword": factoryKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentFormalParameterBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-  final Token? requiredToken;
-  final Token? covariantToken;
-  final Token? varFinalOrConst;
-
-  DirectParserASTContentFormalParameterBegin(DirectParserASTType type,
-      {required this.token,
-      required this.kind,
-      this.requiredToken,
-      this.covariantToken,
-      this.varFinalOrConst})
-      : super("FormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-        "requiredToken": requiredToken,
-        "covariantToken": covariantToken,
-        "varFinalOrConst": varFinalOrConst,
-      };
-}
-
-class DirectParserASTContentFormalParameterEnd extends DirectParserASTContent {
-  final Token? thisKeyword;
-  final Token? superKeyword;
-  final Token? periodAfterThisOrSuper;
-  final Token nameToken;
-  final Token? initializerStart;
-  final Token? initializerEnd;
-  final FormalParameterKind kind;
-  final MemberKind memberKind;
-
-  DirectParserASTContentFormalParameterEnd(DirectParserASTType type,
-      {this.thisKeyword,
-      this.superKeyword,
-      this.periodAfterThisOrSuper,
-      required this.nameToken,
-      this.initializerStart,
-      this.initializerEnd,
-      required this.kind,
-      required this.memberKind})
-      : super("FormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "thisKeyword": thisKeyword,
-        "superKeyword": superKeyword,
-        "periodAfterThisOrSuper": periodAfterThisOrSuper,
-        "nameToken": nameToken,
-        "initializerStart": initializerStart,
-        "initializerEnd": initializerEnd,
-        "kind": kind,
-        "memberKind": memberKind,
-      };
-}
-
-class DirectParserASTContentNoFormalParametersHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-
-  DirectParserASTContentNoFormalParametersHandle(DirectParserASTType type,
-      {required this.token, required this.kind})
-      : super("NoFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentFormalParametersBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final MemberKind kind;
-
-  DirectParserASTContentFormalParametersBegin(DirectParserASTType type,
-      {required this.token, required this.kind})
-      : super("FormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentFormalParametersEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-  final MemberKind kind;
-
-  DirectParserASTContentFormalParametersEnd(DirectParserASTType type,
-      {required this.count,
-      required this.beginToken,
-      required this.endToken,
-      required this.kind})
-      : super("FormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentClassFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentClassFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("ClassFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentMixinFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("MixinFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionFieldsEnd extends DirectParserASTContent {
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentExtensionFieldsEnd(DirectParserASTType type,
-      {this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("ExtensionFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForInitializerEmptyStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInitializerEmptyStatementHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ForInitializerEmptyStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInitializerExpressionStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool forIn;
-
-  DirectParserASTContentForInitializerExpressionStatementHandle(
-      DirectParserASTType type,
-      {required this.token,
-      required this.forIn})
-      : super("ForInitializerExpressionStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "forIn": forIn,
-      };
-}
-
-class DirectParserASTContentForInitializerLocalVariableDeclarationHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool forIn;
-
-  DirectParserASTContentForInitializerLocalVariableDeclarationHandle(
-      DirectParserASTType type,
-      {required this.token,
-      required this.forIn})
-      : super("ForInitializerLocalVariableDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "forIn": forIn,
-      };
-}
-
-class DirectParserASTContentForStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForLoopPartsHandle extends DirectParserASTContent {
-  final Token forKeyword;
-  final Token leftParen;
-  final Token leftSeparator;
-  final int updateExpressionCount;
-
-  DirectParserASTContentForLoopPartsHandle(DirectParserASTType type,
-      {required this.forKeyword,
-      required this.leftParen,
-      required this.leftSeparator,
-      required this.updateExpressionCount})
-      : super("ForLoopParts", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "forKeyword": forKeyword,
-        "leftParen": leftParen,
-        "leftSeparator": leftSeparator,
-        "updateExpressionCount": updateExpressionCount,
-      };
-}
-
-class DirectParserASTContentForStatementEnd extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentForStatementEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("ForStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForStatementBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForStatementBodyEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForStatementBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForStatementBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInLoopPartsHandle
-    extends DirectParserASTContent {
-  final Token? awaitToken;
-  final Token forToken;
-  final Token leftParenthesis;
-  final Token inKeyword;
-
-  DirectParserASTContentForInLoopPartsHandle(DirectParserASTType type,
-      {this.awaitToken,
-      required this.forToken,
-      required this.leftParenthesis,
-      required this.inKeyword})
-      : super("ForInLoopParts", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "awaitToken": awaitToken,
-        "forToken": forToken,
-        "leftParenthesis": leftParenthesis,
-        "inKeyword": inKeyword,
-      };
-}
-
-class DirectParserASTContentForInEnd extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentForInEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("ForIn", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentForInExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForInExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInBodyBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ForInBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInBodyEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInBodyEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNamedFunctionExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNamedFunctionExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("NamedFunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNamedFunctionExpressionEnd
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentNamedFunctionExpressionEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("NamedFunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLocalFunctionDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLocalFunctionDeclarationBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LocalFunctionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLocalFunctionDeclarationEnd
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentLocalFunctionDeclarationEnd(DirectParserASTType type,
-      {required this.endToken})
-      : super("LocalFunctionDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentBlockFunctionBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBlockFunctionBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("BlockFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBlockFunctionBodyEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentBlockFunctionBodyEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("BlockFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentNoFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoFunctionBodyHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionBodySkippedHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final bool isExpressionBody;
-
-  DirectParserASTContentFunctionBodySkippedHandle(DirectParserASTType type,
-      {required this.token, required this.isExpressionBody})
-      : super("FunctionBodySkipped", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "isExpressionBody": isExpressionBody,
-      };
-}
-
-class DirectParserASTContentFunctionNameBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionNameBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FunctionName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionNameEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token token;
-
-  DirectParserASTContentFunctionNameEnd(DirectParserASTType type,
-      {required this.beginToken, required this.token})
-      : super("FunctionName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypedefBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypedefBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Typedef", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypedefEnd extends DirectParserASTContent {
-  final Token typedefKeyword;
-  final Token? equals;
-  final Token endToken;
-
-  DirectParserASTContentTypedefEnd(DirectParserASTType type,
-      {required this.typedefKeyword, this.equals, required this.endToken})
-      : super("Typedef", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "typedefKeyword": typedefKeyword,
-        "equals": equals,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassWithClauseHandle
-    extends DirectParserASTContent {
-  final Token withKeyword;
-
-  DirectParserASTContentClassWithClauseHandle(DirectParserASTType type,
-      {required this.withKeyword})
-      : super("ClassWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "withKeyword": withKeyword,
-      };
-}
-
-class DirectParserASTContentClassNoWithClauseHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentClassNoWithClauseHandle(DirectParserASTType type)
-      : super("ClassNoWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentNamedMixinApplicationBegin
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token? abstractToken;
-  final Token name;
-
-  DirectParserASTContentNamedMixinApplicationBegin(DirectParserASTType type,
-      {required this.begin, this.abstractToken, required this.name})
-      : super("NamedMixinApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "abstractToken": abstractToken,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentNamedMixinApplicationWithClauseHandle
-    extends DirectParserASTContent {
-  final Token withKeyword;
-
-  DirectParserASTContentNamedMixinApplicationWithClauseHandle(
-      DirectParserASTType type,
-      {required this.withKeyword})
-      : super("NamedMixinApplicationWithClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "withKeyword": withKeyword,
-      };
-}
-
-class DirectParserASTContentNamedMixinApplicationEnd
-    extends DirectParserASTContent {
-  final Token begin;
-  final Token classKeyword;
-  final Token equals;
-  final Token? implementsKeyword;
-  final Token endToken;
-
-  DirectParserASTContentNamedMixinApplicationEnd(DirectParserASTType type,
-      {required this.begin,
-      required this.classKeyword,
-      required this.equals,
-      this.implementsKeyword,
-      required this.endToken})
-      : super("NamedMixinApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "begin": begin,
-        "classKeyword": classKeyword,
-        "equals": equals,
-        "implementsKeyword": implementsKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentHideBegin extends DirectParserASTContent {
-  final Token hideKeyword;
-
-  DirectParserASTContentHideBegin(DirectParserASTType type,
-      {required this.hideKeyword})
-      : super("Hide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hideKeyword": hideKeyword,
-      };
-}
-
-class DirectParserASTContentHideEnd extends DirectParserASTContent {
-  final Token hideKeyword;
-
-  DirectParserASTContentHideEnd(DirectParserASTType type,
-      {required this.hideKeyword})
-      : super("Hide", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hideKeyword": hideKeyword,
-      };
-}
-
-class DirectParserASTContentIdentifierListHandle
-    extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentIdentifierListHandle(DirectParserASTType type,
-      {required this.count})
-      : super("IdentifierList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentTypeListBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeListBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeListEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentTypeListEnd(DirectParserASTType type,
-      {required this.count})
-      : super("TypeList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentIfStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("IfStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfStatementEnd extends DirectParserASTContent {
-  final Token ifToken;
-  final Token? elseToken;
-
-  DirectParserASTContentIfStatementEnd(DirectParserASTType type,
-      {required this.ifToken, this.elseToken})
-      : super("IfStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifToken": ifToken,
-        "elseToken": elseToken,
-      };
-}
-
-class DirectParserASTContentThenStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ThenStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentThenStatementEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenStatementEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ThenStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentElseStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ElseStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseStatementEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentElseStatementEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ElseStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentImportBegin extends DirectParserASTContent {
-  final Token importKeyword;
-
-  DirectParserASTContentImportBegin(DirectParserASTType type,
-      {required this.importKeyword})
-      : super("Import", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "importKeyword": importKeyword,
-      };
-}
-
-class DirectParserASTContentImportPrefixHandle extends DirectParserASTContent {
-  final Token? deferredKeyword;
-  final Token? asKeyword;
-
-  DirectParserASTContentImportPrefixHandle(DirectParserASTType type,
-      {this.deferredKeyword, this.asKeyword})
-      : super("ImportPrefix", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "deferredKeyword": deferredKeyword,
-        "asKeyword": asKeyword,
-      };
-}
-
-class DirectParserASTContentImportEnd extends DirectParserASTContent {
-  final Token importKeyword;
-  final Token? semicolon;
-
-  DirectParserASTContentImportEnd(DirectParserASTType type,
-      {required this.importKeyword, this.semicolon})
-      : super("Import", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "importKeyword": importKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentRecoverImportHandle extends DirectParserASTContent {
-  final Token? semicolon;
-
-  DirectParserASTContentRecoverImportHandle(DirectParserASTType type,
-      {this.semicolon})
-      : super("RecoverImport", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentConditionalUrisBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConditionalUrisBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ConditionalUris", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConditionalUrisEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentConditionalUrisEnd(DirectParserASTType type,
-      {required this.count})
-      : super("ConditionalUris", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentConditionalUriBegin extends DirectParserASTContent {
-  final Token ifKeyword;
-
-  DirectParserASTContentConditionalUriBegin(DirectParserASTType type,
-      {required this.ifKeyword})
-      : super("ConditionalUri", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifKeyword": ifKeyword,
-      };
-}
-
-class DirectParserASTContentConditionalUriEnd extends DirectParserASTContent {
-  final Token ifKeyword;
-  final Token leftParen;
-  final Token? equalSign;
-
-  DirectParserASTContentConditionalUriEnd(DirectParserASTType type,
-      {required this.ifKeyword, required this.leftParen, this.equalSign})
-      : super("ConditionalUri", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifKeyword": ifKeyword,
-        "leftParen": leftParen,
-        "equalSign": equalSign,
-      };
-}
-
-class DirectParserASTContentDottedNameHandle extends DirectParserASTContent {
-  final int count;
-  final Token firstIdentifier;
-
-  DirectParserASTContentDottedNameHandle(DirectParserASTType type,
-      {required this.count, required this.firstIdentifier})
-      : super("DottedName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "firstIdentifier": firstIdentifier,
-      };
-}
-
-class DirectParserASTContentImplicitCreationExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentImplicitCreationExpressionBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("ImplicitCreationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentImplicitCreationExpressionEnd
-    extends DirectParserASTContent {
-  final Token token;
-  final Token openAngleBracket;
-
-  DirectParserASTContentImplicitCreationExpressionEnd(DirectParserASTType type,
-      {required this.token, required this.openAngleBracket})
-      : super("ImplicitCreationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "openAngleBracket": openAngleBracket,
-      };
-}
-
-class DirectParserASTContentInitializedIdentifierBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializedIdentifierBegin(DirectParserASTType type,
-      {required this.token})
-      : super("InitializedIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializedIdentifierEnd
-    extends DirectParserASTContent {
-  final Token nameToken;
-
-  DirectParserASTContentInitializedIdentifierEnd(DirectParserASTType type,
-      {required this.nameToken})
-      : super("InitializedIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nameToken": nameToken,
-      };
-}
-
-class DirectParserASTContentFieldInitializerBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFieldInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFieldInitializerEnd extends DirectParserASTContent {
-  final Token assignment;
-  final Token token;
-
-  DirectParserASTContentFieldInitializerEnd(DirectParserASTType type,
-      {required this.assignment, required this.token})
-      : super("FieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assignment": assignment,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoFieldInitializerHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoFieldInitializerHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoFieldInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariableInitializerBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVariableInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("VariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariableInitializerEnd
-    extends DirectParserASTContent {
-  final Token assignmentOperator;
-
-  DirectParserASTContentVariableInitializerEnd(DirectParserASTType type,
-      {required this.assignmentOperator})
-      : super("VariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assignmentOperator": assignmentOperator,
-      };
-}
-
-class DirectParserASTContentNoVariableInitializerHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoVariableInitializerHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoVariableInitializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializerBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializerBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Initializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializerEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializerEnd(DirectParserASTType type,
-      {required this.token})
-      : super("Initializer", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializersBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInitializersBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Initializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInitializersEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentInitializersEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("Initializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentNoInitializersHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentNoInitializersHandle(DirectParserASTType type)
-      : super("NoInitializers", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentInvalidExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidFunctionBodyHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidTypeReferenceHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTypeReferenceHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTypeReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLabelHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLabelHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Label", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLabeledStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final int labelCount;
-
-  DirectParserASTContentLabeledStatementBegin(DirectParserASTType type,
-      {required this.token, required this.labelCount})
-      : super("LabeledStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "labelCount": labelCount,
-      };
-}
-
-class DirectParserASTContentLabeledStatementEnd extends DirectParserASTContent {
-  final int labelCount;
-
-  DirectParserASTContentLabeledStatementEnd(DirectParserASTType type,
-      {required this.labelCount})
-      : super("LabeledStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-      };
-}
-
-class DirectParserASTContentLibraryNameBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLibraryNameBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LibraryName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLibraryNameEnd extends DirectParserASTContent {
-  final Token libraryKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentLibraryNameEnd(DirectParserASTType type,
-      {required this.libraryKeyword, required this.semicolon})
-      : super("LibraryName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "libraryKeyword": libraryKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentLiteralMapEntryHandle
-    extends DirectParserASTContent {
-  final Token colon;
-  final Token endToken;
-
-  DirectParserASTContentLiteralMapEntryHandle(DirectParserASTType type,
-      {required this.colon, required this.endToken})
-      : super("LiteralMapEntry", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLiteralStringBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralStringBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralString", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInterpolationExpressionHandle
-    extends DirectParserASTContent {
-  final Token leftBracket;
-  final Token? rightBracket;
-
-  DirectParserASTContentInterpolationExpressionHandle(DirectParserASTType type,
-      {required this.leftBracket, this.rightBracket})
-      : super("InterpolationExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "leftBracket": leftBracket,
-        "rightBracket": rightBracket,
-      };
-}
-
-class DirectParserASTContentLiteralStringEnd extends DirectParserASTContent {
-  final int interpolationCount;
-  final Token endToken;
-
-  DirectParserASTContentLiteralStringEnd(DirectParserASTType type,
-      {required this.interpolationCount, required this.endToken})
-      : super("LiteralString", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "interpolationCount": interpolationCount,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentStringJuxtapositionHandle
-    extends DirectParserASTContent {
-  final Token startToken;
-  final int literalCount;
-
-  DirectParserASTContentStringJuxtapositionHandle(DirectParserASTType type,
-      {required this.startToken, required this.literalCount})
-      : super("StringJuxtaposition", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "startToken": startToken,
-        "literalCount": literalCount,
-      };
-}
-
-class DirectParserASTContentMemberBegin extends DirectParserASTContent {
-  DirectParserASTContentMemberBegin(DirectParserASTType type)
-      : super("Member", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentInvalidMemberHandle extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentInvalidMemberHandle(DirectParserASTType type,
-      {required this.endToken})
-      : super("InvalidMember", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMemberEnd extends DirectParserASTContent {
-  DirectParserASTContentMemberEnd(DirectParserASTType type)
-      : super("Member", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentMethodBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? varFinalOrConst;
-  final Token? getOrSet;
-  final Token name;
-
-  DirectParserASTContentMethodBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.varFinalOrConst,
-      this.getOrSet,
-      required this.name})
-      : super("Method", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "varFinalOrConst": varFinalOrConst,
-        "getOrSet": getOrSet,
-        "name": name,
-      };
-}
-
-class DirectParserASTContentClassMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentClassMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ClassMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentMixinMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("MixinMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionMethodEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentExtensionMethodEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ExtensionMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentClassConstructorEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentClassConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ClassConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMixinConstructorEnd extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentMixinConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("MixinConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentExtensionConstructorEnd
-    extends DirectParserASTContent {
-  final Token? getOrSet;
-  final Token beginToken;
-  final Token beginParam;
-  final Token? beginInitializers;
-  final Token endToken;
-
-  DirectParserASTContentExtensionConstructorEnd(DirectParserASTType type,
-      {this.getOrSet,
-      required this.beginToken,
-      required this.beginParam,
-      this.beginInitializers,
-      required this.endToken})
-      : super("ExtensionConstructor", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "getOrSet": getOrSet,
-        "beginToken": beginToken,
-        "beginParam": beginParam,
-        "beginInitializers": beginInitializers,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentMetadataStarBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentMetadataStarBegin(DirectParserASTType type,
-      {required this.token})
-      : super("MetadataStar", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentMetadataStarEnd extends DirectParserASTContent {
-  final int count;
-
-  DirectParserASTContentMetadataStarEnd(DirectParserASTType type,
-      {required this.count})
-      : super("MetadataStar", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-      };
-}
-
-class DirectParserASTContentMetadataBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentMetadataBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Metadata", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentMetadataEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? periodBeforeName;
-  final Token endToken;
-
-  DirectParserASTContentMetadataEnd(DirectParserASTType type,
-      {required this.beginToken, this.periodBeforeName, required this.endToken})
-      : super("Metadata", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "periodBeforeName": periodBeforeName,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentOptionalFormalParametersBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentOptionalFormalParametersBegin(DirectParserASTType type,
-      {required this.token})
-      : super("OptionalFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOptionalFormalParametersEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentOptionalFormalParametersEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("OptionalFormalParameters", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentPartBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentPartBegin(DirectParserASTType type,
-      {required this.token})
-      : super("Part", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentPartEnd extends DirectParserASTContent {
-  final Token partKeyword;
-  final Token semicolon;
-
-  DirectParserASTContentPartEnd(DirectParserASTType type,
-      {required this.partKeyword, required this.semicolon})
-      : super("Part", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "partKeyword": partKeyword,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentPartOfBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentPartOfBegin(DirectParserASTType type,
-      {required this.token})
-      : super("PartOf", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentPartOfEnd extends DirectParserASTContent {
-  final Token partKeyword;
-  final Token ofKeyword;
-  final Token semicolon;
-  final bool hasName;
-
-  DirectParserASTContentPartOfEnd(DirectParserASTType type,
-      {required this.partKeyword,
-      required this.ofKeyword,
-      required this.semicolon,
-      required this.hasName})
-      : super("PartOf", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "partKeyword": partKeyword,
-        "ofKeyword": ofKeyword,
-        "semicolon": semicolon,
-        "hasName": hasName,
-      };
-}
-
-class DirectParserASTContentRedirectingFactoryBodyBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentRedirectingFactoryBodyBegin(DirectParserASTType type,
-      {required this.token})
-      : super("RedirectingFactoryBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentRedirectingFactoryBodyEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentRedirectingFactoryBodyEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("RedirectingFactoryBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentReturnStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentReturnStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("ReturnStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodyHandle(DirectParserASTType type,
-      {required this.nativeToken, required this.semicolon})
-      : super("NativeFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodyIgnoredHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodyIgnoredHandle(
-      DirectParserASTType type,
-      {required this.nativeToken,
-      required this.semicolon})
-      : super("NativeFunctionBodyIgnored", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentNativeFunctionBodySkippedHandle
-    extends DirectParserASTContent {
-  final Token nativeToken;
-  final Token semicolon;
-
-  DirectParserASTContentNativeFunctionBodySkippedHandle(
-      DirectParserASTType type,
-      {required this.nativeToken,
-      required this.semicolon})
-      : super("NativeFunctionBodySkipped", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentEmptyFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token semicolon;
-
-  DirectParserASTContentEmptyFunctionBodyHandle(DirectParserASTType type,
-      {required this.semicolon})
-      : super("EmptyFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "semicolon": semicolon,
-      };
-}
-
-class DirectParserASTContentExpressionFunctionBodyHandle
-    extends DirectParserASTContent {
-  final Token arrowToken;
-  final Token? endToken;
-
-  DirectParserASTContentExpressionFunctionBodyHandle(DirectParserASTType type,
-      {required this.arrowToken, this.endToken})
-      : super("ExpressionFunctionBody", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "arrowToken": arrowToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentReturnStatementEnd extends DirectParserASTContent {
-  final bool hasExpression;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentReturnStatementEnd(DirectParserASTType type,
-      {required this.hasExpression,
-      required this.beginToken,
-      required this.endToken})
-      : super("ReturnStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasExpression": hasExpression,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentSendHandle extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentSendHandle(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("Send", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentShowBegin extends DirectParserASTContent {
-  final Token showKeyword;
-
-  DirectParserASTContentShowBegin(DirectParserASTType type,
-      {required this.showKeyword})
-      : super("Show", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-      };
-}
-
-class DirectParserASTContentShowEnd extends DirectParserASTContent {
-  final Token showKeyword;
-
-  DirectParserASTContentShowEnd(DirectParserASTType type,
-      {required this.showKeyword})
-      : super("Show", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "showKeyword": showKeyword,
-      };
-}
-
-class DirectParserASTContentSwitchStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSwitchStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("SwitchStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSwitchStatementEnd extends DirectParserASTContent {
-  final Token switchKeyword;
-  final Token endToken;
-
-  DirectParserASTContentSwitchStatementEnd(DirectParserASTType type,
-      {required this.switchKeyword, required this.endToken})
-      : super("SwitchStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "switchKeyword": switchKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentSwitchBlockBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSwitchBlockBegin(DirectParserASTType type,
-      {required this.token})
-      : super("SwitchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSwitchBlockEnd extends DirectParserASTContent {
-  final int caseCount;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentSwitchBlockEnd(DirectParserASTType type,
-      {required this.caseCount,
-      required this.beginToken,
-      required this.endToken})
-      : super("SwitchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseCount": caseCount,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentLiteralSymbolBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralSymbolBegin(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralSymbol", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralSymbolEnd extends DirectParserASTContent {
-  final Token hashToken;
-  final int identifierCount;
-
-  DirectParserASTContentLiteralSymbolEnd(DirectParserASTType type,
-      {required this.hashToken, required this.identifierCount})
-      : super("LiteralSymbol", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hashToken": hashToken,
-        "identifierCount": identifierCount,
-      };
-}
-
-class DirectParserASTContentThrowExpressionHandle
-    extends DirectParserASTContent {
-  final Token throwToken;
-  final Token endToken;
-
-  DirectParserASTContentThrowExpressionHandle(DirectParserASTType type,
-      {required this.throwToken, required this.endToken})
-      : super("ThrowExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "throwToken": throwToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentRethrowStatementBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentRethrowStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("RethrowStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentRethrowStatementEnd extends DirectParserASTContent {
-  final Token rethrowToken;
-  final Token endToken;
-
-  DirectParserASTContentRethrowStatementEnd(DirectParserASTType type,
-      {required this.rethrowToken, required this.endToken})
-      : super("RethrowStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "rethrowToken": rethrowToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelDeclarationEnd
-    extends DirectParserASTContent {
-  final Token nextToken;
-
-  DirectParserASTContentTopLevelDeclarationEnd(DirectParserASTType type,
-      {required this.nextToken})
-      : super("TopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nextToken": nextToken,
-      };
-}
-
-class DirectParserASTContentInvalidTopLevelDeclarationHandle
-    extends DirectParserASTContent {
-  final Token endToken;
-
-  DirectParserASTContentInvalidTopLevelDeclarationHandle(
-      DirectParserASTType type,
-      {required this.endToken})
-      : super("InvalidTopLevelDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMemberBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTopLevelMemberBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TopLevelMember", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFieldsBegin extends DirectParserASTContent {
-  final DeclarationKind declarationKind;
-  final Token? abstractToken;
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final Token lastConsumed;
-
-  DirectParserASTContentFieldsBegin(DirectParserASTType type,
-      {required this.declarationKind,
-      this.abstractToken,
-      this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.lastConsumed})
-      : super("Fields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "declarationKind": declarationKind,
-        "abstractToken": abstractToken,
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "lastConsumed": lastConsumed,
-      };
-}
-
-class DirectParserASTContentTopLevelFieldsEnd extends DirectParserASTContent {
-  final Token? externalToken;
-  final Token? staticToken;
-  final Token? covariantToken;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTopLevelFieldsEnd(DirectParserASTType type,
-      {this.externalToken,
-      this.staticToken,
-      this.covariantToken,
-      this.lateToken,
-      this.varFinalOrConst,
-      required this.count,
-      required this.beginToken,
-      required this.endToken})
-      : super("TopLevelFields", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "externalToken": externalToken,
-        "staticToken": staticToken,
-        "covariantToken": covariantToken,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMethodBegin extends DirectParserASTContent {
-  final Token lastConsumed;
-  final Token? externalToken;
-
-  DirectParserASTContentTopLevelMethodBegin(DirectParserASTType type,
-      {required this.lastConsumed, this.externalToken})
-      : super("TopLevelMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "lastConsumed": lastConsumed,
-        "externalToken": externalToken,
-      };
-}
-
-class DirectParserASTContentTopLevelMethodEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? getOrSet;
-  final Token endToken;
-
-  DirectParserASTContentTopLevelMethodEnd(DirectParserASTType type,
-      {required this.beginToken, this.getOrSet, required this.endToken})
-      : super("TopLevelMethod", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "getOrSet": getOrSet,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentTryStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTryStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TryStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCaseMatchHandle extends DirectParserASTContent {
-  final Token caseKeyword;
-  final Token colon;
-
-  DirectParserASTContentCaseMatchHandle(DirectParserASTType type,
-      {required this.caseKeyword, required this.colon})
-      : super("CaseMatch", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "caseKeyword": caseKeyword,
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentCatchClauseBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCatchClauseBegin(DirectParserASTType type,
-      {required this.token})
-      : super("CatchClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCatchClauseEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentCatchClauseEnd(DirectParserASTType type,
-      {required this.token})
-      : super("CatchClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCatchBlockHandle extends DirectParserASTContent {
-  final Token? onKeyword;
-  final Token? catchKeyword;
-  final Token? comma;
-
-  DirectParserASTContentCatchBlockHandle(DirectParserASTType type,
-      {this.onKeyword, this.catchKeyword, this.comma})
-      : super("CatchBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "onKeyword": onKeyword,
-        "catchKeyword": catchKeyword,
-        "comma": comma,
-      };
-}
-
-class DirectParserASTContentFinallyBlockHandle extends DirectParserASTContent {
-  final Token finallyKeyword;
-
-  DirectParserASTContentFinallyBlockHandle(DirectParserASTType type,
-      {required this.finallyKeyword})
-      : super("FinallyBlock", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "finallyKeyword": finallyKeyword,
-      };
-}
-
-class DirectParserASTContentTryStatementEnd extends DirectParserASTContent {
-  final int catchCount;
-  final Token tryKeyword;
-  final Token? finallyKeyword;
-
-  DirectParserASTContentTryStatementEnd(DirectParserASTType type,
-      {required this.catchCount, required this.tryKeyword, this.finallyKeyword})
-      : super("TryStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "catchCount": catchCount,
-        "tryKeyword": tryKeyword,
-        "finallyKeyword": finallyKeyword,
-      };
-}
-
-class DirectParserASTContentTypeHandle extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? questionMark;
-
-  DirectParserASTContentTypeHandle(DirectParserASTType type,
-      {required this.beginToken, this.questionMark})
-      : super("Type", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "questionMark": questionMark,
-      };
-}
-
-class DirectParserASTContentNonNullAssertExpressionHandle
-    extends DirectParserASTContent {
-  final Token bang;
-
-  DirectParserASTContentNonNullAssertExpressionHandle(DirectParserASTType type,
-      {required this.bang})
-      : super("NonNullAssertExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "bang": bang,
-      };
-}
-
-class DirectParserASTContentNoNameHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoNameHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionTypeBegin extends DirectParserASTContent {
-  final Token beginToken;
-
-  DirectParserASTContentFunctionTypeBegin(DirectParserASTType type,
-      {required this.beginToken})
-      : super("FunctionType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-      };
-}
-
-class DirectParserASTContentFunctionTypeEnd extends DirectParserASTContent {
-  final Token functionToken;
-  final Token? questionMark;
-
-  DirectParserASTContentFunctionTypeEnd(DirectParserASTType type,
-      {required this.functionToken, this.questionMark})
-      : super("FunctionType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "functionToken": functionToken,
-        "questionMark": questionMark,
-      };
-}
-
-class DirectParserASTContentTypeArgumentsBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeArgumentsBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeArgumentsEnd extends DirectParserASTContent {
-  final int count;
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTypeArgumentsEnd(DirectParserASTType type,
-      {required this.count, required this.beginToken, required this.endToken})
-      : super("TypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentInvalidTypeArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("InvalidTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoTypeArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariableBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeVariableBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeVariable", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariablesDefinedHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final int count;
-
-  DirectParserASTContentTypeVariablesDefinedHandle(DirectParserASTType type,
-      {required this.token, required this.count})
-      : super("TypeVariablesDefined", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "count": count,
-      };
-}
-
-class DirectParserASTContentTypeVariableEnd extends DirectParserASTContent {
-  final Token token;
-  final int index;
-  final Token? extendsOrSuper;
-  final Token? variance;
-
-  DirectParserASTContentTypeVariableEnd(DirectParserASTType type,
-      {required this.token,
-      required this.index,
-      this.extendsOrSuper,
-      this.variance})
-      : super("TypeVariable", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "index": index,
-        "extendsOrSuper": extendsOrSuper,
-        "variance": variance,
-      };
-}
-
-class DirectParserASTContentTypeVariablesBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentTypeVariablesBegin(DirectParserASTType type,
-      {required this.token})
-      : super("TypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentTypeVariablesEnd extends DirectParserASTContent {
-  final Token beginToken;
-  final Token endToken;
-
-  DirectParserASTContentTypeVariablesEnd(DirectParserASTType type,
-      {required this.beginToken, required this.endToken})
-      : super("TypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentFunctionExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("FunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionExpressionEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token token;
-
-  DirectParserASTContentFunctionExpressionEnd(DirectParserASTType type,
-      {required this.beginToken, required this.token})
-      : super("FunctionExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVariablesDeclarationBegin
-    extends DirectParserASTContent {
-  final Token token;
-  final Token? lateToken;
-  final Token? varFinalOrConst;
-
-  DirectParserASTContentVariablesDeclarationBegin(DirectParserASTType type,
-      {required this.token, this.lateToken, this.varFinalOrConst})
-      : super("VariablesDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "lateToken": lateToken,
-        "varFinalOrConst": varFinalOrConst,
-      };
-}
-
-class DirectParserASTContentVariablesDeclarationEnd
-    extends DirectParserASTContent {
-  final int count;
-  final Token? endToken;
-
-  DirectParserASTContentVariablesDeclarationEnd(DirectParserASTType type,
-      {required this.count, this.endToken})
-      : super("VariablesDeclaration", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentWhileStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentWhileStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("WhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentWhileStatementEnd extends DirectParserASTContent {
-  final Token whileKeyword;
-  final Token endToken;
-
-  DirectParserASTContentWhileStatementEnd(DirectParserASTType type,
-      {required this.whileKeyword, required this.endToken})
-      : super("WhileStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "whileKeyword": whileKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentAsOperatorTypeBegin extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorTypeBegin(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAsOperatorTypeEnd extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorTypeEnd(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAsOperatorHandle extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentAsOperatorHandle(DirectParserASTType type,
-      {required this.operator})
-      : super("AsOperator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentAssignmentExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("AssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBinaryExpressionBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBinaryExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("BinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBinaryExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentBinaryExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("BinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentEndingBinaryExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentEndingBinaryExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("EndingBinaryExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConditionalExpressionBegin
-    extends DirectParserASTContent {
-  final Token question;
-
-  DirectParserASTContentConditionalExpressionBegin(DirectParserASTType type,
-      {required this.question})
-      : super("ConditionalExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-      };
-}
-
-class DirectParserASTContentConditionalExpressionColonHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentConditionalExpressionColonHandle(
-      DirectParserASTType type)
-      : super("ConditionalExpressionColon", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentConditionalExpressionEnd
-    extends DirectParserASTContent {
-  final Token question;
-  final Token colon;
-
-  DirectParserASTContentConditionalExpressionEnd(DirectParserASTType type,
-      {required this.question, required this.colon})
-      : super("ConditionalExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentConstExpressionBegin
-    extends DirectParserASTContent {
-  final Token constKeyword;
-
-  DirectParserASTContentConstExpressionBegin(DirectParserASTType type,
-      {required this.constKeyword})
-      : super("ConstExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "constKeyword": constKeyword,
-      };
-}
-
-class DirectParserASTContentConstExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentConstExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ConstExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentConstFactoryHandle extends DirectParserASTContent {
-  final Token constKeyword;
-
-  DirectParserASTContentConstFactoryHandle(DirectParserASTType type,
-      {required this.constKeyword})
-      : super("ConstFactory", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "constKeyword": constKeyword,
-      };
-}
-
-class DirectParserASTContentForControlFlowBegin extends DirectParserASTContent {
-  final Token? awaitToken;
-  final Token forToken;
-
-  DirectParserASTContentForControlFlowBegin(DirectParserASTType type,
-      {this.awaitToken, required this.forToken})
-      : super("ForControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "awaitToken": awaitToken,
-        "forToken": forToken,
-      };
-}
-
-class DirectParserASTContentForControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentForInControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentForInControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("ForInControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfControlFlowBegin extends DirectParserASTContent {
-  final Token ifToken;
-
-  DirectParserASTContentIfControlFlowBegin(DirectParserASTType type,
-      {required this.ifToken})
-      : super("IfControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "ifToken": ifToken,
-      };
-}
-
-class DirectParserASTContentThenControlFlowHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentThenControlFlowHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ThenControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentElseControlFlowHandle
-    extends DirectParserASTContent {
-  final Token elseToken;
-
-  DirectParserASTContentElseControlFlowHandle(DirectParserASTType type,
-      {required this.elseToken})
-      : super("ElseControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "elseToken": elseToken,
-      };
-}
-
-class DirectParserASTContentIfControlFlowEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("IfControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentIfElseControlFlowEnd
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentIfElseControlFlowEnd(DirectParserASTType type,
-      {required this.token})
-      : super("IfElseControlFlow", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSpreadExpressionHandle
-    extends DirectParserASTContent {
-  final Token spreadToken;
-
-  DirectParserASTContentSpreadExpressionHandle(DirectParserASTType type,
-      {required this.spreadToken})
-      : super("SpreadExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "spreadToken": spreadToken,
-      };
-}
-
-class DirectParserASTContentFunctionTypedFormalParameterBegin
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFunctionTypedFormalParameterBegin(
-      DirectParserASTType type,
-      {required this.token})
-      : super("FunctionTypedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFunctionTypedFormalParameterEnd
-    extends DirectParserASTContent {
-  final Token nameToken;
-  final Token? question;
-
-  DirectParserASTContentFunctionTypedFormalParameterEnd(
-      DirectParserASTType type,
-      {required this.nameToken,
-      this.question})
-      : super("FunctionTypedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nameToken": nameToken,
-        "question": question,
-      };
-}
-
-class DirectParserASTContentIdentifierHandle extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentIdentifierHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("Identifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentShowHideIdentifierHandle
-    extends DirectParserASTContent {
-  final Token? modifier;
-  final Token identifier;
-
-  DirectParserASTContentShowHideIdentifierHandle(DirectParserASTType type,
-      {this.modifier, required this.identifier})
-      : super("ShowHideIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "modifier": modifier,
-        "identifier": identifier,
-      };
-}
-
-class DirectParserASTContentIndexedExpressionHandle
-    extends DirectParserASTContent {
-  final Token? question;
-  final Token openSquareBracket;
-  final Token closeSquareBracket;
-
-  DirectParserASTContentIndexedExpressionHandle(DirectParserASTType type,
-      {this.question,
-      required this.openSquareBracket,
-      required this.closeSquareBracket})
-      : super("IndexedExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "question": question,
-        "openSquareBracket": openSquareBracket,
-        "closeSquareBracket": closeSquareBracket,
-      };
-}
-
-class DirectParserASTContentIsOperatorTypeBegin extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentIsOperatorTypeBegin(DirectParserASTType type,
-      {required this.operator})
-      : super("IsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentIsOperatorTypeEnd extends DirectParserASTContent {
-  final Token operator;
-
-  DirectParserASTContentIsOperatorTypeEnd(DirectParserASTType type,
-      {required this.operator})
-      : super("IsOperatorType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operator": operator,
-      };
-}
-
-class DirectParserASTContentIsOperatorHandle extends DirectParserASTContent {
-  final Token isOperator;
-  final Token? not;
-
-  DirectParserASTContentIsOperatorHandle(DirectParserASTType type,
-      {required this.isOperator, this.not})
-      : super("IsOperator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "isOperator": isOperator,
-        "not": not,
-      };
-}
-
-class DirectParserASTContentLiteralBoolHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralBoolHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralBool", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentBreakStatementHandle
-    extends DirectParserASTContent {
-  final bool hasTarget;
-  final Token breakKeyword;
-  final Token endToken;
-
-  DirectParserASTContentBreakStatementHandle(DirectParserASTType type,
-      {required this.hasTarget,
-      required this.breakKeyword,
-      required this.endToken})
-      : super("BreakStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasTarget": hasTarget,
-        "breakKeyword": breakKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentContinueStatementHandle
-    extends DirectParserASTContent {
-  final bool hasTarget;
-  final Token continueKeyword;
-  final Token endToken;
-
-  DirectParserASTContentContinueStatementHandle(DirectParserASTType type,
-      {required this.hasTarget,
-      required this.continueKeyword,
-      required this.endToken})
-      : super("ContinueStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "hasTarget": hasTarget,
-        "continueKeyword": continueKeyword,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentEmptyStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentEmptyStatementHandle(DirectParserASTType type,
-      {required this.token})
-      : super("EmptyStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentAssertBegin extends DirectParserASTContent {
-  final Token assertKeyword;
-  final Assert kind;
-
-  DirectParserASTContentAssertBegin(DirectParserASTType type,
-      {required this.assertKeyword, required this.kind})
-      : super("Assert", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assertKeyword": assertKeyword,
-        "kind": kind,
-      };
-}
-
-class DirectParserASTContentAssertEnd extends DirectParserASTContent {
-  final Token assertKeyword;
-  final Assert kind;
-  final Token leftParenthesis;
-  final Token? commaToken;
-  final Token semicolonToken;
-
-  DirectParserASTContentAssertEnd(DirectParserASTType type,
-      {required this.assertKeyword,
-      required this.kind,
-      required this.leftParenthesis,
-      this.commaToken,
-      required this.semicolonToken})
-      : super("Assert", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "assertKeyword": assertKeyword,
-        "kind": kind,
-        "leftParenthesis": leftParenthesis,
-        "commaToken": commaToken,
-        "semicolonToken": semicolonToken,
-      };
-}
-
-class DirectParserASTContentLiteralDoubleHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralDoubleHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralDouble", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralIntHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralIntHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralInt", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentLiteralListHandle extends DirectParserASTContent {
-  final int count;
-  final Token leftBracket;
-  final Token? constKeyword;
-  final Token rightBracket;
-
-  DirectParserASTContentLiteralListHandle(DirectParserASTType type,
-      {required this.count,
-      required this.leftBracket,
-      this.constKeyword,
-      required this.rightBracket})
-      : super("LiteralList", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "leftBracket": leftBracket,
-        "constKeyword": constKeyword,
-        "rightBracket": rightBracket,
-      };
-}
-
-class DirectParserASTContentLiteralSetOrMapHandle
-    extends DirectParserASTContent {
-  final int count;
-  final Token leftBrace;
-  final Token? constKeyword;
-  final Token rightBrace;
-  final bool hasSetEntry;
-
-  DirectParserASTContentLiteralSetOrMapHandle(DirectParserASTType type,
-      {required this.count,
-      required this.leftBrace,
-      this.constKeyword,
-      required this.rightBrace,
-      required this.hasSetEntry})
-      : super("LiteralSetOrMap", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "count": count,
-        "leftBrace": leftBrace,
-        "constKeyword": constKeyword,
-        "rightBrace": rightBrace,
-        "hasSetEntry": hasSetEntry,
-      };
-}
-
-class DirectParserASTContentLiteralNullHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentLiteralNullHandle(DirectParserASTType type,
-      {required this.token})
-      : super("LiteralNull", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNativeClauseHandle extends DirectParserASTContent {
-  final Token nativeToken;
-  final bool hasName;
-
-  DirectParserASTContentNativeClauseHandle(DirectParserASTType type,
-      {required this.nativeToken, required this.hasName})
-      : super("NativeClause", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "nativeToken": nativeToken,
-        "hasName": hasName,
-      };
-}
-
-class DirectParserASTContentNamedArgumentHandle extends DirectParserASTContent {
-  final Token colon;
-
-  DirectParserASTContentNamedArgumentHandle(DirectParserASTType type,
-      {required this.colon})
-      : super("NamedArgument", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "colon": colon,
-      };
-}
-
-class DirectParserASTContentNewExpressionBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewExpressionBegin(DirectParserASTType type,
-      {required this.token})
-      : super("NewExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNewExpressionEnd extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewExpressionEnd(DirectParserASTType type,
-      {required this.token})
-      : super("NewExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoArgumentsHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoArgumentsHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoConstructorReferenceContinuationAfterTypeArgumentsHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("NoConstructorReferenceContinuationAfterTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoTypeHandle extends DirectParserASTContent {
-  final Token lastConsumed;
-
-  DirectParserASTContentNoTypeHandle(DirectParserASTType type,
-      {required this.lastConsumed})
-      : super("NoType", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "lastConsumed": lastConsumed,
-      };
-}
-
-class DirectParserASTContentNoTypeVariablesHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNoTypeVariablesHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NoTypeVariables", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOperatorHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentOperatorHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Operator", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSymbolVoidHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentSymbolVoidHandle(DirectParserASTType type,
-      {required this.token})
-      : super("SymbolVoid", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentOperatorNameHandle extends DirectParserASTContent {
-  final Token operatorKeyword;
-  final Token token;
-
-  DirectParserASTContentOperatorNameHandle(DirectParserASTType type,
-      {required this.operatorKeyword, required this.token})
-      : super("OperatorName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operatorKeyword": operatorKeyword,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentInvalidOperatorNameHandle
-    extends DirectParserASTContent {
-  final Token operatorKeyword;
-  final Token token;
-
-  DirectParserASTContentInvalidOperatorNameHandle(DirectParserASTType type,
-      {required this.operatorKeyword, required this.token})
-      : super("InvalidOperatorName", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "operatorKeyword": operatorKeyword,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentParenthesizedConditionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentParenthesizedConditionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ParenthesizedCondition", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentParenthesizedExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentParenthesizedExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ParenthesizedExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentQualifiedHandle extends DirectParserASTContent {
-  final Token period;
-
-  DirectParserASTContentQualifiedHandle(DirectParserASTType type,
-      {required this.period})
-      : super("Qualified", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "period": period,
-      };
-}
-
-class DirectParserASTContentStringPartHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentStringPartHandle(DirectParserASTType type,
-      {required this.token})
-      : super("StringPart", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentSuperExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentSuperExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("SuperExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentSwitchCaseBegin extends DirectParserASTContent {
-  final int labelCount;
-  final int expressionCount;
-  final Token firstToken;
-
-  DirectParserASTContentSwitchCaseBegin(DirectParserASTType type,
-      {required this.labelCount,
-      required this.expressionCount,
-      required this.firstToken})
-      : super("SwitchCase", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-        "expressionCount": expressionCount,
-        "firstToken": firstToken,
-      };
-}
-
-class DirectParserASTContentSwitchCaseEnd extends DirectParserASTContent {
-  final int labelCount;
-  final int expressionCount;
-  final Token? defaultKeyword;
-  final Token? colonAfterDefault;
-  final int statementCount;
-  final Token firstToken;
-  final Token endToken;
-
-  DirectParserASTContentSwitchCaseEnd(DirectParserASTType type,
-      {required this.labelCount,
-      required this.expressionCount,
-      this.defaultKeyword,
-      this.colonAfterDefault,
-      required this.statementCount,
-      required this.firstToken,
-      required this.endToken})
-      : super("SwitchCase", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "labelCount": labelCount,
-        "expressionCount": expressionCount,
-        "defaultKeyword": defaultKeyword,
-        "colonAfterDefault": colonAfterDefault,
-        "statementCount": statementCount,
-        "firstToken": firstToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentThisExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final IdentifierContext context;
-
-  DirectParserASTContentThisExpressionHandle(DirectParserASTType type,
-      {required this.token, required this.context})
-      : super("ThisExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "context": context,
-      };
-}
-
-class DirectParserASTContentUnaryPostfixAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPostfixAssignmentExpressionHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPostfixAssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnaryPrefixExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPrefixExpressionHandle(DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPrefixExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnaryPrefixAssignmentExpressionHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentUnaryPrefixAssignmentExpressionHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("UnaryPrefixAssignmentExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFormalParameterDefaultValueExpressionBegin
-    extends DirectParserASTContent {
-  DirectParserASTContentFormalParameterDefaultValueExpressionBegin(
-      DirectParserASTType type)
-      : super("FormalParameterDefaultValueExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentFormalParameterDefaultValueExpressionEnd
-    extends DirectParserASTContent {
-  DirectParserASTContentFormalParameterDefaultValueExpressionEnd(
-      DirectParserASTType type)
-      : super("FormalParameterDefaultValueExpression", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentValuedFormalParameterHandle
-    extends DirectParserASTContent {
-  final Token equals;
-  final Token token;
-
-  DirectParserASTContentValuedFormalParameterHandle(DirectParserASTType type,
-      {required this.equals, required this.token})
-      : super("ValuedFormalParameter", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "equals": equals,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentFormalParameterWithoutValueHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentFormalParameterWithoutValueHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("FormalParameterWithoutValue", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVoidKeywordHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVoidKeywordHandle(DirectParserASTType type,
-      {required this.token})
-      : super("VoidKeyword", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentVoidKeywordWithTypeArgumentsHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentVoidKeywordWithTypeArgumentsHandle(
-      DirectParserASTType type,
-      {required this.token})
-      : super("VoidKeywordWithTypeArguments", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentYieldStatementBegin extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentYieldStatementBegin(DirectParserASTType type,
-      {required this.token})
-      : super("YieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentYieldStatementEnd extends DirectParserASTContent {
-  final Token yieldToken;
-  final Token? starToken;
-  final Token endToken;
-
-  DirectParserASTContentYieldStatementEnd(DirectParserASTType type,
-      {required this.yieldToken, this.starToken, required this.endToken})
-      : super("YieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "yieldToken": yieldToken,
-        "starToken": starToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentInvalidYieldStatementEnd
-    extends DirectParserASTContent {
-  final Token beginToken;
-  final Token? starToken;
-  final Token endToken;
-  final MessageCode errorCode;
-
-  DirectParserASTContentInvalidYieldStatementEnd(DirectParserASTType type,
-      {required this.beginToken,
-      this.starToken,
-      required this.endToken,
-      required this.errorCode})
-      : super("InvalidYieldStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "beginToken": beginToken,
-        "starToken": starToken,
-        "endToken": endToken,
-        "errorCode": errorCode,
-      };
-}
-
-class DirectParserASTContentRecoverableErrorHandle
-    extends DirectParserASTContent {
-  final Message message;
-  final Token startToken;
-  final Token endToken;
-
-  DirectParserASTContentRecoverableErrorHandle(DirectParserASTType type,
-      {required this.message, required this.startToken, required this.endToken})
-      : super("RecoverableError", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "message": message,
-        "startToken": startToken,
-        "endToken": endToken,
-      };
-}
-
-class DirectParserASTContentErrorTokenHandle extends DirectParserASTContent {
-  final ErrorToken token;
-
-  DirectParserASTContentErrorTokenHandle(DirectParserASTType type,
-      {required this.token})
-      : super("ErrorToken", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentUnescapeErrorHandle extends DirectParserASTContent {
-  final Message message;
-  final Token location;
-  final int stringOffset;
-  final int length;
-
-  DirectParserASTContentUnescapeErrorHandle(DirectParserASTType type,
-      {required this.message,
-      required this.location,
-      required this.stringOffset,
-      required this.length})
-      : super("UnescapeError", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "message": message,
-        "location": location,
-        "stringOffset": stringOffset,
-        "length": length,
-      };
-}
-
-class DirectParserASTContentInvalidStatementHandle
-    extends DirectParserASTContent {
-  final Token token;
-  final Message message;
-
-  DirectParserASTContentInvalidStatementHandle(DirectParserASTType type,
-      {required this.token, required this.message})
-      : super("InvalidStatement", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-        "message": message,
-      };
-}
-
-class DirectParserASTContentScriptHandle extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentScriptHandle(DirectParserASTType type,
-      {required this.token})
-      : super("Script", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
-
-class DirectParserASTContentCommentReferenceTextHandle
-    extends DirectParserASTContent {
-  final String referenceSource;
-  final int referenceOffset;
-
-  DirectParserASTContentCommentReferenceTextHandle(DirectParserASTType type,
-      {required this.referenceSource, required this.referenceOffset})
-      : super("CommentReferenceText", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "referenceSource": referenceSource,
-        "referenceOffset": referenceOffset,
-      };
-}
-
-class DirectParserASTContentCommentReferenceHandle
-    extends DirectParserASTContent {
-  final Token? newKeyword;
-  final Token? prefix;
-  final Token? period;
-  final Token token;
-
-  DirectParserASTContentCommentReferenceHandle(DirectParserASTType type,
-      {this.newKeyword, this.prefix, this.period, required this.token})
-      : super("CommentReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "newKeyword": newKeyword,
-        "prefix": prefix,
-        "period": period,
-        "token": token,
-      };
-}
-
-class DirectParserASTContentNoCommentReferenceHandle
-    extends DirectParserASTContent {
-  DirectParserASTContentNoCommentReferenceHandle(DirectParserASTType type)
-      : super("NoCommentReference", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {};
-}
-
-class DirectParserASTContentTypeArgumentApplicationHandle
-    extends DirectParserASTContent {
-  final Token openAngleBracket;
-
-  DirectParserASTContentTypeArgumentApplicationHandle(DirectParserASTType type,
-      {required this.openAngleBracket})
-      : super("TypeArgumentApplication", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "openAngleBracket": openAngleBracket,
-      };
-}
-
-class DirectParserASTContentNewAsIdentifierHandle
-    extends DirectParserASTContent {
-  final Token token;
-
-  DirectParserASTContentNewAsIdentifierHandle(DirectParserASTType type,
-      {required this.token})
-      : super("NewAsIdentifier", type);
-
-  @override
-  Map<String, Object?> get deprecatedArguments => {
-        "token": token,
-      };
-}
diff --git a/pkg/front_end/lib/src/fasta/util/outline_extractor.dart b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
index e8ba2cc..8caa3f6 100644
--- a/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
+++ b/pkg/front_end/lib/src/fasta/util/outline_extractor.dart
@@ -12,12 +12,12 @@
 import 'package:front_end/src/base/processed_options.dart';
 import 'package:front_end/src/fasta/compiler_context.dart';
 import 'package:front_end/src/fasta/uri_translator.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 import 'package:front_end/src/fasta/util/textual_outline.dart';
 import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
 import 'package:kernel/target/targets.dart';
 
-import "direct_parser_ast.dart";
+import "parser_ast.dart";
 import "abstracted_ast_nodes.dart";
 
 // Overall TODO(s):
@@ -135,7 +135,7 @@
     final List<int> bytes2 = utf8.encode(outlined);
     getAstStopwatch.start();
     List<Token> languageVersionsSeen = [];
-    final DirectParserASTContent ast = getAST(bytes2,
+    final ParserAstNode ast = getAST(bytes2,
         enableExtensionMethods: configuration.enableExtensionMethods,
         enableNonNullable: configuration.enableNonNullable,
         enableTripleShift: configuration.enableTripleShift,
@@ -154,13 +154,12 @@
     extractIdentifierStopwatch.start();
     identifierExtractor.extract(ast);
     extractIdentifierStopwatch.stop();
-    for (DirectParserASTContentIdentifierHandle identifier
-        in identifierExtractor.identifiers) {
+    for (IdentifierHandle identifier in identifierExtractor.identifiers) {
       if (identifier.context == IdentifierContext.typeVariableDeclaration) {
         // Hack: Put type variable declarations into scope so any overlap in
         // name doesn't mark usages (e.g. a class E shouldn't be marked if we're
         // talking about the type variable E).
-        DirectParserASTContent content = identifier;
+        ParserAstNode content = identifier;
         AstNode? nearestAstNode = visitor.map[content];
         while (nearestAstNode == null && content.parent != null) {
           content = content.parent!;
@@ -277,9 +276,8 @@
         }
         List<AstNode>? prevLookupResult;
         nextIdentifier:
-        for (DirectParserASTContentIdentifierHandle identifier
-            in identifierExtractor.identifiers) {
-          DirectParserASTContent content = identifier;
+        for (IdentifierHandle identifier in identifierExtractor.identifiers) {
+          ParserAstNode content = identifier;
           AstNode? nearestAstNode = entry.topLevel.map[content];
           while (nearestAstNode == null && content.parent != null) {
             content = content.parent!;
@@ -540,43 +538,36 @@
 }
 
 class _IdentifierExtractor {
-  List<DirectParserASTContentIdentifierHandle> identifiers = [];
+  List<IdentifierHandle> identifiers = [];
 
-  void extract(DirectParserASTContent ast) {
-    if (ast is DirectParserASTContentIdentifierHandle) {
+  void extract(ParserAstNode ast) {
+    if (ast is IdentifierHandle) {
       identifiers.add(ast);
     }
-    List<DirectParserASTContent>? children = ast.children;
+    List<ParserAstNode>? children = ast.children;
     if (children != null) {
-      for (DirectParserASTContent child in children) {
+      for (ParserAstNode child in children) {
         extract(child);
       }
     }
   }
 }
 
-class _ParserAstVisitor extends DirectParserASTContentVisitor {
+class _ParserAstVisitor extends ParserAstVisitor {
   final Uri uri;
   final Uri? partOfUri;
   late Container currentContainer;
-  final Map<DirectParserASTContent, AstNode> map = {};
+  final Map<ParserAstNode, AstNode> map = {};
   final int verbosityLevel;
   final List<Token> languageVersionsSeen;
 
-  _ParserAstVisitor(
-      this.verbosityLevel,
-      String sourceText,
-      this.uri,
-      this.partOfUri,
-      DirectParserASTContent rootAst,
-      this.languageVersionsSeen) {
+  _ParserAstVisitor(this.verbosityLevel, String sourceText, this.uri,
+      this.partOfUri, ParserAstNode rootAst, this.languageVersionsSeen) {
     currentContainer = new TopLevel(sourceText, uri, rootAst, map);
     if (languageVersionsSeen.isNotEmpty) {
       // Use first one.
       Token languageVersion = languageVersionsSeen.first;
-      DirectParserASTContent dummyNode =
-          new DirectParserASTContentNoInitializersHandle(
-              DirectParserASTType.HANDLE);
+      ParserAstNode dummyNode = new NoInitializersHandle(ParserAstType.HANDLE);
       LanguageVersion version =
           new LanguageVersion(dummyNode, languageVersion, languageVersion);
       version.marked = Coloring.Marked;
@@ -596,11 +587,10 @@
   }
 
   @override
-  void visitClass(DirectParserASTContentClassDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    DirectParserASTContentTopLevelDeclarationEnd parent =
-        node.parent! as DirectParserASTContentTopLevelDeclarationEnd;
-    DirectParserASTContentIdentifierHandle identifier = parent.getIdentifier();
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
 
     log("Hello from class ${identifier.token}");
 
@@ -615,10 +605,10 @@
   }
 
   @override
-  void visitClassConstructor(DirectParserASTContentClassConstructorEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitClassConstructor(
+      ClassConstructorEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Class);
-    List<DirectParserASTContentIdentifierHandle> ids = node.getIdentifiers();
+    List<IdentifierHandle> ids = node.getIdentifiers();
     if (ids.length == 1) {
       ClassConstructor classConstructor = new ClassConstructor(
           node, ids.single.token.lexeme, startInclusive, endInclusive);
@@ -638,10 +628,10 @@
   }
 
   @override
-  void visitClassFactoryMethod(DirectParserASTContentClassFactoryMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitClassFactoryMethod(
+      ClassFactoryMethodEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Class);
-    List<DirectParserASTContentIdentifierHandle> ids = node.getIdentifiers();
+    List<IdentifierHandle> ids = node.getIdentifiers();
     if (ids.length == 1) {
       ClassFactoryMethod classFactoryMethod = new ClassFactoryMethod(
           node, ids.single.token.lexeme, startInclusive, endInclusive);
@@ -670,8 +660,8 @@
   }
 
   @override
-  void visitClassFields(DirectParserASTContentClassFieldsEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitClassFields(
+      ClassFieldsEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Class);
     List<String> fields =
         node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
@@ -683,8 +673,8 @@
   }
 
   @override
-  void visitClassMethod(DirectParserASTContentClassMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitClassMethod(
+      ClassMethodEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Class);
 
     String identifier;
@@ -709,9 +699,8 @@
   }
 
   @override
-  void visitEnum(DirectParserASTContentEnumEnd node, Token startInclusive,
-      Token endInclusive) {
-    List<DirectParserASTContentIdentifierHandle> ids = node.getIdentifiers();
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
+    List<IdentifierHandle> ids = node.getIdentifiers();
 
     Enum e = new Enum(
         node,
@@ -727,8 +716,7 @@
   }
 
   @override
-  void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {
     String uriString = node.getExportUriString();
     Uri exportUri = uri.resolve(uriString);
     List<String>? conditionalUriStrings = node.getConditionalExportUriStrings();
@@ -747,12 +735,11 @@
   }
 
   @override
-  void visitExtension(DirectParserASTContentExtensionDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    DirectParserASTContentExtensionDeclarationBegin begin =
-        node.children!.first as DirectParserASTContentExtensionDeclarationBegin;
-    DirectParserASTContentTopLevelDeclarationEnd parent =
-        node.parent! as DirectParserASTContentTopLevelDeclarationEnd;
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    ExtensionDeclarationBegin begin =
+        node.children!.first as ExtensionDeclarationBegin;
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
     log("Hello from extension ${begin.name}");
     Extension extension =
         new Extension(parent, begin.name?.lexeme, startInclusive, endInclusive);
@@ -766,25 +753,21 @@
 
   @override
   void visitExtensionConstructor(
-      DirectParserASTContentExtensionConstructorEnd node,
-      Token startInclusive,
-      Token endInclusive) {
+      ExtensionConstructorEnd node, Token startInclusive, Token endInclusive) {
     // TODO: implement visitExtensionConstructor
     throw node;
   }
 
   @override
-  void visitExtensionFactoryMethod(
-      DirectParserASTContentExtensionFactoryMethodEnd node,
-      Token startInclusive,
-      Token endInclusive) {
+  void visitExtensionFactoryMethod(ExtensionFactoryMethodEnd node,
+      Token startInclusive, Token endInclusive) {
     // TODO: implement visitExtensionFactoryMethod
     throw node;
   }
 
   @override
-  void visitExtensionFields(DirectParserASTContentExtensionFieldsEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitExtensionFields(
+      ExtensionFieldsEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Extension);
     List<String> fields =
         node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
@@ -796,8 +779,8 @@
   }
 
   @override
-  void visitExtensionMethod(DirectParserASTContentExtensionMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitExtensionMethod(
+      ExtensionMethodEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Extension);
     ExtensionMethod extensionMethod = new ExtensionMethod(
         node, node.getNameIdentifier(), startInclusive, endInclusive);
@@ -807,9 +790,8 @@
   }
 
   @override
-  void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token? endInclusive) {
-    DirectParserASTContentIdentifierHandle? prefix = node.getImportPrefix();
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
+    IdentifierHandle? prefix = node.getImportPrefix();
     String uriString = node.getImportUriString();
     Uri importUri = uri.resolve(uriString);
     List<String>? conditionalUriStrings = node.getConditionalImportUriStrings();
@@ -835,26 +817,25 @@
   }
 
   @override
-  void visitLibraryName(DirectParserASTContentLibraryNameEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {
     LibraryName name = new LibraryName(node, startInclusive, endInclusive);
     name.marked = Coloring.Marked;
     currentContainer.addChild(name, map);
   }
 
   @override
-  void visitMetadata(DirectParserASTContentMetadataEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {
     Metadata m = new Metadata(node, startInclusive, endInclusive);
     currentContainer.addChild(m, map);
   }
 
   @override
-  void visitMixin(DirectParserASTContentMixinDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
-    DirectParserASTContentTopLevelDeclarationEnd parent =
-        node.parent! as DirectParserASTContentTopLevelDeclarationEnd;
-    DirectParserASTContentIdentifierHandle identifier = parent.getIdentifier();
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
     log("Hello from mixin ${identifier.token}");
 
     Mixin mixin = new Mixin(
@@ -868,8 +849,8 @@
   }
 
   @override
-  void visitMixinFields(DirectParserASTContentMixinFieldsEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMixinFields(
+      MixinFieldsEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Mixin);
     List<String> fields =
         node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
@@ -881,8 +862,8 @@
   }
 
   @override
-  void visitMixinMethod(DirectParserASTContentMixinMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMixinMethod(
+      MixinMethodEnd node, Token startInclusive, Token endInclusive) {
     assert(currentContainer is Mixin);
     MixinMethod classMethod = new MixinMethod(
         node, node.getNameIdentifier(), startInclusive, endInclusive);
@@ -892,11 +873,10 @@
   }
 
   @override
-  void visitNamedMixin(DirectParserASTContentNamedMixinApplicationEnd node,
-      Token startInclusive, Token endInclusive) {
-    DirectParserASTContentTopLevelDeclarationEnd parent =
-        node.parent! as DirectParserASTContentTopLevelDeclarationEnd;
-    DirectParserASTContentIdentifierHandle identifier = parent.getIdentifier();
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
+    TopLevelDeclarationEnd parent = node.parent! as TopLevelDeclarationEnd;
+    IdentifierHandle identifier = parent.getIdentifier();
     log("Hello from named mixin ${identifier.token}");
 
     Mixin mixin = new Mixin(
@@ -910,8 +890,7 @@
   }
 
   @override
-  void visitPart(DirectParserASTContentPartEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {
     String uriString = node.getPartUriString();
     Uri partUri = uri.resolve(uriString);
 
@@ -921,8 +900,7 @@
   }
 
   @override
-  void visitPartOf(DirectParserASTContentPartOfEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {
     // We'll assume we've gotten here via a "part" so we'll ignore that for now.
     // TODO: partOfUri could - in an error case - be null.
     PartOf partof = new PartOf(node, partOfUri!, startInclusive, endInclusive);
@@ -931,8 +909,8 @@
   }
 
   @override
-  void visitTopLevelFields(DirectParserASTContentTopLevelFieldsEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {
     List<String> fields =
         node.getFieldIdentifiers().map((e) => e.token.lexeme).toList();
     TopLevelFields f =
@@ -943,8 +921,8 @@
   }
 
   @override
-  void visitTopLevelMethod(DirectParserASTContentTopLevelMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {
     TopLevelMethod m = new TopLevelMethod(node,
         node.getNameIdentifier().token.lexeme, startInclusive, endInclusive);
     currentContainer.addChild(m, map);
@@ -953,8 +931,7 @@
   }
 
   @override
-  void visitTypedef(DirectParserASTContentTypedefEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitTypedef(TypedefEnd node, Token startInclusive, Token endInclusive) {
     Typedef t = new Typedef(node, node.getNameIdentifier().token.lexeme,
         startInclusive, endInclusive);
     currentContainer.addChild(t, map);
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast.dart b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
new file mode 100644
index 0000000..3fe3f31
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast.dart
@@ -0,0 +1,1572 @@
+// Copyright (c) 2020, 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:typed_data' show Uint8List;
+
+import 'dart:io' show File;
+
+import 'package:_fe_analyzer_shared/src/messages/codes.dart';
+import 'package:_fe_analyzer_shared/src/scanner/scanner.dart'
+    show ScannerConfiguration;
+
+import 'package:_fe_analyzer_shared/src/parser/parser.dart'
+    show ClassMemberParser, Parser;
+
+import 'package:_fe_analyzer_shared/src/scanner/utf8_bytes_scanner.dart'
+    show Utf8BytesScanner;
+
+import 'package:_fe_analyzer_shared/src/scanner/token.dart' show Token;
+
+import 'package:_fe_analyzer_shared/src/parser/listener.dart'
+    show UnescapeErrorListener;
+
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+
+import 'package:_fe_analyzer_shared/src/parser/quote.dart' show unescapeString;
+
+import '../source/diet_parser.dart';
+
+import 'parser_ast_helper.dart';
+
+CompilationUnitEnd getAST(List<int> rawBytes,
+    {bool includeBody: true,
+    bool includeComments: false,
+    bool enableExtensionMethods: false,
+    bool enableNonNullable: false,
+    bool enableTripleShift: false,
+    List<Token>? languageVersionsSeen}) {
+  Uint8List bytes = new Uint8List(rawBytes.length + 1);
+  bytes.setRange(0, rawBytes.length, rawBytes);
+
+  ScannerConfiguration scannerConfiguration = new ScannerConfiguration(
+      enableExtensionMethods: enableExtensionMethods,
+      enableNonNullable: enableNonNullable,
+      enableTripleShift: enableTripleShift);
+
+  Utf8BytesScanner scanner = new Utf8BytesScanner(
+    bytes,
+    includeComments: includeComments,
+    configuration: scannerConfiguration,
+    languageVersionChanged: (scanner, languageVersion) {
+      // For now don't do anything, but having it (making it non-null) means the
+      // configuration won't be reset.
+      languageVersionsSeen?.add(languageVersion);
+    },
+  );
+  Token firstToken = scanner.tokenize();
+  // ignore: unnecessary_null_comparison
+  if (firstToken == null) {
+    throw "firstToken is null";
+  }
+
+  ParserASTListener listener = new ParserASTListener();
+  Parser parser;
+  if (includeBody) {
+    parser = new Parser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+  } else {
+    parser = new ClassMemberParser(listener,
+        useImplicitCreationExpression: useImplicitCreationExpressionInCfe);
+  }
+  parser.parseUnit(firstToken);
+  return listener.data.single as CompilationUnitEnd;
+}
+
+/// Best-effort visitor for ParserAstNode that visits top-level entries
+/// and class members only (i.e. no bodies, no field initializer content, no
+/// names etc).
+class ParserAstVisitor {
+  void accept(ParserAstNode node) {
+    if (node is CompilationUnitEnd ||
+        node is TopLevelDeclarationEnd ||
+        node is ClassOrMixinOrExtensionBodyEnd ||
+        node is MemberEnd) {
+      visitChildren(node);
+      return;
+    }
+
+    if (node.type == ParserAstType.BEGIN) {
+      // Ignored. These are basically just dummy nodes anyway.
+      assert(node.children == null);
+      return;
+    }
+    if (node.type == ParserAstType.HANDLE) {
+      // Ignored at least for know.
+      assert(node.children == null);
+      return;
+    }
+    if (node is TypeVariablesEnd ||
+        node is TypeArgumentsEnd ||
+        node is TypeListEnd ||
+        node is FunctionTypeEnd ||
+        node is BlockEnd) {
+      // Ignored at least for know.
+      return;
+    }
+    if (node is MetadataStarEnd) {
+      MetadataStarEnd metadata = node;
+      visitMetadataStar(metadata);
+      return;
+    }
+    if (node is TypedefEnd) {
+      TypedefEnd typedefDecl = node;
+      visitTypedef(
+          typedefDecl, typedefDecl.typedefKeyword, typedefDecl.endToken);
+      return;
+    }
+    if (node is ClassDeclarationEnd) {
+      ClassDeclarationEnd cls = node;
+      visitClass(cls, cls.beginToken, cls.endToken);
+      return;
+    }
+    if (node is TopLevelMethodEnd) {
+      TopLevelMethodEnd method = node;
+      visitTopLevelMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ClassMethodEnd) {
+      ClassMethodEnd method = node;
+      visitClassMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ExtensionMethodEnd) {
+      ExtensionMethodEnd method = node;
+      visitExtensionMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is MixinMethodEnd) {
+      MixinMethodEnd method = node;
+      visitMixinMethod(method, method.beginToken, method.endToken);
+      return;
+    }
+    if (node is ImportEnd) {
+      ImportEnd import = node;
+      visitImport(import, import.importKeyword, import.semicolon);
+      return;
+    }
+    if (node is ExportEnd) {
+      ExportEnd export = node;
+      visitExport(export, export.exportKeyword, export.semicolon);
+      return;
+    }
+    if (node is TopLevelFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      TopLevelFieldsEnd fields = node;
+      visitTopLevelFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is ClassFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      ClassFieldsEnd fields = node;
+      visitClassFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is ExtensionFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      ExtensionFieldsEnd fields = node;
+      visitExtensionFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is MixinFieldsEnd) {
+      // TODO(jensj): Possibly this could go into more details too
+      // (e.g. to split up a field declaration).
+      MixinFieldsEnd fields = node;
+      visitMixinFields(fields, fields.beginToken, fields.endToken);
+      return;
+    }
+    if (node is NamedMixinApplicationEnd) {
+      NamedMixinApplicationEnd namedMixin = node;
+      visitNamedMixin(namedMixin, namedMixin.begin, namedMixin.endToken);
+      return;
+    }
+    if (node is MixinDeclarationEnd) {
+      MixinDeclarationEnd declaration = node;
+      visitMixin(declaration, declaration.mixinKeyword, declaration.endToken);
+      return;
+    }
+    if (node is EnumEnd) {
+      EnumEnd declaration = node;
+      visitEnum(declaration, declaration.enumKeyword,
+          declaration.leftBrace.endGroup!);
+      return;
+    }
+    if (node is LibraryNameEnd) {
+      LibraryNameEnd name = node;
+      visitLibraryName(name, name.libraryKeyword, name.semicolon);
+      return;
+    }
+    if (node is PartEnd) {
+      PartEnd part = node;
+      visitPart(part, part.partKeyword, part.semicolon);
+      return;
+    }
+    if (node is PartOfEnd) {
+      PartOfEnd partOf = node;
+      visitPartOf(partOf, partOf.partKeyword, partOf.semicolon);
+      return;
+    }
+    if (node is ExtensionDeclarationEnd) {
+      ExtensionDeclarationEnd ext = node;
+      visitExtension(ext, ext.extensionKeyword, ext.endToken);
+      return;
+    }
+    if (node is ClassConstructorEnd) {
+      ClassConstructorEnd decl = node;
+      visitClassConstructor(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ExtensionConstructorEnd) {
+      ExtensionConstructorEnd decl = node;
+      visitExtensionConstructor(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ClassFactoryMethodEnd) {
+      ClassFactoryMethodEnd decl = node;
+      visitClassFactoryMethod(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is ExtensionFactoryMethodEnd) {
+      ExtensionFactoryMethodEnd decl = node;
+      visitExtensionFactoryMethod(decl, decl.beginToken, decl.endToken);
+      return;
+    }
+    if (node is MetadataEnd) {
+      MetadataEnd decl = node;
+      // TODO(jensj): endToken is not part of the metadata! It's the first token
+      // of the next thing.
+      visitMetadata(decl, decl.beginToken, decl.endToken.previous!);
+      return;
+    }
+
+    throw "Unknown: $node (${node.runtimeType} @ ${node.what})";
+  }
+
+  void visitChildren(ParserAstNode node) {
+    if (node.children == null) return;
+    final int numChildren = node.children!.length;
+    for (int i = 0; i < numChildren; i++) {
+      ParserAstNode child = node.children![i];
+      accept(child);
+    }
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTypedef(
+      TypedefEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitMetadataStar(MetadataStarEnd node) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassMethod(
+      ClassMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionMethod(
+      ExtensionMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMixinMethod(
+      MixinMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassFields(
+      ClassFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionFields(
+      ExtensionFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMixinFields(
+      MixinFieldsEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers can call visitChildren on this node.
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
+    visitChildren(node);
+  }
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassConstructor(
+      ClassConstructorEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionConstructor(
+      ExtensionConstructorEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitClassFactoryMethod(
+      ClassFactoryMethodEnd node, Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitExtensionFactoryMethod(ExtensionFactoryMethodEnd node,
+      Token startInclusive, Token endInclusive) {}
+
+  /// Note: Implementers are NOT expected to call visitChildren on this node.
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {}
+}
+
+extension GeneralASTContentExtension on ParserAstNode {
+  bool isClass() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! ClassDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ClassDeclarationEnd asClass() {
+    if (!isClass()) throw "Not class";
+    return children!.last as ClassDeclarationEnd;
+  }
+
+  bool isImport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! ImportEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ImportEnd asImport() {
+    if (!isImport()) throw "Not import";
+    return children!.last as ImportEnd;
+  }
+
+  bool isExport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! ExportEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ExportEnd asExport() {
+    if (!isExport()) throw "Not export";
+    return children!.last as ExportEnd;
+  }
+
+  bool isEnum() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! EnumEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  EnumEnd asEnum() {
+    if (!isEnum()) throw "Not enum";
+    return children!.last as EnumEnd;
+  }
+
+  bool isTypedef() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! TypedefEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TypedefEnd asTypedef() {
+    if (!isTypedef()) throw "Not typedef";
+    return children!.last as TypedefEnd;
+  }
+
+  bool isScript() {
+    if (this is! ScriptHandle) {
+      return false;
+    }
+    return true;
+  }
+
+  ScriptHandle asScript() {
+    if (!isScript()) throw "Not script";
+    return this as ScriptHandle;
+  }
+
+  bool isExtension() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! ExtensionDeclarationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! ExtensionDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  ExtensionDeclarationEnd asExtension() {
+    if (!isExtension()) throw "Not extension";
+    return children!.last as ExtensionDeclarationEnd;
+  }
+
+  bool isInvalidTopLevelDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! InvalidTopLevelDeclarationHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isRecoverableError() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! RecoverableErrorHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isRecoverImport() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! RecoverImportHandle) {
+      return false;
+    }
+
+    return true;
+  }
+
+  bool isMixinDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! MixinDeclarationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  MixinDeclarationEnd asMixinDeclaration() {
+    if (!isMixinDeclaration()) throw "Not mixin declaration";
+    return children!.last as MixinDeclarationEnd;
+  }
+
+  bool isNamedMixinDeclaration() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first
+        // ignore: lines_longer_than_80_chars
+        is! ClassOrMixinOrNamedMixinApplicationPreludeBegin) {
+      return false;
+    }
+    if (children!.last is! NamedMixinApplicationEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  NamedMixinApplicationEnd asNamedMixinDeclaration() {
+    if (!isNamedMixinDeclaration()) throw "Not named mixin declaration";
+    return children!.last as NamedMixinApplicationEnd;
+  }
+
+  bool isTopLevelMethod() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! TopLevelMethodEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TopLevelMethodEnd asTopLevelMethod() {
+    if (!isTopLevelMethod()) throw "Not top level method";
+    return children!.last as TopLevelMethodEnd;
+  }
+
+  bool isTopLevelFields() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! TopLevelMemberBegin) {
+      return false;
+    }
+    if (children!.last is! TopLevelFieldsEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  TopLevelFieldsEnd asTopLevelFields() {
+    if (!isTopLevelFields()) throw "Not top level fields";
+    return children!.last as TopLevelFieldsEnd;
+  }
+
+  bool isLibraryName() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! LibraryNameEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  LibraryNameEnd asLibraryName() {
+    if (!isLibraryName()) throw "Not library name";
+    return children!.last as LibraryNameEnd;
+  }
+
+  bool isPart() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! PartEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  PartEnd asPart() {
+    if (!isPart()) throw "Not part";
+    return children!.last as PartEnd;
+  }
+
+  bool isPartOf() {
+    if (this is! TopLevelDeclarationEnd) {
+      return false;
+    }
+    if (children!.first is! UncategorizedTopLevelDeclarationBegin) {
+      return false;
+    }
+    if (children!.last is! PartOfEnd) {
+      return false;
+    }
+
+    return true;
+  }
+
+  PartOfEnd asPartOf() {
+    if (!isPartOf()) throw "Not part of";
+    return children!.last as PartOfEnd;
+  }
+
+  bool isMetadata() {
+    if (this is! MetadataStarEnd) {
+      return false;
+    }
+    if (children!.first is! MetadataStarBegin) {
+      return false;
+    }
+    return true;
+  }
+
+  MetadataStarEnd asMetadata() {
+    if (!isMetadata()) throw "Not metadata";
+    return this as MetadataStarEnd;
+  }
+
+  bool isFunctionBody() {
+    if (this is BlockFunctionBodyEnd) return true;
+    return false;
+  }
+
+  BlockFunctionBodyEnd asFunctionBody() {
+    if (!isFunctionBody()) throw "Not function body";
+    return this as BlockFunctionBodyEnd;
+  }
+
+  List<E> recursivelyFind<E extends ParserAstNode>() {
+    Set<E> result = {};
+    _recursivelyFindInternal(this, result);
+    return result.toList();
+  }
+
+  static void _recursivelyFindInternal<E extends ParserAstNode>(
+      ParserAstNode node, Set<E> result) {
+    if (node is E) {
+      result.add(node);
+      return;
+    }
+    if (node.children == null) return;
+    for (ParserAstNode child in node.children!) {
+      _recursivelyFindInternal(child, result);
+    }
+  }
+
+  void debugDumpNodeRecursively({String indent = ""}) {
+    print("$indent${runtimeType} (${what}) "
+        "(${deprecatedArguments})");
+    if (children == null) return;
+    for (ParserAstNode child in children!) {
+      child.debugDumpNodeRecursively(indent: "  $indent");
+    }
+  }
+}
+
+extension MetadataStarExtension on MetadataStarEnd {
+  List<MetadataEnd> getMetadataEntries() {
+    List<MetadataEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (topLevel is! MetadataEnd) continue;
+      result.add(topLevel);
+    }
+    return result;
+  }
+}
+
+extension CompilationUnitExtension on CompilationUnitEnd {
+  List<TopLevelDeclarationEnd> getClasses() {
+    List<TopLevelDeclarationEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isClass()) continue;
+      result.add(topLevel as TopLevelDeclarationEnd);
+    }
+    return result;
+  }
+
+  List<TopLevelDeclarationEnd> getMixinDeclarations() {
+    List<TopLevelDeclarationEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isMixinDeclaration()) continue;
+      result.add(topLevel as TopLevelDeclarationEnd);
+    }
+    return result;
+  }
+
+  List<ImportEnd> getImports() {
+    List<ImportEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isImport()) continue;
+      result.add(topLevel.children!.last as ImportEnd);
+    }
+    return result;
+  }
+
+  List<ExportEnd> getExports() {
+    List<ExportEnd> result = [];
+    for (ParserAstNode topLevel in children!) {
+      if (!topLevel.isExport()) continue;
+      result.add(topLevel.children!.last as ExportEnd);
+    }
+    return result;
+  }
+
+  // List<MetadataStarEnd> getMetadata() {
+  //   List<MetadataStarEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isMetadata()) continue;
+  //     result.add(topLevel);
+  //   }
+  //   return result;
+  // }
+
+  // List<EnumEnd> getEnums() {
+  //   List<EnumEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isEnum()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<FunctionTypeAliasEnd> getTypedefs() {
+  //   List<FunctionTypeAliasEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isTypedef()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<MixinDeclarationEnd> getMixinDeclarations() {
+  //   List<MixinDeclarationEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isMixinDeclaration()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  // List<TopLevelMethodEnd> getTopLevelMethods() {
+  //   List<TopLevelMethodEnd> result = [];
+  //   for (ParserAstNode topLevel in children) {
+  //     if (!topLevel.isTopLevelMethod()) continue;
+  //     result.add(topLevel.children.last);
+  //   }
+  //   return result;
+  // }
+
+  CompilationUnitBegin getBegin() {
+    return children!.first as CompilationUnitBegin;
+  }
+}
+
+extension TopLevelDeclarationExtension on TopLevelDeclarationEnd {
+  IdentifierHandle getIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) return child;
+    }
+    throw "Not found.";
+  }
+
+  ClassDeclarationEnd getClassDeclaration() {
+    if (!isClass()) {
+      throw "Not a class";
+    }
+    for (ParserAstNode child in children!) {
+      if (child is ClassDeclarationEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+}
+
+extension MixinDeclarationExtension on MixinDeclarationEnd {
+  ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassOrMixinOrExtensionBodyEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+}
+
+extension ClassDeclarationExtension on ClassDeclarationEnd {
+  ClassOrMixinOrExtensionBodyEnd getClassOrMixinOrExtensionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassOrMixinOrExtensionBodyEnd) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+
+  ClassExtendsHandle getClassExtends() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassExtendsHandle) return child;
+    }
+    throw "Not found.";
+  }
+
+  ClassOrMixinImplementsHandle getClassImplements() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassOrMixinImplementsHandle) {
+        return child;
+      }
+    }
+    throw "Not found.";
+  }
+
+  ClassWithClauseHandle? getClassWithClause() {
+    for (ParserAstNode child in children!) {
+      if (child is ClassWithClauseHandle) {
+        return child;
+      }
+    }
+    return null;
+  }
+}
+
+extension ClassOrMixinBodyExtension on ClassOrMixinOrExtensionBodyEnd {
+  List<MemberEnd> getMembers() {
+    List<MemberEnd> members = [];
+    for (ParserAstNode child in children!) {
+      if (child is MemberEnd) {
+        members.add(child);
+      }
+    }
+    return members;
+  }
+}
+
+extension MemberExtension on MemberEnd {
+  bool isClassConstructor() {
+    ParserAstNode child = children![1];
+    if (child is ClassConstructorEnd) return true;
+    return false;
+  }
+
+  ClassConstructorEnd getClassConstructor() {
+    ParserAstNode child = children![1];
+    if (child is ClassConstructorEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassFactoryMethodEnd) return true;
+    return false;
+  }
+
+  ClassFactoryMethodEnd getClassFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassFactoryMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassFields() {
+    ParserAstNode child = children![1];
+    if (child is ClassFieldsEnd) return true;
+    return false;
+  }
+
+  ClassFieldsEnd getClassFields() {
+    ParserAstNode child = children![1];
+    if (child is ClassFieldsEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinFields() {
+    ParserAstNode child = children![1];
+    if (child is MixinFieldsEnd) return true;
+    return false;
+  }
+
+  MixinFieldsEnd getMixinFields() {
+    ParserAstNode child = children![1];
+    if (child is MixinFieldsEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinMethodEnd) return true;
+    return false;
+  }
+
+  MixinMethodEnd getMixinMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinFactoryMethodEnd) return true;
+    return false;
+  }
+
+  MixinFactoryMethodEnd getMixinFactoryMethod() {
+    ParserAstNode child = children![1];
+    if (child is MixinFactoryMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isMixinConstructor() {
+    ParserAstNode child = children![1];
+    if (child is MixinConstructorEnd) return true;
+    return false;
+  }
+
+  MixinConstructorEnd getMixinConstructor() {
+    ParserAstNode child = children![1];
+    if (child is MixinConstructorEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassMethodEnd) return true;
+    return false;
+  }
+
+  ClassMethodEnd getClassMethod() {
+    ParserAstNode child = children![1];
+    if (child is ClassMethodEnd) return child;
+    throw "Not found";
+  }
+
+  bool isClassRecoverableError() {
+    ParserAstNode child = children![1];
+    if (child is RecoverableErrorHandle) return true;
+    return false;
+  }
+}
+
+extension MixinFieldsExtension on MixinFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ExtensionFieldsExtension on ExtensionFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ClassFieldsExtension on ClassFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.fieldDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+
+  TypeHandle? getFirstType() {
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle) return child;
+    }
+    return null;
+  }
+
+  FieldInitializerEnd? getFieldInitializer() {
+    for (ParserAstNode child in children!) {
+      if (child is FieldInitializerEnd) return child;
+    }
+    return null;
+  }
+}
+
+extension EnumExtension on EnumEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> ids = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) ids.add(child);
+    }
+    return ids;
+  }
+}
+
+extension ExtensionDeclarationExtension on ExtensionDeclarationEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> ids = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) ids.add(child);
+    }
+    return ids;
+  }
+}
+
+extension TopLevelMethodExtension on TopLevelMethodEnd {
+  IdentifierHandle getNameIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.topLevelFunctionDeclaration) {
+          return child;
+        }
+      }
+    }
+    throw "Didn't find the name identifier!";
+  }
+}
+
+extension TypedefExtension on TypedefEnd {
+  IdentifierHandle getNameIdentifier() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.typedefDeclaration) {
+          return child;
+        }
+      }
+    }
+    throw "Didn't find the name identifier!";
+  }
+}
+
+extension ImportExtension on ImportEnd {
+  IdentifierHandle? getImportPrefix() {
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        if (child.context == IdentifierContext.importPrefixDeclaration) {
+          return child;
+        }
+      }
+    }
+  }
+
+  String getImportUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+
+  List<String>? getConditionalImportUriStrings() {
+    List<String>? result;
+    for (ParserAstNode child in children!) {
+      if (child is ConditionalUrisEnd) {
+        for (ParserAstNode child2 in child.children!) {
+          if (child2 is ConditionalUriEnd) {
+            LiteralStringEnd end = child2.children!.last as LiteralStringEnd;
+            LiteralStringBegin uri = end.children!.single as LiteralStringBegin;
+            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
+                const UnescapeErrorListenerDummy()));
+          }
+        }
+        return result;
+      }
+    }
+    return result;
+  }
+}
+
+extension ExportExtension on ExportEnd {
+  String getExportUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+
+  List<String>? getConditionalExportUriStrings() {
+    List<String>? result;
+    for (ParserAstNode child in children!) {
+      if (child is ConditionalUrisEnd) {
+        for (ParserAstNode child2 in child.children!) {
+          if (child2 is ConditionalUriEnd) {
+            LiteralStringEnd end = child2.children!.last as LiteralStringEnd;
+            LiteralStringBegin uri = end.children!.single as LiteralStringBegin;
+            (result ??= []).add(unescapeString(uri.token.lexeme, uri.token,
+                const UnescapeErrorListenerDummy()));
+          }
+        }
+        return result;
+      }
+    }
+    return result;
+  }
+}
+
+extension PartExtension on PartEnd {
+  String getPartUriString() {
+    StringBuffer sb = new StringBuffer();
+    bool foundOne = false;
+    for (ParserAstNode child in children!) {
+      if (child is LiteralStringEnd) {
+        LiteralStringBegin uri = child.children!.single as LiteralStringBegin;
+        sb.write(unescapeString(
+            uri.token.lexeme, uri.token, const UnescapeErrorListenerDummy()));
+        foundOne = true;
+      }
+    }
+    if (!foundOne) throw "Didn't find any";
+    return sb.toString();
+  }
+}
+
+class UnescapeErrorListenerDummy implements UnescapeErrorListener {
+  const UnescapeErrorListenerDummy();
+
+  @override
+  void handleUnescapeError(
+      Message message, covariant location, int offset, int length) {
+    // Purposely doesn't do anything.
+  }
+}
+
+extension TopLevelFieldsExtension on TopLevelFieldsEnd {
+  List<IdentifierHandle> getFieldIdentifiers() {
+    int countLeft = count;
+    List<IdentifierHandle>? identifiers;
+    for (int i = children!.length - 1; i >= 0; i--) {
+      ParserAstNode child = children![i];
+      if (child is IdentifierHandle &&
+          child.context == IdentifierContext.topLevelVariableDeclaration) {
+        countLeft--;
+        if (identifiers == null) {
+          identifiers = new List<IdentifierHandle>.filled(count, child);
+        } else {
+          identifiers[countLeft] = child;
+        }
+        if (countLeft == 0) break;
+      }
+    }
+    if (countLeft != 0) throw "Didn't find the expected number of identifiers";
+    return identifiers ?? [];
+  }
+}
+
+extension ClassMethodExtension on ClassMethodEnd {
+  BlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is BlockFunctionBodyEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle ||
+          child is FunctionTypeEnd) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension MixinMethodExtension on MixinMethodEnd {
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension ExtensionMethodExtension on ExtensionMethodEnd {
+  String getNameIdentifier() {
+    bool foundType = false;
+    for (ParserAstNode child in children!) {
+      if (child is TypeHandle ||
+          child is NoTypeHandle ||
+          child is VoidKeywordHandle) {
+        foundType = true;
+      }
+      if (foundType && child is IdentifierHandle) {
+        return child.token.lexeme;
+      } else if (foundType && child is OperatorNameHandle) {
+        return child.token.lexeme;
+      }
+    }
+    throw "No identifier found: $children";
+  }
+}
+
+extension ClassFactoryMethodExtension on ClassFactoryMethodEnd {
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        result.add(child);
+      } else if (child is FormalParametersEnd) {
+        break;
+      }
+    }
+    return result;
+  }
+}
+
+extension ClassConstructorExtension on ClassConstructorEnd {
+  FormalParametersEnd getFormalParameters() {
+    for (ParserAstNode child in children!) {
+      if (child is FormalParametersEnd) {
+        return child;
+      }
+    }
+    throw "Not found";
+  }
+
+  InitializersEnd? getInitializers() {
+    for (ParserAstNode child in children!) {
+      if (child is InitializersEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  BlockFunctionBodyEnd? getBlockFunctionBody() {
+    for (ParserAstNode child in children!) {
+      if (child is BlockFunctionBodyEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+
+  List<IdentifierHandle> getIdentifiers() {
+    List<IdentifierHandle> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is IdentifierHandle) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+}
+
+extension FormalParametersExtension on FormalParametersEnd {
+  List<FormalParameterEnd> getFormalParameters() {
+    List<FormalParameterEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is FormalParameterEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+
+  OptionalFormalParametersEnd? getOptionalFormalParameters() {
+    for (ParserAstNode child in children!) {
+      if (child is OptionalFormalParametersEnd) {
+        return child;
+      }
+    }
+    return null;
+  }
+}
+
+extension FormalParameterExtension on FormalParameterEnd {
+  FormalParameterBegin getBegin() {
+    return children!.first as FormalParameterBegin;
+  }
+}
+
+extension OptionalFormalParametersExtension on OptionalFormalParametersEnd {
+  List<FormalParameterEnd> getFormalParameters() {
+    List<FormalParameterEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is FormalParameterEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+}
+
+extension InitializersExtension on InitializersEnd {
+  List<InitializerEnd> getInitializers() {
+    List<InitializerEnd> result = [];
+    for (ParserAstNode child in children!) {
+      if (child is InitializerEnd) {
+        result.add(child);
+      }
+    }
+    return result;
+  }
+
+  InitializersBegin getBegin() {
+    return children!.first as InitializersBegin;
+  }
+}
+
+extension InitializerExtension on InitializerEnd {
+  InitializerBegin getBegin() {
+    return children!.first as InitializerBegin;
+  }
+}
+
+void main(List<String> args) {
+  File f = new File(args[0]);
+  Uint8List data = f.readAsBytesSync();
+  ParserAstNode ast = getAST(data);
+  if (args.length > 1 && args[1] == "--benchmark") {
+    Stopwatch stopwatch = new Stopwatch()..start();
+    int numRuns = 100;
+    for (int i = 0; i < numRuns; i++) {
+      ParserAstNode ast2 = getAST(data);
+      if (ast.what != ast2.what) {
+        throw "Not the same result every time";
+      }
+    }
+    stopwatch.stop();
+    print("First $numRuns took ${stopwatch.elapsedMilliseconds} ms "
+        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
+    stopwatch = new Stopwatch()..start();
+    numRuns = 2500;
+    for (int i = 0; i < numRuns; i++) {
+      ParserAstNode ast2 = getAST(data);
+      if (ast.what != ast2.what) {
+        throw "Not the same result every time";
+      }
+    }
+    stopwatch.stop();
+    print("Next $numRuns took ${stopwatch.elapsedMilliseconds} ms "
+        "(i.e. ${stopwatch.elapsedMilliseconds / numRuns}ms/iteration)");
+  } else {
+    print(ast);
+  }
+}
+
+class ParserASTListener extends AbstractParserAstListener {
+  @override
+  void seen(ParserAstNode entry) {
+    switch (entry.type) {
+      case ParserAstType.BEGIN:
+      case ParserAstType.HANDLE:
+        // This just adds stuff.
+        data.add(entry);
+        break;
+      case ParserAstType.END:
+        // End should gobble up everything until the corresponding begin (which
+        // should be the latest begin).
+        int? beginIndex;
+        for (int i = data.length - 1; i >= 0; i--) {
+          if (data[i].type == ParserAstType.BEGIN) {
+            beginIndex = i;
+            break;
+          }
+        }
+        if (beginIndex == null) {
+          throw "Couldn't find a begin for ${entry.what}. Has:\n"
+              "${data.map((e) => "${e.what}: ${e.type}").join("\n")}";
+        }
+        String begin = data[beginIndex].what;
+        String end = entry.what;
+        if (begin == end) {
+          // Exact match.
+        } else if (end == "TopLevelDeclaration" &&
+            (begin == "ExtensionDeclarationPrelude" ||
+                begin == "ClassOrMixinOrNamedMixinApplicationPrelude" ||
+                begin == "TopLevelMember" ||
+                begin == "UncategorizedTopLevelDeclaration")) {
+          // endTopLevelDeclaration is started by one of
+          // beginExtensionDeclarationPrelude,
+          // beginClassOrNamedMixinApplicationPrelude
+          // beginTopLevelMember or beginUncategorizedTopLevelDeclaration.
+        } else if (begin == "Method" &&
+            (end == "ClassConstructor" ||
+                end == "ClassMethod" ||
+                end == "ExtensionConstructor" ||
+                end == "ExtensionMethod" ||
+                end == "MixinConstructor" ||
+                end == "MixinMethod")) {
+          // beginMethod is ended by one of endClassConstructor, endClassMethod,
+          // endExtensionMethod, endMixinConstructor or endMixinMethod.
+        } else if (begin == "Fields" &&
+            (end == "TopLevelFields" ||
+                end == "ClassFields" ||
+                end == "MixinFields" ||
+                end == "ExtensionFields")) {
+          // beginFields is ended by one of endTopLevelFields, endMixinFields or
+          // endExtensionFields.
+        } else if (begin == "ForStatement" && end == "ForIn") {
+          // beginForStatement is ended by either endForStatement or endForIn.
+        } else if (begin == "FactoryMethod" &&
+            (end == "ClassFactoryMethod" ||
+                end == "MixinFactoryMethod" ||
+                end == "ExtensionFactoryMethod")) {
+          // beginFactoryMethod is ended by either endClassFactoryMethod,
+          // endMixinFactoryMethod or endExtensionFactoryMethod.
+        } else if (begin == "ForControlFlow" && (end == "ForInControlFlow")) {
+          // beginForControlFlow is ended by either endForControlFlow or
+          // endForInControlFlow.
+        } else if (begin == "IfControlFlow" && (end == "IfElseControlFlow")) {
+          // beginIfControlFlow is ended by either endIfControlFlow or
+          // endIfElseControlFlow.
+        } else if (begin == "AwaitExpression" &&
+            (end == "InvalidAwaitExpression")) {
+          // beginAwaitExpression is ended by either endAwaitExpression or
+          // endInvalidAwaitExpression.
+        } else if (begin == "YieldStatement" &&
+            (end == "InvalidYieldStatement")) {
+          // beginYieldStatement is ended by either endYieldStatement or
+          // endInvalidYieldStatement.
+        } else {
+          throw "Unknown combination: begin$begin and end$end";
+        }
+        List<ParserAstNode> children = data.sublist(beginIndex);
+        for (ParserAstNode child in children) {
+          child.parent = entry;
+        }
+        data.length = beginIndex;
+        data.add(entry..children = children);
+        break;
+    }
+  }
+
+  @override
+  void reportVarianceModifierNotEnabled(Token? variance) {
+    throw new UnimplementedError();
+  }
+
+  @override
+  Uri get uri => throw new UnimplementedError();
+
+  @override
+  void logEvent(String name) {
+    throw new UnimplementedError();
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
new file mode 100644
index 0000000..f41a614
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart
@@ -0,0 +1,6885 @@
+// Copyright (c) 2020, 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:_fe_analyzer_shared/src/parser/assert.dart';
+import 'package:_fe_analyzer_shared/src/parser/block_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/constructor_reference_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/declaration_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/formal_parameter_kind.dart';
+import 'package:_fe_analyzer_shared/src/parser/identifier_context.dart';
+import 'package:_fe_analyzer_shared/src/parser/listener.dart';
+import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
+import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
+import 'package:_fe_analyzer_shared/src/scanner/token.dart';
+import 'package:front_end/src/fasta/messages.dart';
+
+// ignore_for_file: lines_longer_than_80_chars
+
+// THIS FILE IS AUTO GENERATED BY
+// 'tool/_fasta/parser_ast_helper_creator.dart'
+// Run this command to update it:
+// 'dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart'
+
+abstract class ParserAstNode {
+  final String what;
+  final ParserAstType type;
+  Map<String, Object?> get deprecatedArguments;
+  List<ParserAstNode>? children;
+  ParserAstNode? parent;
+
+  ParserAstNode(this.what, this.type);
+
+  // TODO(jensj): Compare two ASTs.
+}
+
+enum ParserAstType { BEGIN, END, HANDLE }
+
+abstract class AbstractParserAstListener implements Listener {
+  List<ParserAstNode> data = [];
+
+  void seen(ParserAstNode entry);
+
+  @override
+  void beginArguments(Token token) {
+    ArgumentsBegin data = new ArgumentsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endArguments(int count, Token beginToken, Token endToken) {
+    ArgumentsEnd data = new ArgumentsEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleAsyncModifier(Token? asyncToken, Token? starToken) {
+    AsyncModifierHandle data = new AsyncModifierHandle(ParserAstType.HANDLE,
+        asyncToken: asyncToken, starToken: starToken);
+    seen(data);
+  }
+
+  @override
+  void beginAwaitExpression(Token token) {
+    AwaitExpressionBegin data =
+        new AwaitExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endAwaitExpression(Token beginToken, Token endToken) {
+    AwaitExpressionEnd data = new AwaitExpressionEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endInvalidAwaitExpression(
+      Token beginToken, Token endToken, MessageCode errorCode) {
+    InvalidAwaitExpressionEnd data = new InvalidAwaitExpressionEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        endToken: endToken,
+        errorCode: errorCode);
+    seen(data);
+  }
+
+  @override
+  void beginBlock(Token token, BlockKind blockKind) {
+    BlockBegin data =
+        new BlockBegin(ParserAstType.BEGIN, token: token, blockKind: blockKind);
+    seen(data);
+  }
+
+  @override
+  void endBlock(
+      int count, Token beginToken, Token endToken, BlockKind blockKind) {
+    BlockEnd data = new BlockEnd(ParserAstType.END,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken,
+        blockKind: blockKind);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTopLevelBlock(Token token) {
+    InvalidTopLevelBlockHandle data =
+        new InvalidTopLevelBlockHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginCascade(Token token) {
+    CascadeBegin data = new CascadeBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCascade() {
+    CascadeEnd data = new CascadeEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void beginCaseExpression(Token caseKeyword) {
+    CaseExpressionBegin data =
+        new CaseExpressionBegin(ParserAstType.BEGIN, caseKeyword: caseKeyword);
+    seen(data);
+  }
+
+  @override
+  void endCaseExpression(Token colon) {
+    CaseExpressionEnd data =
+        new CaseExpressionEnd(ParserAstType.END, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginClassOrMixinOrExtensionBody(DeclarationKind kind, Token token) {
+    ClassOrMixinOrExtensionBodyBegin data =
+        new ClassOrMixinOrExtensionBodyBegin(ParserAstType.BEGIN,
+            kind: kind, token: token);
+    seen(data);
+  }
+
+  @override
+  void endClassOrMixinOrExtensionBody(
+      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
+    ClassOrMixinOrExtensionBodyEnd data = new ClassOrMixinOrExtensionBodyEnd(
+        ParserAstType.END,
+        kind: kind,
+        memberCount: memberCount,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginClassOrMixinOrNamedMixinApplicationPrelude(Token token) {
+    ClassOrMixinOrNamedMixinApplicationPreludeBegin data =
+        new ClassOrMixinOrNamedMixinApplicationPreludeBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginClassDeclaration(Token begin, Token? abstractToken, Token name) {
+    ClassDeclarationBegin data = new ClassDeclarationBegin(ParserAstType.BEGIN,
+        begin: begin, abstractToken: abstractToken, name: name);
+    seen(data);
+  }
+
+  @override
+  void handleClassExtends(Token? extendsKeyword, int typeCount) {
+    ClassExtendsHandle data = new ClassExtendsHandle(ParserAstType.HANDLE,
+        extendsKeyword: extendsKeyword, typeCount: typeCount);
+    seen(data);
+  }
+
+  @override
+  void handleClassOrMixinImplements(
+      Token? implementsKeyword, int interfacesCount) {
+    ClassOrMixinImplementsHandle data = new ClassOrMixinImplementsHandle(
+        ParserAstType.HANDLE,
+        implementsKeyword: implementsKeyword,
+        interfacesCount: interfacesCount);
+    seen(data);
+  }
+
+  @override
+  void handleExtensionShowHide(Token? showKeyword, int showElementCount,
+      Token? hideKeyword, int hideElementCount) {
+    ExtensionShowHideHandle data = new ExtensionShowHideHandle(
+        ParserAstType.HANDLE,
+        showKeyword: showKeyword,
+        showElementCount: showElementCount,
+        hideKeyword: hideKeyword,
+        hideElementCount: hideElementCount);
+    seen(data);
+  }
+
+  @override
+  void handleClassHeader(Token begin, Token classKeyword, Token? nativeToken) {
+    ClassHeaderHandle data = new ClassHeaderHandle(ParserAstType.HANDLE,
+        begin: begin, classKeyword: classKeyword, nativeToken: nativeToken);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverClassHeader() {
+    RecoverClassHeaderHandle data =
+        new RecoverClassHeaderHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endClassDeclaration(Token beginToken, Token endToken) {
+    ClassDeclarationEnd data = new ClassDeclarationEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginMixinDeclaration(Token mixinKeyword, Token name) {
+    MixinDeclarationBegin data = new MixinDeclarationBegin(ParserAstType.BEGIN,
+        mixinKeyword: mixinKeyword, name: name);
+    seen(data);
+  }
+
+  @override
+  void handleMixinOn(Token? onKeyword, int typeCount) {
+    MixinOnHandle data = new MixinOnHandle(ParserAstType.HANDLE,
+        onKeyword: onKeyword, typeCount: typeCount);
+    seen(data);
+  }
+
+  @override
+  void handleMixinHeader(Token mixinKeyword) {
+    MixinHeaderHandle data =
+        new MixinHeaderHandle(ParserAstType.HANDLE, mixinKeyword: mixinKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverMixinHeader() {
+    RecoverMixinHeaderHandle data =
+        new RecoverMixinHeaderHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endMixinDeclaration(Token mixinKeyword, Token endToken) {
+    MixinDeclarationEnd data = new MixinDeclarationEnd(ParserAstType.END,
+        mixinKeyword: mixinKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginUncategorizedTopLevelDeclaration(Token token) {
+    UncategorizedTopLevelDeclarationBegin data =
+        new UncategorizedTopLevelDeclarationBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginExtensionDeclarationPrelude(Token extensionKeyword) {
+    ExtensionDeclarationPreludeBegin data =
+        new ExtensionDeclarationPreludeBegin(ParserAstType.BEGIN,
+            extensionKeyword: extensionKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginExtensionDeclaration(Token extensionKeyword, Token? name) {
+    ExtensionDeclarationBegin data = new ExtensionDeclarationBegin(
+        ParserAstType.BEGIN,
+        extensionKeyword: extensionKeyword,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void endExtensionDeclaration(Token extensionKeyword, Token? typeKeyword,
+      Token onKeyword, Token? showKeyword, Token? hideKeyword, Token endToken) {
+    ExtensionDeclarationEnd data = new ExtensionDeclarationEnd(
+        ParserAstType.END,
+        extensionKeyword: extensionKeyword,
+        typeKeyword: typeKeyword,
+        onKeyword: onKeyword,
+        showKeyword: showKeyword,
+        hideKeyword: hideKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginCombinators(Token token) {
+    CombinatorsBegin data =
+        new CombinatorsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCombinators(int count) {
+    CombinatorsEnd data = new CombinatorsEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginCompilationUnit(Token token) {
+    CompilationUnitBegin data =
+        new CompilationUnitBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleDirectivesOnly() {
+    DirectivesOnlyHandle data = new DirectivesOnlyHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endCompilationUnit(int count, Token token) {
+    CompilationUnitEnd data =
+        new CompilationUnitEnd(ParserAstType.END, count: count, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConstLiteral(Token token) {
+    ConstLiteralBegin data =
+        new ConstLiteralBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endConstLiteral(Token token) {
+    ConstLiteralEnd data = new ConstLiteralEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConstructorReference(Token start) {
+    ConstructorReferenceBegin data =
+        new ConstructorReferenceBegin(ParserAstType.BEGIN, start: start);
+    seen(data);
+  }
+
+  @override
+  void endConstructorReference(Token start, Token? periodBeforeName,
+      Token endToken, ConstructorReferenceContext constructorReferenceContext) {
+    ConstructorReferenceEnd data = new ConstructorReferenceEnd(
+        ParserAstType.END,
+        start: start,
+        periodBeforeName: periodBeforeName,
+        endToken: endToken,
+        constructorReferenceContext: constructorReferenceContext);
+    seen(data);
+  }
+
+  @override
+  void beginDoWhileStatement(Token token) {
+    DoWhileStatementBegin data =
+        new DoWhileStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endDoWhileStatement(
+      Token doKeyword, Token whileKeyword, Token endToken) {
+    DoWhileStatementEnd data = new DoWhileStatementEnd(ParserAstType.END,
+        doKeyword: doKeyword, whileKeyword: whileKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginDoWhileStatementBody(Token token) {
+    DoWhileStatementBodyBegin data =
+        new DoWhileStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endDoWhileStatementBody(Token token) {
+    DoWhileStatementBodyEnd data =
+        new DoWhileStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginWhileStatementBody(Token token) {
+    WhileStatementBodyBegin data =
+        new WhileStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endWhileStatementBody(Token token) {
+    WhileStatementBodyEnd data =
+        new WhileStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginEnum(Token enumKeyword) {
+    EnumBegin data =
+        new EnumBegin(ParserAstType.BEGIN, enumKeyword: enumKeyword);
+    seen(data);
+  }
+
+  @override
+  void endEnum(Token enumKeyword, Token leftBrace, int count) {
+    EnumEnd data = new EnumEnd(ParserAstType.END,
+        enumKeyword: enumKeyword, leftBrace: leftBrace, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginExport(Token token) {
+    ExportBegin data = new ExportBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endExport(Token exportKeyword, Token semicolon) {
+    ExportEnd data = new ExportEnd(ParserAstType.END,
+        exportKeyword: exportKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleExtraneousExpression(Token token, Message message) {
+    ExtraneousExpressionHandle data = new ExtraneousExpressionHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        message: message);
+    seen(data);
+  }
+
+  @override
+  void handleExpressionStatement(Token token) {
+    ExpressionStatementHandle data =
+        new ExpressionStatementHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFactoryMethod(DeclarationKind declarationKind, Token lastConsumed,
+      Token? externalToken, Token? constToken) {
+    FactoryMethodBegin data = new FactoryMethodBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        lastConsumed: lastConsumed,
+        externalToken: externalToken,
+        constToken: constToken);
+    seen(data);
+  }
+
+  @override
+  void endClassFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    ClassFactoryMethodEnd data = new ClassFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    MixinFactoryMethodEnd data = new MixinFactoryMethodEnd(ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionFactoryMethod(
+      Token beginToken, Token factoryKeyword, Token endToken) {
+    ExtensionFactoryMethodEnd data = new ExtensionFactoryMethodEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        factoryKeyword: factoryKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameter(Token token, MemberKind kind, Token? requiredToken,
+      Token? covariantToken, Token? varFinalOrConst) {
+    FormalParameterBegin data = new FormalParameterBegin(ParserAstType.BEGIN,
+        token: token,
+        kind: kind,
+        requiredToken: requiredToken,
+        covariantToken: covariantToken,
+        varFinalOrConst: varFinalOrConst);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameter(
+      Token? thisKeyword,
+      Token? superKeyword,
+      Token? periodAfterThisOrSuper,
+      Token nameToken,
+      Token? initializerStart,
+      Token? initializerEnd,
+      FormalParameterKind kind,
+      MemberKind memberKind) {
+    FormalParameterEnd data = new FormalParameterEnd(ParserAstType.END,
+        thisKeyword: thisKeyword,
+        superKeyword: superKeyword,
+        periodAfterThisOrSuper: periodAfterThisOrSuper,
+        nameToken: nameToken,
+        initializerStart: initializerStart,
+        initializerEnd: initializerEnd,
+        kind: kind,
+        memberKind: memberKind);
+    seen(data);
+  }
+
+  @override
+  void handleNoFormalParameters(Token token, MemberKind kind) {
+    NoFormalParametersHandle data = new NoFormalParametersHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        kind: kind);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameters(Token token, MemberKind kind) {
+    FormalParametersBegin data = new FormalParametersBegin(ParserAstType.BEGIN,
+        token: token, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameters(
+      int count, Token beginToken, Token endToken, MemberKind kind) {
+    FormalParametersEnd data = new FormalParametersEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endClassFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    ClassFieldsEnd data = new ClassFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    MixinFieldsEnd data = new MixinFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionFields(
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    ExtensionFieldsEnd data = new ExtensionFieldsEnd(ParserAstType.END,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerEmptyStatement(Token token) {
+    ForInitializerEmptyStatementHandle data =
+        new ForInitializerEmptyStatementHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerExpressionStatement(Token token, bool forIn) {
+    ForInitializerExpressionStatementHandle data =
+        new ForInitializerExpressionStatementHandle(ParserAstType.HANDLE,
+            token: token, forIn: forIn);
+    seen(data);
+  }
+
+  @override
+  void handleForInitializerLocalVariableDeclaration(Token token, bool forIn) {
+    ForInitializerLocalVariableDeclarationHandle data =
+        new ForInitializerLocalVariableDeclarationHandle(ParserAstType.HANDLE,
+            token: token, forIn: forIn);
+    seen(data);
+  }
+
+  @override
+  void beginForStatement(Token token) {
+    ForStatementBegin data =
+        new ForStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForLoopParts(Token forKeyword, Token leftParen,
+      Token leftSeparator, int updateExpressionCount) {
+    ForLoopPartsHandle data = new ForLoopPartsHandle(ParserAstType.HANDLE,
+        forKeyword: forKeyword,
+        leftParen: leftParen,
+        leftSeparator: leftSeparator,
+        updateExpressionCount: updateExpressionCount);
+    seen(data);
+  }
+
+  @override
+  void endForStatement(Token endToken) {
+    ForStatementEnd data =
+        new ForStatementEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginForStatementBody(Token token) {
+    ForStatementBodyBegin data =
+        new ForStatementBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForStatementBody(Token token) {
+    ForStatementBodyEnd data =
+        new ForStatementBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleForInLoopParts(Token? awaitToken, Token forToken,
+      Token leftParenthesis, Token inKeyword) {
+    ForInLoopPartsHandle data = new ForInLoopPartsHandle(ParserAstType.HANDLE,
+        awaitToken: awaitToken,
+        forToken: forToken,
+        leftParenthesis: leftParenthesis,
+        inKeyword: inKeyword);
+    seen(data);
+  }
+
+  @override
+  void endForIn(Token endToken) {
+    ForInEnd data = new ForInEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginForInExpression(Token token) {
+    ForInExpressionBegin data =
+        new ForInExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInExpression(Token token) {
+    ForInExpressionEnd data =
+        new ForInExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginForInBody(Token token) {
+    ForInBodyBegin data = new ForInBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInBody(Token token) {
+    ForInBodyEnd data = new ForInBodyEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginNamedFunctionExpression(Token token) {
+    NamedFunctionExpressionBegin data =
+        new NamedFunctionExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endNamedFunctionExpression(Token endToken) {
+    NamedFunctionExpressionEnd data =
+        new NamedFunctionExpressionEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLocalFunctionDeclaration(Token token) {
+    LocalFunctionDeclarationBegin data =
+        new LocalFunctionDeclarationBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLocalFunctionDeclaration(Token endToken) {
+    LocalFunctionDeclarationEnd data =
+        new LocalFunctionDeclarationEnd(ParserAstType.END, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginBlockFunctionBody(Token token) {
+    BlockFunctionBodyBegin data =
+        new BlockFunctionBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endBlockFunctionBody(int count, Token beginToken, Token endToken) {
+    BlockFunctionBodyEnd data = new BlockFunctionBodyEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleNoFunctionBody(Token token) {
+    NoFunctionBodyHandle data =
+        new NoFunctionBodyHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleFunctionBodySkipped(Token token, bool isExpressionBody) {
+    FunctionBodySkippedHandle data = new FunctionBodySkippedHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        isExpressionBody: isExpressionBody);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionName(Token token) {
+    FunctionNameBegin data =
+        new FunctionNameBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionName(Token beginToken, Token token) {
+    FunctionNameEnd data = new FunctionNameEnd(ParserAstType.END,
+        beginToken: beginToken, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginTypedef(Token token) {
+    TypedefBegin data = new TypedefBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypedef(Token typedefKeyword, Token? equals, Token endToken) {
+    TypedefEnd data = new TypedefEnd(ParserAstType.END,
+        typedefKeyword: typedefKeyword, equals: equals, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleClassWithClause(Token withKeyword) {
+    ClassWithClauseHandle data = new ClassWithClauseHandle(ParserAstType.HANDLE,
+        withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleClassNoWithClause() {
+    ClassNoWithClauseHandle data =
+        new ClassNoWithClauseHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void beginNamedMixinApplication(
+      Token begin, Token? abstractToken, Token name) {
+    NamedMixinApplicationBegin data = new NamedMixinApplicationBegin(
+        ParserAstType.BEGIN,
+        begin: begin,
+        abstractToken: abstractToken,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void handleNamedMixinApplicationWithClause(Token withKeyword) {
+    NamedMixinApplicationWithClauseHandle data =
+        new NamedMixinApplicationWithClauseHandle(ParserAstType.HANDLE,
+            withKeyword: withKeyword);
+    seen(data);
+  }
+
+  @override
+  void endNamedMixinApplication(Token begin, Token classKeyword, Token equals,
+      Token? implementsKeyword, Token endToken) {
+    NamedMixinApplicationEnd data = new NamedMixinApplicationEnd(
+        ParserAstType.END,
+        begin: begin,
+        classKeyword: classKeyword,
+        equals: equals,
+        implementsKeyword: implementsKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginHide(Token hideKeyword) {
+    HideBegin data =
+        new HideBegin(ParserAstType.BEGIN, hideKeyword: hideKeyword);
+    seen(data);
+  }
+
+  @override
+  void endHide(Token hideKeyword) {
+    HideEnd data = new HideEnd(ParserAstType.END, hideKeyword: hideKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleIdentifierList(int count) {
+    IdentifierListHandle data =
+        new IdentifierListHandle(ParserAstType.HANDLE, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginTypeList(Token token) {
+    TypeListBegin data = new TypeListBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeList(int count) {
+    TypeListEnd data = new TypeListEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginIfStatement(Token token) {
+    IfStatementBegin data =
+        new IfStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endIfStatement(Token ifToken, Token? elseToken) {
+    IfStatementEnd data = new IfStatementEnd(ParserAstType.END,
+        ifToken: ifToken, elseToken: elseToken);
+    seen(data);
+  }
+
+  @override
+  void beginThenStatement(Token token) {
+    ThenStatementBegin data =
+        new ThenStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endThenStatement(Token token) {
+    ThenStatementEnd data =
+        new ThenStatementEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginElseStatement(Token token) {
+    ElseStatementBegin data =
+        new ElseStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endElseStatement(Token token) {
+    ElseStatementEnd data =
+        new ElseStatementEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginImport(Token importKeyword) {
+    ImportBegin data =
+        new ImportBegin(ParserAstType.BEGIN, importKeyword: importKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleImportPrefix(Token? deferredKeyword, Token? asKeyword) {
+    ImportPrefixHandle data = new ImportPrefixHandle(ParserAstType.HANDLE,
+        deferredKeyword: deferredKeyword, asKeyword: asKeyword);
+    seen(data);
+  }
+
+  @override
+  void endImport(Token importKeyword, Token? semicolon) {
+    ImportEnd data = new ImportEnd(ParserAstType.END,
+        importKeyword: importKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverImport(Token? semicolon) {
+    RecoverImportHandle data =
+        new RecoverImportHandle(ParserAstType.HANDLE, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalUris(Token token) {
+    ConditionalUrisBegin data =
+        new ConditionalUrisBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endConditionalUris(int count) {
+    ConditionalUrisEnd data =
+        new ConditionalUrisEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalUri(Token ifKeyword) {
+    ConditionalUriBegin data =
+        new ConditionalUriBegin(ParserAstType.BEGIN, ifKeyword: ifKeyword);
+    seen(data);
+  }
+
+  @override
+  void endConditionalUri(Token ifKeyword, Token leftParen, Token? equalSign) {
+    ConditionalUriEnd data = new ConditionalUriEnd(ParserAstType.END,
+        ifKeyword: ifKeyword, leftParen: leftParen, equalSign: equalSign);
+    seen(data);
+  }
+
+  @override
+  void handleDottedName(int count, Token firstIdentifier) {
+    DottedNameHandle data = new DottedNameHandle(ParserAstType.HANDLE,
+        count: count, firstIdentifier: firstIdentifier);
+    seen(data);
+  }
+
+  @override
+  void beginImplicitCreationExpression(Token token) {
+    ImplicitCreationExpressionBegin data =
+        new ImplicitCreationExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endImplicitCreationExpression(Token token, Token openAngleBracket) {
+    ImplicitCreationExpressionEnd data = new ImplicitCreationExpressionEnd(
+        ParserAstType.END,
+        token: token,
+        openAngleBracket: openAngleBracket);
+    seen(data);
+  }
+
+  @override
+  void beginInitializedIdentifier(Token token) {
+    InitializedIdentifierBegin data =
+        new InitializedIdentifierBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializedIdentifier(Token nameToken) {
+    InitializedIdentifierEnd data =
+        new InitializedIdentifierEnd(ParserAstType.END, nameToken: nameToken);
+    seen(data);
+  }
+
+  @override
+  void beginFieldInitializer(Token token) {
+    FieldInitializerBegin data =
+        new FieldInitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFieldInitializer(Token assignment, Token token) {
+    FieldInitializerEnd data = new FieldInitializerEnd(ParserAstType.END,
+        assignment: assignment, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoFieldInitializer(Token token) {
+    NoFieldInitializerHandle data =
+        new NoFieldInitializerHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginVariableInitializer(Token token) {
+    VariableInitializerBegin data =
+        new VariableInitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endVariableInitializer(Token assignmentOperator) {
+    VariableInitializerEnd data = new VariableInitializerEnd(ParserAstType.END,
+        assignmentOperator: assignmentOperator);
+    seen(data);
+  }
+
+  @override
+  void handleNoVariableInitializer(Token token) {
+    NoVariableInitializerHandle data =
+        new NoVariableInitializerHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginInitializer(Token token) {
+    InitializerBegin data =
+        new InitializerBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializer(Token token) {
+    InitializerEnd data = new InitializerEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginInitializers(Token token) {
+    InitializersBegin data =
+        new InitializersBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endInitializers(int count, Token beginToken, Token endToken) {
+    InitializersEnd data = new InitializersEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleNoInitializers() {
+    NoInitializersHandle data = new NoInitializersHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidExpression(Token token) {
+    InvalidExpressionHandle data =
+        new InvalidExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidFunctionBody(Token token) {
+    InvalidFunctionBodyHandle data =
+        new InvalidFunctionBodyHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTypeReference(Token token) {
+    InvalidTypeReferenceHandle data =
+        new InvalidTypeReferenceHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLabel(Token token) {
+    LabelHandle data = new LabelHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginLabeledStatement(Token token, int labelCount) {
+    LabeledStatementBegin data = new LabeledStatementBegin(ParserAstType.BEGIN,
+        token: token, labelCount: labelCount);
+    seen(data);
+  }
+
+  @override
+  void endLabeledStatement(int labelCount) {
+    LabeledStatementEnd data =
+        new LabeledStatementEnd(ParserAstType.END, labelCount: labelCount);
+    seen(data);
+  }
+
+  @override
+  void beginLibraryName(Token token) {
+    LibraryNameBegin data =
+        new LibraryNameBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLibraryName(Token libraryKeyword, Token semicolon) {
+    LibraryNameEnd data = new LibraryNameEnd(ParserAstType.END,
+        libraryKeyword: libraryKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralMapEntry(Token colon, Token endToken) {
+    LiteralMapEntryHandle data = new LiteralMapEntryHandle(ParserAstType.HANDLE,
+        colon: colon, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLiteralString(Token token) {
+    LiteralStringBegin data =
+        new LiteralStringBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInterpolationExpression(Token leftBracket, Token? rightBracket) {
+    InterpolationExpressionHandle data = new InterpolationExpressionHandle(
+        ParserAstType.HANDLE,
+        leftBracket: leftBracket,
+        rightBracket: rightBracket);
+    seen(data);
+  }
+
+  @override
+  void endLiteralString(int interpolationCount, Token endToken) {
+    LiteralStringEnd data = new LiteralStringEnd(ParserAstType.END,
+        interpolationCount: interpolationCount, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleStringJuxtaposition(Token startToken, int literalCount) {
+    StringJuxtapositionHandle data = new StringJuxtapositionHandle(
+        ParserAstType.HANDLE,
+        startToken: startToken,
+        literalCount: literalCount);
+    seen(data);
+  }
+
+  @override
+  void beginMember() {
+    MemberBegin data = new MemberBegin(ParserAstType.BEGIN);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidMember(Token endToken) {
+    InvalidMemberHandle data =
+        new InvalidMemberHandle(ParserAstType.HANDLE, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMember() {
+    MemberEnd data = new MemberEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void beginMethod(
+      DeclarationKind declarationKind,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? varFinalOrConst,
+      Token? getOrSet,
+      Token name) {
+    MethodBegin data = new MethodBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        varFinalOrConst: varFinalOrConst,
+        getOrSet: getOrSet,
+        name: name);
+    seen(data);
+  }
+
+  @override
+  void endClassMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ClassMethodEnd data = new ClassMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    MixinMethodEnd data = new MixinMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionMethod(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ExtensionMethodEnd data = new ExtensionMethodEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endClassConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    ClassConstructorEnd data = new ClassConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endMixinConstructor(Token? getOrSet, Token beginToken, Token beginParam,
+      Token? beginInitializers, Token endToken) {
+    MixinConstructorEnd data = new MixinConstructorEnd(ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endExtensionConstructor(Token? getOrSet, Token beginToken,
+      Token beginParam, Token? beginInitializers, Token endToken) {
+    ExtensionConstructorEnd data = new ExtensionConstructorEnd(
+        ParserAstType.END,
+        getOrSet: getOrSet,
+        beginToken: beginToken,
+        beginParam: beginParam,
+        beginInitializers: beginInitializers,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginMetadataStar(Token token) {
+    MetadataStarBegin data =
+        new MetadataStarBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endMetadataStar(int count) {
+    MetadataStarEnd data = new MetadataStarEnd(ParserAstType.END, count: count);
+    seen(data);
+  }
+
+  @override
+  void beginMetadata(Token token) {
+    MetadataBegin data = new MetadataBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endMetadata(Token beginToken, Token? periodBeforeName, Token endToken) {
+    MetadataEnd data = new MetadataEnd(ParserAstType.END,
+        beginToken: beginToken,
+        periodBeforeName: periodBeforeName,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginOptionalFormalParameters(Token token) {
+    OptionalFormalParametersBegin data =
+        new OptionalFormalParametersBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endOptionalFormalParameters(
+      int count, Token beginToken, Token endToken) {
+    OptionalFormalParametersEnd data = new OptionalFormalParametersEnd(
+        ParserAstType.END,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginPart(Token token) {
+    PartBegin data = new PartBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endPart(Token partKeyword, Token semicolon) {
+    PartEnd data = new PartEnd(ParserAstType.END,
+        partKeyword: partKeyword, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void beginPartOf(Token token) {
+    PartOfBegin data = new PartOfBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endPartOf(
+      Token partKeyword, Token ofKeyword, Token semicolon, bool hasName) {
+    PartOfEnd data = new PartOfEnd(ParserAstType.END,
+        partKeyword: partKeyword,
+        ofKeyword: ofKeyword,
+        semicolon: semicolon,
+        hasName: hasName);
+    seen(data);
+  }
+
+  @override
+  void beginRedirectingFactoryBody(Token token) {
+    RedirectingFactoryBodyBegin data =
+        new RedirectingFactoryBodyBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endRedirectingFactoryBody(Token beginToken, Token endToken) {
+    RedirectingFactoryBodyEnd data = new RedirectingFactoryBodyEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginReturnStatement(Token token) {
+    ReturnStatementBegin data =
+        new ReturnStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBody(Token nativeToken, Token semicolon) {
+    NativeFunctionBodyHandle data = new NativeFunctionBodyHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBodyIgnored(Token nativeToken, Token semicolon) {
+    NativeFunctionBodyIgnoredHandle data = new NativeFunctionBodyIgnoredHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleNativeFunctionBodySkipped(Token nativeToken, Token semicolon) {
+    NativeFunctionBodySkippedHandle data = new NativeFunctionBodySkippedHandle(
+        ParserAstType.HANDLE,
+        nativeToken: nativeToken,
+        semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleEmptyFunctionBody(Token semicolon) {
+    EmptyFunctionBodyHandle data =
+        new EmptyFunctionBodyHandle(ParserAstType.HANDLE, semicolon: semicolon);
+    seen(data);
+  }
+
+  @override
+  void handleExpressionFunctionBody(Token arrowToken, Token? endToken) {
+    ExpressionFunctionBodyHandle data = new ExpressionFunctionBodyHandle(
+        ParserAstType.HANDLE,
+        arrowToken: arrowToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endReturnStatement(
+      bool hasExpression, Token beginToken, Token endToken) {
+    ReturnStatementEnd data = new ReturnStatementEnd(ParserAstType.END,
+        hasExpression: hasExpression,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleSend(Token beginToken, Token endToken) {
+    SendHandle data = new SendHandle(ParserAstType.HANDLE,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginShow(Token showKeyword) {
+    ShowBegin data =
+        new ShowBegin(ParserAstType.BEGIN, showKeyword: showKeyword);
+    seen(data);
+  }
+
+  @override
+  void endShow(Token showKeyword) {
+    ShowEnd data = new ShowEnd(ParserAstType.END, showKeyword: showKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchStatement(Token token) {
+    SwitchStatementBegin data =
+        new SwitchStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endSwitchStatement(Token switchKeyword, Token endToken) {
+    SwitchStatementEnd data = new SwitchStatementEnd(ParserAstType.END,
+        switchKeyword: switchKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchBlock(Token token) {
+    SwitchBlockBegin data =
+        new SwitchBlockBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endSwitchBlock(int caseCount, Token beginToken, Token endToken) {
+    SwitchBlockEnd data = new SwitchBlockEnd(ParserAstType.END,
+        caseCount: caseCount, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginLiteralSymbol(Token token) {
+    LiteralSymbolBegin data =
+        new LiteralSymbolBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endLiteralSymbol(Token hashToken, int identifierCount) {
+    LiteralSymbolEnd data = new LiteralSymbolEnd(ParserAstType.END,
+        hashToken: hashToken, identifierCount: identifierCount);
+    seen(data);
+  }
+
+  @override
+  void handleThrowExpression(Token throwToken, Token endToken) {
+    ThrowExpressionHandle data = new ThrowExpressionHandle(ParserAstType.HANDLE,
+        throwToken: throwToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginRethrowStatement(Token token) {
+    RethrowStatementBegin data =
+        new RethrowStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endRethrowStatement(Token rethrowToken, Token endToken) {
+    RethrowStatementEnd data = new RethrowStatementEnd(ParserAstType.END,
+        rethrowToken: rethrowToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelDeclaration(Token nextToken) {
+    TopLevelDeclarationEnd data =
+        new TopLevelDeclarationEnd(ParserAstType.END, nextToken: nextToken);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTopLevelDeclaration(Token endToken) {
+    InvalidTopLevelDeclarationHandle data =
+        new InvalidTopLevelDeclarationHandle(ParserAstType.HANDLE,
+            endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTopLevelMember(Token token) {
+    TopLevelMemberBegin data =
+        new TopLevelMemberBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFields(
+      DeclarationKind declarationKind,
+      Token? abstractToken,
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      Token lastConsumed) {
+    FieldsBegin data = new FieldsBegin(ParserAstType.BEGIN,
+        declarationKind: declarationKind,
+        abstractToken: abstractToken,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        lastConsumed: lastConsumed);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelFields(
+      Token? externalToken,
+      Token? staticToken,
+      Token? covariantToken,
+      Token? lateToken,
+      Token? varFinalOrConst,
+      int count,
+      Token beginToken,
+      Token endToken) {
+    TopLevelFieldsEnd data = new TopLevelFieldsEnd(ParserAstType.END,
+        externalToken: externalToken,
+        staticToken: staticToken,
+        covariantToken: covariantToken,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst,
+        count: count,
+        beginToken: beginToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTopLevelMethod(Token lastConsumed, Token? externalToken) {
+    TopLevelMethodBegin data = new TopLevelMethodBegin(ParserAstType.BEGIN,
+        lastConsumed: lastConsumed, externalToken: externalToken);
+    seen(data);
+  }
+
+  @override
+  void endTopLevelMethod(Token beginToken, Token? getOrSet, Token endToken) {
+    TopLevelMethodEnd data = new TopLevelMethodEnd(ParserAstType.END,
+        beginToken: beginToken, getOrSet: getOrSet, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginTryStatement(Token token) {
+    TryStatementBegin data =
+        new TryStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCaseMatch(Token caseKeyword, Token colon) {
+    CaseMatchHandle data = new CaseMatchHandle(ParserAstType.HANDLE,
+        caseKeyword: caseKeyword, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginCatchClause(Token token) {
+    CatchClauseBegin data =
+        new CatchClauseBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endCatchClause(Token token) {
+    CatchClauseEnd data = new CatchClauseEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCatchBlock(Token? onKeyword, Token? catchKeyword, Token? comma) {
+    CatchBlockHandle data = new CatchBlockHandle(ParserAstType.HANDLE,
+        onKeyword: onKeyword, catchKeyword: catchKeyword, comma: comma);
+    seen(data);
+  }
+
+  @override
+  void handleFinallyBlock(Token finallyKeyword) {
+    FinallyBlockHandle data = new FinallyBlockHandle(ParserAstType.HANDLE,
+        finallyKeyword: finallyKeyword);
+    seen(data);
+  }
+
+  @override
+  void endTryStatement(
+      int catchCount, Token tryKeyword, Token? finallyKeyword) {
+    TryStatementEnd data = new TryStatementEnd(ParserAstType.END,
+        catchCount: catchCount,
+        tryKeyword: tryKeyword,
+        finallyKeyword: finallyKeyword);
+    seen(data);
+  }
+
+  @override
+  void handleType(Token beginToken, Token? questionMark) {
+    TypeHandle data = new TypeHandle(ParserAstType.HANDLE,
+        beginToken: beginToken, questionMark: questionMark);
+    seen(data);
+  }
+
+  @override
+  void handleNonNullAssertExpression(Token bang) {
+    NonNullAssertExpressionHandle data =
+        new NonNullAssertExpressionHandle(ParserAstType.HANDLE, bang: bang);
+    seen(data);
+  }
+
+  @override
+  void handleNoName(Token token) {
+    NoNameHandle data = new NoNameHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionType(Token beginToken) {
+    FunctionTypeBegin data =
+        new FunctionTypeBegin(ParserAstType.BEGIN, beginToken: beginToken);
+    seen(data);
+  }
+
+  @override
+  void endFunctionType(Token functionToken, Token? questionMark) {
+    FunctionTypeEnd data = new FunctionTypeEnd(ParserAstType.END,
+        functionToken: functionToken, questionMark: questionMark);
+    seen(data);
+  }
+
+  @override
+  void beginTypeArguments(Token token) {
+    TypeArgumentsBegin data =
+        new TypeArgumentsBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeArguments(int count, Token beginToken, Token endToken) {
+    TypeArgumentsEnd data = new TypeArgumentsEnd(ParserAstType.END,
+        count: count, beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidTypeArguments(Token token) {
+    InvalidTypeArgumentsHandle data =
+        new InvalidTypeArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeArguments(Token token) {
+    NoTypeArgumentsHandle data =
+        new NoTypeArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginTypeVariable(Token token) {
+    TypeVariableBegin data =
+        new TypeVariableBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleTypeVariablesDefined(Token token, int count) {
+    TypeVariablesDefinedHandle data = new TypeVariablesDefinedHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        count: count);
+    seen(data);
+  }
+
+  @override
+  void endTypeVariable(
+      Token token, int index, Token? extendsOrSuper, Token? variance) {
+    TypeVariableEnd data = new TypeVariableEnd(ParserAstType.END,
+        token: token,
+        index: index,
+        extendsOrSuper: extendsOrSuper,
+        variance: variance);
+    seen(data);
+  }
+
+  @override
+  void beginTypeVariables(Token token) {
+    TypeVariablesBegin data =
+        new TypeVariablesBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endTypeVariables(Token beginToken, Token endToken) {
+    TypeVariablesEnd data = new TypeVariablesEnd(ParserAstType.END,
+        beginToken: beginToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionExpression(Token token) {
+    FunctionExpressionBegin data =
+        new FunctionExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionExpression(Token beginToken, Token token) {
+    FunctionExpressionEnd data = new FunctionExpressionEnd(ParserAstType.END,
+        beginToken: beginToken, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginVariablesDeclaration(
+      Token token, Token? lateToken, Token? varFinalOrConst) {
+    VariablesDeclarationBegin data = new VariablesDeclarationBegin(
+        ParserAstType.BEGIN,
+        token: token,
+        lateToken: lateToken,
+        varFinalOrConst: varFinalOrConst);
+    seen(data);
+  }
+
+  @override
+  void endVariablesDeclaration(int count, Token? endToken) {
+    VariablesDeclarationEnd data = new VariablesDeclarationEnd(
+        ParserAstType.END,
+        count: count,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginWhileStatement(Token token) {
+    WhileStatementBegin data =
+        new WhileStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endWhileStatement(Token whileKeyword, Token endToken) {
+    WhileStatementEnd data = new WhileStatementEnd(ParserAstType.END,
+        whileKeyword: whileKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void beginAsOperatorType(Token operator) {
+    AsOperatorTypeBegin data =
+        new AsOperatorTypeBegin(ParserAstType.BEGIN, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void endAsOperatorType(Token operator) {
+    AsOperatorTypeEnd data =
+        new AsOperatorTypeEnd(ParserAstType.END, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleAsOperator(Token operator) {
+    AsOperatorHandle data =
+        new AsOperatorHandle(ParserAstType.HANDLE, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleAssignmentExpression(Token token) {
+    AssignmentExpressionHandle data =
+        new AssignmentExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginBinaryExpression(Token token) {
+    BinaryExpressionBegin data =
+        new BinaryExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endBinaryExpression(Token token) {
+    BinaryExpressionEnd data =
+        new BinaryExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleEndingBinaryExpression(Token token) {
+    EndingBinaryExpressionHandle data =
+        new EndingBinaryExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginConditionalExpression(Token question) {
+    ConditionalExpressionBegin data =
+        new ConditionalExpressionBegin(ParserAstType.BEGIN, question: question);
+    seen(data);
+  }
+
+  @override
+  void handleConditionalExpressionColon() {
+    ConditionalExpressionColonHandle data =
+        new ConditionalExpressionColonHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void endConditionalExpression(Token question, Token colon) {
+    ConditionalExpressionEnd data = new ConditionalExpressionEnd(
+        ParserAstType.END,
+        question: question,
+        colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginConstExpression(Token constKeyword) {
+    ConstExpressionBegin data = new ConstExpressionBegin(ParserAstType.BEGIN,
+        constKeyword: constKeyword);
+    seen(data);
+  }
+
+  @override
+  void endConstExpression(Token token) {
+    ConstExpressionEnd data =
+        new ConstExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleConstFactory(Token constKeyword) {
+    ConstFactoryHandle data = new ConstFactoryHandle(ParserAstType.HANDLE,
+        constKeyword: constKeyword);
+    seen(data);
+  }
+
+  @override
+  void beginForControlFlow(Token? awaitToken, Token forToken) {
+    ForControlFlowBegin data = new ForControlFlowBegin(ParserAstType.BEGIN,
+        awaitToken: awaitToken, forToken: forToken);
+    seen(data);
+  }
+
+  @override
+  void endForControlFlow(Token token) {
+    ForControlFlowEnd data =
+        new ForControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void endForInControlFlow(Token token) {
+    ForInControlFlowEnd data =
+        new ForInControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginIfControlFlow(Token ifToken) {
+    IfControlFlowBegin data =
+        new IfControlFlowBegin(ParserAstType.BEGIN, ifToken: ifToken);
+    seen(data);
+  }
+
+  @override
+  void handleThenControlFlow(Token token) {
+    ThenControlFlowHandle data =
+        new ThenControlFlowHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleElseControlFlow(Token elseToken) {
+    ElseControlFlowHandle data =
+        new ElseControlFlowHandle(ParserAstType.HANDLE, elseToken: elseToken);
+    seen(data);
+  }
+
+  @override
+  void endIfControlFlow(Token token) {
+    IfControlFlowEnd data =
+        new IfControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void endIfElseControlFlow(Token token) {
+    IfElseControlFlowEnd data =
+        new IfElseControlFlowEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSpreadExpression(Token spreadToken) {
+    SpreadExpressionHandle data = new SpreadExpressionHandle(
+        ParserAstType.HANDLE,
+        spreadToken: spreadToken);
+    seen(data);
+  }
+
+  @override
+  void beginFunctionTypedFormalParameter(Token token) {
+    FunctionTypedFormalParameterBegin data =
+        new FunctionTypedFormalParameterBegin(ParserAstType.BEGIN,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void endFunctionTypedFormalParameter(Token nameToken, Token? question) {
+    FunctionTypedFormalParameterEnd data = new FunctionTypedFormalParameterEnd(
+        ParserAstType.END,
+        nameToken: nameToken,
+        question: question);
+    seen(data);
+  }
+
+  @override
+  void handleIdentifier(Token token, IdentifierContext context) {
+    IdentifierHandle data = new IdentifierHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void handleShowHideIdentifier(Token? modifier, Token identifier) {
+    ShowHideIdentifierHandle data = new ShowHideIdentifierHandle(
+        ParserAstType.HANDLE,
+        modifier: modifier,
+        identifier: identifier);
+    seen(data);
+  }
+
+  @override
+  void handleIndexedExpression(
+      Token? question, Token openSquareBracket, Token closeSquareBracket) {
+    IndexedExpressionHandle data = new IndexedExpressionHandle(
+        ParserAstType.HANDLE,
+        question: question,
+        openSquareBracket: openSquareBracket,
+        closeSquareBracket: closeSquareBracket);
+    seen(data);
+  }
+
+  @override
+  void beginIsOperatorType(Token operator) {
+    IsOperatorTypeBegin data =
+        new IsOperatorTypeBegin(ParserAstType.BEGIN, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void endIsOperatorType(Token operator) {
+    IsOperatorTypeEnd data =
+        new IsOperatorTypeEnd(ParserAstType.END, operator: operator);
+    seen(data);
+  }
+
+  @override
+  void handleIsOperator(Token isOperator, Token? not) {
+    IsOperatorHandle data = new IsOperatorHandle(ParserAstType.HANDLE,
+        isOperator: isOperator, not: not);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralBool(Token token) {
+    LiteralBoolHandle data =
+        new LiteralBoolHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleBreakStatement(
+      bool hasTarget, Token breakKeyword, Token endToken) {
+    BreakStatementHandle data = new BreakStatementHandle(ParserAstType.HANDLE,
+        hasTarget: hasTarget, breakKeyword: breakKeyword, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleContinueStatement(
+      bool hasTarget, Token continueKeyword, Token endToken) {
+    ContinueStatementHandle data = new ContinueStatementHandle(
+        ParserAstType.HANDLE,
+        hasTarget: hasTarget,
+        continueKeyword: continueKeyword,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleEmptyStatement(Token token) {
+    EmptyStatementHandle data =
+        new EmptyStatementHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void beginAssert(Token assertKeyword, Assert kind) {
+    AssertBegin data = new AssertBegin(ParserAstType.BEGIN,
+        assertKeyword: assertKeyword, kind: kind);
+    seen(data);
+  }
+
+  @override
+  void endAssert(Token assertKeyword, Assert kind, Token leftParenthesis,
+      Token? commaToken, Token semicolonToken) {
+    AssertEnd data = new AssertEnd(ParserAstType.END,
+        assertKeyword: assertKeyword,
+        kind: kind,
+        leftParenthesis: leftParenthesis,
+        commaToken: commaToken,
+        semicolonToken: semicolonToken);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralDouble(Token token) {
+    LiteralDoubleHandle data =
+        new LiteralDoubleHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralInt(Token token) {
+    LiteralIntHandle data =
+        new LiteralIntHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralList(
+      int count, Token leftBracket, Token? constKeyword, Token rightBracket) {
+    LiteralListHandle data = new LiteralListHandle(ParserAstType.HANDLE,
+        count: count,
+        leftBracket: leftBracket,
+        constKeyword: constKeyword,
+        rightBracket: rightBracket);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralSetOrMap(
+    int count,
+    Token leftBrace,
+    Token? constKeyword,
+    Token rightBrace,
+    bool hasSetEntry,
+  ) {
+    LiteralSetOrMapHandle data = new LiteralSetOrMapHandle(ParserAstType.HANDLE,
+        count: count,
+        leftBrace: leftBrace,
+        constKeyword: constKeyword,
+        rightBrace: rightBrace,
+        hasSetEntry: hasSetEntry);
+    seen(data);
+  }
+
+  @override
+  void handleLiteralNull(Token token) {
+    LiteralNullHandle data =
+        new LiteralNullHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNativeClause(Token nativeToken, bool hasName) {
+    NativeClauseHandle data = new NativeClauseHandle(ParserAstType.HANDLE,
+        nativeToken: nativeToken, hasName: hasName);
+    seen(data);
+  }
+
+  @override
+  void handleNamedArgument(Token colon) {
+    NamedArgumentHandle data =
+        new NamedArgumentHandle(ParserAstType.HANDLE, colon: colon);
+    seen(data);
+  }
+
+  @override
+  void beginNewExpression(Token token) {
+    NewExpressionBegin data =
+        new NewExpressionBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endNewExpression(Token token) {
+    NewExpressionEnd data =
+        new NewExpressionEnd(ParserAstType.END, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoArguments(Token token) {
+    NoArgumentsHandle data =
+        new NoArgumentsHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoConstructorReferenceContinuationAfterTypeArguments(Token token) {
+    NoConstructorReferenceContinuationAfterTypeArgumentsHandle data =
+        new NoConstructorReferenceContinuationAfterTypeArgumentsHandle(
+            ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoType(Token lastConsumed) {
+    NoTypeHandle data =
+        new NoTypeHandle(ParserAstType.HANDLE, lastConsumed: lastConsumed);
+    seen(data);
+  }
+
+  @override
+  void handleNoTypeVariables(Token token) {
+    NoTypeVariablesHandle data =
+        new NoTypeVariablesHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleOperator(Token token) {
+    OperatorHandle data =
+        new OperatorHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSymbolVoid(Token token) {
+    SymbolVoidHandle data =
+        new SymbolVoidHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleOperatorName(Token operatorKeyword, Token token) {
+    OperatorNameHandle data = new OperatorNameHandle(ParserAstType.HANDLE,
+        operatorKeyword: operatorKeyword, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidOperatorName(Token operatorKeyword, Token token) {
+    InvalidOperatorNameHandle data = new InvalidOperatorNameHandle(
+        ParserAstType.HANDLE,
+        operatorKeyword: operatorKeyword,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleParenthesizedCondition(Token token) {
+    ParenthesizedConditionHandle data =
+        new ParenthesizedConditionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleParenthesizedExpression(Token token) {
+    ParenthesizedExpressionHandle data =
+        new ParenthesizedExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleQualified(Token period) {
+    QualifiedHandle data =
+        new QualifiedHandle(ParserAstType.HANDLE, period: period);
+    seen(data);
+  }
+
+  @override
+  void handleStringPart(Token token) {
+    StringPartHandle data =
+        new StringPartHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleSuperExpression(Token token, IdentifierContext context) {
+    SuperExpressionHandle data = new SuperExpressionHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void beginSwitchCase(int labelCount, int expressionCount, Token firstToken) {
+    SwitchCaseBegin data = new SwitchCaseBegin(ParserAstType.BEGIN,
+        labelCount: labelCount,
+        expressionCount: expressionCount,
+        firstToken: firstToken);
+    seen(data);
+  }
+
+  @override
+  void endSwitchCase(
+      int labelCount,
+      int expressionCount,
+      Token? defaultKeyword,
+      Token? colonAfterDefault,
+      int statementCount,
+      Token firstToken,
+      Token endToken) {
+    SwitchCaseEnd data = new SwitchCaseEnd(ParserAstType.END,
+        labelCount: labelCount,
+        expressionCount: expressionCount,
+        defaultKeyword: defaultKeyword,
+        colonAfterDefault: colonAfterDefault,
+        statementCount: statementCount,
+        firstToken: firstToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleThisExpression(Token token, IdentifierContext context) {
+    ThisExpressionHandle data = new ThisExpressionHandle(ParserAstType.HANDLE,
+        token: token, context: context);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPostfixAssignmentExpression(Token token) {
+    UnaryPostfixAssignmentExpressionHandle data =
+        new UnaryPostfixAssignmentExpressionHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPrefixExpression(Token token) {
+    UnaryPrefixExpressionHandle data =
+        new UnaryPrefixExpressionHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnaryPrefixAssignmentExpression(Token token) {
+    UnaryPrefixAssignmentExpressionHandle data =
+        new UnaryPrefixAssignmentExpressionHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginFormalParameterDefaultValueExpression() {
+    FormalParameterDefaultValueExpressionBegin data =
+        new FormalParameterDefaultValueExpressionBegin(ParserAstType.BEGIN);
+    seen(data);
+  }
+
+  @override
+  void endFormalParameterDefaultValueExpression() {
+    FormalParameterDefaultValueExpressionEnd data =
+        new FormalParameterDefaultValueExpressionEnd(ParserAstType.END);
+    seen(data);
+  }
+
+  @override
+  void handleValuedFormalParameter(Token equals, Token token) {
+    ValuedFormalParameterHandle data = new ValuedFormalParameterHandle(
+        ParserAstType.HANDLE,
+        equals: equals,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleFormalParameterWithoutValue(Token token) {
+    FormalParameterWithoutValueHandle data =
+        new FormalParameterWithoutValueHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void handleVoidKeyword(Token token) {
+    VoidKeywordHandle data =
+        new VoidKeywordHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleVoidKeywordWithTypeArguments(Token token) {
+    VoidKeywordWithTypeArgumentsHandle data =
+        new VoidKeywordWithTypeArgumentsHandle(ParserAstType.HANDLE,
+            token: token);
+    seen(data);
+  }
+
+  @override
+  void beginYieldStatement(Token token) {
+    YieldStatementBegin data =
+        new YieldStatementBegin(ParserAstType.BEGIN, token: token);
+    seen(data);
+  }
+
+  @override
+  void endYieldStatement(Token yieldToken, Token? starToken, Token endToken) {
+    YieldStatementEnd data = new YieldStatementEnd(ParserAstType.END,
+        yieldToken: yieldToken, starToken: starToken, endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void endInvalidYieldStatement(Token beginToken, Token? starToken,
+      Token endToken, MessageCode errorCode) {
+    InvalidYieldStatementEnd data = new InvalidYieldStatementEnd(
+        ParserAstType.END,
+        beginToken: beginToken,
+        starToken: starToken,
+        endToken: endToken,
+        errorCode: errorCode);
+    seen(data);
+  }
+
+  @override
+  void handleRecoverableError(
+      Message message, Token startToken, Token endToken) {
+    RecoverableErrorHandle data = new RecoverableErrorHandle(
+        ParserAstType.HANDLE,
+        message: message,
+        startToken: startToken,
+        endToken: endToken);
+    seen(data);
+  }
+
+  @override
+  void handleErrorToken(ErrorToken token) {
+    ErrorTokenHandle data =
+        new ErrorTokenHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleUnescapeError(
+      Message message, Token location, int stringOffset, int length) {
+    UnescapeErrorHandle data = new UnescapeErrorHandle(ParserAstType.HANDLE,
+        message: message,
+        location: location,
+        stringOffset: stringOffset,
+        length: length);
+    seen(data);
+  }
+
+  @override
+  void handleInvalidStatement(Token token, Message message) {
+    InvalidStatementHandle data = new InvalidStatementHandle(
+        ParserAstType.HANDLE,
+        token: token,
+        message: message);
+    seen(data);
+  }
+
+  @override
+  void handleScript(Token token) {
+    ScriptHandle data = new ScriptHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+
+  @override
+  void handleCommentReferenceText(String referenceSource, int referenceOffset) {
+    CommentReferenceTextHandle data = new CommentReferenceTextHandle(
+        ParserAstType.HANDLE,
+        referenceSource: referenceSource,
+        referenceOffset: referenceOffset);
+    seen(data);
+  }
+
+  @override
+  void handleCommentReference(
+      Token? newKeyword, Token? prefix, Token? period, Token token) {
+    CommentReferenceHandle data = new CommentReferenceHandle(
+        ParserAstType.HANDLE,
+        newKeyword: newKeyword,
+        prefix: prefix,
+        period: period,
+        token: token);
+    seen(data);
+  }
+
+  @override
+  void handleNoCommentReference() {
+    NoCommentReferenceHandle data =
+        new NoCommentReferenceHandle(ParserAstType.HANDLE);
+    seen(data);
+  }
+
+  @override
+  void handleTypeArgumentApplication(Token openAngleBracket) {
+    TypeArgumentApplicationHandle data = new TypeArgumentApplicationHandle(
+        ParserAstType.HANDLE,
+        openAngleBracket: openAngleBracket);
+    seen(data);
+  }
+
+  @override
+  void handleNewAsIdentifier(Token token) {
+    NewAsIdentifierHandle data =
+        new NewAsIdentifierHandle(ParserAstType.HANDLE, token: token);
+    seen(data);
+  }
+}
+
+class ArgumentsBegin extends ParserAstNode {
+  final Token token;
+
+  ArgumentsBegin(ParserAstType type, {required this.token})
+      : super("Arguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ArgumentsEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ArgumentsEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("Arguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class AsyncModifierHandle extends ParserAstNode {
+  final Token? asyncToken;
+  final Token? starToken;
+
+  AsyncModifierHandle(ParserAstType type, {this.asyncToken, this.starToken})
+      : super("AsyncModifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "asyncToken": asyncToken,
+        "starToken": starToken,
+      };
+}
+
+class AwaitExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  AwaitExpressionBegin(ParserAstType type, {required this.token})
+      : super("AwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class AwaitExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  AwaitExpressionEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("AwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidAwaitExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+  final MessageCode errorCode;
+
+  InvalidAwaitExpressionEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.endToken,
+      required this.errorCode})
+      : super("InvalidAwaitExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "errorCode": errorCode,
+      };
+}
+
+class BlockBegin extends ParserAstNode {
+  final Token token;
+  final BlockKind blockKind;
+
+  BlockBegin(ParserAstType type, {required this.token, required this.blockKind})
+      : super("Block", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "blockKind": blockKind,
+      };
+}
+
+class BlockEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+  final BlockKind blockKind;
+
+  BlockEnd(ParserAstType type,
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.blockKind})
+      : super("Block", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "blockKind": blockKind,
+      };
+}
+
+class InvalidTopLevelBlockHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTopLevelBlockHandle(ParserAstType type, {required this.token})
+      : super("InvalidTopLevelBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CascadeBegin extends ParserAstNode {
+  final Token token;
+
+  CascadeBegin(ParserAstType type, {required this.token})
+      : super("Cascade", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CascadeEnd extends ParserAstNode {
+  CascadeEnd(ParserAstType type) : super("Cascade", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class CaseExpressionBegin extends ParserAstNode {
+  final Token caseKeyword;
+
+  CaseExpressionBegin(ParserAstType type, {required this.caseKeyword})
+      : super("CaseExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseKeyword": caseKeyword,
+      };
+}
+
+class CaseExpressionEnd extends ParserAstNode {
+  final Token colon;
+
+  CaseExpressionEnd(ParserAstType type, {required this.colon})
+      : super("CaseExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+      };
+}
+
+class ClassOrMixinOrExtensionBodyBegin extends ParserAstNode {
+  final DeclarationKind kind;
+  final Token token;
+
+  ClassOrMixinOrExtensionBodyBegin(ParserAstType type,
+      {required this.kind, required this.token})
+      : super("ClassOrMixinOrExtensionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "kind": kind,
+        "token": token,
+      };
+}
+
+class ClassOrMixinOrExtensionBodyEnd extends ParserAstNode {
+  final DeclarationKind kind;
+  final int memberCount;
+  final Token beginToken;
+  final Token endToken;
+
+  ClassOrMixinOrExtensionBodyEnd(ParserAstType type,
+      {required this.kind,
+      required this.memberCount,
+      required this.beginToken,
+      required this.endToken})
+      : super("ClassOrMixinOrExtensionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "kind": kind,
+        "memberCount": memberCount,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ClassOrMixinOrNamedMixinApplicationPreludeBegin extends ParserAstNode {
+  final Token token;
+
+  ClassOrMixinOrNamedMixinApplicationPreludeBegin(ParserAstType type,
+      {required this.token})
+      : super("ClassOrMixinOrNamedMixinApplicationPrelude", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ClassDeclarationBegin extends ParserAstNode {
+  final Token begin;
+  final Token? abstractToken;
+  final Token name;
+
+  ClassDeclarationBegin(ParserAstType type,
+      {required this.begin, this.abstractToken, required this.name})
+      : super("ClassDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "abstractToken": abstractToken,
+        "name": name,
+      };
+}
+
+class ClassExtendsHandle extends ParserAstNode {
+  final Token? extendsKeyword;
+  final int typeCount;
+
+  ClassExtendsHandle(ParserAstType type,
+      {this.extendsKeyword, required this.typeCount})
+      : super("ClassExtends", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extendsKeyword": extendsKeyword,
+        "typeCount": typeCount,
+      };
+}
+
+class ClassOrMixinImplementsHandle extends ParserAstNode {
+  final Token? implementsKeyword;
+  final int interfacesCount;
+
+  ClassOrMixinImplementsHandle(ParserAstType type,
+      {this.implementsKeyword, required this.interfacesCount})
+      : super("ClassOrMixinImplements", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "implementsKeyword": implementsKeyword,
+        "interfacesCount": interfacesCount,
+      };
+}
+
+class ExtensionShowHideHandle extends ParserAstNode {
+  final Token? showKeyword;
+  final int showElementCount;
+  final Token? hideKeyword;
+  final int hideElementCount;
+
+  ExtensionShowHideHandle(ParserAstType type,
+      {this.showKeyword,
+      required this.showElementCount,
+      this.hideKeyword,
+      required this.hideElementCount})
+      : super("ExtensionShowHide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+        "showElementCount": showElementCount,
+        "hideKeyword": hideKeyword,
+        "hideElementCount": hideElementCount,
+      };
+}
+
+class ClassHeaderHandle extends ParserAstNode {
+  final Token begin;
+  final Token classKeyword;
+  final Token? nativeToken;
+
+  ClassHeaderHandle(ParserAstType type,
+      {required this.begin, required this.classKeyword, this.nativeToken})
+      : super("ClassHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "classKeyword": classKeyword,
+        "nativeToken": nativeToken,
+      };
+}
+
+class RecoverClassHeaderHandle extends ParserAstNode {
+  RecoverClassHeaderHandle(ParserAstType type)
+      : super("RecoverClassHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ClassDeclarationEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  ClassDeclarationEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("ClassDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class MixinDeclarationBegin extends ParserAstNode {
+  final Token mixinKeyword;
+  final Token name;
+
+  MixinDeclarationBegin(ParserAstType type,
+      {required this.mixinKeyword, required this.name})
+      : super("MixinDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+        "name": name,
+      };
+}
+
+class MixinOnHandle extends ParserAstNode {
+  final Token? onKeyword;
+  final int typeCount;
+
+  MixinOnHandle(ParserAstType type, {this.onKeyword, required this.typeCount})
+      : super("MixinOn", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "onKeyword": onKeyword,
+        "typeCount": typeCount,
+      };
+}
+
+class MixinHeaderHandle extends ParserAstNode {
+  final Token mixinKeyword;
+
+  MixinHeaderHandle(ParserAstType type, {required this.mixinKeyword})
+      : super("MixinHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+      };
+}
+
+class RecoverMixinHeaderHandle extends ParserAstNode {
+  RecoverMixinHeaderHandle(ParserAstType type)
+      : super("RecoverMixinHeader", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class MixinDeclarationEnd extends ParserAstNode {
+  final Token mixinKeyword;
+  final Token endToken;
+
+  MixinDeclarationEnd(ParserAstType type,
+      {required this.mixinKeyword, required this.endToken})
+      : super("MixinDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "mixinKeyword": mixinKeyword,
+        "endToken": endToken,
+      };
+}
+
+class UncategorizedTopLevelDeclarationBegin extends ParserAstNode {
+  final Token token;
+
+  UncategorizedTopLevelDeclarationBegin(ParserAstType type,
+      {required this.token})
+      : super("UncategorizedTopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ExtensionDeclarationPreludeBegin extends ParserAstNode {
+  final Token extensionKeyword;
+
+  ExtensionDeclarationPreludeBegin(ParserAstType type,
+      {required this.extensionKeyword})
+      : super("ExtensionDeclarationPrelude", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+      };
+}
+
+class ExtensionDeclarationBegin extends ParserAstNode {
+  final Token extensionKeyword;
+  final Token? name;
+
+  ExtensionDeclarationBegin(ParserAstType type,
+      {required this.extensionKeyword, this.name})
+      : super("ExtensionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+        "name": name,
+      };
+}
+
+class ExtensionDeclarationEnd extends ParserAstNode {
+  final Token extensionKeyword;
+  final Token? typeKeyword;
+  final Token onKeyword;
+  final Token? showKeyword;
+  final Token? hideKeyword;
+  final Token endToken;
+
+  ExtensionDeclarationEnd(ParserAstType type,
+      {required this.extensionKeyword,
+      this.typeKeyword,
+      required this.onKeyword,
+      this.showKeyword,
+      this.hideKeyword,
+      required this.endToken})
+      : super("ExtensionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "extensionKeyword": extensionKeyword,
+        "typeKeyword": typeKeyword,
+        "onKeyword": onKeyword,
+        "showKeyword": showKeyword,
+        "hideKeyword": hideKeyword,
+        "endToken": endToken,
+      };
+}
+
+class CombinatorsBegin extends ParserAstNode {
+  final Token token;
+
+  CombinatorsBegin(ParserAstType type, {required this.token})
+      : super("Combinators", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CombinatorsEnd extends ParserAstNode {
+  final int count;
+
+  CombinatorsEnd(ParserAstType type, {required this.count})
+      : super("Combinators", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class CompilationUnitBegin extends ParserAstNode {
+  final Token token;
+
+  CompilationUnitBegin(ParserAstType type, {required this.token})
+      : super("CompilationUnit", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DirectivesOnlyHandle extends ParserAstNode {
+  DirectivesOnlyHandle(ParserAstType type) : super("DirectivesOnly", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class CompilationUnitEnd extends ParserAstNode {
+  final int count;
+  final Token token;
+
+  CompilationUnitEnd(ParserAstType type,
+      {required this.count, required this.token})
+      : super("CompilationUnit", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "token": token,
+      };
+}
+
+class ConstLiteralBegin extends ParserAstNode {
+  final Token token;
+
+  ConstLiteralBegin(ParserAstType type, {required this.token})
+      : super("ConstLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstLiteralEnd extends ParserAstNode {
+  final Token token;
+
+  ConstLiteralEnd(ParserAstType type, {required this.token})
+      : super("ConstLiteral", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstructorReferenceBegin extends ParserAstNode {
+  final Token start;
+
+  ConstructorReferenceBegin(ParserAstType type, {required this.start})
+      : super("ConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "start": start,
+      };
+}
+
+class ConstructorReferenceEnd extends ParserAstNode {
+  final Token start;
+  final Token? periodBeforeName;
+  final Token endToken;
+  final ConstructorReferenceContext constructorReferenceContext;
+
+  ConstructorReferenceEnd(ParserAstType type,
+      {required this.start,
+      this.periodBeforeName,
+      required this.endToken,
+      required this.constructorReferenceContext})
+      : super("ConstructorReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "start": start,
+        "periodBeforeName": periodBeforeName,
+        "endToken": endToken,
+        "constructorReferenceContext": constructorReferenceContext,
+      };
+}
+
+class DoWhileStatementBegin extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBegin(ParserAstType type, {required this.token})
+      : super("DoWhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DoWhileStatementEnd extends ParserAstNode {
+  final Token doKeyword;
+  final Token whileKeyword;
+  final Token endToken;
+
+  DoWhileStatementEnd(ParserAstType type,
+      {required this.doKeyword,
+      required this.whileKeyword,
+      required this.endToken})
+      : super("DoWhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "doKeyword": doKeyword,
+        "whileKeyword": whileKeyword,
+        "endToken": endToken,
+      };
+}
+
+class DoWhileStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("DoWhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class DoWhileStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  DoWhileStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("DoWhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("WhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("WhileStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class EnumBegin extends ParserAstNode {
+  final Token enumKeyword;
+
+  EnumBegin(ParserAstType type, {required this.enumKeyword})
+      : super("Enum", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+      };
+}
+
+class EnumEnd extends ParserAstNode {
+  final Token enumKeyword;
+  final Token leftBrace;
+  final int count;
+
+  EnumEnd(ParserAstType type,
+      {required this.enumKeyword, required this.leftBrace, required this.count})
+      : super("Enum", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "enumKeyword": enumKeyword,
+        "leftBrace": leftBrace,
+        "count": count,
+      };
+}
+
+class ExportBegin extends ParserAstNode {
+  final Token token;
+
+  ExportBegin(ParserAstType type, {required this.token})
+      : super("Export", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ExportEnd extends ParserAstNode {
+  final Token exportKeyword;
+  final Token semicolon;
+
+  ExportEnd(ParserAstType type,
+      {required this.exportKeyword, required this.semicolon})
+      : super("Export", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "exportKeyword": exportKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class ExtraneousExpressionHandle extends ParserAstNode {
+  final Token token;
+  final Message message;
+
+  ExtraneousExpressionHandle(ParserAstType type,
+      {required this.token, required this.message})
+      : super("ExtraneousExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "message": message,
+      };
+}
+
+class ExpressionStatementHandle extends ParserAstNode {
+  final Token token;
+
+  ExpressionStatementHandle(ParserAstType type, {required this.token})
+      : super("ExpressionStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FactoryMethodBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token lastConsumed;
+  final Token? externalToken;
+  final Token? constToken;
+
+  FactoryMethodBegin(ParserAstType type,
+      {required this.declarationKind,
+      required this.lastConsumed,
+      this.externalToken,
+      this.constToken})
+      : super("FactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "lastConsumed": lastConsumed,
+        "externalToken": externalToken,
+        "constToken": constToken,
+      };
+}
+
+class ClassFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  ClassFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("ClassFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class MixinFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  MixinFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("MixinFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionFactoryMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token factoryKeyword;
+  final Token endToken;
+
+  ExtensionFactoryMethodEnd(ParserAstType type,
+      {required this.beginToken,
+      required this.factoryKeyword,
+      required this.endToken})
+      : super("ExtensionFactoryMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "factoryKeyword": factoryKeyword,
+        "endToken": endToken,
+      };
+}
+
+class FormalParameterBegin extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+  final Token? requiredToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
+
+  FormalParameterBegin(ParserAstType type,
+      {required this.token,
+      required this.kind,
+      this.requiredToken,
+      this.covariantToken,
+      this.varFinalOrConst})
+      : super("FormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+        "requiredToken": requiredToken,
+        "covariantToken": covariantToken,
+        "varFinalOrConst": varFinalOrConst,
+      };
+}
+
+class FormalParameterEnd extends ParserAstNode {
+  final Token? thisKeyword;
+  final Token? superKeyword;
+  final Token? periodAfterThisOrSuper;
+  final Token nameToken;
+  final Token? initializerStart;
+  final Token? initializerEnd;
+  final FormalParameterKind kind;
+  final MemberKind memberKind;
+
+  FormalParameterEnd(ParserAstType type,
+      {this.thisKeyword,
+      this.superKeyword,
+      this.periodAfterThisOrSuper,
+      required this.nameToken,
+      this.initializerStart,
+      this.initializerEnd,
+      required this.kind,
+      required this.memberKind})
+      : super("FormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "thisKeyword": thisKeyword,
+        "superKeyword": superKeyword,
+        "periodAfterThisOrSuper": periodAfterThisOrSuper,
+        "nameToken": nameToken,
+        "initializerStart": initializerStart,
+        "initializerEnd": initializerEnd,
+        "kind": kind,
+        "memberKind": memberKind,
+      };
+}
+
+class NoFormalParametersHandle extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+
+  NoFormalParametersHandle(ParserAstType type,
+      {required this.token, required this.kind})
+      : super("NoFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+      };
+}
+
+class FormalParametersBegin extends ParserAstNode {
+  final Token token;
+  final MemberKind kind;
+
+  FormalParametersBegin(ParserAstType type,
+      {required this.token, required this.kind})
+      : super("FormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "kind": kind,
+      };
+}
+
+class FormalParametersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+  final MemberKind kind;
+
+  FormalParametersEnd(ParserAstType type,
+      {required this.count,
+      required this.beginToken,
+      required this.endToken,
+      required this.kind})
+      : super("FormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+        "kind": kind,
+      };
+}
+
+class ClassFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ClassFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("ClassFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class MixinFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  MixinFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("MixinFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionFieldsEnd extends ParserAstNode {
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  ExtensionFieldsEnd(ParserAstType type,
+      {this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("ExtensionFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ForInitializerEmptyStatementHandle extends ParserAstNode {
+  final Token token;
+
+  ForInitializerEmptyStatementHandle(ParserAstType type, {required this.token})
+      : super("ForInitializerEmptyStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInitializerExpressionStatementHandle extends ParserAstNode {
+  final Token token;
+  final bool forIn;
+
+  ForInitializerExpressionStatementHandle(ParserAstType type,
+      {required this.token, required this.forIn})
+      : super("ForInitializerExpressionStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "forIn": forIn,
+      };
+}
+
+class ForInitializerLocalVariableDeclarationHandle extends ParserAstNode {
+  final Token token;
+  final bool forIn;
+
+  ForInitializerLocalVariableDeclarationHandle(ParserAstType type,
+      {required this.token, required this.forIn})
+      : super("ForInitializerLocalVariableDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "forIn": forIn,
+      };
+}
+
+class ForStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ForStatementBegin(ParserAstType type, {required this.token})
+      : super("ForStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForLoopPartsHandle extends ParserAstNode {
+  final Token forKeyword;
+  final Token leftParen;
+  final Token leftSeparator;
+  final int updateExpressionCount;
+
+  ForLoopPartsHandle(ParserAstType type,
+      {required this.forKeyword,
+      required this.leftParen,
+      required this.leftSeparator,
+      required this.updateExpressionCount})
+      : super("ForLoopParts", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "forKeyword": forKeyword,
+        "leftParen": leftParen,
+        "leftSeparator": leftSeparator,
+        "updateExpressionCount": updateExpressionCount,
+      };
+}
+
+class ForStatementEnd extends ParserAstNode {
+  final Token endToken;
+
+  ForStatementEnd(ParserAstType type, {required this.endToken})
+      : super("ForStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class ForStatementBodyBegin extends ParserAstNode {
+  final Token token;
+
+  ForStatementBodyBegin(ParserAstType type, {required this.token})
+      : super("ForStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForStatementBodyEnd extends ParserAstNode {
+  final Token token;
+
+  ForStatementBodyEnd(ParserAstType type, {required this.token})
+      : super("ForStatementBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInLoopPartsHandle extends ParserAstNode {
+  final Token? awaitToken;
+  final Token forToken;
+  final Token leftParenthesis;
+  final Token inKeyword;
+
+  ForInLoopPartsHandle(ParserAstType type,
+      {this.awaitToken,
+      required this.forToken,
+      required this.leftParenthesis,
+      required this.inKeyword})
+      : super("ForInLoopParts", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "awaitToken": awaitToken,
+        "forToken": forToken,
+        "leftParenthesis": leftParenthesis,
+        "inKeyword": inKeyword,
+      };
+}
+
+class ForInEnd extends ParserAstNode {
+  final Token endToken;
+
+  ForInEnd(ParserAstType type, {required this.endToken}) : super("ForIn", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class ForInExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  ForInExpressionBegin(ParserAstType type, {required this.token})
+      : super("ForInExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  ForInExpressionEnd(ParserAstType type, {required this.token})
+      : super("ForInExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInBodyBegin extends ParserAstNode {
+  final Token token;
+
+  ForInBodyBegin(ParserAstType type, {required this.token})
+      : super("ForInBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInBodyEnd extends ParserAstNode {
+  final Token token;
+
+  ForInBodyEnd(ParserAstType type, {required this.token})
+      : super("ForInBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NamedFunctionExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  NamedFunctionExpressionBegin(ParserAstType type, {required this.token})
+      : super("NamedFunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NamedFunctionExpressionEnd extends ParserAstNode {
+  final Token endToken;
+
+  NamedFunctionExpressionEnd(ParserAstType type, {required this.endToken})
+      : super("NamedFunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class LocalFunctionDeclarationBegin extends ParserAstNode {
+  final Token token;
+
+  LocalFunctionDeclarationBegin(ParserAstType type, {required this.token})
+      : super("LocalFunctionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LocalFunctionDeclarationEnd extends ParserAstNode {
+  final Token endToken;
+
+  LocalFunctionDeclarationEnd(ParserAstType type, {required this.endToken})
+      : super("LocalFunctionDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class BlockFunctionBodyBegin extends ParserAstNode {
+  final Token token;
+
+  BlockFunctionBodyBegin(ParserAstType type, {required this.token})
+      : super("BlockFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BlockFunctionBodyEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  BlockFunctionBodyEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("BlockFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class NoFunctionBodyHandle extends ParserAstNode {
+  final Token token;
+
+  NoFunctionBodyHandle(ParserAstType type, {required this.token})
+      : super("NoFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionBodySkippedHandle extends ParserAstNode {
+  final Token token;
+  final bool isExpressionBody;
+
+  FunctionBodySkippedHandle(ParserAstType type,
+      {required this.token, required this.isExpressionBody})
+      : super("FunctionBodySkipped", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "isExpressionBody": isExpressionBody,
+      };
+}
+
+class FunctionNameBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionNameBegin(ParserAstType type, {required this.token})
+      : super("FunctionName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionNameEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token token;
+
+  FunctionNameEnd(ParserAstType type,
+      {required this.beginToken, required this.token})
+      : super("FunctionName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "token": token,
+      };
+}
+
+class TypedefBegin extends ParserAstNode {
+  final Token token;
+
+  TypedefBegin(ParserAstType type, {required this.token})
+      : super("Typedef", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypedefEnd extends ParserAstNode {
+  final Token typedefKeyword;
+  final Token? equals;
+  final Token endToken;
+
+  TypedefEnd(ParserAstType type,
+      {required this.typedefKeyword, this.equals, required this.endToken})
+      : super("Typedef", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "typedefKeyword": typedefKeyword,
+        "equals": equals,
+        "endToken": endToken,
+      };
+}
+
+class ClassWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  ClassWithClauseHandle(ParserAstType type, {required this.withKeyword})
+      : super("ClassWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class ClassNoWithClauseHandle extends ParserAstNode {
+  ClassNoWithClauseHandle(ParserAstType type)
+      : super("ClassNoWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class NamedMixinApplicationBegin extends ParserAstNode {
+  final Token begin;
+  final Token? abstractToken;
+  final Token name;
+
+  NamedMixinApplicationBegin(ParserAstType type,
+      {required this.begin, this.abstractToken, required this.name})
+      : super("NamedMixinApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "abstractToken": abstractToken,
+        "name": name,
+      };
+}
+
+class NamedMixinApplicationWithClauseHandle extends ParserAstNode {
+  final Token withKeyword;
+
+  NamedMixinApplicationWithClauseHandle(ParserAstType type,
+      {required this.withKeyword})
+      : super("NamedMixinApplicationWithClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "withKeyword": withKeyword,
+      };
+}
+
+class NamedMixinApplicationEnd extends ParserAstNode {
+  final Token begin;
+  final Token classKeyword;
+  final Token equals;
+  final Token? implementsKeyword;
+  final Token endToken;
+
+  NamedMixinApplicationEnd(ParserAstType type,
+      {required this.begin,
+      required this.classKeyword,
+      required this.equals,
+      this.implementsKeyword,
+      required this.endToken})
+      : super("NamedMixinApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "begin": begin,
+        "classKeyword": classKeyword,
+        "equals": equals,
+        "implementsKeyword": implementsKeyword,
+        "endToken": endToken,
+      };
+}
+
+class HideBegin extends ParserAstNode {
+  final Token hideKeyword;
+
+  HideBegin(ParserAstType type, {required this.hideKeyword})
+      : super("Hide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hideKeyword": hideKeyword,
+      };
+}
+
+class HideEnd extends ParserAstNode {
+  final Token hideKeyword;
+
+  HideEnd(ParserAstType type, {required this.hideKeyword})
+      : super("Hide", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hideKeyword": hideKeyword,
+      };
+}
+
+class IdentifierListHandle extends ParserAstNode {
+  final int count;
+
+  IdentifierListHandle(ParserAstType type, {required this.count})
+      : super("IdentifierList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class TypeListBegin extends ParserAstNode {
+  final Token token;
+
+  TypeListBegin(ParserAstType type, {required this.token})
+      : super("TypeList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeListEnd extends ParserAstNode {
+  final int count;
+
+  TypeListEnd(ParserAstType type, {required this.count})
+      : super("TypeList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class IfStatementBegin extends ParserAstNode {
+  final Token token;
+
+  IfStatementBegin(ParserAstType type, {required this.token})
+      : super("IfStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfStatementEnd extends ParserAstNode {
+  final Token ifToken;
+  final Token? elseToken;
+
+  IfStatementEnd(ParserAstType type, {required this.ifToken, this.elseToken})
+      : super("IfStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifToken": ifToken,
+        "elseToken": elseToken,
+      };
+}
+
+class ThenStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ThenStatementBegin(ParserAstType type, {required this.token})
+      : super("ThenStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ThenStatementEnd extends ParserAstNode {
+  final Token token;
+
+  ThenStatementEnd(ParserAstType type, {required this.token})
+      : super("ThenStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ElseStatementBegin(ParserAstType type, {required this.token})
+      : super("ElseStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseStatementEnd extends ParserAstNode {
+  final Token token;
+
+  ElseStatementEnd(ParserAstType type, {required this.token})
+      : super("ElseStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ImportBegin extends ParserAstNode {
+  final Token importKeyword;
+
+  ImportBegin(ParserAstType type, {required this.importKeyword})
+      : super("Import", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "importKeyword": importKeyword,
+      };
+}
+
+class ImportPrefixHandle extends ParserAstNode {
+  final Token? deferredKeyword;
+  final Token? asKeyword;
+
+  ImportPrefixHandle(ParserAstType type, {this.deferredKeyword, this.asKeyword})
+      : super("ImportPrefix", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "deferredKeyword": deferredKeyword,
+        "asKeyword": asKeyword,
+      };
+}
+
+class ImportEnd extends ParserAstNode {
+  final Token importKeyword;
+  final Token? semicolon;
+
+  ImportEnd(ParserAstType type, {required this.importKeyword, this.semicolon})
+      : super("Import", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "importKeyword": importKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class RecoverImportHandle extends ParserAstNode {
+  final Token? semicolon;
+
+  RecoverImportHandle(ParserAstType type, {this.semicolon})
+      : super("RecoverImport", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "semicolon": semicolon,
+      };
+}
+
+class ConditionalUrisBegin extends ParserAstNode {
+  final Token token;
+
+  ConditionalUrisBegin(ParserAstType type, {required this.token})
+      : super("ConditionalUris", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConditionalUrisEnd extends ParserAstNode {
+  final int count;
+
+  ConditionalUrisEnd(ParserAstType type, {required this.count})
+      : super("ConditionalUris", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class ConditionalUriBegin extends ParserAstNode {
+  final Token ifKeyword;
+
+  ConditionalUriBegin(ParserAstType type, {required this.ifKeyword})
+      : super("ConditionalUri", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifKeyword": ifKeyword,
+      };
+}
+
+class ConditionalUriEnd extends ParserAstNode {
+  final Token ifKeyword;
+  final Token leftParen;
+  final Token? equalSign;
+
+  ConditionalUriEnd(ParserAstType type,
+      {required this.ifKeyword, required this.leftParen, this.equalSign})
+      : super("ConditionalUri", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifKeyword": ifKeyword,
+        "leftParen": leftParen,
+        "equalSign": equalSign,
+      };
+}
+
+class DottedNameHandle extends ParserAstNode {
+  final int count;
+  final Token firstIdentifier;
+
+  DottedNameHandle(ParserAstType type,
+      {required this.count, required this.firstIdentifier})
+      : super("DottedName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "firstIdentifier": firstIdentifier,
+      };
+}
+
+class ImplicitCreationExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  ImplicitCreationExpressionBegin(ParserAstType type, {required this.token})
+      : super("ImplicitCreationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ImplicitCreationExpressionEnd extends ParserAstNode {
+  final Token token;
+  final Token openAngleBracket;
+
+  ImplicitCreationExpressionEnd(ParserAstType type,
+      {required this.token, required this.openAngleBracket})
+      : super("ImplicitCreationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "openAngleBracket": openAngleBracket,
+      };
+}
+
+class InitializedIdentifierBegin extends ParserAstNode {
+  final Token token;
+
+  InitializedIdentifierBegin(ParserAstType type, {required this.token})
+      : super("InitializedIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializedIdentifierEnd extends ParserAstNode {
+  final Token nameToken;
+
+  InitializedIdentifierEnd(ParserAstType type, {required this.nameToken})
+      : super("InitializedIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nameToken": nameToken,
+      };
+}
+
+class FieldInitializerBegin extends ParserAstNode {
+  final Token token;
+
+  FieldInitializerBegin(ParserAstType type, {required this.token})
+      : super("FieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FieldInitializerEnd extends ParserAstNode {
+  final Token assignment;
+  final Token token;
+
+  FieldInitializerEnd(ParserAstType type,
+      {required this.assignment, required this.token})
+      : super("FieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assignment": assignment,
+        "token": token,
+      };
+}
+
+class NoFieldInitializerHandle extends ParserAstNode {
+  final Token token;
+
+  NoFieldInitializerHandle(ParserAstType type, {required this.token})
+      : super("NoFieldInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VariableInitializerBegin extends ParserAstNode {
+  final Token token;
+
+  VariableInitializerBegin(ParserAstType type, {required this.token})
+      : super("VariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VariableInitializerEnd extends ParserAstNode {
+  final Token assignmentOperator;
+
+  VariableInitializerEnd(ParserAstType type, {required this.assignmentOperator})
+      : super("VariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assignmentOperator": assignmentOperator,
+      };
+}
+
+class NoVariableInitializerHandle extends ParserAstNode {
+  final Token token;
+
+  NoVariableInitializerHandle(ParserAstType type, {required this.token})
+      : super("NoVariableInitializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializerBegin extends ParserAstNode {
+  final Token token;
+
+  InitializerBegin(ParserAstType type, {required this.token})
+      : super("Initializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializerEnd extends ParserAstNode {
+  final Token token;
+
+  InitializerEnd(ParserAstType type, {required this.token})
+      : super("Initializer", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializersBegin extends ParserAstNode {
+  final Token token;
+
+  InitializersBegin(ParserAstType type, {required this.token})
+      : super("Initializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InitializersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  InitializersEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("Initializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class NoInitializersHandle extends ParserAstNode {
+  NoInitializersHandle(ParserAstType type) : super("NoInitializers", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class InvalidExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidExpressionHandle(ParserAstType type, {required this.token})
+      : super("InvalidExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InvalidFunctionBodyHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidFunctionBodyHandle(ParserAstType type, {required this.token})
+      : super("InvalidFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InvalidTypeReferenceHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTypeReferenceHandle(ParserAstType type, {required this.token})
+      : super("InvalidTypeReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LabelHandle extends ParserAstNode {
+  final Token token;
+
+  LabelHandle(ParserAstType type, {required this.token}) : super("Label", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LabeledStatementBegin extends ParserAstNode {
+  final Token token;
+  final int labelCount;
+
+  LabeledStatementBegin(ParserAstType type,
+      {required this.token, required this.labelCount})
+      : super("LabeledStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "labelCount": labelCount,
+      };
+}
+
+class LabeledStatementEnd extends ParserAstNode {
+  final int labelCount;
+
+  LabeledStatementEnd(ParserAstType type, {required this.labelCount})
+      : super("LabeledStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+      };
+}
+
+class LibraryNameBegin extends ParserAstNode {
+  final Token token;
+
+  LibraryNameBegin(ParserAstType type, {required this.token})
+      : super("LibraryName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LibraryNameEnd extends ParserAstNode {
+  final Token libraryKeyword;
+  final Token semicolon;
+
+  LibraryNameEnd(ParserAstType type,
+      {required this.libraryKeyword, required this.semicolon})
+      : super("LibraryName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "libraryKeyword": libraryKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class LiteralMapEntryHandle extends ParserAstNode {
+  final Token colon;
+  final Token endToken;
+
+  LiteralMapEntryHandle(ParserAstType type,
+      {required this.colon, required this.endToken})
+      : super("LiteralMapEntry", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+        "endToken": endToken,
+      };
+}
+
+class LiteralStringBegin extends ParserAstNode {
+  final Token token;
+
+  LiteralStringBegin(ParserAstType type, {required this.token})
+      : super("LiteralString", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class InterpolationExpressionHandle extends ParserAstNode {
+  final Token leftBracket;
+  final Token? rightBracket;
+
+  InterpolationExpressionHandle(ParserAstType type,
+      {required this.leftBracket, this.rightBracket})
+      : super("InterpolationExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "leftBracket": leftBracket,
+        "rightBracket": rightBracket,
+      };
+}
+
+class LiteralStringEnd extends ParserAstNode {
+  final int interpolationCount;
+  final Token endToken;
+
+  LiteralStringEnd(ParserAstType type,
+      {required this.interpolationCount, required this.endToken})
+      : super("LiteralString", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "interpolationCount": interpolationCount,
+        "endToken": endToken,
+      };
+}
+
+class StringJuxtapositionHandle extends ParserAstNode {
+  final Token startToken;
+  final int literalCount;
+
+  StringJuxtapositionHandle(ParserAstType type,
+      {required this.startToken, required this.literalCount})
+      : super("StringJuxtaposition", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "startToken": startToken,
+        "literalCount": literalCount,
+      };
+}
+
+class MemberBegin extends ParserAstNode {
+  MemberBegin(ParserAstType type) : super("Member", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class InvalidMemberHandle extends ParserAstNode {
+  final Token endToken;
+
+  InvalidMemberHandle(ParserAstType type, {required this.endToken})
+      : super("InvalidMember", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class MemberEnd extends ParserAstNode {
+  MemberEnd(ParserAstType type) : super("Member", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class MethodBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? varFinalOrConst;
+  final Token? getOrSet;
+  final Token name;
+
+  MethodBegin(ParserAstType type,
+      {required this.declarationKind,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.varFinalOrConst,
+      this.getOrSet,
+      required this.name})
+      : super("Method", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "varFinalOrConst": varFinalOrConst,
+        "getOrSet": getOrSet,
+        "name": name,
+      };
+}
+
+class ClassMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ClassMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ClassMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MixinMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  MixinMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("MixinMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionMethodEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ExtensionMethodEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ExtensionMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ClassConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ClassConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ClassConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MixinConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  MixinConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("MixinConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class ExtensionConstructorEnd extends ParserAstNode {
+  final Token? getOrSet;
+  final Token beginToken;
+  final Token beginParam;
+  final Token? beginInitializers;
+  final Token endToken;
+
+  ExtensionConstructorEnd(ParserAstType type,
+      {this.getOrSet,
+      required this.beginToken,
+      required this.beginParam,
+      this.beginInitializers,
+      required this.endToken})
+      : super("ExtensionConstructor", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "getOrSet": getOrSet,
+        "beginToken": beginToken,
+        "beginParam": beginParam,
+        "beginInitializers": beginInitializers,
+        "endToken": endToken,
+      };
+}
+
+class MetadataStarBegin extends ParserAstNode {
+  final Token token;
+
+  MetadataStarBegin(ParserAstType type, {required this.token})
+      : super("MetadataStar", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class MetadataStarEnd extends ParserAstNode {
+  final int count;
+
+  MetadataStarEnd(ParserAstType type, {required this.count})
+      : super("MetadataStar", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+      };
+}
+
+class MetadataBegin extends ParserAstNode {
+  final Token token;
+
+  MetadataBegin(ParserAstType type, {required this.token})
+      : super("Metadata", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class MetadataEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? periodBeforeName;
+  final Token endToken;
+
+  MetadataEnd(ParserAstType type,
+      {required this.beginToken, this.periodBeforeName, required this.endToken})
+      : super("Metadata", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "periodBeforeName": periodBeforeName,
+        "endToken": endToken,
+      };
+}
+
+class OptionalFormalParametersBegin extends ParserAstNode {
+  final Token token;
+
+  OptionalFormalParametersBegin(ParserAstType type, {required this.token})
+      : super("OptionalFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OptionalFormalParametersEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  OptionalFormalParametersEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("OptionalFormalParameters", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class PartBegin extends ParserAstNode {
+  final Token token;
+
+  PartBegin(ParserAstType type, {required this.token}) : super("Part", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class PartEnd extends ParserAstNode {
+  final Token partKeyword;
+  final Token semicolon;
+
+  PartEnd(ParserAstType type,
+      {required this.partKeyword, required this.semicolon})
+      : super("Part", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "partKeyword": partKeyword,
+        "semicolon": semicolon,
+      };
+}
+
+class PartOfBegin extends ParserAstNode {
+  final Token token;
+
+  PartOfBegin(ParserAstType type, {required this.token})
+      : super("PartOf", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class PartOfEnd extends ParserAstNode {
+  final Token partKeyword;
+  final Token ofKeyword;
+  final Token semicolon;
+  final bool hasName;
+
+  PartOfEnd(ParserAstType type,
+      {required this.partKeyword,
+      required this.ofKeyword,
+      required this.semicolon,
+      required this.hasName})
+      : super("PartOf", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "partKeyword": partKeyword,
+        "ofKeyword": ofKeyword,
+        "semicolon": semicolon,
+        "hasName": hasName,
+      };
+}
+
+class RedirectingFactoryBodyBegin extends ParserAstNode {
+  final Token token;
+
+  RedirectingFactoryBodyBegin(ParserAstType type, {required this.token})
+      : super("RedirectingFactoryBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class RedirectingFactoryBodyEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  RedirectingFactoryBodyEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("RedirectingFactoryBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ReturnStatementBegin extends ParserAstNode {
+  final Token token;
+
+  ReturnStatementBegin(ParserAstType type, {required this.token})
+      : super("ReturnStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NativeFunctionBodyHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodyHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class NativeFunctionBodyIgnoredHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodyIgnoredHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBodyIgnored", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class NativeFunctionBodySkippedHandle extends ParserAstNode {
+  final Token nativeToken;
+  final Token semicolon;
+
+  NativeFunctionBodySkippedHandle(ParserAstType type,
+      {required this.nativeToken, required this.semicolon})
+      : super("NativeFunctionBodySkipped", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "semicolon": semicolon,
+      };
+}
+
+class EmptyFunctionBodyHandle extends ParserAstNode {
+  final Token semicolon;
+
+  EmptyFunctionBodyHandle(ParserAstType type, {required this.semicolon})
+      : super("EmptyFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "semicolon": semicolon,
+      };
+}
+
+class ExpressionFunctionBodyHandle extends ParserAstNode {
+  final Token arrowToken;
+  final Token? endToken;
+
+  ExpressionFunctionBodyHandle(ParserAstType type,
+      {required this.arrowToken, this.endToken})
+      : super("ExpressionFunctionBody", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "arrowToken": arrowToken,
+        "endToken": endToken,
+      };
+}
+
+class ReturnStatementEnd extends ParserAstNode {
+  final bool hasExpression;
+  final Token beginToken;
+  final Token endToken;
+
+  ReturnStatementEnd(ParserAstType type,
+      {required this.hasExpression,
+      required this.beginToken,
+      required this.endToken})
+      : super("ReturnStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasExpression": hasExpression,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class SendHandle extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  SendHandle(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("Send", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class ShowBegin extends ParserAstNode {
+  final Token showKeyword;
+
+  ShowBegin(ParserAstType type, {required this.showKeyword})
+      : super("Show", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+      };
+}
+
+class ShowEnd extends ParserAstNode {
+  final Token showKeyword;
+
+  ShowEnd(ParserAstType type, {required this.showKeyword})
+      : super("Show", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "showKeyword": showKeyword,
+      };
+}
+
+class SwitchStatementBegin extends ParserAstNode {
+  final Token token;
+
+  SwitchStatementBegin(ParserAstType type, {required this.token})
+      : super("SwitchStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SwitchStatementEnd extends ParserAstNode {
+  final Token switchKeyword;
+  final Token endToken;
+
+  SwitchStatementEnd(ParserAstType type,
+      {required this.switchKeyword, required this.endToken})
+      : super("SwitchStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "switchKeyword": switchKeyword,
+        "endToken": endToken,
+      };
+}
+
+class SwitchBlockBegin extends ParserAstNode {
+  final Token token;
+
+  SwitchBlockBegin(ParserAstType type, {required this.token})
+      : super("SwitchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SwitchBlockEnd extends ParserAstNode {
+  final int caseCount;
+  final Token beginToken;
+  final Token endToken;
+
+  SwitchBlockEnd(ParserAstType type,
+      {required this.caseCount,
+      required this.beginToken,
+      required this.endToken})
+      : super("SwitchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseCount": caseCount,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class LiteralSymbolBegin extends ParserAstNode {
+  final Token token;
+
+  LiteralSymbolBegin(ParserAstType type, {required this.token})
+      : super("LiteralSymbol", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralSymbolEnd extends ParserAstNode {
+  final Token hashToken;
+  final int identifierCount;
+
+  LiteralSymbolEnd(ParserAstType type,
+      {required this.hashToken, required this.identifierCount})
+      : super("LiteralSymbol", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hashToken": hashToken,
+        "identifierCount": identifierCount,
+      };
+}
+
+class ThrowExpressionHandle extends ParserAstNode {
+  final Token throwToken;
+  final Token endToken;
+
+  ThrowExpressionHandle(ParserAstType type,
+      {required this.throwToken, required this.endToken})
+      : super("ThrowExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "throwToken": throwToken,
+        "endToken": endToken,
+      };
+}
+
+class RethrowStatementBegin extends ParserAstNode {
+  final Token token;
+
+  RethrowStatementBegin(ParserAstType type, {required this.token})
+      : super("RethrowStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class RethrowStatementEnd extends ParserAstNode {
+  final Token rethrowToken;
+  final Token endToken;
+
+  RethrowStatementEnd(ParserAstType type,
+      {required this.rethrowToken, required this.endToken})
+      : super("RethrowStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "rethrowToken": rethrowToken,
+        "endToken": endToken,
+      };
+}
+
+class TopLevelDeclarationEnd extends ParserAstNode {
+  final Token nextToken;
+
+  TopLevelDeclarationEnd(ParserAstType type, {required this.nextToken})
+      : super("TopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nextToken": nextToken,
+      };
+}
+
+class InvalidTopLevelDeclarationHandle extends ParserAstNode {
+  final Token endToken;
+
+  InvalidTopLevelDeclarationHandle(ParserAstType type, {required this.endToken})
+      : super("InvalidTopLevelDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "endToken": endToken,
+      };
+}
+
+class TopLevelMemberBegin extends ParserAstNode {
+  final Token token;
+
+  TopLevelMemberBegin(ParserAstType type, {required this.token})
+      : super("TopLevelMember", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FieldsBegin extends ParserAstNode {
+  final DeclarationKind declarationKind;
+  final Token? abstractToken;
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final Token lastConsumed;
+
+  FieldsBegin(ParserAstType type,
+      {required this.declarationKind,
+      this.abstractToken,
+      this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.lastConsumed})
+      : super("Fields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "declarationKind": declarationKind,
+        "abstractToken": abstractToken,
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "lastConsumed": lastConsumed,
+      };
+}
+
+class TopLevelFieldsEnd extends ParserAstNode {
+  final Token? externalToken;
+  final Token? staticToken;
+  final Token? covariantToken;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  TopLevelFieldsEnd(ParserAstType type,
+      {this.externalToken,
+      this.staticToken,
+      this.covariantToken,
+      this.lateToken,
+      this.varFinalOrConst,
+      required this.count,
+      required this.beginToken,
+      required this.endToken})
+      : super("TopLevelFields", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "externalToken": externalToken,
+        "staticToken": staticToken,
+        "covariantToken": covariantToken,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class TopLevelMethodBegin extends ParserAstNode {
+  final Token lastConsumed;
+  final Token? externalToken;
+
+  TopLevelMethodBegin(ParserAstType type,
+      {required this.lastConsumed, this.externalToken})
+      : super("TopLevelMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "lastConsumed": lastConsumed,
+        "externalToken": externalToken,
+      };
+}
+
+class TopLevelMethodEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? getOrSet;
+  final Token endToken;
+
+  TopLevelMethodEnd(ParserAstType type,
+      {required this.beginToken, this.getOrSet, required this.endToken})
+      : super("TopLevelMethod", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "getOrSet": getOrSet,
+        "endToken": endToken,
+      };
+}
+
+class TryStatementBegin extends ParserAstNode {
+  final Token token;
+
+  TryStatementBegin(ParserAstType type, {required this.token})
+      : super("TryStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CaseMatchHandle extends ParserAstNode {
+  final Token caseKeyword;
+  final Token colon;
+
+  CaseMatchHandle(ParserAstType type,
+      {required this.caseKeyword, required this.colon})
+      : super("CaseMatch", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "caseKeyword": caseKeyword,
+        "colon": colon,
+      };
+}
+
+class CatchClauseBegin extends ParserAstNode {
+  final Token token;
+
+  CatchClauseBegin(ParserAstType type, {required this.token})
+      : super("CatchClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CatchClauseEnd extends ParserAstNode {
+  final Token token;
+
+  CatchClauseEnd(ParserAstType type, {required this.token})
+      : super("CatchClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CatchBlockHandle extends ParserAstNode {
+  final Token? onKeyword;
+  final Token? catchKeyword;
+  final Token? comma;
+
+  CatchBlockHandle(ParserAstType type,
+      {this.onKeyword, this.catchKeyword, this.comma})
+      : super("CatchBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "onKeyword": onKeyword,
+        "catchKeyword": catchKeyword,
+        "comma": comma,
+      };
+}
+
+class FinallyBlockHandle extends ParserAstNode {
+  final Token finallyKeyword;
+
+  FinallyBlockHandle(ParserAstType type, {required this.finallyKeyword})
+      : super("FinallyBlock", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "finallyKeyword": finallyKeyword,
+      };
+}
+
+class TryStatementEnd extends ParserAstNode {
+  final int catchCount;
+  final Token tryKeyword;
+  final Token? finallyKeyword;
+
+  TryStatementEnd(ParserAstType type,
+      {required this.catchCount, required this.tryKeyword, this.finallyKeyword})
+      : super("TryStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "catchCount": catchCount,
+        "tryKeyword": tryKeyword,
+        "finallyKeyword": finallyKeyword,
+      };
+}
+
+class TypeHandle extends ParserAstNode {
+  final Token beginToken;
+  final Token? questionMark;
+
+  TypeHandle(ParserAstType type, {required this.beginToken, this.questionMark})
+      : super("Type", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "questionMark": questionMark,
+      };
+}
+
+class NonNullAssertExpressionHandle extends ParserAstNode {
+  final Token bang;
+
+  NonNullAssertExpressionHandle(ParserAstType type, {required this.bang})
+      : super("NonNullAssertExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "bang": bang,
+      };
+}
+
+class NoNameHandle extends ParserAstNode {
+  final Token token;
+
+  NoNameHandle(ParserAstType type, {required this.token})
+      : super("NoName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionTypeBegin extends ParserAstNode {
+  final Token beginToken;
+
+  FunctionTypeBegin(ParserAstType type, {required this.beginToken})
+      : super("FunctionType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+      };
+}
+
+class FunctionTypeEnd extends ParserAstNode {
+  final Token functionToken;
+  final Token? questionMark;
+
+  FunctionTypeEnd(ParserAstType type,
+      {required this.functionToken, this.questionMark})
+      : super("FunctionType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "functionToken": functionToken,
+        "questionMark": questionMark,
+      };
+}
+
+class TypeArgumentsBegin extends ParserAstNode {
+  final Token token;
+
+  TypeArgumentsBegin(ParserAstType type, {required this.token})
+      : super("TypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeArgumentsEnd extends ParserAstNode {
+  final int count;
+  final Token beginToken;
+  final Token endToken;
+
+  TypeArgumentsEnd(ParserAstType type,
+      {required this.count, required this.beginToken, required this.endToken})
+      : super("TypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  InvalidTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("InvalidTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("NoTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariableBegin extends ParserAstNode {
+  final Token token;
+
+  TypeVariableBegin(ParserAstType type, {required this.token})
+      : super("TypeVariable", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariablesDefinedHandle extends ParserAstNode {
+  final Token token;
+  final int count;
+
+  TypeVariablesDefinedHandle(ParserAstType type,
+      {required this.token, required this.count})
+      : super("TypeVariablesDefined", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "count": count,
+      };
+}
+
+class TypeVariableEnd extends ParserAstNode {
+  final Token token;
+  final int index;
+  final Token? extendsOrSuper;
+  final Token? variance;
+
+  TypeVariableEnd(ParserAstType type,
+      {required this.token,
+      required this.index,
+      this.extendsOrSuper,
+      this.variance})
+      : super("TypeVariable", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "index": index,
+        "extendsOrSuper": extendsOrSuper,
+        "variance": variance,
+      };
+}
+
+class TypeVariablesBegin extends ParserAstNode {
+  final Token token;
+
+  TypeVariablesBegin(ParserAstType type, {required this.token})
+      : super("TypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class TypeVariablesEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token endToken;
+
+  TypeVariablesEnd(ParserAstType type,
+      {required this.beginToken, required this.endToken})
+      : super("TypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "endToken": endToken,
+      };
+}
+
+class FunctionExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionExpressionBegin(ParserAstType type, {required this.token})
+      : super("FunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionExpressionEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token token;
+
+  FunctionExpressionEnd(ParserAstType type,
+      {required this.beginToken, required this.token})
+      : super("FunctionExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "token": token,
+      };
+}
+
+class VariablesDeclarationBegin extends ParserAstNode {
+  final Token token;
+  final Token? lateToken;
+  final Token? varFinalOrConst;
+
+  VariablesDeclarationBegin(ParserAstType type,
+      {required this.token, this.lateToken, this.varFinalOrConst})
+      : super("VariablesDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "lateToken": lateToken,
+        "varFinalOrConst": varFinalOrConst,
+      };
+}
+
+class VariablesDeclarationEnd extends ParserAstNode {
+  final int count;
+  final Token? endToken;
+
+  VariablesDeclarationEnd(ParserAstType type,
+      {required this.count, this.endToken})
+      : super("VariablesDeclaration", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "endToken": endToken,
+      };
+}
+
+class WhileStatementBegin extends ParserAstNode {
+  final Token token;
+
+  WhileStatementBegin(ParserAstType type, {required this.token})
+      : super("WhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class WhileStatementEnd extends ParserAstNode {
+  final Token whileKeyword;
+  final Token endToken;
+
+  WhileStatementEnd(ParserAstType type,
+      {required this.whileKeyword, required this.endToken})
+      : super("WhileStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "whileKeyword": whileKeyword,
+        "endToken": endToken,
+      };
+}
+
+class AsOperatorTypeBegin extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorTypeBegin(ParserAstType type, {required this.operator})
+      : super("AsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AsOperatorTypeEnd extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorTypeEnd(ParserAstType type, {required this.operator})
+      : super("AsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AsOperatorHandle extends ParserAstNode {
+  final Token operator;
+
+  AsOperatorHandle(ParserAstType type, {required this.operator})
+      : super("AsOperator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class AssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  AssignmentExpressionHandle(ParserAstType type, {required this.token})
+      : super("AssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BinaryExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  BinaryExpressionBegin(ParserAstType type, {required this.token})
+      : super("BinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BinaryExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  BinaryExpressionEnd(ParserAstType type, {required this.token})
+      : super("BinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class EndingBinaryExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  EndingBinaryExpressionHandle(ParserAstType type, {required this.token})
+      : super("EndingBinaryExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConditionalExpressionBegin extends ParserAstNode {
+  final Token question;
+
+  ConditionalExpressionBegin(ParserAstType type, {required this.question})
+      : super("ConditionalExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+      };
+}
+
+class ConditionalExpressionColonHandle extends ParserAstNode {
+  ConditionalExpressionColonHandle(ParserAstType type)
+      : super("ConditionalExpressionColon", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ConditionalExpressionEnd extends ParserAstNode {
+  final Token question;
+  final Token colon;
+
+  ConditionalExpressionEnd(ParserAstType type,
+      {required this.question, required this.colon})
+      : super("ConditionalExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+        "colon": colon,
+      };
+}
+
+class ConstExpressionBegin extends ParserAstNode {
+  final Token constKeyword;
+
+  ConstExpressionBegin(ParserAstType type, {required this.constKeyword})
+      : super("ConstExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "constKeyword": constKeyword,
+      };
+}
+
+class ConstExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  ConstExpressionEnd(ParserAstType type, {required this.token})
+      : super("ConstExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ConstFactoryHandle extends ParserAstNode {
+  final Token constKeyword;
+
+  ConstFactoryHandle(ParserAstType type, {required this.constKeyword})
+      : super("ConstFactory", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "constKeyword": constKeyword,
+      };
+}
+
+class ForControlFlowBegin extends ParserAstNode {
+  final Token? awaitToken;
+  final Token forToken;
+
+  ForControlFlowBegin(ParserAstType type,
+      {this.awaitToken, required this.forToken})
+      : super("ForControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "awaitToken": awaitToken,
+        "forToken": forToken,
+      };
+}
+
+class ForControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  ForControlFlowEnd(ParserAstType type, {required this.token})
+      : super("ForControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ForInControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  ForInControlFlowEnd(ParserAstType type, {required this.token})
+      : super("ForInControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfControlFlowBegin extends ParserAstNode {
+  final Token ifToken;
+
+  IfControlFlowBegin(ParserAstType type, {required this.ifToken})
+      : super("IfControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "ifToken": ifToken,
+      };
+}
+
+class ThenControlFlowHandle extends ParserAstNode {
+  final Token token;
+
+  ThenControlFlowHandle(ParserAstType type, {required this.token})
+      : super("ThenControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ElseControlFlowHandle extends ParserAstNode {
+  final Token elseToken;
+
+  ElseControlFlowHandle(ParserAstType type, {required this.elseToken})
+      : super("ElseControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "elseToken": elseToken,
+      };
+}
+
+class IfControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  IfControlFlowEnd(ParserAstType type, {required this.token})
+      : super("IfControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class IfElseControlFlowEnd extends ParserAstNode {
+  final Token token;
+
+  IfElseControlFlowEnd(ParserAstType type, {required this.token})
+      : super("IfElseControlFlow", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SpreadExpressionHandle extends ParserAstNode {
+  final Token spreadToken;
+
+  SpreadExpressionHandle(ParserAstType type, {required this.spreadToken})
+      : super("SpreadExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "spreadToken": spreadToken,
+      };
+}
+
+class FunctionTypedFormalParameterBegin extends ParserAstNode {
+  final Token token;
+
+  FunctionTypedFormalParameterBegin(ParserAstType type, {required this.token})
+      : super("FunctionTypedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FunctionTypedFormalParameterEnd extends ParserAstNode {
+  final Token nameToken;
+  final Token? question;
+
+  FunctionTypedFormalParameterEnd(ParserAstType type,
+      {required this.nameToken, this.question})
+      : super("FunctionTypedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nameToken": nameToken,
+        "question": question,
+      };
+}
+
+class IdentifierHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  IdentifierHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("Identifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class ShowHideIdentifierHandle extends ParserAstNode {
+  final Token? modifier;
+  final Token identifier;
+
+  ShowHideIdentifierHandle(ParserAstType type,
+      {this.modifier, required this.identifier})
+      : super("ShowHideIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "modifier": modifier,
+        "identifier": identifier,
+      };
+}
+
+class IndexedExpressionHandle extends ParserAstNode {
+  final Token? question;
+  final Token openSquareBracket;
+  final Token closeSquareBracket;
+
+  IndexedExpressionHandle(ParserAstType type,
+      {this.question,
+      required this.openSquareBracket,
+      required this.closeSquareBracket})
+      : super("IndexedExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "question": question,
+        "openSquareBracket": openSquareBracket,
+        "closeSquareBracket": closeSquareBracket,
+      };
+}
+
+class IsOperatorTypeBegin extends ParserAstNode {
+  final Token operator;
+
+  IsOperatorTypeBegin(ParserAstType type, {required this.operator})
+      : super("IsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class IsOperatorTypeEnd extends ParserAstNode {
+  final Token operator;
+
+  IsOperatorTypeEnd(ParserAstType type, {required this.operator})
+      : super("IsOperatorType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operator": operator,
+      };
+}
+
+class IsOperatorHandle extends ParserAstNode {
+  final Token isOperator;
+  final Token? not;
+
+  IsOperatorHandle(ParserAstType type, {required this.isOperator, this.not})
+      : super("IsOperator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "isOperator": isOperator,
+        "not": not,
+      };
+}
+
+class LiteralBoolHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralBoolHandle(ParserAstType type, {required this.token})
+      : super("LiteralBool", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class BreakStatementHandle extends ParserAstNode {
+  final bool hasTarget;
+  final Token breakKeyword;
+  final Token endToken;
+
+  BreakStatementHandle(ParserAstType type,
+      {required this.hasTarget,
+      required this.breakKeyword,
+      required this.endToken})
+      : super("BreakStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasTarget": hasTarget,
+        "breakKeyword": breakKeyword,
+        "endToken": endToken,
+      };
+}
+
+class ContinueStatementHandle extends ParserAstNode {
+  final bool hasTarget;
+  final Token continueKeyword;
+  final Token endToken;
+
+  ContinueStatementHandle(ParserAstType type,
+      {required this.hasTarget,
+      required this.continueKeyword,
+      required this.endToken})
+      : super("ContinueStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "hasTarget": hasTarget,
+        "continueKeyword": continueKeyword,
+        "endToken": endToken,
+      };
+}
+
+class EmptyStatementHandle extends ParserAstNode {
+  final Token token;
+
+  EmptyStatementHandle(ParserAstType type, {required this.token})
+      : super("EmptyStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class AssertBegin extends ParserAstNode {
+  final Token assertKeyword;
+  final Assert kind;
+
+  AssertBegin(ParserAstType type,
+      {required this.assertKeyword, required this.kind})
+      : super("Assert", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assertKeyword": assertKeyword,
+        "kind": kind,
+      };
+}
+
+class AssertEnd extends ParserAstNode {
+  final Token assertKeyword;
+  final Assert kind;
+  final Token leftParenthesis;
+  final Token? commaToken;
+  final Token semicolonToken;
+
+  AssertEnd(ParserAstType type,
+      {required this.assertKeyword,
+      required this.kind,
+      required this.leftParenthesis,
+      this.commaToken,
+      required this.semicolonToken})
+      : super("Assert", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "assertKeyword": assertKeyword,
+        "kind": kind,
+        "leftParenthesis": leftParenthesis,
+        "commaToken": commaToken,
+        "semicolonToken": semicolonToken,
+      };
+}
+
+class LiteralDoubleHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralDoubleHandle(ParserAstType type, {required this.token})
+      : super("LiteralDouble", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralIntHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralIntHandle(ParserAstType type, {required this.token})
+      : super("LiteralInt", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class LiteralListHandle extends ParserAstNode {
+  final int count;
+  final Token leftBracket;
+  final Token? constKeyword;
+  final Token rightBracket;
+
+  LiteralListHandle(ParserAstType type,
+      {required this.count,
+      required this.leftBracket,
+      this.constKeyword,
+      required this.rightBracket})
+      : super("LiteralList", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "leftBracket": leftBracket,
+        "constKeyword": constKeyword,
+        "rightBracket": rightBracket,
+      };
+}
+
+class LiteralSetOrMapHandle extends ParserAstNode {
+  final int count;
+  final Token leftBrace;
+  final Token? constKeyword;
+  final Token rightBrace;
+  final bool hasSetEntry;
+
+  LiteralSetOrMapHandle(ParserAstType type,
+      {required this.count,
+      required this.leftBrace,
+      this.constKeyword,
+      required this.rightBrace,
+      required this.hasSetEntry})
+      : super("LiteralSetOrMap", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "count": count,
+        "leftBrace": leftBrace,
+        "constKeyword": constKeyword,
+        "rightBrace": rightBrace,
+        "hasSetEntry": hasSetEntry,
+      };
+}
+
+class LiteralNullHandle extends ParserAstNode {
+  final Token token;
+
+  LiteralNullHandle(ParserAstType type, {required this.token})
+      : super("LiteralNull", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NativeClauseHandle extends ParserAstNode {
+  final Token nativeToken;
+  final bool hasName;
+
+  NativeClauseHandle(ParserAstType type,
+      {required this.nativeToken, required this.hasName})
+      : super("NativeClause", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "nativeToken": nativeToken,
+        "hasName": hasName,
+      };
+}
+
+class NamedArgumentHandle extends ParserAstNode {
+  final Token colon;
+
+  NamedArgumentHandle(ParserAstType type, {required this.colon})
+      : super("NamedArgument", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "colon": colon,
+      };
+}
+
+class NewExpressionBegin extends ParserAstNode {
+  final Token token;
+
+  NewExpressionBegin(ParserAstType type, {required this.token})
+      : super("NewExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NewExpressionEnd extends ParserAstNode {
+  final Token token;
+
+  NewExpressionEnd(ParserAstType type, {required this.token})
+      : super("NewExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  NoArgumentsHandle(ParserAstType type, {required this.token})
+      : super("NoArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoConstructorReferenceContinuationAfterTypeArgumentsHandle
+    extends ParserAstNode {
+  final Token token;
+
+  NoConstructorReferenceContinuationAfterTypeArgumentsHandle(ParserAstType type,
+      {required this.token})
+      : super("NoConstructorReferenceContinuationAfterTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class NoTypeHandle extends ParserAstNode {
+  final Token lastConsumed;
+
+  NoTypeHandle(ParserAstType type, {required this.lastConsumed})
+      : super("NoType", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "lastConsumed": lastConsumed,
+      };
+}
+
+class NoTypeVariablesHandle extends ParserAstNode {
+  final Token token;
+
+  NoTypeVariablesHandle(ParserAstType type, {required this.token})
+      : super("NoTypeVariables", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OperatorHandle extends ParserAstNode {
+  final Token token;
+
+  OperatorHandle(ParserAstType type, {required this.token})
+      : super("Operator", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SymbolVoidHandle extends ParserAstNode {
+  final Token token;
+
+  SymbolVoidHandle(ParserAstType type, {required this.token})
+      : super("SymbolVoid", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class OperatorNameHandle extends ParserAstNode {
+  final Token operatorKeyword;
+  final Token token;
+
+  OperatorNameHandle(ParserAstType type,
+      {required this.operatorKeyword, required this.token})
+      : super("OperatorName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operatorKeyword": operatorKeyword,
+        "token": token,
+      };
+}
+
+class InvalidOperatorNameHandle extends ParserAstNode {
+  final Token operatorKeyword;
+  final Token token;
+
+  InvalidOperatorNameHandle(ParserAstType type,
+      {required this.operatorKeyword, required this.token})
+      : super("InvalidOperatorName", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "operatorKeyword": operatorKeyword,
+        "token": token,
+      };
+}
+
+class ParenthesizedConditionHandle extends ParserAstNode {
+  final Token token;
+
+  ParenthesizedConditionHandle(ParserAstType type, {required this.token})
+      : super("ParenthesizedCondition", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class ParenthesizedExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  ParenthesizedExpressionHandle(ParserAstType type, {required this.token})
+      : super("ParenthesizedExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class QualifiedHandle extends ParserAstNode {
+  final Token period;
+
+  QualifiedHandle(ParserAstType type, {required this.period})
+      : super("Qualified", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "period": period,
+      };
+}
+
+class StringPartHandle extends ParserAstNode {
+  final Token token;
+
+  StringPartHandle(ParserAstType type, {required this.token})
+      : super("StringPart", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class SuperExpressionHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  SuperExpressionHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("SuperExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class SwitchCaseBegin extends ParserAstNode {
+  final int labelCount;
+  final int expressionCount;
+  final Token firstToken;
+
+  SwitchCaseBegin(ParserAstType type,
+      {required this.labelCount,
+      required this.expressionCount,
+      required this.firstToken})
+      : super("SwitchCase", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+        "expressionCount": expressionCount,
+        "firstToken": firstToken,
+      };
+}
+
+class SwitchCaseEnd extends ParserAstNode {
+  final int labelCount;
+  final int expressionCount;
+  final Token? defaultKeyword;
+  final Token? colonAfterDefault;
+  final int statementCount;
+  final Token firstToken;
+  final Token endToken;
+
+  SwitchCaseEnd(ParserAstType type,
+      {required this.labelCount,
+      required this.expressionCount,
+      this.defaultKeyword,
+      this.colonAfterDefault,
+      required this.statementCount,
+      required this.firstToken,
+      required this.endToken})
+      : super("SwitchCase", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "labelCount": labelCount,
+        "expressionCount": expressionCount,
+        "defaultKeyword": defaultKeyword,
+        "colonAfterDefault": colonAfterDefault,
+        "statementCount": statementCount,
+        "firstToken": firstToken,
+        "endToken": endToken,
+      };
+}
+
+class ThisExpressionHandle extends ParserAstNode {
+  final Token token;
+  final IdentifierContext context;
+
+  ThisExpressionHandle(ParserAstType type,
+      {required this.token, required this.context})
+      : super("ThisExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "context": context,
+      };
+}
+
+class UnaryPostfixAssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPostfixAssignmentExpressionHandle(ParserAstType type,
+      {required this.token})
+      : super("UnaryPostfixAssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnaryPrefixExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPrefixExpressionHandle(ParserAstType type, {required this.token})
+      : super("UnaryPrefixExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnaryPrefixAssignmentExpressionHandle extends ParserAstNode {
+  final Token token;
+
+  UnaryPrefixAssignmentExpressionHandle(ParserAstType type,
+      {required this.token})
+      : super("UnaryPrefixAssignmentExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class FormalParameterDefaultValueExpressionBegin extends ParserAstNode {
+  FormalParameterDefaultValueExpressionBegin(ParserAstType type)
+      : super("FormalParameterDefaultValueExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class FormalParameterDefaultValueExpressionEnd extends ParserAstNode {
+  FormalParameterDefaultValueExpressionEnd(ParserAstType type)
+      : super("FormalParameterDefaultValueExpression", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class ValuedFormalParameterHandle extends ParserAstNode {
+  final Token equals;
+  final Token token;
+
+  ValuedFormalParameterHandle(ParserAstType type,
+      {required this.equals, required this.token})
+      : super("ValuedFormalParameter", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "equals": equals,
+        "token": token,
+      };
+}
+
+class FormalParameterWithoutValueHandle extends ParserAstNode {
+  final Token token;
+
+  FormalParameterWithoutValueHandle(ParserAstType type, {required this.token})
+      : super("FormalParameterWithoutValue", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VoidKeywordHandle extends ParserAstNode {
+  final Token token;
+
+  VoidKeywordHandle(ParserAstType type, {required this.token})
+      : super("VoidKeyword", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class VoidKeywordWithTypeArgumentsHandle extends ParserAstNode {
+  final Token token;
+
+  VoidKeywordWithTypeArgumentsHandle(ParserAstType type, {required this.token})
+      : super("VoidKeywordWithTypeArguments", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class YieldStatementBegin extends ParserAstNode {
+  final Token token;
+
+  YieldStatementBegin(ParserAstType type, {required this.token})
+      : super("YieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class YieldStatementEnd extends ParserAstNode {
+  final Token yieldToken;
+  final Token? starToken;
+  final Token endToken;
+
+  YieldStatementEnd(ParserAstType type,
+      {required this.yieldToken, this.starToken, required this.endToken})
+      : super("YieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "yieldToken": yieldToken,
+        "starToken": starToken,
+        "endToken": endToken,
+      };
+}
+
+class InvalidYieldStatementEnd extends ParserAstNode {
+  final Token beginToken;
+  final Token? starToken;
+  final Token endToken;
+  final MessageCode errorCode;
+
+  InvalidYieldStatementEnd(ParserAstType type,
+      {required this.beginToken,
+      this.starToken,
+      required this.endToken,
+      required this.errorCode})
+      : super("InvalidYieldStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "beginToken": beginToken,
+        "starToken": starToken,
+        "endToken": endToken,
+        "errorCode": errorCode,
+      };
+}
+
+class RecoverableErrorHandle extends ParserAstNode {
+  final Message message;
+  final Token startToken;
+  final Token endToken;
+
+  RecoverableErrorHandle(ParserAstType type,
+      {required this.message, required this.startToken, required this.endToken})
+      : super("RecoverableError", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "message": message,
+        "startToken": startToken,
+        "endToken": endToken,
+      };
+}
+
+class ErrorTokenHandle extends ParserAstNode {
+  final ErrorToken token;
+
+  ErrorTokenHandle(ParserAstType type, {required this.token})
+      : super("ErrorToken", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class UnescapeErrorHandle extends ParserAstNode {
+  final Message message;
+  final Token location;
+  final int stringOffset;
+  final int length;
+
+  UnescapeErrorHandle(ParserAstType type,
+      {required this.message,
+      required this.location,
+      required this.stringOffset,
+      required this.length})
+      : super("UnescapeError", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "message": message,
+        "location": location,
+        "stringOffset": stringOffset,
+        "length": length,
+      };
+}
+
+class InvalidStatementHandle extends ParserAstNode {
+  final Token token;
+  final Message message;
+
+  InvalidStatementHandle(ParserAstType type,
+      {required this.token, required this.message})
+      : super("InvalidStatement", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+        "message": message,
+      };
+}
+
+class ScriptHandle extends ParserAstNode {
+  final Token token;
+
+  ScriptHandle(ParserAstType type, {required this.token})
+      : super("Script", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
+
+class CommentReferenceTextHandle extends ParserAstNode {
+  final String referenceSource;
+  final int referenceOffset;
+
+  CommentReferenceTextHandle(ParserAstType type,
+      {required this.referenceSource, required this.referenceOffset})
+      : super("CommentReferenceText", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "referenceSource": referenceSource,
+        "referenceOffset": referenceOffset,
+      };
+}
+
+class CommentReferenceHandle extends ParserAstNode {
+  final Token? newKeyword;
+  final Token? prefix;
+  final Token? period;
+  final Token token;
+
+  CommentReferenceHandle(ParserAstType type,
+      {this.newKeyword, this.prefix, this.period, required this.token})
+      : super("CommentReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "newKeyword": newKeyword,
+        "prefix": prefix,
+        "period": period,
+        "token": token,
+      };
+}
+
+class NoCommentReferenceHandle extends ParserAstNode {
+  NoCommentReferenceHandle(ParserAstType type)
+      : super("NoCommentReference", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {};
+}
+
+class TypeArgumentApplicationHandle extends ParserAstNode {
+  final Token openAngleBracket;
+
+  TypeArgumentApplicationHandle(ParserAstType type,
+      {required this.openAngleBracket})
+      : super("TypeArgumentApplication", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "openAngleBracket": openAngleBracket,
+      };
+}
+
+class NewAsIdentifierHandle extends ParserAstNode {
+  final Token token;
+
+  NewAsIdentifierHandle(ParserAstType type, {required this.token})
+      : super("NewAsIdentifier", type);
+
+  @override
+  Map<String, Object?> get deprecatedArguments => {
+        "token": token,
+      };
+}
diff --git a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
index 2991e70..3d08af6 100644
--- a/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
+++ b/pkg/front_end/test/crashing_test_case_minimizer_impl.dart
@@ -50,8 +50,8 @@
 import 'package:front_end/src/fasta/messages.dart' show Message;
 import 'package:front_end/src/fasta/source/diet_parser.dart'
     show useImplicitCreationExpressionInCfe;
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 import 'package:front_end/src/fasta/util/textual_outline.dart'
     show textualOutline;
@@ -539,7 +539,7 @@
       if (inlinableUri == uri) continue;
       final Uint8List? originalBytes = _fs.data[uri];
       if (originalBytes == null || originalBytes.isEmpty) continue;
-      DirectParserASTContentCompilationUnitEnd ast = getAST(originalBytes,
+      CompilationUnitEnd ast = getAST(originalBytes,
           includeBody: false,
           includeComments: false,
           enableExtensionMethods: true,
@@ -552,7 +552,7 @@
       // * if that *doesn't* work and we've inserted an export,
       //   try converting that to an import instead.
       List<_Replacement> replacements = [];
-      for (DirectParserASTContentImportEnd import in ast.getImports()) {
+      for (ImportEnd import in ast.getImports()) {
         Token importUriToken = import.importKeyword.next!;
         Uri importUri = _getUri(importUriToken, uri);
         if (inlinableUri == importUri) {
@@ -560,7 +560,7 @@
               import.importKeyword.offset - 1, import.semicolon!.offset + 1));
         }
       }
-      for (DirectParserASTContentExportEnd export in ast.getExports()) {
+      for (ExportEnd export in ast.getExports()) {
         Token exportUriToken = export.exportKeyword.next!;
         Uri exportUri = _getUri(exportUriToken, uri);
         if (inlinableUri == exportUri) {
@@ -585,10 +585,10 @@
           includeComments: false,
           enableExtensionMethods: true,
           enableNonNullable: _isUriNnbd(uri));
-      for (DirectParserASTContentImportEnd import in ast.getImports()) {
+      for (ImportEnd import in ast.getImports()) {
         offsetOfLast = max(offsetOfLast, import.semicolon!.offset + 1);
       }
-      for (DirectParserASTContentExportEnd export in ast.getExports()) {
+      for (ExportEnd export in ast.getExports()) {
         offsetOfLast = max(offsetOfLast, export.semicolon.offset + 1);
       }
 
@@ -686,17 +686,17 @@
   Uint8List _rewriteImportsExportsToUri(
       Uint8List oldData, Uri newUri, Uri oldUri, bool nnbd,
       {bool convertExportToImport: false}) {
-    DirectParserASTContentCompilationUnitEnd ast = getAST(oldData,
+    CompilationUnitEnd ast = getAST(oldData,
         includeBody: false,
         includeComments: false,
         enableExtensionMethods: true,
         enableNonNullable: nnbd);
     List<_Replacement> replacements = [];
-    for (DirectParserASTContentImportEnd import in ast.getImports()) {
+    for (ImportEnd import in ast.getImports()) {
       _rewriteImportsExportsToUriInternal(
           import.importKeyword.next!, oldUri, replacements, newUri);
     }
-    for (DirectParserASTContentExportEnd export in ast.getExports()) {
+    for (ExportEnd export in ast.getExports()) {
       if (convertExportToImport) {
         replacements.add(new _Replacement(
           export.exportKeyword.offset - 1,
@@ -1254,7 +1254,7 @@
     if (!uri.toString().endsWith(".dart")) return;
 
     Uint8List data = _fs.data[uri]!;
-    DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+    CompilationUnitEnd ast = getAST(data,
         includeBody: true,
         includeComments: false,
         enableExtensionMethods: true,
@@ -1263,64 +1263,60 @@
     _CompilationHelperClass helper = new _CompilationHelperClass(data);
 
     // Try to remove top level things one at a time.
-    for (DirectParserASTContent child in ast.children!) {
+    for (ParserAstNode child in ast.children!) {
       bool shouldCompile = false;
       String what = "";
       if (child.isClass()) {
-        DirectParserASTContentClassDeclarationEnd cls = child.asClass();
+        ClassDeclarationEnd cls = child.asClass();
         helper.replacements.add(new _Replacement(
             cls.beginToken.offset - 1, cls.endToken.offset + 1));
         shouldCompile = true;
         what = "class";
       } else if (child.isMixinDeclaration()) {
-        DirectParserASTContentMixinDeclarationEnd decl =
-            child.asMixinDeclaration();
+        MixinDeclarationEnd decl = child.asMixinDeclaration();
         helper.replacements.add(new _Replacement(
             decl.mixinKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "mixin";
       } else if (child.isNamedMixinDeclaration()) {
-        DirectParserASTContentNamedMixinApplicationEnd decl =
-            child.asNamedMixinDeclaration();
+        NamedMixinApplicationEnd decl = child.asNamedMixinDeclaration();
         helper.replacements.add(
             new _Replacement(decl.begin.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "named mixin";
       } else if (child.isExtension()) {
-        DirectParserASTContentExtensionDeclarationEnd decl =
-            child.asExtension();
+        ExtensionDeclarationEnd decl = child.asExtension();
         helper.replacements.add(new _Replacement(
             decl.extensionKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "extension";
       } else if (child.isTopLevelFields()) {
-        DirectParserASTContentTopLevelFieldsEnd decl = child.asTopLevelFields();
+        TopLevelFieldsEnd decl = child.asTopLevelFields();
         helper.replacements.add(new _Replacement(
             decl.beginToken.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "toplevel fields";
       } else if (child.isTopLevelMethod()) {
-        DirectParserASTContentTopLevelMethodEnd decl = child.asTopLevelMethod();
+        TopLevelMethodEnd decl = child.asTopLevelMethod();
         helper.replacements.add(new _Replacement(
             decl.beginToken.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "toplevel method";
       } else if (child.isEnum()) {
-        DirectParserASTContentEnumEnd decl = child.asEnum();
+        EnumEnd decl = child.asEnum();
         helper.replacements.add(new _Replacement(
             decl.enumKeyword.offset - 1, decl.leftBrace.endGroup!.offset + 1));
         shouldCompile = true;
         what = "enum";
       } else if (child.isTypedef()) {
-        DirectParserASTContentTypedefEnd decl = child.asTypedef();
+        TypedefEnd decl = child.asTypedef();
         helper.replacements.add(new _Replacement(
             decl.typedefKeyword.offset - 1, decl.endToken.offset + 1));
         shouldCompile = true;
         what = "typedef";
       } else if (child.isMetadata()) {
-        DirectParserASTContentMetadataStarEnd decl = child.asMetadata();
-        List<DirectParserASTContentMetadataEnd> metadata =
-            decl.getMetadataEntries();
+        MetadataStarEnd decl = child.asMetadata();
+        List<MetadataEnd> metadata = decl.getMetadataEntries();
         if (metadata.isNotEmpty) {
           helper.replacements.add(new _Replacement(
               metadata.first.beginToken.offset - 1,
@@ -1329,31 +1325,31 @@
         }
         what = "metadata";
       } else if (child.isImport()) {
-        DirectParserASTContentImportEnd decl = child.asImport();
+        ImportEnd decl = child.asImport();
         helper.replacements.add(new _Replacement(
             decl.importKeyword.offset - 1, decl.semicolon!.offset + 1));
         shouldCompile = true;
         what = "import";
       } else if (child.isExport()) {
-        DirectParserASTContentExportEnd decl = child.asExport();
+        ExportEnd decl = child.asExport();
         helper.replacements.add(new _Replacement(
             decl.exportKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "export";
       } else if (child.isLibraryName()) {
-        DirectParserASTContentLibraryNameEnd decl = child.asLibraryName();
+        LibraryNameEnd decl = child.asLibraryName();
         helper.replacements.add(new _Replacement(
             decl.libraryKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "library name";
       } else if (child.isPart()) {
-        DirectParserASTContentPartEnd decl = child.asPart();
+        PartEnd decl = child.asPart();
         helper.replacements.add(new _Replacement(
             decl.partKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
         what = "part";
       } else if (child.isPartOf()) {
-        DirectParserASTContentPartOfEnd decl = child.asPartOf();
+        PartOfEnd decl = child.asPartOf();
         helper.replacements.add(new _Replacement(
             decl.partKeyword.offset - 1, decl.semicolon.offset + 1));
         shouldCompile = true;
@@ -1373,8 +1369,8 @@
         if (!success) {
           if (child.isClass()) {
             // Also try to remove all content of the class.
-            DirectParserASTContentClassDeclarationEnd decl = child.asClass();
-            DirectParserASTContentClassOrMixinOrExtensionBodyEnd body =
+            ClassDeclarationEnd decl = child.asClass();
+            ClassOrMixinOrExtensionBodyEnd body =
                 decl.getClassOrMixinOrExtensionBody();
             if (body.beginToken.offset + 2 < body.endToken.offset) {
               helper.replacements.add(new _Replacement(
@@ -1387,11 +1383,11 @@
 
             if (!success) {
               // Also try to remove members one at a time.
-              for (DirectParserASTContent child in body.children!) {
+              for (ParserAstNode child in body.children!) {
                 shouldCompile = false;
-                if (child is DirectParserASTContentMemberEnd) {
+                if (child is MemberEnd) {
                   if (child.isClassConstructor()) {
-                    DirectParserASTContentClassConstructorEnd memberDecl =
+                    ClassConstructorEnd memberDecl =
                         child.getClassConstructor();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1399,23 +1395,21 @@
                     what = "class constructor";
                     shouldCompile = true;
                   } else if (child.isClassFields()) {
-                    DirectParserASTContentClassFieldsEnd memberDecl =
-                        child.getClassFields();
+                    ClassFieldsEnd memberDecl = child.getClassFields();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "class fields";
                     shouldCompile = true;
                   } else if (child.isClassMethod()) {
-                    DirectParserASTContentClassMethodEnd memberDecl =
-                        child.getClassMethod();
+                    ClassMethodEnd memberDecl = child.getClassMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "class method";
                     shouldCompile = true;
                   } else if (child.isClassFactoryMethod()) {
-                    DirectParserASTContentClassFactoryMethodEnd memberDecl =
+                    ClassFactoryMethodEnd memberDecl =
                         child.getClassFactoryMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1427,10 +1421,8 @@
                     continue;
                   }
                 } else if (child.isMetadata()) {
-                  DirectParserASTContentMetadataStarEnd decl =
-                      child.asMetadata();
-                  List<DirectParserASTContentMetadataEnd> metadata =
-                      decl.getMetadataEntries();
+                  MetadataStarEnd decl = child.asMetadata();
+                  List<MetadataEnd> metadata = decl.getMetadataEntries();
                   if (metadata.isNotEmpty) {
                     helper.replacements.add(new _Replacement(
                         metadata.first.beginToken.offset - 1,
@@ -1444,8 +1436,8 @@
                       helper, uri, initialComponent, what);
                   if (helper.shouldQuit) return;
                   if (!success) {
-                    DirectParserASTContentBlockFunctionBodyEnd? decl;
-                    if (child is DirectParserASTContentMemberEnd) {
+                    BlockFunctionBodyEnd? decl;
+                    if (child is MemberEnd) {
                       if (child.isClassMethod()) {
                         decl = child.getClassMethod().getBlockFunctionBody();
                       } else if (child.isClassConstructor()) {
@@ -1501,9 +1493,8 @@
             }
           } else if (child.isMixinDeclaration()) {
             // Also try to remove all content of the mixin.
-            DirectParserASTContentMixinDeclarationEnd decl =
-                child.asMixinDeclaration();
-            DirectParserASTContentClassOrMixinOrExtensionBodyEnd body =
+            MixinDeclarationEnd decl = child.asMixinDeclaration();
+            ClassOrMixinOrExtensionBodyEnd body =
                 decl.getClassOrMixinOrExtensionBody();
             if (body.beginToken.offset + 2 < body.endToken.offset) {
               helper.replacements.add(new _Replacement(
@@ -1516,11 +1507,11 @@
 
             if (!success) {
               // Also try to remove members one at a time.
-              for (DirectParserASTContent child in body.children!) {
+              for (ParserAstNode child in body.children!) {
                 shouldCompile = false;
-                if (child is DirectParserASTContentMemberEnd) {
+                if (child is MemberEnd) {
                   if (child.isMixinConstructor()) {
-                    DirectParserASTContentMixinConstructorEnd memberDecl =
+                    MixinConstructorEnd memberDecl =
                         child.getMixinConstructor();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1528,23 +1519,21 @@
                     what = "mixin constructor";
                     shouldCompile = true;
                   } else if (child.isMixinFields()) {
-                    DirectParserASTContentMixinFieldsEnd memberDecl =
-                        child.getMixinFields();
+                    MixinFieldsEnd memberDecl = child.getMixinFields();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "mixin fields";
                     shouldCompile = true;
                   } else if (child.isMixinMethod()) {
-                    DirectParserASTContentMixinMethodEnd memberDecl =
-                        child.getMixinMethod();
+                    MixinMethodEnd memberDecl = child.getMixinMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
                         memberDecl.endToken.offset + 1));
                     what = "mixin method";
                     shouldCompile = true;
                   } else if (child.isMixinFactoryMethod()) {
-                    DirectParserASTContentMixinFactoryMethodEnd memberDecl =
+                    MixinFactoryMethodEnd memberDecl =
                         child.getMixinFactoryMethod();
                     helper.replacements.add(new _Replacement(
                         memberDecl.beginToken.offset - 1,
@@ -1556,10 +1545,8 @@
                     continue;
                   }
                 } else if (child.isMetadata()) {
-                  DirectParserASTContentMetadataStarEnd decl =
-                      child.asMetadata();
-                  List<DirectParserASTContentMetadataEnd> metadata =
-                      decl.getMetadataEntries();
+                  MetadataStarEnd decl = child.asMetadata();
+                  List<MetadataEnd> metadata = decl.getMetadataEntries();
                   if (metadata.isNotEmpty) {
                     helper.replacements.add(new _Replacement(
                         metadata.first.beginToken.offset - 1,
@@ -1573,8 +1560,8 @@
                       helper, uri, initialComponent, what);
                   if (helper.shouldQuit) return;
                   if (!success) {
-                    DirectParserASTContentBlockFunctionBodyEnd? decl;
-                    if (child is DirectParserASTContentMemberEnd) {
+                    BlockFunctionBodyEnd? decl;
+                    if (child is MemberEnd) {
                       if (child.isClassMethod()) {
                         decl = child.getClassMethod().getBlockFunctionBody();
                       } else if (child.isClassConstructor()) {
diff --git a/pkg/front_end/test/fasta/testing/suite.dart b/pkg/front_end/test/fasta/testing/suite.dart
index 7a4b070..c97e664 100644
--- a/pkg/front_end/test/fasta/testing/suite.dart
+++ b/pkg/front_end/test/fasta/testing/suite.dart
@@ -85,10 +85,10 @@
 
 import 'package:front_end/src/fasta/kernel/verifier.dart' show verifyComponent;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart'
-    show DirectParserASTContentVisitor, getAST;
+import 'package:front_end/src/fasta/util/parser_ast.dart'
+    show ParserAstVisitor, getAST;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 import 'package:kernel/ast.dart'
     show
@@ -1475,13 +1475,13 @@
 
 enum FuzzSorterState { nonSortable, importExportSortable, sortableRest }
 
-class FuzzAstVisitorSorter extends DirectParserASTContentVisitor {
+class FuzzAstVisitorSorter extends ParserAstVisitor {
   final Uint8List bytes;
   final String asString;
   final bool nnbd;
 
   FuzzAstVisitorSorter(this.bytes, this.nnbd) : asString = utf8.decode(bytes) {
-    DirectParserASTContentCompilationUnitEnd ast = getAST(bytes,
+    CompilationUnitEnd ast = getAST(bytes,
         includeBody: false,
         includeComments: true,
         enableExtensionMethods: true,
@@ -1590,48 +1590,45 @@
   }
 
   @override
-  void visitExport(DirectParserASTContentExportEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitExport(ExportEnd node, Token startInclusive, Token endInclusive) {
     handleData(
         FuzzSorterState.importExportSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitImport(DirectParserASTContentImportEnd node, Token startInclusive,
-      Token? endInclusive) {
+  void visitImport(ImportEnd node, Token startInclusive, Token? endInclusive) {
     handleData(
         FuzzSorterState.importExportSortable, startInclusive, endInclusive!);
   }
 
   @override
-  void visitClass(DirectParserASTContentClassDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitClass(
+      ClassDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitEnum(DirectParserASTContentEnumEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitEnum(EnumEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitExtension(DirectParserASTContentExtensionDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitExtension(
+      ExtensionDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitLibraryName(DirectParserASTContentLibraryNameEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitLibraryName(
+      LibraryNameEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitMetadata(DirectParserASTContentMetadataEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMetadata(
+      MetadataEnd node, Token startInclusive, Token endInclusive) {
     if (metadataStart == null) {
       metadataStart = startInclusive;
       metadataEndInclusive = endInclusive;
@@ -1641,46 +1638,43 @@
   }
 
   @override
-  void visitMixin(DirectParserASTContentMixinDeclarationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitMixin(
+      MixinDeclarationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitNamedMixin(DirectParserASTContentNamedMixinApplicationEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitNamedMixin(
+      NamedMixinApplicationEnd node, Token startInclusive, Token endInclusive) {
     // TODO(jensj): Possibly sort stuff inside of this too.
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitPart(DirectParserASTContentPartEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPart(PartEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitPartOf(DirectParserASTContentPartOfEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitPartOf(PartOfEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.nonSortable, startInclusive, endInclusive);
   }
 
   @override
-  void visitTopLevelFields(DirectParserASTContentTopLevelFieldsEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelFields(
+      TopLevelFieldsEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitTopLevelMethod(DirectParserASTContentTopLevelMethodEnd node,
-      Token startInclusive, Token endInclusive) {
+  void visitTopLevelMethod(
+      TopLevelMethodEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 
   @override
-  void visitTypedef(DirectParserASTContentTypedefEnd node, Token startInclusive,
-      Token endInclusive) {
+  void visitTypedef(TypedefEnd node, Token startInclusive, Token endInclusive) {
     handleData(FuzzSorterState.sortableRest, startInclusive, endInclusive);
   }
 }
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test.dart b/pkg/front_end/test/fasta/util/parser_ast_test.dart
similarity index 74%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test.dart
rename to pkg/front_end/test/fasta/util/parser_ast_test.dart
index 08f036e..4d74a08 100644
--- a/pkg/front_end/test/fasta/util/direct_parser_ast_test.dart
+++ b/pkg/front_end/test/fasta/util/parser_ast_test.dart
@@ -5,8 +5,8 @@
 import 'dart:convert';
 import 'dart:io';
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart';
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 late Uri base;
 
@@ -33,13 +33,13 @@
       try {
         processed++;
         List<int> data = entry.readAsBytesSync();
-        DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+        CompilationUnitEnd ast = getAST(data,
             includeBody: true,
             includeComments: true,
             enableExtensionMethods: true,
             enableNonNullable: false);
         splitIntoChunks(ast, data);
-        for (DirectParserASTContent child in ast.children!) {
+        for (ParserAstNode child in ast.children!) {
           if (child.isClass()) {
             splitIntoChunks(
                 child.asClass().getClassOrMixinOrExtensionBody(), data);
@@ -61,9 +61,9 @@
 
 void testTopLevelStuff() {
   File file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/top_level_stuff.txt"));
+      base.resolve("parser_ast_test_data/top_level_stuff.txt"));
   List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+  CompilationUnitEnd ast = getAST(data,
       includeBody: true,
       includeComments: true,
       enableExtensionMethods: true,
@@ -117,7 +117,7 @@
   expect("@AnnotationAtEOF", foundChunks[21]);
 
   file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/top_level_stuff_helper.txt"));
+      base.resolve("parser_ast_test_data/top_level_stuff_helper.txt"));
   data = file.readAsBytesSync();
   ast = getAST(data,
       includeBody: true,
@@ -128,8 +128,8 @@
   expect(1, foundChunks.length);
   expect("part of 'top_level_stuff.txt';", foundChunks[0]);
 
-  file = new File.fromUri(
-      base.resolve("direct_parser_ast_test_data/script_handle.txt"));
+  file =
+      new File.fromUri(base.resolve("parser_ast_test_data/script_handle.txt"));
   data = file.readAsBytesSync();
   ast = getAST(data,
       includeBody: true,
@@ -142,30 +142,26 @@
 }
 
 void testClassStuff() {
-  File file =
-      new File.fromUri(base.resolve("direct_parser_ast_test_data/class.txt"));
+  File file = new File.fromUri(base.resolve("parser_ast_test_data/class.txt"));
   List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+  CompilationUnitEnd ast = getAST(data,
       includeBody: true,
       includeComments: true,
       enableExtensionMethods: true,
       enableNonNullable: false);
-  List<DirectParserASTContentTopLevelDeclarationEnd> classes = ast.getClasses();
+  List<TopLevelDeclarationEnd> classes = ast.getClasses();
   expect(2, classes.length);
 
-  DirectParserASTContentTopLevelDeclarationEnd decl = classes[0];
-  DirectParserASTContentClassDeclarationEnd cls = decl.asClass();
+  TopLevelDeclarationEnd decl = classes[0];
+  ClassDeclarationEnd cls = decl.asClass();
   expect("Foo", decl.getIdentifier().token.lexeme);
-  DirectParserASTContentClassExtendsHandle extendsDecl = cls.getClassExtends();
+  ClassExtendsHandle extendsDecl = cls.getClassExtends();
   expect("extends", extendsDecl.extendsKeyword?.lexeme);
-  DirectParserASTContentClassOrMixinImplementsHandle implementsDecl =
-      cls.getClassImplements();
+  ClassOrMixinImplementsHandle implementsDecl = cls.getClassImplements();
   expect("implements", implementsDecl.implementsKeyword?.lexeme);
-  DirectParserASTContentClassWithClauseHandle? withClauseDecl =
-      cls.getClassWithClause();
+  ClassWithClauseHandle? withClauseDecl = cls.getClassWithClause();
   expect(null, withClauseDecl);
-  List<DirectParserASTContentMemberEnd> members =
-      cls.getClassOrMixinOrExtensionBody().getMembers();
+  List<MemberEnd> members = cls.getClassOrMixinOrExtensionBody().getMembers();
   expect(5, members.length);
   expect(members[0].isClassConstructor(), true);
   expect(members[1].isClassFactoryMethod(), true);
@@ -208,8 +204,7 @@
   }""", chunks[0]);
 
   // TODO: Move (something like) this into the check-all-files-thing.
-  for (DirectParserASTContentMemberEnd member
-      in cls.getClassOrMixinOrExtensionBody().getMembers()) {
+  for (MemberEnd member in cls.getClassOrMixinOrExtensionBody().getMembers()) {
     if (member.isClassConstructor()) continue;
     if (member.isClassFactoryMethod()) continue;
     if (member.isClassFields()) continue;
@@ -231,24 +226,21 @@
 }
 
 void testMixinStuff() {
-  File file =
-      new File.fromUri(base.resolve("direct_parser_ast_test_data/mixin.txt"));
+  File file = new File.fromUri(base.resolve("parser_ast_test_data/mixin.txt"));
   List<int> data = file.readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast = getAST(data,
+  CompilationUnitEnd ast = getAST(data,
       includeBody: true,
       includeComments: true,
       enableExtensionMethods: true,
       enableNonNullable: false);
-  List<DirectParserASTContentTopLevelDeclarationEnd> mixins =
-      ast.getMixinDeclarations();
+  List<TopLevelDeclarationEnd> mixins = ast.getMixinDeclarations();
   expect(mixins.length, 1);
 
-  DirectParserASTContentTopLevelDeclarationEnd decl = mixins[0];
-  DirectParserASTContentMixinDeclarationEnd mxn = decl.asMixinDeclaration();
+  TopLevelDeclarationEnd decl = mixins[0];
+  MixinDeclarationEnd mxn = decl.asMixinDeclaration();
   expect("B", decl.getIdentifier().token.lexeme);
 
-  List<DirectParserASTContentMemberEnd> members =
-      mxn.getClassOrMixinOrExtensionBody().getMembers();
+  List<MemberEnd> members = mxn.getClassOrMixinOrExtensionBody().getMembers();
   expect(4, members.length);
   expect(members[0].isMixinFields(), true);
   expect(members[1].isMixinMethod(), true);
@@ -274,28 +266,27 @@
   if (expect != actual) throw "Expected '$expect' but got '$actual'";
 }
 
-List<String> splitIntoChunks(DirectParserASTContent ast, List<int> data) {
+List<String> splitIntoChunks(ParserAstNode ast, List<int> data) {
   List<String> foundChunks = [];
-  for (DirectParserASTContent child in ast.children!) {
+  for (ParserAstNode child in ast.children!) {
     foundChunks.addAll(processItem(child, data));
   }
   return foundChunks;
 }
 
-List<String> processItem(DirectParserASTContent item, List<int> data) {
+List<String> processItem(ParserAstNode item, List<int> data) {
   if (item.isClass()) {
-    DirectParserASTContentClassDeclarationEnd cls = item.asClass();
+    ClassDeclarationEnd cls = item.asClass();
     return [
       getCutContent(data, cls.beginToken.offset,
           cls.endToken.offset + cls.endToken.length)
     ];
   } else if (item.isMetadata()) {
-    DirectParserASTContentMetadataStarEnd metadataStar = item.asMetadata();
-    List<DirectParserASTContentMetadataEnd> entries =
-        metadataStar.getMetadataEntries();
+    MetadataStarEnd metadataStar = item.asMetadata();
+    List<MetadataEnd> entries = metadataStar.getMetadataEntries();
     if (entries.isNotEmpty) {
       List<String> chunks = [];
-      for (DirectParserASTContentMetadataEnd metadata in entries) {
+      for (MetadataEnd metadata in entries) {
         chunks.add(getCutContent(
             data, metadata.beginToken.offset, metadata.endToken.offset));
       }
@@ -303,49 +294,49 @@
     }
     return const [];
   } else if (item.isImport()) {
-    DirectParserASTContentImportEnd import = item.asImport();
+    ImportEnd import = item.asImport();
     return [
       getCutContent(data, import.importKeyword.offset,
           import.semicolon!.offset + import.semicolon!.length)
     ];
   } else if (item.isExport()) {
-    DirectParserASTContentExportEnd export = item.asExport();
+    ExportEnd export = item.asExport();
     return [
       getCutContent(data, export.exportKeyword.offset,
           export.semicolon.offset + export.semicolon.length)
     ];
   } else if (item.isLibraryName()) {
-    DirectParserASTContentLibraryNameEnd name = item.asLibraryName();
+    LibraryNameEnd name = item.asLibraryName();
     return [
       getCutContent(data, name.libraryKeyword.offset,
           name.semicolon.offset + name.semicolon.length)
     ];
   } else if (item.isPart()) {
-    DirectParserASTContentPartEnd part = item.asPart();
+    PartEnd part = item.asPart();
     return [
       getCutContent(data, part.partKeyword.offset,
           part.semicolon.offset + part.semicolon.length)
     ];
   } else if (item.isPartOf()) {
-    DirectParserASTContentPartOfEnd partOf = item.asPartOf();
+    PartOfEnd partOf = item.asPartOf();
     return [
       getCutContent(data, partOf.partKeyword.offset,
           partOf.semicolon.offset + partOf.semicolon.length)
     ];
   } else if (item.isTopLevelMethod()) {
-    DirectParserASTContentTopLevelMethodEnd method = item.asTopLevelMethod();
+    TopLevelMethodEnd method = item.asTopLevelMethod();
     return [
       getCutContent(data, method.beginToken.offset,
           method.endToken.offset + method.endToken.length)
     ];
   } else if (item.isTopLevelFields()) {
-    DirectParserASTContentTopLevelFieldsEnd fields = item.asTopLevelFields();
+    TopLevelFieldsEnd fields = item.asTopLevelFields();
     return [
       getCutContent(data, fields.beginToken.offset,
           fields.endToken.offset + fields.endToken.length)
     ];
   } else if (item.isEnum()) {
-    DirectParserASTContentEnumEnd declaration = item.asEnum();
+    EnumEnd declaration = item.asEnum();
     return [
       getCutContent(
           data,
@@ -354,114 +345,107 @@
               declaration.leftBrace.endGroup!.length)
     ];
   } else if (item.isMixinDeclaration()) {
-    DirectParserASTContentMixinDeclarationEnd mixinDecl =
-        item.asMixinDeclaration();
+    MixinDeclarationEnd mixinDecl = item.asMixinDeclaration();
     return [
       getCutContent(data, mixinDecl.mixinKeyword.offset,
           mixinDecl.endToken.offset + mixinDecl.endToken.length)
     ];
   } else if (item.isNamedMixinDeclaration()) {
-    DirectParserASTContentNamedMixinApplicationEnd namedMixinDecl =
-        item.asNamedMixinDeclaration();
+    NamedMixinApplicationEnd namedMixinDecl = item.asNamedMixinDeclaration();
     return [
       getCutContent(data, namedMixinDecl.begin.offset,
           namedMixinDecl.endToken.offset + namedMixinDecl.endToken.length)
     ];
   } else if (item.isTypedef()) {
-    DirectParserASTContentTypedefEnd typedefDecl = item.asTypedef();
+    TypedefEnd typedefDecl = item.asTypedef();
     return [
       getCutContent(data, typedefDecl.typedefKeyword.offset,
           typedefDecl.endToken.offset + typedefDecl.endToken.length)
     ];
   } else if (item.isExtension()) {
-    DirectParserASTContentExtensionDeclarationEnd extensionDecl =
-        item.asExtension();
+    ExtensionDeclarationEnd extensionDecl = item.asExtension();
     return [
       getCutContent(data, extensionDecl.extensionKeyword.offset,
           extensionDecl.endToken.offset + extensionDecl.endToken.length)
     ];
   } else if (item.isScript()) {
-    DirectParserASTContentScriptHandle script = item.asScript();
+    ScriptHandle script = item.asScript();
     return [
       getCutContent(
           data, script.token.offset, script.token.offset + script.token.length)
     ];
-  } else if (item is DirectParserASTContentMemberEnd) {
+  } else if (item is MemberEnd) {
     if (item.isClassConstructor()) {
-      DirectParserASTContentClassConstructorEnd decl =
-          item.getClassConstructor();
+      ClassConstructorEnd decl = item.getClassConstructor();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassFactoryMethod()) {
-      DirectParserASTContentClassFactoryMethodEnd decl =
-          item.getClassFactoryMethod();
+      ClassFactoryMethodEnd decl = item.getClassFactoryMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassMethod()) {
-      DirectParserASTContentClassMethodEnd decl = item.getClassMethod();
+      ClassMethodEnd decl = item.getClassMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassFields()) {
-      DirectParserASTContentClassFieldsEnd decl = item.getClassFields();
+      ClassFieldsEnd decl = item.getClassFields();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isClassFields()) {
-      DirectParserASTContentClassFieldsEnd decl = item.getClassFields();
+      ClassFieldsEnd decl = item.getClassFields();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinFields()) {
-      DirectParserASTContentMixinFieldsEnd decl = item.getMixinFields();
+      MixinFieldsEnd decl = item.getMixinFields();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinMethod()) {
-      DirectParserASTContentMixinMethodEnd decl = item.getMixinMethod();
+      MixinMethodEnd decl = item.getMixinMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinFactoryMethod()) {
-      DirectParserASTContentMixinFactoryMethodEnd decl =
-          item.getMixinFactoryMethod();
+      MixinFactoryMethodEnd decl = item.getMixinFactoryMethod();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else if (item.isMixinConstructor()) {
-      DirectParserASTContentMixinConstructorEnd decl =
-          item.getMixinConstructor();
+      MixinConstructorEnd decl = item.getMixinConstructor();
       return [
         getCutContent(data, decl.beginToken.offset,
             decl.endToken.offset + decl.endToken.length)
       ];
     } else {
-      if (item.type == DirectParserASTType.BEGIN) return const [];
-      if (item.type == DirectParserASTType.HANDLE) return const [];
+      if (item.type == ParserAstType.BEGIN) return const [];
+      if (item.type == ParserAstType.HANDLE) return const [];
       if (item.isClassRecoverableError()) return const [];
       if (item.isRecoverableError()) return const [];
       if (item.isRecoverImport()) return const [];
       throw "Unknown: $item --- ${item.children}";
     }
   } else if (item.isFunctionBody()) {
-    DirectParserASTContentBlockFunctionBodyEnd decl = item.asFunctionBody();
+    BlockFunctionBodyEnd decl = item.asFunctionBody();
     return [
       getCutContent(data, decl.beginToken.offset,
           decl.endToken.offset + decl.endToken.length)
     ];
   } else {
-    if (item.type == DirectParserASTType.BEGIN) return const [];
-    if (item.type == DirectParserASTType.HANDLE) return const [];
+    if (item.type == ParserAstType.BEGIN) return const [];
+    if (item.type == ParserAstType.HANDLE) return const [];
     if (item.isInvalidTopLevelDeclaration()) return const [];
     if (item.isRecoverableError()) return const [];
     if (item.isRecoverImport()) return const [];
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/class.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/class.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/class.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/class.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/mixin.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/mixin.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/mixin.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/mixin.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/script_handle.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/script_handle.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/script_handle.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/script_handle.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff.txt
diff --git a/pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff_helper.txt b/pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff_helper.txt
similarity index 100%
rename from pkg/front_end/test/fasta/util/direct_parser_ast_test_data/top_level_stuff_helper.txt
rename to pkg/front_end/test/fasta/util/parser_ast_test_data/top_level_stuff_helper.txt
diff --git a/pkg/front_end/test/generated_files_up_to_date_git_test.dart b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
index 78cdefb..89665f6 100644
--- a/pkg/front_end/test/generated_files_up_to_date_git_test.dart
+++ b/pkg/front_end/test/generated_files_up_to_date_git_test.dart
@@ -7,8 +7,8 @@
 import "../tool/_fasta/generate_messages.dart" as generateMessages;
 import "../tool/_fasta/generate_experimental_flags.dart"
     as generateExperimentalFlags;
-import "../tool/_fasta/direct_parser_ast_helper_creator.dart"
-    as generateDirectParserAstHelper;
+import "../tool/_fasta/parser_ast_helper_creator.dart"
+    as generateParserAstHelper;
 import "parser_test_listener_creator.dart" as generateParserTestListener;
 import "parser_test_parser_creator.dart" as generateParserTestParser;
 import '../tool/ast_model.dart';
@@ -45,11 +45,10 @@
 }
 
 void directParserAstHelper() {
-  Uri generatedFile =
-      generateDirectParserAstHelper.computeAstHelperUri(repoDir);
-  String generated = generateDirectParserAstHelper.generateAstHelper(repoDir);
+  Uri generatedFile = generateParserAstHelper.computeAstHelperUri(repoDir);
+  String generated = generateParserAstHelper.generateAstHelper(repoDir);
   check(generated, generatedFile,
-      "dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart");
+      "dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart");
 }
 
 Future<void> astEquivalence(AstModel astModel) async {
diff --git a/pkg/front_end/test/parser_suite.dart b/pkg/front_end/test/parser_suite.dart
index cb24755..5910e30 100644
--- a/pkg/front_end/test/parser_suite.dart
+++ b/pkg/front_end/test/parser_suite.dart
@@ -15,7 +15,7 @@
 import 'package:front_end/src/fasta/source/diet_parser.dart'
     show useImplicitCreationExpressionInCfe;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast.dart' show getAST;
+import 'package:front_end/src/fasta/util/parser_ast.dart' show getAST;
 
 import 'package:_fe_analyzer_shared/src/parser/parser.dart'
     show Parser, lengthOfSpan;
@@ -29,8 +29,8 @@
 import 'package:front_end/src/fasta/source/stack_listener_impl.dart'
     show offsetForToken;
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart'
-    show DirectParserASTContent;
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart'
+    show ParserAstNode;
 
 import 'package:kernel/ast.dart';
 
@@ -144,7 +144,7 @@
   @override
   final List<Step> steps = const <Step>[
     const ListenerStep(false),
-    const DirectParserASTStep(),
+    const ParserAstStep(),
   ];
 
   @override
@@ -159,18 +159,17 @@
   }
 }
 
-class DirectParserASTStep
-    extends Step<TestDescription, TestDescription, Context> {
-  const DirectParserASTStep();
+class ParserAstStep extends Step<TestDescription, TestDescription, Context> {
+  const ParserAstStep();
   @override
-  String get name => "DirectParserAST";
+  String get name => "ParserAst";
   @override
   Future<Result<TestDescription>> run(
       TestDescription description, Context context) {
     Uri uri = description.uri;
     File f = new File.fromUri(uri);
     List<int> rawBytes = f.readAsBytesSync();
-    DirectParserASTContent ast = getAST(rawBytes);
+    ParserAstNode ast = getAST(rawBytes);
     if (ast.what != "CompilationUnit") {
       throw "Expected a single element for 'CompilationUnit' "
           "but got ${ast.what}";
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.outline.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
index 776ec91..cd13068 100644
--- a/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart.weak.transformed.expect
@@ -14,7 +14,7 @@
 // typedef F<Glib.=
 //                ^
 //
-// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/general/error_recovery/issue_39033b.crash_dart:2:16: Error: Can't create typedef from non-type.
 // typedef F<Glib.=
 //                ^
 //
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.expect
index 1c6fab0..aeebd16 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
index f366ace..697ca5b 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.outline.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
index 1c6fab0..aeebd16 100644
--- a/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/general/issue47495.dart.weak.transformed.expect
@@ -17,20 +17,6 @@
 // typedef MAlias = M;
 //         ^
 //
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'SAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:10:9: Context: The issue arises via this type alias.
-// typedef SAlias = S;
-//         ^
-//
-// pkg/front_end/testcases/general/issue47495.dart:13:7: Error: The type 'MAlias' which is an alias of 'invalid-type' can't be used as supertype.
-// class C = SAlias with MAlias;
-//       ^
-// pkg/front_end/testcases/general/issue47495.dart:11:9: Context: The issue arises via this type alias.
-// typedef MAlias = M;
-//         ^
-//
 import self as self;
 import "dart:core" as core;
 
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart b/pkg/front_end/testcases/general/issue47728_1.dart
new file mode 100644
index 0000000..c21c8d9
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart
@@ -0,0 +1,13 @@
+// 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.12
+
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect
new file mode 100644
index 0000000..ce30a6e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline.expect
@@ -0,0 +1,7 @@
+// @dart = 2.12
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..41cba10
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.textual_outline_modelled.expect
@@ -0,0 +1,6 @@
+// @dart = 2.12
+class B {}
+
+class C = A with B;
+main() {}
+typedef A = Function()?;
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect
new file mode 100644
index 0000000..a0401b1
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect
new file mode 100644
index 0000000..f10b81e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.outline.expect
@@ -0,0 +1,22 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect
new file mode 100644
index 0000000..047429d
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_1.dart.weak.transformed.expect
@@ -0,0 +1,23 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_1.dart:7:11: Error: Can't create typedef from nullable type.
+// typedef A = Function()?;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart b/pkg/front_end/testcases/general/issue47728_2.dart
new file mode 100644
index 0000000..70ff02c
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart
@@ -0,0 +1,11 @@
+// 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.
+
+typedef A = ;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect
new file mode 100644
index 0000000..d2e4a8cd
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.textual_outline.expect
@@ -0,0 +1,4 @@
+typedef A = ;
+class B {}
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect
new file mode 100644
index 0000000..82e50f8
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect
new file mode 100644
index 0000000..836ab09
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.outline.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect
new file mode 100644
index 0000000..3b07de4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_2.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_2.dart:5:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart b/pkg/front_end/testcases/general/issue47728_3.dart
new file mode 100644
index 0000000..cc160b7
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart
@@ -0,0 +1,13 @@
+// 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.12
+
+typedef A = ;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect
new file mode 100644
index 0000000..f5e4116
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.textual_outline.expect
@@ -0,0 +1,5 @@
+// @dart = 2.12
+typedef A = ;
+class B {}
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect
new file mode 100644
index 0000000..7f3c778
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect
new file mode 100644
index 0000000..e34cb28
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.outline.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect
new file mode 100644
index 0000000..11c3c9f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_3.dart.weak.transformed.expect
@@ -0,0 +1,27 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:13: Error: Expected a type, but got ';'.
+// typedef A = ;
+//             ^
+//
+// pkg/front_end/testcases/general/issue47728_3.dart:7:11: Error: Can't create typedef from non-type.
+// typedef A = ;
+//           ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = invalid-type;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart b/pkg/front_end/testcases/general/issue47728_4.dart
new file mode 100644
index 0000000..bd0512e
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart
@@ -0,0 +1,11 @@
+// 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.
+
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect
new file mode 100644
index 0000000..aca4ab4
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline.expect
@@ -0,0 +1,6 @@
+typedef A = Function()?;
+
+class B {}
+
+class C = A with B;
+main() {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect
new file mode 100644
index 0000000..09de3de
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.textual_outline_modelled.expect
@@ -0,0 +1,5 @@
+class B {}
+
+class C = A with B;
+main() {}
+typedef A = Function()?;
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect
new file mode 100644
index 0000000..b242e08
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect
new file mode 100644
index 0000000..bcc7a6f
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.outline.expect
@@ -0,0 +1,25 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    ;
+}
+class C = core::Object with self::B {
+  synthetic constructor •() → self::C
+    ;
+}
+static method main() → dynamic
+  ;
diff --git a/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect b/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect
new file mode 100644
index 0000000..a92eb47
--- /dev/null
+++ b/pkg/front_end/testcases/general/issue47728_4.dart.weak.transformed.expect
@@ -0,0 +1,26 @@
+library /*isNonNullableByDefault*/;
+//
+// Problems in library:
+//
+// pkg/front_end/testcases/general/issue47728_4.dart:9:7: Error: The type 'A' which is an alias of 'dynamic Function()?' can't be used as supertype because it is nullable.
+// class C = A with B;
+//       ^
+// pkg/front_end/testcases/general/issue47728_4.dart:5:9: Context: The issue arises via this type alias.
+// typedef A = Function()?;
+//         ^
+//
+import self as self;
+import "dart:core" as core;
+
+typedef A = () →? dynamic;
+class B extends core::Object {
+  synthetic constructor •() → self::B
+    : super core::Object::•()
+    ;
+}
+class C extends core::Object implements self::B /*isEliminatedMixin*/  {
+  synthetic constructor •() → self::C
+    : super core::Object::•()
+    ;
+}
+static method main() → dynamic {}
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
index af8ae54..7b520a3 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
index d0b75ac..1b5d642 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.outline.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect b/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
index af8ae54..7b520a3 100644
--- a/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
+++ b/pkg/front_end/testcases/regress/issue_31171.dart.weak.transformed.expect
@@ -10,7 +10,7 @@
 // typedef T =
 //           ^
 //
-// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-function type.
+// pkg/front_end/testcases/regress/issue_31171.dart:7:11: Error: Can't create typedef from non-type.
 // typedef T =
 //           ^
 //
diff --git a/pkg/front_end/testcases/textual_outline.status b/pkg/front_end/testcases/textual_outline.status
index 6fec846..13f7172 100644
--- a/pkg/front_end/testcases/textual_outline.status
+++ b/pkg/front_end/testcases/textual_outline.status
@@ -88,6 +88,8 @@
 general/issue45490: FormatterCrash
 general/issue45700.crash: FormatterCrash
 general/issue47495: FormatterCrash
+general/issue47728_2: FormatterCrash
+general/issue47728_3: FormatterCrash
 general/many_errors: FormatterCrash
 general/missing_prefix_name: FormatterCrash
 general/new_as_selector: FormatterCrash
diff --git a/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart b/pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
similarity index 89%
rename from pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
rename to pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
index 2cfa64c..b9999d6 100644
--- a/pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart
+++ b/pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart
@@ -19,8 +19,8 @@
 }
 
 Uri computeAstHelperUri(Uri repoDir) {
-  return repoDir.resolve(
-      "pkg/front_end/lib/src/fasta/util/direct_parser_ast_helper.dart");
+  return repoDir
+      .resolve("pkg/front_end/lib/src/fasta/util/parser_ast_helper.dart");
 }
 
 String generateAstHelper(Uri repoDir) {
@@ -55,28 +55,28 @@
 // ignore_for_file: lines_longer_than_80_chars
 
 // THIS FILE IS AUTO GENERATED BY
-// 'tool/_fasta/direct_parser_ast_helper_creator.dart'
+// 'tool/_fasta/parser_ast_helper_creator.dart'
 // Run this command to update it:
-// 'dart pkg/front_end/tool/_fasta/direct_parser_ast_helper_creator.dart'
+// 'dart pkg/front_end/tool/_fasta/parser_ast_helper_creator.dart'
 
-abstract class DirectParserASTContent {
+abstract class ParserAstNode {
   final String what;
-  final DirectParserASTType type;
+  final ParserAstType type;
   Map<String, Object?> get deprecatedArguments;
-  List<DirectParserASTContent>? children;
-  DirectParserASTContent? parent;
+  List<ParserAstNode>? children;
+  ParserAstNode? parent;
 
-  DirectParserASTContent(this.what, this.type);
+  ParserAstNode(this.what, this.type);
 
   // TODO(jensj): Compare two ASTs.
 }
 
-enum DirectParserASTType { BEGIN, END, HANDLE }
+enum ParserAstType { BEGIN, END, HANDLE }
 
-abstract class AbstractDirectParserASTListener implements Listener {
-  List<DirectParserASTContent> data = [];
+abstract class AbstractParserAstListener implements Listener {
+  List<ParserAstNode> data = [];
 
-  void seen(DirectParserASTContent entry);
+  void seen(ParserAstNode entry);
 
 """);
 
@@ -181,9 +181,9 @@
           throw "Unexpected.";
         }
 
-        String className = "DirectParserASTContent${name}${typeStringCamel}";
+        String className = "${name}${typeStringCamel}";
         sb.write("$className data = new $className(");
-        sb.write("DirectParserASTType.");
+        sb.write("ParserAstType.");
         sb.write(typeString);
         for (int i = 0; i < parameters.length; i++) {
           Parameter param = parameters[i];
@@ -198,9 +198,8 @@
         sb.write("seen(data);");
         sb.write("\n  ");
 
-        newClasses
-            .write("class DirectParserASTContent${name}${typeStringCamel} "
-                "extends DirectParserASTContent {\n");
+        newClasses.write("class ${name}${typeStringCamel} "
+            "extends ParserAstNode {\n");
 
         for (int i = 0; i < parameters.length; i++) {
           Parameter param = parameters[i];
@@ -212,8 +211,8 @@
           newClasses.write(';\n');
         }
         newClasses.write('\n');
-        newClasses.write("  DirectParserASTContent${name}${typeStringCamel}"
-            "(DirectParserASTType type");
+        newClasses.write("  ${name}${typeStringCamel}"
+            "(ParserAstType type");
         String separator = ", {";
         for (int i = 0; i < parameters.length; i++) {
           Parameter param = parameters[i];
diff --git a/pkg/front_end/tool/kernel_ast_file_rewriter.dart b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
index d80b5c2..091640d 100644
--- a/pkg/front_end/tool/kernel_ast_file_rewriter.dart
+++ b/pkg/front_end/tool/kernel_ast_file_rewriter.dart
@@ -11,28 +11,27 @@
 import 'package:_fe_analyzer_shared/src/scanner/token.dart'
     show CommentToken, Token;
 
-import "package:front_end/src/fasta/util/direct_parser_ast.dart";
+import "package:front_end/src/fasta/util/parser_ast.dart";
 
-import 'package:front_end/src/fasta/util/direct_parser_ast_helper.dart';
+import 'package:front_end/src/fasta/util/parser_ast_helper.dart';
 
 void main(List<String> args) {
   Uri uri = Platform.script;
   uri = uri.resolve("../../kernel/lib/ast.dart");
   Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
-  DirectParserASTContentCompilationUnitEnd ast =
+  CompilationUnitEnd ast =
       getAST(bytes, includeBody: true, includeComments: true);
-  Map<String, DirectParserASTContentTopLevelDeclarationEnd> classes = {};
-  for (DirectParserASTContentTopLevelDeclarationEnd cls in ast.getClasses()) {
-    DirectParserASTContentIdentifierHandle identifier = cls.getIdentifier();
+  Map<String, TopLevelDeclarationEnd> classes = {};
+  for (TopLevelDeclarationEnd cls in ast.getClasses()) {
+    IdentifierHandle identifier = cls.getIdentifier();
     assert(classes[identifier.token] == null);
     classes[identifier.token.toString()] = cls;
   }
 
   Set<String?> goodNames = {"TreeNode"};
   Map<Token, Replacement> replacements = {};
-  for (MapEntry<String, DirectParserASTContentTopLevelDeclarationEnd> entry
-      in classes.entries) {
-    DirectParserASTContentTopLevelDeclarationEnd cls = entry.value;
+  for (MapEntry<String, TopLevelDeclarationEnd> entry in classes.entries) {
+    TopLevelDeclarationEnd cls = entry.value;
 
     // Simple "class hierarchy" to only work on TreeNodes.
     if (goodNames.contains(entry.key)) {
@@ -40,7 +39,7 @@
     } else {
       // Check if good.
       String? parent = getExtends(cls);
-      DirectParserASTContentTopLevelDeclarationEnd? parentCls = classes[parent];
+      TopLevelDeclarationEnd? parentCls = classes[parent];
       List<String?> allParents = [parent];
       while (
           parent != null && parentCls != null && !goodNames.contains(parent)) {
@@ -55,18 +54,15 @@
       }
     }
 
-    DirectParserASTContentClassDeclarationEnd classDeclaration =
-        cls.getClassDeclaration();
-    DirectParserASTContentClassOrMixinOrExtensionBodyEnd classOrMixinBody =
+    ClassDeclarationEnd classDeclaration = cls.getClassDeclaration();
+    ClassOrMixinOrExtensionBodyEnd classOrMixinBody =
         classDeclaration.getClassOrMixinOrExtensionBody();
 
     Set<String> namedClassConstructors = {};
     Set<String> namedFields = {};
-    for (DirectParserASTContentMemberEnd member
-        in classOrMixinBody.getMembers()) {
+    for (MemberEnd member in classOrMixinBody.getMembers()) {
       if (member.isClassConstructor()) {
-        DirectParserASTContentClassConstructorEnd constructor =
-            member.getClassConstructor();
+        ClassConstructorEnd constructor = member.getClassConstructor();
         Token nameToken = constructor.beginToken;
         // String name = nameToken.lexeme;
         if (nameToken.next!.lexeme == ".") {
@@ -78,8 +74,7 @@
           throw "Unexpected";
         }
       } else if (member.isClassFields()) {
-        DirectParserASTContentClassFieldsEnd classFields =
-            member.getClassFields();
+        ClassFieldsEnd classFields = member.getClassFields();
         Token identifierToken = classFields.getFieldIdentifiers().single.token;
         String identifier = identifierToken.toString();
         namedFields.add(identifier);
@@ -94,8 +89,7 @@
           classBraceToken, classBraceToken, "{\n  bool frozen = false;");
     }
 
-    for (DirectParserASTContentMemberEnd member
-        in classOrMixinBody.getMembers()) {
+    for (MemberEnd member in classOrMixinBody.getMembers()) {
       if (member.isClassConstructor()) {
         processConstructor(
             member, replacements, namedClassConstructors, namedFields);
@@ -143,10 +137,10 @@
 }
 
 void processField(
-    DirectParserASTContentMemberEnd member,
-    MapEntry<String, DirectParserASTContentTopLevelDeclarationEnd> entry,
+    MemberEnd member,
+    MapEntry<String, TopLevelDeclarationEnd> entry,
     Map<Token, Replacement> replacements) {
-  DirectParserASTContentClassFieldsEnd classFields = member.getClassFields();
+  ClassFieldsEnd classFields = member.getClassFields();
 
   if (classFields.count != 1) {
     throw "Notice ${classFields.count}";
@@ -165,7 +159,7 @@
     isFinal = true;
   }
 
-  DirectParserASTContentTypeHandle? type = classFields.getFirstType();
+  TypeHandle? type = classFields.getFirstType();
   String typeString = "dynamic";
   if (type != null) {
     Token token = type.beginToken;
@@ -177,8 +171,7 @@
     typeString = typeString.trim();
   }
 
-  DirectParserASTContentFieldInitializerEnd? initializer =
-      classFields.getFieldInitializer();
+  FieldInitializerEnd? initializer = classFields.getFieldInitializer();
   String initializerString = "";
   if (initializer != null) {
     Token token = initializer.assignment;
@@ -240,19 +233,13 @@
   }
 }
 
-void processConstructor(
-    DirectParserASTContentMemberEnd member,
-    Map<Token, Replacement> replacements,
-    Set<String> namedClassConstructors,
-    Set<String> namedFields) {
-  DirectParserASTContentClassConstructorEnd constructor =
-      member.getClassConstructor();
-  DirectParserASTContentFormalParametersEnd formalParameters =
-      constructor.getFormalParameters();
-  List<DirectParserASTContentFormalParameterEnd> parameters =
-      formalParameters.getFormalParameters();
+void processConstructor(MemberEnd member, Map<Token, Replacement> replacements,
+    Set<String> namedClassConstructors, Set<String> namedFields) {
+  ClassConstructorEnd constructor = member.getClassConstructor();
+  FormalParametersEnd formalParameters = constructor.getFormalParameters();
+  List<FormalParameterEnd> parameters = formalParameters.getFormalParameters();
 
-  for (DirectParserASTContentFormalParameterEnd parameter in parameters) {
+  for (FormalParameterEnd parameter in parameters) {
     Token token = parameter.getBegin().token;
     if (token.lexeme != "this") {
       continue;
@@ -262,14 +249,14 @@
     replacements[afterDot] = new Replacement(afterDot, afterDot, "_$afterDot");
   }
 
-  DirectParserASTContentOptionalFormalParametersEnd? optionalFormalParameters =
+  OptionalFormalParametersEnd? optionalFormalParameters =
       formalParameters.getOptionalFormalParameters();
   Set<String> addInitializers = {};
   if (optionalFormalParameters != null) {
-    List<DirectParserASTContentFormalParameterEnd> parameters =
+    List<FormalParameterEnd> parameters =
         optionalFormalParameters.getFormalParameters();
 
-    for (DirectParserASTContentFormalParameterEnd parameter in parameters) {
+    for (FormalParameterEnd parameter in parameters) {
       Token token = parameter.getBegin().token;
       if (token.lexeme != "this") {
         continue;
@@ -284,15 +271,12 @@
     }
   }
 
-  DirectParserASTContentInitializersEnd? initializers =
-      constructor.getInitializers();
+  InitializersEnd? initializers = constructor.getInitializers();
 
   // First patch up any existing initializers.
   if (initializers != null) {
-    List<DirectParserASTContentInitializerEnd> actualInitializers =
-        initializers.getInitializers();
-    for (DirectParserASTContentInitializerEnd initializer
-        in actualInitializers) {
+    List<InitializerEnd> actualInitializers = initializers.getInitializers();
+    for (InitializerEnd initializer in actualInitializers) {
       Token token = initializer.getBegin().token;
       // This is only afterDot if there's a dot --- which (probably) is
       // only there if there's a `this`.
@@ -318,8 +302,8 @@
       } else if (token.lexeme == "super") {
         // Don't try to patch this one.
       } else if (token.lexeme == "assert") {
-        List<DirectParserASTContentIdentifierHandle> identifiers = initializer
-            .recursivelyFind<DirectParserASTContentIdentifierHandle>();
+        List<IdentifierHandle> identifiers =
+            initializer.recursivelyFind<IdentifierHandle>();
         for (Token token in identifiers.map((e) => e.token)) {
           if (namedFields.contains(token.lexeme)) {
             replacements[token] = new Replacement(token, token, "_$token");
@@ -345,7 +329,7 @@
   } else if (addInitializers.isNotEmpty) {
     // Add to existing initializer list. We add them as the first one(s)
     // so we don't have to insert before the potential super call.
-    DirectParserASTContentInitializersBegin firstOne = initializers!.getBegin();
+    InitializersBegin firstOne = initializers!.getBegin();
     Token colon = firstOne.token;
     assert(colon.lexeme == ":");
     String initializerString =
@@ -365,13 +349,12 @@
   //    C(this.field1) : field2 = field1 + 1;
   //  }
   if (addInitializers.isNotEmpty) {
-    DirectParserASTContentBlockFunctionBodyEnd? blockFunctionBody =
+    BlockFunctionBodyEnd? blockFunctionBody =
         constructor.getBlockFunctionBody();
     if (blockFunctionBody != null) {
-      List<DirectParserASTContentIdentifierHandle> identifiers =
-          blockFunctionBody
-              .recursivelyFind<DirectParserASTContentIdentifierHandle>();
-      for (DirectParserASTContentIdentifierHandle identifier in identifiers) {
+      List<IdentifierHandle> identifiers =
+          blockFunctionBody.recursivelyFind<IdentifierHandle>();
+      for (IdentifierHandle identifier in identifiers) {
         Token token = identifier.token;
         IdentifierContext context = identifier.context;
         if (namedFields.contains(token.lexeme) &&
@@ -395,12 +378,10 @@
   Replacement(this.beginToken, this.endToken, this.replacement);
 }
 
-String? getExtends(DirectParserASTContentTopLevelDeclarationEnd cls) {
-  DirectParserASTContentClassDeclarationEnd classDeclaration =
-      cls.getClassDeclaration();
+String? getExtends(TopLevelDeclarationEnd cls) {
+  ClassDeclarationEnd classDeclaration = cls.getClassDeclaration();
 
-  DirectParserASTContentClassExtendsHandle classExtends =
-      classDeclaration.getClassExtends();
+  ClassExtendsHandle classExtends = classDeclaration.getClassExtends();
   Token? extendsKeyword = classExtends.extendsKeyword;
   if (extendsKeyword == null) {
     return null;
@@ -409,15 +390,14 @@
   }
 }
 
-void debugDumpNode(DirectParserASTContent node) {
+void debugDumpNode(ParserAstNode node) {
   node.children!.forEach((element) {
     print("${element.what} (${element.deprecatedArguments}) "
         "(${element.children})");
   });
 }
 
-void debugDumpNodeRecursively(DirectParserASTContent node,
-    {String indent = ""}) {
+void debugDumpNodeRecursively(ParserAstNode node, {String indent = ""}) {
   print("$indent${node.what} (${node.deprecatedArguments})");
   if (node.children == null) return;
   node.children!.forEach((element) {
diff --git a/pkg/front_end/tool/parser_direct_ast/viewer.dart b/pkg/front_end/tool/parser_direct_ast/viewer.dart
index edf1159..8650f0f 100644
--- a/pkg/front_end/tool/parser_direct_ast/viewer.dart
+++ b/pkg/front_end/tool/parser_direct_ast/viewer.dart
@@ -5,9 +5,9 @@
 import "dart:io" show File, Platform;
 import "dart:typed_data" show Uint8List;
 
-import "package:front_end/src/fasta/util/direct_parser_ast.dart" show getAST;
-import "package:front_end/src/fasta/util/direct_parser_ast_helper.dart"
-    show DirectParserASTContent, DirectParserASTType;
+import "package:front_end/src/fasta/util/parser_ast.dart" show getAST;
+import "package:front_end/src/fasta/util/parser_ast_helper.dart"
+    show ParserAstNode, ParserAstType;
 
 import "console_helper.dart";
 
@@ -17,7 +17,7 @@
     uri = Uri.base.resolve(args.first);
   }
   Uint8List bytes = new File.fromUri(uri).readAsBytesSync();
-  DirectParserASTContent ast = getAST(bytes, enableExtensionMethods: true);
+  ParserAstNode ast = getAST(bytes, enableExtensionMethods: true);
 
   Widget widget = new QuitOnQWidget(
     new WithSingleLineBottomWidget(
@@ -33,7 +33,7 @@
 
 class PrintedLine {
   final String text;
-  final DirectParserASTContent? ast;
+  final ParserAstNode? ast;
   final List<PrintedLine>? parentShown;
   final int? selected;
 
@@ -53,21 +53,21 @@
   late List<PrintedLine> shown;
   int selected = 0;
 
-  AstWidget(DirectParserASTContent ast) {
+  AstWidget(ParserAstNode ast) {
     shown = [new PrintedLine.ast(ast, textualize(ast))];
   }
 
-  String textualize(DirectParserASTContent element,
+  String textualize(ParserAstNode element,
       {bool indent: false, bool withEndHeader: false}) {
     String header;
     switch (element.type) {
-      case DirectParserASTType.BEGIN:
+      case ParserAstType.BEGIN:
         header = "begin";
         break;
-      case DirectParserASTType.HANDLE:
+      case ParserAstType.HANDLE:
         header = "handle";
         break;
-      case DirectParserASTType.END:
+      case ParserAstType.END:
         header = withEndHeader ? "end" : "";
         break;
     }
@@ -114,7 +114,7 @@
       selected = selectedElement.selected!;
     } else {
       shown = [new PrintedLine.parent(shown, selected)];
-      List<DirectParserASTContent>? children = selectedElement.ast!.children;
+      List<ParserAstNode>? children = selectedElement.ast!.children;
       if (children != null) {
         for (int i = 0; i < children.length; i++) {
           shown.add(new PrintedLine.ast(
diff --git a/runtime/tests/concurrency/stress_test_list.json b/runtime/tests/concurrency/stress_test_list.json
index 067339d..a3073eb 100644
--- a/runtime/tests/concurrency/stress_test_list.json
+++ b/runtime/tests/concurrency/stress_test_list.json
@@ -340,7 +340,6 @@
     "../../../tests/corelib/regexp/backreferences_test.dart",
     "../../../tests/corelib/regexp/bol-with-multiline_test.dart",
     "../../../tests/corelib/regexp/bol_test.dart",
-    "../../../tests/corelib/regexp/capture-3_test.dart",
     "../../../tests/corelib/regexp/capture_test.dart",
     "../../../tests/corelib/regexp/captures_test.dart",
     "../../../tests/corelib/regexp/char-insensitive_test.dart",
@@ -3752,7 +3751,6 @@
     "../../../tests/corelib_2/regexp/backreferences_test.dart",
     "../../../tests/corelib_2/regexp/bol-with-multiline_test.dart",
     "../../../tests/corelib_2/regexp/bol_test.dart",
-    "../../../tests/corelib_2/regexp/capture-3_test.dart",
     "../../../tests/corelib_2/regexp/capture_test.dart",
     "../../../tests/corelib_2/regexp/captures_test.dart",
     "../../../tests/corelib_2/regexp/char-insensitive_test.dart",
diff --git a/runtime/vm/compiler/backend/constant_propagator.cc b/runtime/vm/compiler/backend/constant_propagator.cc
index f4f5424..eed551a 100644
--- a/runtime/vm/compiler/backend/constant_propagator.cc
+++ b/runtime/vm/compiler/backend/constant_propagator.cc
@@ -588,9 +588,17 @@
   const Object& left = left_defn->constant_value();
   const Object& right = right_defn->constant_value();
   if (IsNonConstant(left) || IsNonConstant(right)) {
-    // TODO(vegorov): incorporate nullability information into the lattice.
-    if ((left.IsNull() && instr->right()->Type()->HasDecidableNullability()) ||
-        (right.IsNull() && instr->left()->Type()->HasDecidableNullability())) {
+    if ((left.ptr() == Object::sentinel().ptr() &&
+         !instr->right()->Type()->can_be_sentinel()) ||
+        (right.ptr() == Object::sentinel().ptr() &&
+         !instr->left()->Type()->can_be_sentinel())) {
+      // Handle provably false (EQ_STRICT) or true (NE_STRICT) sentinel checks.
+      SetValue(instr, Bool::Get(instr->kind() != Token::kEQ_STRICT));
+    } else if ((left.IsNull() &&
+                instr->right()->Type()->HasDecidableNullability()) ||
+               (right.IsNull() &&
+                instr->left()->Type()->HasDecidableNullability())) {
+      // TODO(vegorov): incorporate nullability information into the lattice.
       bool result = left.IsNull() ? instr->right()->Type()->IsNull()
                                   : instr->left()->Type()->IsNull();
       if (instr->kind() == Token::kNE_STRICT) {
diff --git a/runtime/vm/compiler/backend/constant_propagator_test.cc b/runtime/vm/compiler/backend/constant_propagator_test.cc
index de14881..1ee3b6d 100644
--- a/runtime/vm/compiler/backend/constant_propagator_test.cc
+++ b/runtime/vm/compiler/backend/constant_propagator_test.cc
@@ -295,4 +295,85 @@
 }
 #endif
 
+void StrictCompareSentinel(Thread* thread,
+                           bool negate,
+                           bool non_sentinel_on_left) {
+  const char* kScript = R"(
+    late final int x = 4;
+  )";
+  Zone* const Z = Thread::Current()->zone();
+  const auto& root_library = Library::CheckedHandle(Z, LoadTestScript(kScript));
+  const auto& toplevel = Class::Handle(Z, root_library.toplevel_class());
+  const auto& field_x = Field::Handle(
+      Z, toplevel.LookupStaticField(String::Handle(Z, String::New("x"))));
+
+  using compiler::BlockBuilder;
+  CompilerState S(thread, /*is_aot=*/false, /*is_optimizing=*/true);
+  FlowGraphBuilderHelper H;
+
+  auto b1 = H.flow_graph()->graph_entry()->normal_entry();
+
+  {
+    BlockBuilder builder(H.flow_graph(), b1);
+    auto v_load = builder.AddDefinition(new LoadStaticFieldInstr(
+        field_x, {},
+        /*calls_initializer=*/true, S.GetNextDeoptId()));
+    auto v_sentinel = H.flow_graph()->GetConstant(Object::sentinel());
+    Value* const left_value =
+        non_sentinel_on_left ? new Value(v_load) : new Value(v_sentinel);
+    Value* const right_value =
+        non_sentinel_on_left ? new Value(v_sentinel) : new Value(v_load);
+    auto v_compare = builder.AddDefinition(new StrictCompareInstr(
+        {}, negate ? Token::kNE_STRICT : Token::kEQ_STRICT, left_value,
+        right_value,
+        /*needs_number_check=*/false, S.GetNextDeoptId()));
+    builder.AddReturn(new Value(v_compare));
+  }
+
+  H.FinishGraph();
+
+  FlowGraphPrinter::PrintGraph("Before TypePropagator", H.flow_graph());
+  FlowGraphTypePropagator::Propagate(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After TypePropagator", H.flow_graph());
+  GrowableArray<BlockEntryInstr*> ignored;
+  ConstantPropagator::Optimize(H.flow_graph());
+  FlowGraphPrinter::PrintGraph("After ConstantPropagator", H.flow_graph());
+
+  ReturnInstr* ret = nullptr;
+
+  ILMatcher cursor(H.flow_graph(),
+                   H.flow_graph()->graph_entry()->normal_entry(), true);
+  RELEASE_ASSERT(cursor.TryMatch({
+      kMatchAndMoveFunctionEntry,
+      kMatchAndMoveLoadStaticField,
+      // The StrictCompare instruction should be removed.
+      {kMatchReturn, &ret},
+  }));
+
+  EXPECT_PROPERTY(ret, it.value()->BindsToConstant());
+  EXPECT_PROPERTY(&ret->value()->BoundConstant(), it.IsBool());
+  EXPECT_PROPERTY(&ret->value()->BoundConstant(),
+                  Bool::Cast(it).value() == negate);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareEqualsSentinelLeft) {
+  StrictCompareSentinel(thread, /*negate=*/false,
+                        /*non_sentinel_on_left=*/true);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareEqualsSentinelRightt) {
+  StrictCompareSentinel(thread, /*negate=*/false,
+                        /*non_sentinel_on_left=*/false);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareNotEqualsSentinelLeft) {
+  StrictCompareSentinel(thread, /*negate=*/true,
+                        /*non_sentinel_on_left=*/true);
+}
+
+ISOLATE_UNIT_TEST_CASE(ConstantPropagator_StrictCompareNotEqualsSentinelRight) {
+  StrictCompareSentinel(thread, /*negate=*/true,
+                        /*non_sentinel_on_left=*/false);
+}
+
 }  // namespace dart
diff --git a/runtime/vm/compiler/backend/il_arm.cc b/runtime/vm/compiler/backend/il_arm.cc
index 5262ad3..3e956fe 100644
--- a/runtime/vm/compiler/backend/il_arm.cc
+++ b/runtime/vm/compiler/backend/il_arm.cc
@@ -1448,7 +1448,23 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ StoreToOffset(FPREG, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+    __ StoreToOffset(branch, THR, compiler::target::Thread::vm_tag_offset());
+#endif
+
     __ blx(branch);
+
+#if !defined(PRODUCT)
+    __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
+    __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
+    __ LoadImmediate(temp1, 0);
+    __ StoreToOffset(temp1, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+#endif
   } else {
     // We need to copy the return address up into the dummy stack frame so the
     // stack walker will know which safepoint to use.
diff --git a/runtime/vm/compiler/backend/il_arm64.cc b/runtime/vm/compiler/backend/il_arm64.cc
index c0a5d1a..1c5673c 100644
--- a/runtime/vm/compiler/backend/il_arm64.cc
+++ b/runtime/vm/compiler/backend/il_arm64.cc
@@ -1270,6 +1270,14 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ StoreToOffset(FPREG, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+    __ StoreToOffset(branch, THR, compiler::target::Thread::vm_tag_offset());
+#endif
+
     // We are entering runtime code, so the C stack pointer must be restored
     // from the stack limit to the top of the stack.
     __ mov(R25, CSP);
@@ -1280,6 +1288,13 @@
     // Restore the Dart stack pointer.
     __ mov(SP, CSP);
     __ mov(CSP, R25);
+
+#if !defined(PRODUCT)
+    __ LoadImmediate(temp1, compiler::target::Thread::vm_tag_dart_id());
+    __ StoreToOffset(temp1, THR, compiler::target::Thread::vm_tag_offset());
+    __ StoreToOffset(ZR, THR,
+                     compiler::target::Thread::top_exit_frame_info_offset());
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use.
diff --git a/runtime/vm/compiler/backend/il_ia32.cc b/runtime/vm/compiler/backend/il_ia32.cc
index 4d84b62..60dd46e 100644
--- a/runtime/vm/compiler/backend/il_ia32.cc
+++ b/runtime/vm/compiler/backend/il_ia32.cc
@@ -1052,7 +1052,24 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ movl(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            FPREG);
+    __ movl(compiler::Assembler::VMTagAddress(), branch);
+#endif
+
     __ call(branch);
+
+#if !defined(PRODUCT)
+    __ movl(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(compiler::target::Thread::vm_tag_dart_id()));
+    __ movl(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            compiler::Immediate(0));
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use. Unlike X64, there's no
diff --git a/runtime/vm/compiler/backend/il_x64.cc b/runtime/vm/compiler/backend/il_x64.cc
index 105d49c..c770204 100644
--- a/runtime/vm/compiler/backend/il_x64.cc
+++ b/runtime/vm/compiler/backend/il_x64.cc
@@ -1240,7 +1240,24 @@
   }
 
   if (is_leaf_) {
+#if !defined(PRODUCT)
+    // Set the thread object's top_exit_frame_info and VMTag to enable the
+    // profiler to determine that thread is no longer executing Dart code.
+    __ movq(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            FPREG);
+    __ movq(compiler::Assembler::VMTagAddress(), target_address);
+#endif
+
     __ CallCFunction(target_address, /*restore_rsp=*/true);
+
+#if !defined(PRODUCT)
+    __ movq(compiler::Assembler::VMTagAddress(),
+            compiler::Immediate(compiler::target::Thread::vm_tag_dart_id()));
+    __ movq(compiler::Address(
+                THR, compiler::target::Thread::top_exit_frame_info_offset()),
+            compiler::Immediate(0));
+#endif
   } else {
     // We need to copy a dummy return address up into the dummy stack frame so
     // the stack walker will know which safepoint to use. RIP points to the
diff --git a/runtime/vm/heap/safepoint.h b/runtime/vm/heap/safepoint.h
index d002189..42fd7d4c 100644
--- a/runtime/vm/heap/safepoint.h
+++ b/runtime/vm/heap/safepoint.h
@@ -76,6 +76,7 @@
   void BlockForSafepoint(Thread* T);
 
   bool IsOwnedByTheThread(Thread* thread) {
+    MonitorLocker ml(threads_lock());
     for (intptr_t level = 0; level < SafepointLevel::kNumLevels; ++level) {
       if (handlers_[level]->owner_ == thread) {
         return true;
diff --git a/sdk/lib/collection/splay_tree.dart b/sdk/lib/collection/splay_tree.dart
index 5770c5b..1ab21db 100644
--- a/sdk/lib/collection/splay_tree.dart
+++ b/sdk/lib/collection/splay_tree.dart
@@ -54,7 +54,7 @@
   // Number of elements in the splay tree.
   int _count = 0;
 
-  /// Counter incremented whenever the keys in the map changes.
+  /// Counter incremented whenever the keys in the map change.
   ///
   /// Used to detect concurrent modifications.
   int _modificationCount = 0;
@@ -310,6 +310,86 @@
 /// using the `compare` function on an argument value that may not be a [K]
 /// value. If omitted, the `isValidKey` function defaults to testing if the
 /// value is a [K].
+///
+/// **Notice:**
+/// Do not modify a map (add or remove keys) while an operation
+/// is being performed on that map, for example in functions
+/// called during a [forEach] or [putIfAbsent] call,
+/// or while iterating the map ([keys], [values] or [entries]).
+///
+/// Example:
+/// ```dart
+/// final planetsByMass = SplayTreeMap<double, String>((a, b) => a.compareTo(b));
+/// ```
+/// To add data to a map, use [operator[]=], [addAll] or [addEntries].
+/// ```
+/// planetsByMass[0.06] = 'Mercury';
+/// planetsByMass
+///     .addAll({0.81: 'Venus', 1.0: 'Earth', 0.11: 'Mars', 317.83: 'Jupiter'});
+/// ```
+/// To check if the map is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of map entries, use [length].
+/// ```
+/// print(planetsByMass.isEmpty); // false
+/// print(planetsByMass.length); // 5
+/// ```
+/// The [forEach] method calls a function for each key/value entry of the map.
+/// ```
+/// planetsByMass.forEach((key, value) {
+///   print('$key \t $value');
+///   // 0.06    Mercury
+///   // 0.11    Mars
+///   // 0.81    Venus
+///   // 1.0     Earth
+///   // 317.83  Jupiter
+/// });
+/// ```
+/// To check whether the map has an entry with a specific key, use [containsKey].
+/// ```
+/// final keyOneExists = planetsByMass.containsKey(1.0); // true
+/// final keyFiveExists = planetsByMass.containsKey(5); // false
+/// ```
+/// To check whether the map has an entry with a specific value,
+/// use [containsValue].
+/// ```
+/// final earthExists = planetsByMass.containsValue('Earth'); // true
+/// final plutoExists = planetsByMass.containsValue('Pluto'); // false
+/// ```
+/// To remove an entry with a specific key, use [remove].
+/// ```
+/// final removedValue = planetsByMass.remove(1.0);
+/// print(removedValue); // Earth
+/// ```
+/// To remove multiple entries at the same time, based on their keys and values,
+/// use [removeWhere].
+/// ```
+/// planetsByMass.removeWhere((key, value) => key <= 1);
+/// print(planetsByMass); // {317.83: Jupiter}
+/// ```
+/// To conditionally add or modify a value for a specific key, depending on
+/// whether there already is an entry with that key,
+/// use [putIfAbsent] or [update].
+/// ```
+/// planetsByMass.update(1, (v) => '', ifAbsent: () => 'Earth');
+/// planetsByMass.putIfAbsent(317.83, () => 'Another Jupiter');
+/// print(planetsByMass); // {1.0: Earth, 317.83: Jupiter}
+/// ```
+/// To update the values of all keys, based on the existing key and value,
+/// use [updateAll].
+/// ```
+/// planetsByMass.updateAll((key, value) => 'X');
+/// print(planetsByMass); // {1.0: X, 317.83: X}
+/// ```
+/// To remove all entries and empty the map, use [clear].
+/// ```
+/// planetsByMass.clear();
+/// print(planetsByMass.isEmpty); // false
+/// print(planetsByMass); // {}
+/// ```
+/// **See also:**
+/// * [Map], the general interface of key/value pair collections.
+/// * [HashMap] is unordered (the order of iteration is not guaranteed).
+/// * [LinkedHashMap] iterates in key insertion order.
 class SplayTreeMap<K, V> extends _SplayTree<K, _SplayTreeMapNode<K, V>>
     with MapMixin<K, V> {
   _SplayTreeMapNode<K, V>? _root;
@@ -327,6 +407,12 @@
   ///
   /// The keys must all be instances of [K] and the values of [V].
   /// The [other] map itself can have any type.
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, Object>{3: 'C', 1: 'A', 2: 'B'};
+  /// final fromBaseMap = SplayTreeMap<int, String>.from(baseMap);
+  /// print(fromBaseMap); // {1: A, 2: B, 3: C}
+  /// ```
   factory SplayTreeMap.from(Map<dynamic, dynamic> other,
       [int Function(K key1, K key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -341,6 +427,12 @@
   }
 
   /// Creates a [SplayTreeMap] that contains all key/value pairs of [other].
+  /// Example:
+  /// ```dart
+  /// final baseMap = <int, String>{3: 'A', 2: 'B', 1: 'C', 4: 'D'};
+  /// final mapOf = SplayTreeMap<num, Object>.of(baseMap);
+  /// print(mapOf); // {1: C, 2: B, 3: A, 4: D}
+  /// ```
   factory SplayTreeMap.of(Map<K, V> other,
           [int Function(K key1, K key2)? compare,
           bool Function(dynamic potentialKey)? isValidKey]) =>
@@ -355,8 +447,16 @@
   /// The keys of the key/value pairs do not need to be unique. The last
   /// occurrence of a key will simply overwrite any previous value.
   ///
-  /// If no functions are specified for [key] and [value] the default is to
+  /// If no functions are specified for [key] and [value], the default is to
   /// use the iterable value itself.
+  /// Example:
+  /// ```dart
+  /// final numbers = [12, 11, 14, 13];
+  /// final mapFromIterable =
+  ///     SplayTreeMap<int, int>.fromIterable(numbers,
+  ///         key: (i) => i, value: (i) => i * i);
+  /// print(mapFromIterable); // {11: 121, 12: 144, 13: 169, 14: 196}
+  /// ```
   factory SplayTreeMap.fromIterable(Iterable iterable,
       {K Function(dynamic element)? key,
       V Function(dynamic element)? value,
@@ -376,6 +476,13 @@
   /// overwrites the previous value.
   ///
   /// It is an error if the two [Iterable]s don't have the same length.
+  /// Example:
+  /// ```dart
+  /// final keys = ['1', '2', '3', '4'];
+  /// final values = ['A', 'B', 'C', 'D'];
+  /// final mapFromIterables = SplayTreeMap.fromIterables(keys, values);
+  /// print(mapFromIterables); // {1: A, 2: B, 3: C, 4: D}
+  /// ```
   factory SplayTreeMap.fromIterables(Iterable<K> keys, Iterable<V> values,
       [int Function(K key1, K key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -772,6 +879,74 @@
 /// [Comparable], and are compared using their [Comparable.compareTo] method.
 /// Non-comparable objects (including `null`) will not work as an element
 /// in that case.
+///
+/// **Note:**
+/// Do not modify a set (add or remove elements) while an operation
+/// is being performed on that set, for example in functions
+/// called during a [forEach] or [containsAll] call,
+/// or while iterating the set.
+///
+/// Do not modify elements in a way which changes their equality (and thus their
+/// hash code) while they are in the set. Some specialized kinds of sets may be
+/// more permissive with regards to equality, in which case they should document
+/// their different behavior and restrictions.
+///
+/// Example:
+/// ```dart
+/// final planets = SplayTreeSet<String>((a, b) => a.compareTo(b));
+/// ```
+/// To add data to a set, use [add] or [addAll].
+/// ```
+/// planets.add('Neptune');
+/// planets.addAll({'Venus', 'Mars', 'Earth', 'Jupiter'});
+/// print(planets); // {Earth, Jupiter, Mars, Neptune, Venus}
+/// ```
+/// To check if the set is empty, use [isEmpty] or [isNotEmpty].
+/// To find the number of elements in the set, use [length].
+/// ```
+/// final isEmpty = planets.isEmpty; // false
+/// final length = planets.length; // 5
+/// ```
+/// To check whether the set contains a specific element, use [contains].
+/// ```
+/// final marsExists = planets.contains('Mars'); // true
+/// ```
+/// To get element value using index, use [elementAt].
+/// ```
+/// final elementAt = planets.elementAt(1);
+/// print(elementAt); // Jupiter
+/// ```
+/// To make a copy of set, use [toSet].
+/// ```
+/// final copySet = planets.toSet(); // a `SplayTreeSet` with the same ordering.
+/// print(copySet); // {Earth, Jupiter, Mars, Neptune, Venus}
+/// ```
+/// To remove an element, use [remove].
+/// ```
+/// final removedValue = planets.remove('Mars'); // true
+/// print(planets); // {Earth, Jupiter, Neptune, Venus}
+/// ```
+/// To remove multiple elements at the same time, use [removeWhere].
+/// ```
+/// planets.removeWhere((element) => element.startsWith('J'));
+/// print(planets); // {Earth, Neptune, Venus}
+/// ```
+/// To removes all elements in this set that do not meet a condition,
+/// use [retainWhere].
+/// ```
+/// planets.retainWhere((element) => element.contains('Earth'));
+/// print(planets); // {Earth}
+/// ```
+/// To remove all elements and empty the set, use [clear].
+/// ```
+/// planets.clear();
+/// print(planets.isEmpty); // true
+/// print(planets); // {}
+/// ```
+/// **See also:**
+/// * [Set] is a base-class for collection of objects.
+/// * [HashSet] the order of the objects in the iterations is not guaranteed.
+/// * [LinkedHashSet] objects stored based on insertion order.
 class SplayTreeSet<E> extends _SplayTree<E, _SplayTreeSetNode<E>>
     with IterableMixin<E>, SetMixin<E> {
   _SplayTreeSetNode<E>? _root;
@@ -788,7 +963,7 @@
   /// work on all `E` instances.
   ///
   /// For operations that add elements to the set, the user is supposed to not
-  /// pass in objects that doesn't work with the compare function.
+  /// pass in objects that don't work with the compare function.
   ///
   /// The methods [contains], [remove], [lookup], [removeAll] or [retainAll]
   /// are typed to accept any object(s), and the [isValidKey] test can used to
@@ -809,7 +984,7 @@
 
   /// Creates a [SplayTreeSet] that contains all [elements].
   ///
-  /// The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
+  /// The set works as if created by `SplayTreeSet<E>(compare, isValidKey)`.
   ///
   /// All the [elements] should be instances of [E] and valid arguments to
   /// [compare].
@@ -820,6 +995,12 @@
   /// Set<SubType> subSet =
   ///     SplayTreeSet<SubType>.from(superSet.whereType<SubType>());
   /// ```
+  /// Example:
+  /// ```dart
+  /// final numbers = <num>[20, 30, 10];
+  /// final setFrom = SplayTreeSet<int>.from(numbers);
+  /// print(setFrom); // {10, 20, 30}
+  /// ```
   factory SplayTreeSet.from(Iterable elements,
       [int Function(E key1, E key2)? compare,
       bool Function(dynamic potentialKey)? isValidKey]) {
@@ -838,6 +1019,12 @@
   /// The set works as if created by `new SplayTreeSet<E>(compare, isValidKey)`.
   ///
   /// All the [elements] should be valid as arguments to the [compare] function.
+  /// Example:
+  /// ```dart
+  /// final baseSet = <int>{1, 2, 3};
+  /// final setOf = SplayTreeSet<num>.of(baseSet);
+  /// print(setOf); // {1, 2, 3}
+  /// ```
   factory SplayTreeSet.of(Iterable<E> elements,
           [int Function(E key1, E key2)? compare,
           bool Function(dynamic potentialKey)? isValidKey]) =>
diff --git a/sdk/lib/core/set.dart b/sdk/lib/core/set.dart
index d94a58f..f548888 100644
--- a/sdk/lib/core/set.dart
+++ b/sdk/lib/core/set.dart
@@ -13,8 +13,8 @@
 /// elements are treated as being the same for any operation on the set.
 ///
 /// The default [Set] implementation, [LinkedHashSet], considers objects
-/// indistinguishable if they are equal with regard to
-/// operator [Object.==].
+/// indistinguishable if they are equal with regard to [Object.==] and
+/// [Object.hashCode].
 ///
 /// Iterating over elements of a set may be either unordered
 /// or ordered in some way. Examples:
diff --git a/tests/ffi/regress_47594_test.dart b/tests/ffi/regress_47594_test.dart
new file mode 100644
index 0000000..abd6628
--- /dev/null
+++ b/tests/ffi/regress_47594_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.
+//
+// Regression test for http://dartbug.com/47594.
+// FFI leaf calls did not mark the thread for the transition and would cause
+// the stack walker to segfault when it was unable to interpret the frame.
+//
+// VMOptions=--deterministic --enable-vm-service --profiler
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+final strerror = DynamicLibrary.process()
+    .lookupFunction<Pointer<Utf8> Function(Int32), Pointer<Utf8> Function(int)>(
+        'strerror',
+        isLeaf: true);
+
+void main() {
+  for (var i = 0; i < 10000; i++) strerror(0).toDartString();
+}
diff --git a/tests/ffi_2/regress_47594_test.dart b/tests/ffi_2/regress_47594_test.dart
new file mode 100644
index 0000000..abd6628
--- /dev/null
+++ b/tests/ffi_2/regress_47594_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.
+//
+// Regression test for http://dartbug.com/47594.
+// FFI leaf calls did not mark the thread for the transition and would cause
+// the stack walker to segfault when it was unable to interpret the frame.
+//
+// VMOptions=--deterministic --enable-vm-service --profiler
+
+import 'dart:ffi';
+
+import 'package:ffi/ffi.dart';
+
+final strerror = DynamicLibrary.process()
+    .lookupFunction<Pointer<Utf8> Function(Int32), Pointer<Utf8> Function(int)>(
+        'strerror',
+        isLeaf: true);
+
+void main() {
+  for (var i = 0; i < 10000; i++) strerror(0).toDartString();
+}
diff --git a/tools/VERSION b/tools/VERSION
index 7e6515a..687f8d7 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 55
+PRERELEASE 56
 PRERELEASE_PATCH 0
\ No newline at end of file
