Version 2.16.0-56.0.dev

Merge commit '6faa4b70c377ee25c1e08d9abb8fb69b2ee756b3' into 'dev'
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