// 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(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 beginClassOrMixinBody(DeclarationKind kind, Token token) {
    DirectParserASTContentClassOrMixinBodyBegin data =
        new DirectParserASTContentClassOrMixinBodyBegin(
            DirectParserASTType.BEGIN,
            kind: kind,
            token: token);
    seen(data);
  }

  @override
  void endClassOrMixinBody(
      DeclarationKind kind, int memberCount, Token beginToken, Token endToken) {
    DirectParserASTContentClassOrMixinBodyEnd data =
        new DirectParserASTContentClassOrMixinBodyEnd(DirectParserASTType.END,
            kind: kind,
            memberCount: memberCount,
            beginToken: beginToken,
            endToken: endToken);
    seen(data);
  }

  @override
  void beginClassOrNamedMixinApplicationPrelude(Token token) {
    DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin data =
        new DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin(
            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(
      Token lastConsumed, Token? externalToken, Token? constToken) {
    DirectParserASTContentFactoryMethodBegin data =
        new DirectParserASTContentFactoryMethodBegin(DirectParserASTType.BEGIN,
            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? periodAfterThis,
      Token nameToken,
      Token? initializerStart,
      Token? initializerEnd,
      FormalParameterKind kind,
      MemberKind memberKind) {
    DirectParserASTContentFormalParameterEnd data =
        new DirectParserASTContentFormalParameterEnd(DirectParserASTType.END,
            thisKeyword: thisKeyword,
            periodAfterThis: periodAfterThis,
            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 beginFunctionTypeAlias(Token token) {
    DirectParserASTContentFunctionTypeAliasBegin data =
        new DirectParserASTContentFunctionTypeAliasBegin(
            DirectParserASTType.BEGIN,
            token: token);
    seen(data);
  }

  @override
  void endFunctionTypeAlias(
      Token typedefKeyword, Token? equals, Token endToken) {
    DirectParserASTContentFunctionTypeAliasEnd data =
        new DirectParserASTContentFunctionTypeAliasEnd(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) {
    DirectParserASTContentImplicitCreationExpressionEnd data =
        new DirectParserASTContentImplicitCreationExpressionEnd(
            DirectParserASTType.END,
            token: token);
    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(
      Token? externalToken,
      Token? staticToken,
      Token? covariantToken,
      Token? varFinalOrConst,
      Token? getOrSet,
      Token name) {
    DirectParserASTContentMethodBegin data =
        new DirectParserASTContentMethodBegin(DirectParserASTType.BEGIN,
            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(Token lastConsumed) {
    DirectParserASTContentFieldsBegin data =
        new DirectParserASTContentFieldsBegin(DirectParserASTType.BEGIN,
            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 DirectParserASTContentClassOrMixinBodyBegin
    extends DirectParserASTContent {
  final DeclarationKind kind;
  final Token token;

  DirectParserASTContentClassOrMixinBodyBegin(DirectParserASTType type,
      {required this.kind, required this.token})
      : super("ClassOrMixinBody", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "kind": kind,
        "token": token,
      };
}

class DirectParserASTContentClassOrMixinBodyEnd extends DirectParserASTContent {
  final DeclarationKind kind;
  final int memberCount;
  final Token beginToken;
  final Token endToken;

  DirectParserASTContentClassOrMixinBodyEnd(DirectParserASTType type,
      {required this.kind,
      required this.memberCount,
      required this.beginToken,
      required this.endToken})
      : super("ClassOrMixinBody", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "kind": kind,
        "memberCount": memberCount,
        "beginToken": beginToken,
        "endToken": endToken,
      };
}

class DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin
    extends DirectParserASTContent {
  final Token token;

  DirectParserASTContentClassOrNamedMixinApplicationPreludeBegin(
      DirectParserASTType type,
      {required this.token})
      : super("ClassOrNamedMixinApplicationPrelude", 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 Token lastConsumed;
  final Token? externalToken;
  final Token? constToken;

  DirectParserASTContentFactoryMethodBegin(DirectParserASTType type,
      {required this.lastConsumed, this.externalToken, this.constToken})
      : super("FactoryMethod", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "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? periodAfterThis;
  final Token nameToken;
  final Token? initializerStart;
  final Token? initializerEnd;
  final FormalParameterKind kind;
  final MemberKind memberKind;

  DirectParserASTContentFormalParameterEnd(DirectParserASTType type,
      {this.thisKeyword,
      this.periodAfterThis,
      required this.nameToken,
      this.initializerStart,
      this.initializerEnd,
      required this.kind,
      required this.memberKind})
      : super("FormalParameter", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "thisKeyword": thisKeyword,
        "periodAfterThis": periodAfterThis,
        "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 DirectParserASTContentFunctionTypeAliasBegin
    extends DirectParserASTContent {
  final Token token;

  DirectParserASTContentFunctionTypeAliasBegin(DirectParserASTType type,
      {required this.token})
      : super("FunctionTypeAlias", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "token": token,
      };
}

class DirectParserASTContentFunctionTypeAliasEnd
    extends DirectParserASTContent {
  final Token typedefKeyword;
  final Token? equals;
  final Token endToken;

  DirectParserASTContentFunctionTypeAliasEnd(DirectParserASTType type,
      {required this.typedefKeyword, this.equals, required this.endToken})
      : super("FunctionTypeAlias", 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;

  DirectParserASTContentImplicitCreationExpressionEnd(DirectParserASTType type,
      {required this.token})
      : super("ImplicitCreationExpression", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "token": token,
      };
}

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 Token? externalToken;
  final Token? staticToken;
  final Token? covariantToken;
  final Token? varFinalOrConst;
  final Token? getOrSet;
  final Token name;

  DirectParserASTContentMethodBegin(DirectParserASTType type,
      {this.externalToken,
      this.staticToken,
      this.covariantToken,
      this.varFinalOrConst,
      this.getOrSet,
      required this.name})
      : super("Method", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "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 Token lastConsumed;

  DirectParserASTContentFieldsBegin(DirectParserASTType type,
      {required this.lastConsumed})
      : super("Fields", type);

  @override
  Map<String, Object?> get deprecatedArguments => {
        "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,
      };
}
