// Copyright (c) 2019, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

import 'package:_fe_analyzer_shared/src/experiments/flags.dart';
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/directive_context.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' show Listener;
import 'package:_fe_analyzer_shared/src/parser/member_kind.dart';
import 'package:_fe_analyzer_shared/src/parser/parser.dart'
    show ConstantPatternContext, ExperimentalFeatures, Parser;
import 'package:_fe_analyzer_shared/src/parser/parser_impl.dart'
    show AwaitOrYieldContext, ForPartsContext, PatternContext;
import 'package:_fe_analyzer_shared/src/parser/token_stream_rewriter.dart';
import 'package:_fe_analyzer_shared/src/parser/type_info.dart';
import 'package:_fe_analyzer_shared/src/scanner/token.dart';
import 'package:front_end/src/codes/cfe_codes.dart' as codes;
import 'package:front_end/src/source/diet_parser.dart'
    show useImplicitCreationExpressionInCfe;

// THIS FILE IS AUTO GENERATED BY 'test/parser_test_parser_creator.dart'
// Run this command to update it:
// 'dart pkg/front_end/test/parser_test_parser_creator.dart'

class TestParser extends Parser {
  int indent = 0;
  StringBuffer sb = new StringBuffer();
  final bool trace;
  bool _inhibitPrinting = false;

  TestParser(
    Listener listener,
    this.trace, {
    required ExperimentalFeatures experimentalFeatures,
  }) : super(
         listener,
         useImplicitCreationExpression: useImplicitCreationExpressionInCfe,
         experimentalFeatures: experimentalFeatures,
       );

  String createTrace() {
    List<String> traceLines = StackTrace.current.toString().split("\n");
    for (int i = 0; i < traceLines.length; i++) {
      // Find first one that's not any of the denylisted ones.
      String line = traceLines[i];
      if (line.contains("parser_test_listener.dart:") ||
          line.contains("parser_suite.dart:") ||
          line.contains("parser_test_parser.dart:") ||
          line == "<asynchronous suspension>") {
        continue;
      }
      return line.substring(line.indexOf("(") + 1, line.lastIndexOf(")"));
    }
    return "N/A";
  }

  void doPrint(String s) {
    if (_inhibitPrinting) return;
    String traceString = "";
    if (trace) traceString = " (${createTrace()})";
    sb.writeln(("  " * indent) + s + traceString);
  }

  @override
  T inhibitPrinting<T>(T Function() callback) {
    bool previousInhibitPrinting = _inhibitPrinting;
    _inhibitPrinting = true;
    try {
      return callback();
    } finally {
      _inhibitPrinting = previousInhibitPrinting;
    }
  }

  @override
  TokenStreamRewriter get rewriter {
    doPrint('rewriter()');
    indent++;
    var result = super.rewriter;
    indent--;
    return result;
  }

  @override
  bool get allowedToShortcutParseExpression {
    doPrint('allowedToShortcutParseExpression()');
    indent++;
    var result = super.allowedToShortcutParseExpression;
    indent--;
    return result;
  }

  @override
  bool get inGenerator {
    doPrint('inGenerator()');
    indent++;
    var result = super.inGenerator;
    indent--;
    return result;
  }

  @override
  bool get inAsync {
    doPrint('inAsync()');
    indent++;
    var result = super.inAsync;
    indent--;
    return result;
  }

  @override
  bool get inPlainSync {
    doPrint('inPlainSync()');
    indent++;
    var result = super.inPlainSync;
    indent--;
    return result;
  }

  @override
  bool get isBreakAllowed {
    doPrint('isBreakAllowed()');
    indent++;
    var result = super.isBreakAllowed;
    indent--;
    return result;
  }

  @override
  bool get isContinueAllowed {
    doPrint('isContinueAllowed()');
    indent++;
    var result = super.isContinueAllowed;
    indent--;
    return result;
  }

  @override
  bool get isContinueWithLabelAllowed {
    doPrint('isContinueWithLabelAllowed()');
    indent++;
    var result = super.isContinueWithLabelAllowed;
    indent--;
    return result;
  }

  @override
  Token parseUnit(Token token) {
    doPrint(
      'parseUnit('
      '$token)',
    );
    indent++;
    var result = super.parseUnit(token);
    indent--;
    return result;
  }

  @override
  Token parseDirectives(Token token) {
    doPrint(
      'parseDirectives('
      '$token)',
    );
    indent++;
    var result = super.parseDirectives(token);
    indent--;
    return result;
  }

  @override
  Token parseTopLevelDeclaration(Token token) {
    doPrint(
      'parseTopLevelDeclaration('
      '$token)',
    );
    indent++;
    var result = super.parseTopLevelDeclaration(token);
    indent--;
    return result;
  }

  @override
  Token parseTopLevelDeclarationImpl(
    Token token,
    DirectiveContext? directiveState,
  ) {
    doPrint(
      'parseTopLevelDeclarationImpl('
      '$token, '
      '$directiveState)',
    );
    indent++;
    var result = super.parseTopLevelDeclarationImpl(token, directiveState);
    indent--;
    return result;
  }

  @override
  Token parseTopLevelKeywordDeclaration(
    Token beginToken,
    Token modifierStart,
    Token keyword,
    Token? macroToken,
    Token? sealedToken,
    Token? baseToken,
    Token? interfaceToken,
    DirectiveContext? directiveState,
  ) {
    doPrint(
      'parseTopLevelKeywordDeclaration('
      '$beginToken, '
      '$modifierStart, '
      '$keyword, '
      '$macroToken, '
      '$sealedToken, '
      '$baseToken, '
      '$interfaceToken, '
      '$directiveState)',
    );
    indent++;
    var result = super.parseTopLevelKeywordDeclaration(
      beginToken,
      modifierStart,
      keyword,
      macroToken,
      sealedToken,
      baseToken,
      interfaceToken,
      directiveState,
    );
    indent--;
    return result;
  }

  @override
  Token parseLibraryAugmentation(Token augmentKeyword, Token libraryKeyword) {
    doPrint(
      'parseLibraryAugmentation('
      '$augmentKeyword, '
      '$libraryKeyword)',
    );
    indent++;
    var result = super.parseLibraryAugmentation(augmentKeyword, libraryKeyword);
    indent--;
    return result;
  }

  @override
  Token parseLibraryName(Token libraryKeyword) {
    doPrint(
      'parseLibraryName('
      '$libraryKeyword)',
    );
    indent++;
    var result = super.parseLibraryName(libraryKeyword);
    indent--;
    return result;
  }

  @override
  Token parseImportPrefixOpt(Token token) {
    doPrint(
      'parseImportPrefixOpt('
      '$token)',
    );
    indent++;
    var result = super.parseImportPrefixOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseImport(Token importKeyword) {
    doPrint(
      'parseImport('
      '$importKeyword)',
    );
    indent++;
    var result = super.parseImport(importKeyword);
    indent--;
    return result;
  }

  @override
  Token parseImportRecovery(Token token) {
    doPrint(
      'parseImportRecovery('
      '$token)',
    );
    indent++;
    var result = super.parseImportRecovery(token);
    indent--;
    return result;
  }

  @override
  Token parseConditionalUriStar(Token token) {
    doPrint(
      'parseConditionalUriStar('
      '$token)',
    );
    indent++;
    var result = super.parseConditionalUriStar(token);
    indent--;
    return result;
  }

  @override
  Token parseConditionalUri(Token token) {
    doPrint(
      'parseConditionalUri('
      '$token)',
    );
    indent++;
    var result = super.parseConditionalUri(token);
    indent--;
    return result;
  }

  @override
  Token parseDottedName(Token token) {
    doPrint(
      'parseDottedName('
      '$token)',
    );
    indent++;
    var result = super.parseDottedName(token);
    indent--;
    return result;
  }

  @override
  Token parseExport(Token exportKeyword) {
    doPrint(
      'parseExport('
      '$exportKeyword)',
    );
    indent++;
    var result = super.parseExport(exportKeyword);
    indent--;
    return result;
  }

  @override
  Token parseCombinatorStar(Token token) {
    doPrint(
      'parseCombinatorStar('
      '$token)',
    );
    indent++;
    var result = super.parseCombinatorStar(token);
    indent--;
    return result;
  }

  @override
  Token parseHide(Token token) {
    doPrint(
      'parseHide('
      '$token)',
    );
    indent++;
    var result = super.parseHide(token);
    indent--;
    return result;
  }

  @override
  Token parseShow(Token token) {
    doPrint(
      'parseShow('
      '$token)',
    );
    indent++;
    var result = super.parseShow(token);
    indent--;
    return result;
  }

  @override
  Token parseIdentifierList(Token token) {
    doPrint(
      'parseIdentifierList('
      '$token)',
    );
    indent++;
    var result = super.parseIdentifierList(token);
    indent--;
    return result;
  }

  @override
  Token parseTypeList(Token token) {
    doPrint(
      'parseTypeList('
      '$token)',
    );
    indent++;
    var result = super.parseTypeList(token);
    indent--;
    return result;
  }

  @override
  Token parsePartOrPartOf(Token partKeyword, DirectiveContext? directiveState) {
    doPrint(
      'parsePartOrPartOf('
      '$partKeyword, '
      '$directiveState)',
    );
    indent++;
    var result = super.parsePartOrPartOf(partKeyword, directiveState);
    indent--;
    return result;
  }

  @override
  Token parsePart(Token partKeyword) {
    doPrint(
      'parsePart('
      '$partKeyword)',
    );
    indent++;
    var result = super.parsePart(partKeyword);
    indent--;
    return result;
  }

  @override
  Token parsePartOf(Token partKeyword) {
    doPrint(
      'parsePartOf('
      '$partKeyword)',
    );
    indent++;
    var result = super.parsePartOf(partKeyword);
    indent--;
    return result;
  }

  @override
  Token parseMetadataStar(Token token) {
    doPrint(
      'parseMetadataStar('
      '$token)',
    );
    indent++;
    var result = super.parseMetadataStar(token);
    indent--;
    return result;
  }

  @override
  Token parseMetadata(Token token) {
    doPrint(
      'parseMetadata('
      '$token)',
    );
    indent++;
    var result = super.parseMetadata(token);
    indent--;
    return result;
  }

  @override
  Token parseScript(Token token) {
    doPrint(
      'parseScript('
      '$token)',
    );
    indent++;
    var result = super.parseScript(token);
    indent--;
    return result;
  }

  @override
  Token parseTypedef(Token? augmentToken, Token typedefKeyword) {
    doPrint(
      'parseTypedef('
      '$augmentToken, '
      '$typedefKeyword)',
    );
    indent++;
    var result = super.parseTypedef(augmentToken, typedefKeyword);
    indent--;
    return result;
  }

  @override
  Token parseMixinApplicationRest(Token token) {
    doPrint(
      'parseMixinApplicationRest('
      '$token)',
    );
    indent++;
    var result = super.parseMixinApplicationRest(token);
    indent--;
    return result;
  }

  @override
  Token parseClassWithClauseOpt(Token token) {
    doPrint(
      'parseClassWithClauseOpt('
      '$token)',
    );
    indent++;
    var result = super.parseClassWithClauseOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseEnumWithClauseOpt(Token token) {
    doPrint(
      'parseEnumWithClauseOpt('
      '$token)',
    );
    indent++;
    var result = super.parseEnumWithClauseOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseGetterOrFormalParameters(
    Token token,
    Token name,
    bool isGetter,
    MemberKind kind,
  ) {
    doPrint(
      'parseGetterOrFormalParameters('
      '$token, '
      '$name, '
      '$isGetter, '
      '$kind)',
    );
    indent++;
    var result = super.parseGetterOrFormalParameters(
      token,
      name,
      isGetter,
      kind,
    );
    indent--;
    return result;
  }

  @override
  Token parseFormalParametersOpt(Token token, MemberKind kind) {
    doPrint(
      'parseFormalParametersOpt('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseFormalParametersOpt(token, kind);
    indent--;
    return result;
  }

  @override
  Token skipFormalParameters(Token token, MemberKind kind) {
    doPrint(
      'skipFormalParameters('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.skipFormalParameters(token, kind);
    indent--;
    return result;
  }

  @override
  Token skipFormalParametersRest(Token token, MemberKind kind) {
    doPrint(
      'skipFormalParametersRest('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.skipFormalParametersRest(token, kind);
    indent--;
    return result;
  }

  @override
  Token parseRecordType(
    final Token start,
    Token token,
    bool isQuestionMarkPartOfType,
  ) {
    doPrint(
      'parseRecordType('
      '$start, '
      '$token, '
      '$isQuestionMarkPartOfType)',
    );
    indent++;
    var result = super.parseRecordType(start, token, isQuestionMarkPartOfType);
    indent--;
    return result;
  }

  @override
  Token parseRecordTypeField(
    Token token, {
    required bool identifierIsOptional,
  }) {
    doPrint(
      'parseRecordTypeField('
      '$token, '
      'identifierIsOptional: $identifierIsOptional)',
    );
    indent++;
    var result = super.parseRecordTypeField(
      token,
      identifierIsOptional: identifierIsOptional,
    );
    indent--;
    return result;
  }

  @override
  Token parseRecordTypeNamedFields(Token token) {
    doPrint(
      'parseRecordTypeNamedFields('
      '$token)',
    );
    indent++;
    var result = super.parseRecordTypeNamedFields(token);
    indent--;
    return result;
  }

  @override
  Token parseFormalParametersRequiredOpt(Token token, MemberKind kind) {
    doPrint(
      'parseFormalParametersRequiredOpt('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseFormalParametersRequiredOpt(token, kind);
    indent--;
    return result;
  }

  @override
  Token parseFormalParameters(Token token, MemberKind kind) {
    doPrint(
      'parseFormalParameters('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseFormalParameters(token, kind);
    indent--;
    return result;
  }

  @override
  Token parseFormalParametersRest(Token token, MemberKind kind) {
    doPrint(
      'parseFormalParametersRest('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseFormalParametersRest(token, kind);
    indent--;
    return result;
  }

  @override
  codes.Message missingParameterMessage(MemberKind kind) {
    doPrint(
      'missingParameterMessage('
      '$kind)',
    );
    indent++;
    var result = super.missingParameterMessage(kind);
    indent--;
    return result;
  }

  @override
  Token parseFormalParameter(
    Token token,
    FormalParameterKind parameterKind,
    MemberKind memberKind,
  ) {
    doPrint(
      'parseFormalParameter('
      '$token, '
      '$parameterKind, '
      '$memberKind)',
    );
    indent++;
    var result = super.parseFormalParameter(token, parameterKind, memberKind);
    indent--;
    return result;
  }

  @override
  Token parseOptionalPositionalParameters(Token token, MemberKind kind) {
    doPrint(
      'parseOptionalPositionalParameters('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseOptionalPositionalParameters(token, kind);
    indent--;
    return result;
  }

  @override
  Token parseOptionalNamedParameters(Token token, MemberKind kind) {
    doPrint(
      'parseOptionalNamedParameters('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseOptionalNamedParameters(token, kind);
    indent--;
    return result;
  }

  @override
  Token parseQualified(
    Token token,
    IdentifierContext context,
    IdentifierContext continuationContext,
  ) {
    doPrint(
      'parseQualified('
      '$token, '
      '$context, '
      '$continuationContext)',
    );
    indent++;
    var result = super.parseQualified(token, context, continuationContext);
    indent--;
    return result;
  }

  @override
  Token parseQualifiedRestOpt(
    Token token,
    IdentifierContext continuationContext,
  ) {
    doPrint(
      'parseQualifiedRestOpt('
      '$token, '
      '$continuationContext)',
    );
    indent++;
    var result = super.parseQualifiedRestOpt(token, continuationContext);
    indent--;
    return result;
  }

  @override
  Token parseQualifiedRest(Token token, IdentifierContext context) {
    doPrint(
      'parseQualifiedRest('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.parseQualifiedRest(token, context);
    indent--;
    return result;
  }

  @override
  Token skipBlock(Token token) {
    doPrint(
      'skipBlock('
      '$token)',
    );
    indent++;
    var result = super.skipBlock(token);
    indent--;
    return result;
  }

  @override
  Token parseEnum(Token beginToken, Token? augmentToken, Token enumKeyword) {
    doPrint(
      'parseEnum('
      '$beginToken, '
      '$augmentToken, '
      '$enumKeyword)',
    );
    indent++;
    var result = super.parseEnum(beginToken, augmentToken, enumKeyword);
    indent--;
    return result;
  }

  @override
  Token parseEnumHeaderOpt(Token token, Token enumKeyword) {
    doPrint(
      'parseEnumHeaderOpt('
      '$token, '
      '$enumKeyword)',
    );
    indent++;
    var result = super.parseEnumHeaderOpt(token, enumKeyword);
    indent--;
    return result;
  }

  @override
  Token? recoveryEnumWith(Token token, codes.Message message) {
    doPrint(
      'recoveryEnumWith('
      '$token, '
      '$message)',
    );
    indent++;
    var result = super.recoveryEnumWith(token, message);
    indent--;
    return result;
  }

  @override
  Token? recoveryEnumImplements(Token token, codes.Message message) {
    doPrint(
      'recoveryEnumImplements('
      '$token, '
      '$message)',
    );
    indent++;
    var result = super.recoveryEnumImplements(token, message);
    indent--;
    return result;
  }

  @override
  Token? recoverySmallLookAheadSkipTokens(
    final Token token,
    List<TokenType> lookFor,
  ) {
    doPrint(
      'recoverySmallLookAheadSkipTokens('
      '$token, '
      '$lookFor)',
    );
    indent++;
    var result = super.recoverySmallLookAheadSkipTokens(token, lookFor);
    indent--;
    return result;
  }

  @override
  Token parseEnumElement(Token token) {
    doPrint(
      'parseEnumElement('
      '$token)',
    );
    indent++;
    var result = super.parseEnumElement(token);
    indent--;
    return result;
  }

  @override
  Token parseClassOrNamedMixinApplication(
    Token beginToken,
    Token? abstractToken,
    Token? macroToken,
    Token? sealedToken,
    Token? baseToken,
    Token? interfaceToken,
    Token? finalToken,
    Token? augmentToken,
    Token? mixinToken,
    Token classKeyword,
  ) {
    doPrint(
      'parseClassOrNamedMixinApplication('
      '$beginToken, '
      '$abstractToken, '
      '$macroToken, '
      '$sealedToken, '
      '$baseToken, '
      '$interfaceToken, '
      '$finalToken, '
      '$augmentToken, '
      '$mixinToken, '
      '$classKeyword)',
    );
    indent++;
    var result = super.parseClassOrNamedMixinApplication(
      beginToken,
      abstractToken,
      macroToken,
      sealedToken,
      baseToken,
      interfaceToken,
      finalToken,
      augmentToken,
      mixinToken,
      classKeyword,
    );
    indent--;
    return result;
  }

  @override
  Token parseNamedMixinApplication(
    Token token,
    Token begin,
    Token classKeyword,
  ) {
    doPrint(
      'parseNamedMixinApplication('
      '$token, '
      '$begin, '
      '$classKeyword)',
    );
    indent++;
    var result = super.parseNamedMixinApplication(token, begin, classKeyword);
    indent--;
    return result;
  }

  @override
  Token parseClass(
    Token token,
    Token beginToken,
    Token classKeyword,
    Token? constToken,
    String className,
  ) {
    doPrint(
      'parseClass('
      '$token, '
      '$beginToken, '
      '$classKeyword, '
      '$constToken, '
      '$className)',
    );
    indent++;
    var result = super.parseClass(
      token,
      beginToken,
      classKeyword,
      constToken,
      className,
    );
    indent--;
    return result;
  }

  @override
  Token parseClassHeaderOpt(Token token, Token begin, Token classKeyword) {
    doPrint(
      'parseClassHeaderOpt('
      '$token, '
      '$begin, '
      '$classKeyword)',
    );
    indent++;
    var result = super.parseClassHeaderOpt(token, begin, classKeyword);
    indent--;
    return result;
  }

  @override
  Token parseClassHeaderRecovery(Token token, Token begin, Token classKeyword) {
    doPrint(
      'parseClassHeaderRecovery('
      '$token, '
      '$begin, '
      '$classKeyword)',
    );
    indent++;
    var result = super.parseClassHeaderRecovery(token, begin, classKeyword);
    indent--;
    return result;
  }

  @override
  Token parseExtensionTypeHeaderRecovery(Token token, Token extensionKeyword) {
    doPrint(
      'parseExtensionTypeHeaderRecovery('
      '$token, '
      '$extensionKeyword)',
    );
    indent++;
    var result = super.parseExtensionTypeHeaderRecovery(
      token,
      extensionKeyword,
    );
    indent--;
    return result;
  }

  @override
  Token parseDeclarationHeaderRecoveryInternal(
    Token token,
    Token begin,
    Token declarationKeyword,
    DeclarationHeaderKind kind,
  ) {
    doPrint(
      'parseDeclarationHeaderRecoveryInternal('
      '$token, '
      '$begin, '
      '$declarationKeyword, '
      '$kind)',
    );
    indent++;
    var result = super.parseDeclarationHeaderRecoveryInternal(
      token,
      begin,
      declarationKeyword,
      kind,
    );
    indent--;
    return result;
  }

  @override
  Token parseClassExtendsOpt(Token token, DeclarationHeaderKind kind) {
    doPrint(
      'parseClassExtendsOpt('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseClassExtendsOpt(token, kind);
    indent--;
    return result;
  }

  @override
  Token parseClassExtendsSeenExtendsClause(
    Token extendsKeyword,
    Token token,
    DeclarationHeaderKind kind,
  ) {
    doPrint(
      'parseClassExtendsSeenExtendsClause('
      '$extendsKeyword, '
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseClassExtendsSeenExtendsClause(
      extendsKeyword,
      token,
      kind,
    );
    indent--;
    return result;
  }

  @override
  Token parseClassOrMixinOrEnumImplementsOpt(Token token) {
    doPrint(
      'parseClassOrMixinOrEnumImplementsOpt('
      '$token)',
    );
    indent++;
    var result = super.parseClassOrMixinOrEnumImplementsOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseMixin(
    Token beginToken,
    Token? augmentToken,
    Token? baseToken,
    Token mixinKeyword,
  ) {
    doPrint(
      'parseMixin('
      '$beginToken, '
      '$augmentToken, '
      '$baseToken, '
      '$mixinKeyword)',
    );
    indent++;
    var result = super.parseMixin(
      beginToken,
      augmentToken,
      baseToken,
      mixinKeyword,
    );
    indent--;
    return result;
  }

  @override
  Token parseMixinHeaderOpt(Token token, Token mixinKeyword) {
    doPrint(
      'parseMixinHeaderOpt('
      '$token, '
      '$mixinKeyword)',
    );
    indent++;
    var result = super.parseMixinHeaderOpt(token, mixinKeyword);
    indent--;
    return result;
  }

  @override
  Token parseMixinHeaderRecovery(
    Token token,
    Token mixinKeyword,
    Token headerStart,
  ) {
    doPrint(
      'parseMixinHeaderRecovery('
      '$token, '
      '$mixinKeyword, '
      '$headerStart)',
    );
    indent++;
    var result = super.parseMixinHeaderRecovery(
      token,
      mixinKeyword,
      headerStart,
    );
    indent--;
    return result;
  }

  @override
  Token parseMixinOnOpt(Token token) {
    doPrint(
      'parseMixinOnOpt('
      '$token)',
    );
    indent++;
    var result = super.parseMixinOnOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseMixinOn(Token token) {
    doPrint(
      'parseMixinOn('
      '$token)',
    );
    indent++;
    var result = super.parseMixinOn(token);
    indent--;
    return result;
  }

  @override
  Token parseExtension(
    Token beginToken,
    Token? augmentToken,
    Token extensionKeyword,
  ) {
    doPrint(
      'parseExtension('
      '$beginToken, '
      '$augmentToken, '
      '$extensionKeyword)',
    );
    indent++;
    var result = super.parseExtension(
      beginToken,
      augmentToken,
      extensionKeyword,
    );
    indent--;
    return result;
  }

  @override
  Token parseExtensionDeclaration(
    Token beginToken,
    Token token,
    Token? augmentToken,
    Token extensionKeyword,
  ) {
    doPrint(
      'parseExtensionDeclaration('
      '$beginToken, '
      '$token, '
      '$augmentToken, '
      '$extensionKeyword)',
    );
    indent++;
    var result = super.parseExtensionDeclaration(
      beginToken,
      token,
      augmentToken,
      extensionKeyword,
    );
    indent--;
    return result;
  }

  @override
  Token parsePrimaryConstructorOpt(
    Token token,
    Token? constKeyword,
    bool forExtensionType,
  ) {
    doPrint(
      'parsePrimaryConstructorOpt('
      '$token, '
      '$constKeyword, '
      '$forExtensionType)',
    );
    indent++;
    var result = super.parsePrimaryConstructorOpt(
      token,
      constKeyword,
      forExtensionType,
    );
    indent--;
    return result;
  }

  @override
  Token parseExtensionTypeDeclaration(
    Token beginToken,
    Token token,
    Token? augmentToken,
    Token extensionKeyword,
    Token typeKeyword,
  ) {
    doPrint(
      'parseExtensionTypeDeclaration('
      '$beginToken, '
      '$token, '
      '$augmentToken, '
      '$extensionKeyword, '
      '$typeKeyword)',
    );
    indent++;
    var result = super.parseExtensionTypeDeclaration(
      beginToken,
      token,
      augmentToken,
      extensionKeyword,
      typeKeyword,
    );
    indent--;
    return result;
  }

  @override
  Token parseStringPart(Token token) {
    doPrint(
      'parseStringPart('
      '$token)',
    );
    indent++;
    var result = super.parseStringPart(token);
    indent--;
    return result;
  }

  @override
  Token insertSyntheticIdentifier(
    Token token,
    IdentifierContext context, {
    codes.Message? message,
    Token? messageOnToken,
  }) {
    doPrint(
      'insertSyntheticIdentifier('
      '$token, '
      '$context, '
      'message: $message, '
      'messageOnToken: $messageOnToken)',
    );
    indent++;
    var result = super.insertSyntheticIdentifier(
      token,
      context,
      message: message,
      messageOnToken: messageOnToken,
    );
    indent--;
    return result;
  }

  @override
  Token ensureIdentifier(Token token, IdentifierContext context) {
    doPrint(
      'ensureIdentifier('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.ensureIdentifier(token, context);
    indent--;
    return result;
  }

  @override
  Token ensureIdentifierPotentiallyRecovered(
    Token token,
    IdentifierContext context,
    bool isRecovered,
  ) {
    doPrint(
      'ensureIdentifierPotentiallyRecovered('
      '$token, '
      '$context, '
      '$isRecovered)',
    );
    indent++;
    var result = super.ensureIdentifierPotentiallyRecovered(
      token,
      context,
      isRecovered,
    );
    indent--;
    return result;
  }

  @override
  bool notEofOrType(TokenType type, Token token) {
    doPrint(
      'notEofOrType('
      '$type, '
      '$token)',
    );
    indent++;
    var result = super.notEofOrType(type, token);
    indent--;
    return result;
  }

  @override
  Token parseTypeVariablesOpt(Token token) {
    doPrint(
      'parseTypeVariablesOpt('
      '$token)',
    );
    indent++;
    var result = super.parseTypeVariablesOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseTopLevelMember(Token token) {
    doPrint(
      'parseTopLevelMember('
      '$token)',
    );
    indent++;
    var result = super.parseTopLevelMember(token);
    indent--;
    return result;
  }

  @override
  Token parseTopLevelMemberImpl(Token token) {
    doPrint(
      'parseTopLevelMemberImpl('
      '$token)',
    );
    indent++;
    var result = super.parseTopLevelMemberImpl(token);
    indent--;
    return result;
  }

  @override
  Token parseFields(
    Token beforeStart,
    Token? abstractToken,
    Token? augmentToken,
    Token? externalToken,
    Token? staticToken,
    Token? covariantToken,
    Token? lateToken,
    Token? varFinalOrConst,
    Token beforeType,
    TypeInfo typeInfo,
    Token name,
    DeclarationKind kind,
    String? enclosingDeclarationName,
    bool nameIsRecovered,
  ) {
    doPrint(
      'parseFields('
      '$beforeStart, '
      '$abstractToken, '
      '$augmentToken, '
      '$externalToken, '
      '$staticToken, '
      '$covariantToken, '
      '$lateToken, '
      '$varFinalOrConst, '
      '$beforeType, '
      '$typeInfo, '
      '$name, '
      '$kind, '
      '$enclosingDeclarationName, '
      '$nameIsRecovered)',
    );
    indent++;
    var result = super.parseFields(
      beforeStart,
      abstractToken,
      augmentToken,
      externalToken,
      staticToken,
      covariantToken,
      lateToken,
      varFinalOrConst,
      beforeType,
      typeInfo,
      name,
      kind,
      enclosingDeclarationName,
      nameIsRecovered,
    );
    indent--;
    return result;
  }

  @override
  Token parseTopLevelMethod(
    Token beforeStart,
    Token? augmentToken,
    Token? externalToken,
    Token beforeType,
    TypeInfo typeInfo,
    Token? getOrSet,
    Token name,
    bool nameIsRecovered,
  ) {
    doPrint(
      'parseTopLevelMethod('
      '$beforeStart, '
      '$augmentToken, '
      '$externalToken, '
      '$beforeType, '
      '$typeInfo, '
      '$getOrSet, '
      '$name, '
      '$nameIsRecovered)',
    );
    indent++;
    var result = super.parseTopLevelMethod(
      beforeStart,
      augmentToken,
      externalToken,
      beforeType,
      typeInfo,
      getOrSet,
      name,
      nameIsRecovered,
    );
    indent--;
    return result;
  }

  @override
  Token parseMethodTypeVar(Token name) {
    doPrint(
      'parseMethodTypeVar('
      '$name)',
    );
    indent++;
    var result = super.parseMethodTypeVar(name);
    indent--;
    return result;
  }

  @override
  Token parseFieldInitializerOpt(
    Token token,
    Token name,
    Token? lateToken,
    Token? abstractToken,
    Token? augmentToken,
    Token? externalToken,
    Token? varFinalOrConst,
    DeclarationKind kind,
    String? enclosingDeclarationName,
  ) {
    doPrint(
      'parseFieldInitializerOpt('
      '$token, '
      '$name, '
      '$lateToken, '
      '$abstractToken, '
      '$augmentToken, '
      '$externalToken, '
      '$varFinalOrConst, '
      '$kind, '
      '$enclosingDeclarationName)',
    );
    indent++;
    var result = super.parseFieldInitializerOpt(
      token,
      name,
      lateToken,
      abstractToken,
      augmentToken,
      externalToken,
      varFinalOrConst,
      kind,
      enclosingDeclarationName,
    );
    indent--;
    return result;
  }

  @override
  Token parseVariableInitializerOpt(Token token) {
    doPrint(
      'parseVariableInitializerOpt('
      '$token)',
    );
    indent++;
    var result = super.parseVariableInitializerOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseInitializersOpt(Token token) {
    doPrint(
      'parseInitializersOpt('
      '$token)',
    );
    indent++;
    var result = super.parseInitializersOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseInitializers(Token token) {
    doPrint(
      'parseInitializers('
      '$token)',
    );
    indent++;
    var result = super.parseInitializers(token);
    indent--;
    return result;
  }

  @override
  Token parseInitializer(Token token) {
    doPrint(
      'parseInitializer('
      '$token)',
    );
    indent++;
    var result = super.parseInitializer(token);
    indent--;
    return result;
  }

  @override
  Token parseSuperInitializerExpression(final Token start) {
    doPrint(
      'parseSuperInitializerExpression('
      '$start)',
    );
    indent++;
    var result = super.parseSuperInitializerExpression(start);
    indent--;
    return result;
  }

  @override
  Token parseInitializerExpressionRest(Token token) {
    doPrint(
      'parseInitializerExpressionRest('
      '$token)',
    );
    indent++;
    var result = super.parseInitializerExpressionRest(token);
    indent--;
    return result;
  }

  @override
  Token ensureBlock(Token token, BlockKind? missingBlockKind) {
    doPrint(
      'ensureBlock('
      '$token, '
      '$missingBlockKind)',
    );
    indent++;
    var result = super.ensureBlock(token, missingBlockKind);
    indent--;
    return result;
  }

  @override
  Token insertBlock(Token token) {
    doPrint(
      'insertBlock('
      '$token)',
    );
    indent++;
    var result = super.insertBlock(token);
    indent--;
    return result;
  }

  @override
  Token ensureCloseParen(Token token, Token openParen) {
    doPrint(
      'ensureCloseParen('
      '$token, '
      '$openParen)',
    );
    indent++;
    var result = super.ensureCloseParen(token, openParen);
    indent--;
    return result;
  }

  @override
  Token ensureColon(Token token) {
    doPrint(
      'ensureColon('
      '$token)',
    );
    indent++;
    var result = super.ensureColon(token);
    indent--;
    return result;
  }

  @override
  Token ensureFunctionArrow(Token token) {
    doPrint(
      'ensureFunctionArrow('
      '$token)',
    );
    indent++;
    var result = super.ensureFunctionArrow(token);
    indent--;
    return result;
  }

  @override
  Token ensureLiteralString(Token token) {
    doPrint(
      'ensureLiteralString('
      '$token)',
    );
    indent++;
    var result = super.ensureLiteralString(token);
    indent--;
    return result;
  }

  @override
  Token ensureSemicolon(Token token) {
    doPrint(
      'ensureSemicolon('
      '$token)',
    );
    indent++;
    var result = super.ensureSemicolon(token);
    indent--;
    return result;
  }

  @override
  Token rewriteAndRecover(Token token, codes.Message message, Token newToken) {
    doPrint(
      'rewriteAndRecover('
      '$token, '
      '$message, '
      '$newToken)',
    );
    indent++;
    var result = super.rewriteAndRecover(token, message, newToken);
    indent--;
    return result;
  }

  @override
  Token rewriteSquareBrackets(Token token) {
    doPrint(
      'rewriteSquareBrackets('
      '$token)',
    );
    indent++;
    var result = super.rewriteSquareBrackets(token);
    indent--;
    return result;
  }

  @override
  Token skipUnexpectedTokenOpt(Token token, List<String> expectedNext) {
    doPrint(
      'skipUnexpectedTokenOpt('
      '$token, '
      '$expectedNext)',
    );
    indent++;
    var result = super.skipUnexpectedTokenOpt(token, expectedNext);
    indent--;
    return result;
  }

  @override
  Token parseNativeClause(Token token) {
    doPrint(
      'parseNativeClause('
      '$token)',
    );
    indent++;
    var result = super.parseNativeClause(token);
    indent--;
    return result;
  }

  @override
  Token skipClassOrMixinOrExtensionBody(Token token) {
    doPrint(
      'skipClassOrMixinOrExtensionBody('
      '$token)',
    );
    indent++;
    var result = super.skipClassOrMixinOrExtensionBody(token);
    indent--;
    return result;
  }

  @override
  Token parseClassOrMixinOrExtensionBody(
    Token token,
    DeclarationKind kind,
    String? enclosingDeclarationName,
  ) {
    doPrint(
      'parseClassOrMixinOrExtensionBody('
      '$token, '
      '$kind, '
      '$enclosingDeclarationName)',
    );
    indent++;
    var result = super.parseClassOrMixinOrExtensionBody(
      token,
      kind,
      enclosingDeclarationName,
    );
    indent--;
    return result;
  }

  @override
  bool isUnaryMinus(Token token) {
    doPrint(
      'isUnaryMinus('
      '$token)',
    );
    indent++;
    var result = super.isUnaryMinus(token);
    indent--;
    return result;
  }

  @override
  Token parseClassMember(Token token, String? className) {
    doPrint(
      'parseClassMember('
      '$token, '
      '$className)',
    );
    indent++;
    var result = super.parseClassMember(token, className);
    indent--;
    return result;
  }

  @override
  Token parseMixinMember(Token token, String mixinName) {
    doPrint(
      'parseMixinMember('
      '$token, '
      '$mixinName)',
    );
    indent++;
    var result = super.parseMixinMember(token, mixinName);
    indent--;
    return result;
  }

  @override
  Token parseExtensionMember(Token token, String extensionName) {
    doPrint(
      'parseExtensionMember('
      '$token, '
      '$extensionName)',
    );
    indent++;
    var result = super.parseExtensionMember(token, extensionName);
    indent--;
    return result;
  }

  @override
  bool isReservedKeyword(Token token) {
    doPrint(
      'isReservedKeyword('
      '$token)',
    );
    indent++;
    var result = super.isReservedKeyword(token);
    indent--;
    return result;
  }

  @override
  bool indicatesMethodOrField(Token token) {
    doPrint(
      'indicatesMethodOrField('
      '$token)',
    );
    indent++;
    var result = super.indicatesMethodOrField(token);
    indent--;
    return result;
  }

  @override
  Token parseClassOrMixinOrExtensionOrEnumMemberImpl(
    Token token,
    DeclarationKind kind,
    String? enclosingDeclarationName,
  ) {
    doPrint(
      'parseClassOrMixinOrExtensionOrEnumMemberImpl('
      '$token, '
      '$kind, '
      '$enclosingDeclarationName)',
    );
    indent++;
    var result = super.parseClassOrMixinOrExtensionOrEnumMemberImpl(
      token,
      kind,
      enclosingDeclarationName,
    );
    indent--;
    return result;
  }

  @override
  Token parseMethod(
    Token beforeStart,
    Token? abstractToken,
    Token? augmentToken,
    Token? externalToken,
    Token? staticToken,
    Token? covariantToken,
    Token? lateToken,
    Token? varFinalOrConst,
    Token beforeType,
    TypeInfo typeInfo,
    Token? getOrSet,
    Token name,
    DeclarationKind kind,
    String? enclosingDeclarationName,
    bool nameIsRecovered,
  ) {
    doPrint(
      'parseMethod('
      '$beforeStart, '
      '$abstractToken, '
      '$augmentToken, '
      '$externalToken, '
      '$staticToken, '
      '$covariantToken, '
      '$lateToken, '
      '$varFinalOrConst, '
      '$beforeType, '
      '$typeInfo, '
      '$getOrSet, '
      '$name, '
      '$kind, '
      '$enclosingDeclarationName, '
      '$nameIsRecovered)',
    );
    indent++;
    var result = super.parseMethod(
      beforeStart,
      abstractToken,
      augmentToken,
      externalToken,
      staticToken,
      covariantToken,
      lateToken,
      varFinalOrConst,
      beforeType,
      typeInfo,
      getOrSet,
      name,
      kind,
      enclosingDeclarationName,
      nameIsRecovered,
    );
    indent--;
    return result;
  }

  @override
  Token parseFactoryMethod(
    Token token,
    DeclarationKind kind,
    Token beforeStart,
    Token? externalToken,
    Token? staticOrCovariant,
    Token? varFinalOrConst,
  ) {
    doPrint(
      'parseFactoryMethod('
      '$token, '
      '$kind, '
      '$beforeStart, '
      '$externalToken, '
      '$staticOrCovariant, '
      '$varFinalOrConst)',
    );
    indent++;
    var result = super.parseFactoryMethod(
      token,
      kind,
      beforeStart,
      externalToken,
      staticOrCovariant,
      varFinalOrConst,
    );
    indent--;
    return result;
  }

  @override
  Token parseOperatorName(Token token) {
    doPrint(
      'parseOperatorName('
      '$token)',
    );
    indent++;
    var result = super.parseOperatorName(token);
    indent--;
    return result;
  }

  @override
  Token parseFunctionExpression(Token token) {
    doPrint(
      'parseFunctionExpression('
      '$token)',
    );
    indent++;
    var result = super.parseFunctionExpression(token);
    indent--;
    return result;
  }

  @override
  Token parseFunctionLiteral(
    Token start,
    Token beforeName,
    Token name,
    TypeInfo typeInfo,
    TypeParamOrArgInfo typeParam,
    IdentifierContext context,
  ) {
    doPrint(
      'parseFunctionLiteral('
      '$start, '
      '$beforeName, '
      '$name, '
      '$typeInfo, '
      '$typeParam, '
      '$context)',
    );
    indent++;
    var result = super.parseFunctionLiteral(
      start,
      beforeName,
      name,
      typeInfo,
      typeParam,
      context,
    );
    indent--;
    return result;
  }

  @override
  Token parseNamedFunctionRest(
    Token beforeName,
    Token begin,
    Token formals,
    bool isFunctionExpression,
  ) {
    doPrint(
      'parseNamedFunctionRest('
      '$beforeName, '
      '$begin, '
      '$formals, '
      '$isFunctionExpression)',
    );
    indent++;
    var result = super.parseNamedFunctionRest(
      beforeName,
      begin,
      formals,
      isFunctionExpression,
    );
    indent--;
    return result;
  }

  @override
  Token parseAsyncOptBody(
    Token token,
    bool ofFunctionExpression,
    bool allowAbstract,
  ) {
    doPrint(
      'parseAsyncOptBody('
      '$token, '
      '$ofFunctionExpression, '
      '$allowAbstract)',
    );
    indent++;
    var result = super.parseAsyncOptBody(
      token,
      ofFunctionExpression,
      allowAbstract,
    );
    indent--;
    return result;
  }

  @override
  Token parseConstructorReference(
    Token token,
    ConstructorReferenceContext constructorReferenceContext, [
    TypeParamOrArgInfo? typeArg,
  ]) {
    doPrint(
      'parseConstructorReference('
      '$token, '
      '$constructorReferenceContext, '
      '$typeArg)',
    );
    indent++;
    var result = super.parseConstructorReference(
      token,
      constructorReferenceContext,
      typeArg,
    );
    indent--;
    return result;
  }

  @override
  Token parseRedirectingFactoryBody(Token token) {
    doPrint(
      'parseRedirectingFactoryBody('
      '$token)',
    );
    indent++;
    var result = super.parseRedirectingFactoryBody(token);
    indent--;
    return result;
  }

  @override
  Token skipFunctionBody(Token token, bool isExpression, bool allowAbstract) {
    doPrint(
      'skipFunctionBody('
      '$token, '
      '$isExpression, '
      '$allowAbstract)',
    );
    indent++;
    var result = super.skipFunctionBody(token, isExpression, allowAbstract);
    indent--;
    return result;
  }

  @override
  Token parseFunctionBody(
    Token token,
    bool ofFunctionExpression,
    bool allowAbstract,
  ) {
    doPrint(
      'parseFunctionBody('
      '$token, '
      '$ofFunctionExpression, '
      '$allowAbstract)',
    );
    indent++;
    var result = super.parseFunctionBody(
      token,
      ofFunctionExpression,
      allowAbstract,
    );
    indent--;
    return result;
  }

  @override
  Token parseExpressionFunctionBody(Token token, bool ofFunctionExpression) {
    doPrint(
      'parseExpressionFunctionBody('
      '$token, '
      '$ofFunctionExpression)',
    );
    indent++;
    var result = super.parseExpressionFunctionBody(token, ofFunctionExpression);
    indent--;
    return result;
  }

  @override
  Token skipAsyncModifier(Token token) {
    doPrint(
      'skipAsyncModifier('
      '$token)',
    );
    indent++;
    var result = super.skipAsyncModifier(token);
    indent--;
    return result;
  }

  @override
  Token parseAsyncModifierOpt(Token token) {
    doPrint(
      'parseAsyncModifierOpt('
      '$token)',
    );
    indent++;
    var result = super.parseAsyncModifierOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseStatement(Token token) {
    doPrint(
      'parseStatement('
      '$token)',
    );
    indent++;
    var result = super.parseStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseStatementX(Token token) {
    doPrint(
      'parseStatementX('
      '$token)',
    );
    indent++;
    var result = super.parseStatementX(token);
    indent--;
    return result;
  }

  @override
  Token parseYieldStatement(Token token) {
    doPrint(
      'parseYieldStatement('
      '$token)',
    );
    indent++;
    var result = super.parseYieldStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseReturnStatement(Token token) {
    doPrint(
      'parseReturnStatement('
      '$token)',
    );
    indent++;
    var result = super.parseReturnStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseLabel(Token token) {
    doPrint(
      'parseLabel('
      '$token)',
    );
    indent++;
    var result = super.parseLabel(token);
    indent--;
    return result;
  }

  @override
  Token parseLabeledStatement(Token token) {
    doPrint(
      'parseLabeledStatement('
      '$token)',
    );
    indent++;
    var result = super.parseLabeledStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseExpressionStatement(Token token) {
    doPrint(
      'parseExpressionStatement('
      '$token)',
    );
    indent++;
    var result = super.parseExpressionStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseExpression(Token token) {
    doPrint(
      'parseExpression('
      '$token)',
    );
    indent++;
    var result = super.parseExpression(token);
    indent--;
    return result;
  }

  @override
  Token parseExpressionWithoutCascade(Token token) {
    doPrint(
      'parseExpressionWithoutCascade('
      '$token)',
    );
    indent++;
    var result = super.parseExpressionWithoutCascade(token);
    indent--;
    return result;
  }

  @override
  bool canParseAsConditional(Token question) {
    doPrint(
      'canParseAsConditional('
      '$question)',
    );
    indent++;
    var result = super.canParseAsConditional(question);
    indent--;
    return result;
  }

  @override
  Token parseConditionalExpressionRest(Token token) {
    doPrint(
      'parseConditionalExpressionRest('
      '$token)',
    );
    indent++;
    var result = super.parseConditionalExpressionRest(token);
    indent--;
    return result;
  }

  @override
  Token parsePrecedenceExpression(
    Token token,
    int precedence,
    bool allowCascades,
    ConstantPatternContext constantPatternContext,
  ) {
    doPrint(
      'parsePrecedenceExpression('
      '$token, '
      '$precedence, '
      '$allowCascades, '
      '$constantPatternContext)',
    );
    indent++;
    var result = super.parsePrecedenceExpression(
      token,
      precedence,
      allowCascades,
      constantPatternContext,
    );
    indent--;
    return result;
  }

  @override
  Token parseCascadeExpression(Token token) {
    doPrint(
      'parseCascadeExpression('
      '$token)',
    );
    indent++;
    var result = super.parseCascadeExpression(token);
    indent--;
    return result;
  }

  @override
  Token parseUnaryExpression(
    Token token,
    bool allowCascades,
    ConstantPatternContext constantPatternContext,
  ) {
    doPrint(
      'parseUnaryExpression('
      '$token, '
      '$allowCascades, '
      '$constantPatternContext)',
    );
    indent++;
    var result = super.parseUnaryExpression(
      token,
      allowCascades,
      constantPatternContext,
    );
    indent--;
    return result;
  }

  @override
  Token parseArgumentOrIndexStar(
    Token token,
    TypeParamOrArgInfo typeArg,
    bool checkedNullAware,
  ) {
    doPrint(
      'parseArgumentOrIndexStar('
      '$token, '
      '$typeArg, '
      '$checkedNullAware)',
    );
    indent++;
    var result = super.parseArgumentOrIndexStar(
      token,
      typeArg,
      checkedNullAware,
    );
    indent--;
    return result;
  }

  @override
  Token parsePrimary(
    Token token,
    IdentifierContext context,
    ConstantPatternContext constantPatternContext,
  ) {
    doPrint(
      'parsePrimary('
      '$token, '
      '$context, '
      '$constantPatternContext)',
    );
    indent++;
    var result = super.parsePrimary(token, context, constantPatternContext);
    indent--;
    return result;
  }

  @override
  Token parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(
    Token token,
    ConstantPatternContext constantPatternContext,
  ) {
    doPrint(
      'parseParenthesizedExpressionFunctionLiteralOrRecordLiteral('
      '$token, '
      '$constantPatternContext)',
    );
    indent++;
    var result = super
        .parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(
          token,
          constantPatternContext,
        );
    indent--;
    return result;
  }

  @override
  Token ensureParenthesizedCondition(Token token, {required bool allowCase}) {
    doPrint(
      'ensureParenthesizedCondition('
      '$token, '
      'allowCase: $allowCase)',
    );
    indent++;
    var result = super.ensureParenthesizedCondition(
      token,
      allowCase: allowCase,
    );
    indent--;
    return result;
  }

  @override
  Token parseParenthesizedExpressionOrRecordLiteral(
    Token token,
    Token? constKeywordForRecord,
    ConstantPatternContext constantPatternContext,
  ) {
    doPrint(
      'parseParenthesizedExpressionOrRecordLiteral('
      '$token, '
      '$constKeywordForRecord, '
      '$constantPatternContext)',
    );
    indent++;
    var result = super.parseParenthesizedExpressionOrRecordLiteral(
      token,
      constKeywordForRecord,
      constantPatternContext,
    );
    indent--;
    return result;
  }

  @override
  Token parseExpressionInParenthesisRest(
    Token token, {
    required bool allowCase,
  }) {
    doPrint(
      'parseExpressionInParenthesisRest('
      '$token, '
      'allowCase: $allowCase)',
    );
    indent++;
    var result = super.parseExpressionInParenthesisRest(
      token,
      allowCase: allowCase,
    );
    indent--;
    return result;
  }

  @override
  Token parseThisExpression(Token token, IdentifierContext context) {
    doPrint(
      'parseThisExpression('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.parseThisExpression(token, context);
    indent--;
    return result;
  }

  @override
  Token parseSuperExpression(Token token, IdentifierContext context) {
    doPrint(
      'parseSuperExpression('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.parseSuperExpression(token, context);
    indent--;
    return result;
  }

  @override
  Token parseAugmentSuperExpression(Token token, IdentifierContext context) {
    doPrint(
      'parseAugmentSuperExpression('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.parseAugmentSuperExpression(token, context);
    indent--;
    return result;
  }

  @override
  Token parseLiteralListSuffix(Token token, Token? constKeyword) {
    doPrint(
      'parseLiteralListSuffix('
      '$token, '
      '$constKeyword)',
    );
    indent++;
    var result = super.parseLiteralListSuffix(token, constKeyword);
    indent--;
    return result;
  }

  @override
  Token parseLiteralSetOrMapSuffix(Token token, Token? constKeyword) {
    doPrint(
      'parseLiteralSetOrMapSuffix('
      '$token, '
      '$constKeyword)',
    );
    indent++;
    var result = super.parseLiteralSetOrMapSuffix(token, constKeyword);
    indent--;
    return result;
  }

  @override
  Token parseLiteralFunctionSuffix(Token token) {
    doPrint(
      'parseLiteralFunctionSuffix('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralFunctionSuffix(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralListSetMapOrFunction(
    final Token start,
    Token? constKeyword,
  ) {
    doPrint(
      'parseLiteralListSetMapOrFunction('
      '$start, '
      '$constKeyword)',
    );
    indent++;
    var result = super.parseLiteralListSetMapOrFunction(start, constKeyword);
    indent--;
    return result;
  }

  @override
  Token parseMapLiteralEntry(Token token) {
    doPrint(
      'parseMapLiteralEntry('
      '$token)',
    );
    indent++;
    var result = super.parseMapLiteralEntry(token);
    indent--;
    return result;
  }

  @override
  Token parseSendOrFunctionLiteral(
    Token token,
    IdentifierContext context,
    ConstantPatternContext constantPatternContext,
  ) {
    doPrint(
      'parseSendOrFunctionLiteral('
      '$token, '
      '$context, '
      '$constantPatternContext)',
    );
    indent++;
    var result = super.parseSendOrFunctionLiteral(
      token,
      context,
      constantPatternContext,
    );
    indent--;
    return result;
  }

  @override
  Token ensureArguments(Token token) {
    doPrint(
      'ensureArguments('
      '$token)',
    );
    indent++;
    var result = super.ensureArguments(token);
    indent--;
    return result;
  }

  @override
  Token parseConstructorInvocationArguments(Token token) {
    doPrint(
      'parseConstructorInvocationArguments('
      '$token)',
    );
    indent++;
    var result = super.parseConstructorInvocationArguments(token);
    indent--;
    return result;
  }

  @override
  Token parseNewExpression(Token token) {
    doPrint(
      'parseNewExpression('
      '$token)',
    );
    indent++;
    var result = super.parseNewExpression(token);
    indent--;
    return result;
  }

  @override
  Token parseImplicitCreationExpression(
    Token token,
    Token openAngleBracket,
    TypeParamOrArgInfo typeArg,
  ) {
    doPrint(
      'parseImplicitCreationExpression('
      '$token, '
      '$openAngleBracket, '
      '$typeArg)',
    );
    indent++;
    var result = super.parseImplicitCreationExpression(
      token,
      openAngleBracket,
      typeArg,
    );
    indent--;
    return result;
  }

  @override
  Token parseConstExpression(Token token) {
    doPrint(
      'parseConstExpression('
      '$token)',
    );
    indent++;
    var result = super.parseConstExpression(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralInt(Token token) {
    doPrint(
      'parseLiteralInt('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralInt(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralIntWithSeparators(Token token) {
    doPrint(
      'parseLiteralIntWithSeparators('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralIntWithSeparators(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralDouble(Token token) {
    doPrint(
      'parseLiteralDouble('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralDouble(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralDoubleWithSeparators(Token token) {
    doPrint(
      'parseLiteralDoubleWithSeparators('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralDoubleWithSeparators(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralString(Token token) {
    doPrint(
      'parseLiteralString('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralString(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralSymbol(Token token) {
    doPrint(
      'parseLiteralSymbol('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralSymbol(token);
    indent--;
    return result;
  }

  @override
  Token parseSingleLiteralString(Token token) {
    doPrint(
      'parseSingleLiteralString('
      '$token)',
    );
    indent++;
    var result = super.parseSingleLiteralString(token);
    indent--;
    return result;
  }

  @override
  Token parseIdentifierExpression(Token token) {
    doPrint(
      'parseIdentifierExpression('
      '$token)',
    );
    indent++;
    var result = super.parseIdentifierExpression(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralBool(Token token) {
    doPrint(
      'parseLiteralBool('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralBool(token);
    indent--;
    return result;
  }

  @override
  Token parseLiteralNull(Token token) {
    doPrint(
      'parseLiteralNull('
      '$token)',
    );
    indent++;
    var result = super.parseLiteralNull(token);
    indent--;
    return result;
  }

  @override
  Token parseSend(
    Token token,
    IdentifierContext context,
    ConstantPatternContext constantPatternContext,
  ) {
    doPrint(
      'parseSend('
      '$token, '
      '$context, '
      '$constantPatternContext)',
    );
    indent++;
    var result = super.parseSend(token, context, constantPatternContext);
    indent--;
    return result;
  }

  @override
  Token skipArgumentsOpt(Token token) {
    doPrint(
      'skipArgumentsOpt('
      '$token)',
    );
    indent++;
    var result = super.skipArgumentsOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseArgumentsOptMetadata(Token token, bool hasTypeArguments) {
    doPrint(
      'parseArgumentsOptMetadata('
      '$token, '
      '$hasTypeArguments)',
    );
    indent++;
    var result = super.parseArgumentsOptMetadata(token, hasTypeArguments);
    indent--;
    return result;
  }

  @override
  Token parseArgumentsOpt(Token token) {
    doPrint(
      'parseArgumentsOpt('
      '$token)',
    );
    indent++;
    var result = super.parseArgumentsOpt(token);
    indent--;
    return result;
  }

  @override
  Token parseArguments(Token token) {
    doPrint(
      'parseArguments('
      '$token)',
    );
    indent++;
    var result = super.parseArguments(token);
    indent--;
    return result;
  }

  @override
  Token parseArgumentsRest(Token token) {
    doPrint(
      'parseArgumentsRest('
      '$token)',
    );
    indent++;
    var result = super.parseArgumentsRest(token);
    indent--;
    return result;
  }

  @override
  Token parseIsOperatorRest(Token token) {
    doPrint(
      'parseIsOperatorRest('
      '$token)',
    );
    indent++;
    var result = super.parseIsOperatorRest(token);
    indent--;
    return result;
  }

  @override
  TypeInfo computeTypeAfterIsOrAs(Token token) {
    doPrint(
      'computeTypeAfterIsOrAs('
      '$token)',
    );
    indent++;
    var result = super.computeTypeAfterIsOrAs(token);
    indent--;
    return result;
  }

  @override
  Token parseAsOperatorRest(Token token) {
    doPrint(
      'parseAsOperatorRest('
      '$token)',
    );
    indent++;
    var result = super.parseAsOperatorRest(token);
    indent--;
    return result;
  }

  @override
  Token skipChainedAsIsOperators(Token token) {
    doPrint(
      'skipChainedAsIsOperators('
      '$token)',
    );
    indent++;
    var result = super.skipChainedAsIsOperators(token);
    indent--;
    return result;
  }

  @override
  bool looksLikeLocalFunction(Token token) {
    doPrint(
      'looksLikeLocalFunction('
      '$token)',
    );
    indent++;
    var result = super.looksLikeLocalFunction(token);
    indent--;
    return result;
  }

  @override
  bool looksLikeFunctionBody(Token token) {
    doPrint(
      'looksLikeFunctionBody('
      '$token)',
    );
    indent++;
    var result = super.looksLikeFunctionBody(token);
    indent--;
    return result;
  }

  @override
  Token parseExpressionStatementOrConstDeclaration(final Token start) {
    doPrint(
      'parseExpressionStatementOrConstDeclaration('
      '$start)',
    );
    indent++;
    var result = super.parseExpressionStatementOrConstDeclaration(start);
    indent--;
    return result;
  }

  @override
  Token parseExpressionStatementOrDeclaration(
    final Token start, [
    ForPartsContext? forPartsContext,
  ]) {
    doPrint(
      'parseExpressionStatementOrDeclaration('
      '$start, '
      '$forPartsContext)',
    );
    indent++;
    var result = super.parseExpressionStatementOrDeclaration(
      start,
      forPartsContext,
    );
    indent--;
    return result;
  }

  @override
  Token parseExpressionStatementOrDeclarationAfterModifiers(
    Token beforeType,
    Token start,
    Token? lateToken,
    Token? varFinalOrConst,
    TypeInfo? typeInfo, [
    ForPartsContext? forPartsContext,
  ]) {
    doPrint(
      'parseExpressionStatementOrDeclarationAfterModifiers('
      '$beforeType, '
      '$start, '
      '$lateToken, '
      '$varFinalOrConst, '
      '$typeInfo, '
      '$forPartsContext)',
    );
    indent++;
    var result = super.parseExpressionStatementOrDeclarationAfterModifiers(
      beforeType,
      start,
      lateToken,
      varFinalOrConst,
      typeInfo,
      forPartsContext,
    );
    indent--;
    return result;
  }

  @override
  Token parseVariablesDeclarationRest(Token token, bool endWithSemicolon) {
    doPrint(
      'parseVariablesDeclarationRest('
      '$token, '
      '$endWithSemicolon)',
    );
    indent++;
    var result = super.parseVariablesDeclarationRest(token, endWithSemicolon);
    indent--;
    return result;
  }

  @override
  Token parseOptionallyInitializedIdentifier(Token token) {
    doPrint(
      'parseOptionallyInitializedIdentifier('
      '$token)',
    );
    indent++;
    var result = super.parseOptionallyInitializedIdentifier(token);
    indent--;
    return result;
  }

  @override
  Token parseIfStatement(Token token) {
    doPrint(
      'parseIfStatement('
      '$token)',
    );
    indent++;
    var result = super.parseIfStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseForStatement(Token token, Token? awaitToken) {
    doPrint(
      'parseForStatement('
      '$token, '
      '$awaitToken)',
    );
    indent++;
    var result = super.parseForStatement(token, awaitToken);
    indent--;
    return result;
  }

  @override
  Token parseForLoopPartsStart(
    Token? awaitToken,
    Token forToken,
    ForPartsContext forPartsContext,
  ) {
    doPrint(
      'parseForLoopPartsStart('
      '$awaitToken, '
      '$forToken, '
      '$forPartsContext)',
    );
    indent++;
    var result = super.parseForLoopPartsStart(
      awaitToken,
      forToken,
      forPartsContext,
    );
    indent--;
    return result;
  }

  @override
  Token parseForLoopPartsMid(Token token, Token? awaitToken, Token forToken) {
    doPrint(
      'parseForLoopPartsMid('
      '$token, '
      '$awaitToken, '
      '$forToken)',
    );
    indent++;
    var result = super.parseForLoopPartsMid(token, awaitToken, forToken);
    indent--;
    return result;
  }

  @override
  Token parseForRest(Token? awaitToken, Token token, Token forToken) {
    doPrint(
      'parseForRest('
      '$awaitToken, '
      '$token, '
      '$forToken)',
    );
    indent++;
    var result = super.parseForRest(awaitToken, token, forToken);
    indent--;
    return result;
  }

  @override
  Token parseForLoopPartsRest(Token token, Token forToken, Token? awaitToken) {
    doPrint(
      'parseForLoopPartsRest('
      '$token, '
      '$forToken, '
      '$awaitToken)',
    );
    indent++;
    var result = super.parseForLoopPartsRest(token, forToken, awaitToken);
    indent--;
    return result;
  }

  @override
  Token parseForInRest(
    Token token,
    Token? awaitToken,
    Token forToken,
    Token? patternKeyword,
    Token? identifier,
  ) {
    doPrint(
      'parseForInRest('
      '$token, '
      '$awaitToken, '
      '$forToken, '
      '$patternKeyword, '
      '$identifier)',
    );
    indent++;
    var result = super.parseForInRest(
      token,
      awaitToken,
      forToken,
      patternKeyword,
      identifier,
    );
    indent--;
    return result;
  }

  @override
  Token parseForInLoopPartsRest(
    Token token,
    Token? awaitToken,
    Token forToken,
    Token? patternKeyword,
    Token? identifier,
  ) {
    doPrint(
      'parseForInLoopPartsRest('
      '$token, '
      '$awaitToken, '
      '$forToken, '
      '$patternKeyword, '
      '$identifier)',
    );
    indent++;
    var result = super.parseForInLoopPartsRest(
      token,
      awaitToken,
      forToken,
      patternKeyword,
      identifier,
    );
    indent--;
    return result;
  }

  @override
  Token parseWhileStatement(Token token) {
    doPrint(
      'parseWhileStatement('
      '$token)',
    );
    indent++;
    var result = super.parseWhileStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseDoWhileStatement(Token token) {
    doPrint(
      'parseDoWhileStatement('
      '$token)',
    );
    indent++;
    var result = super.parseDoWhileStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseBlock(Token token, BlockKind blockKind) {
    doPrint(
      'parseBlock('
      '$token, '
      '$blockKind)',
    );
    indent++;
    var result = super.parseBlock(token, blockKind);
    indent--;
    return result;
  }

  @override
  Token parseInvalidBlock(Token token) {
    doPrint(
      'parseInvalidBlock('
      '$token)',
    );
    indent++;
    var result = super.parseInvalidBlock(token);
    indent--;
    return result;
  }

  @override
  bool looksLikeExpressionAfterAwaitOrYield(
    Token token,
    AwaitOrYieldContext context,
  ) {
    doPrint(
      'looksLikeExpressionAfterAwaitOrYield('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.looksLikeExpressionAfterAwaitOrYield(token, context);
    indent--;
    return result;
  }

  @override
  bool looksLikeAwaitExpression(Token token, AwaitOrYieldContext context) {
    doPrint(
      'looksLikeAwaitExpression('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.looksLikeAwaitExpression(token, context);
    indent--;
    return result;
  }

  @override
  bool looksLikeYieldStatement(Token token, AwaitOrYieldContext context) {
    doPrint(
      'looksLikeYieldStatement('
      '$token, '
      '$context)',
    );
    indent++;
    var result = super.looksLikeYieldStatement(token, context);
    indent--;
    return result;
  }

  @override
  Token parseAwaitExpression(Token token, bool allowCascades) {
    doPrint(
      'parseAwaitExpression('
      '$token, '
      '$allowCascades)',
    );
    indent++;
    var result = super.parseAwaitExpression(token, allowCascades);
    indent--;
    return result;
  }

  @override
  Token parseThrowExpression(Token token, bool allowCascades) {
    doPrint(
      'parseThrowExpression('
      '$token, '
      '$allowCascades)',
    );
    indent++;
    var result = super.parseThrowExpression(token, allowCascades);
    indent--;
    return result;
  }

  @override
  Token parseRethrowStatement(Token token) {
    doPrint(
      'parseRethrowStatement('
      '$token)',
    );
    indent++;
    var result = super.parseRethrowStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseTryStatement(Token token) {
    doPrint(
      'parseTryStatement('
      '$token)',
    );
    indent++;
    var result = super.parseTryStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseSwitchStatement(Token token) {
    doPrint(
      'parseSwitchStatement('
      '$token)',
    );
    indent++;
    var result = super.parseSwitchStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseSwitchBlock(Token token) {
    doPrint(
      'parseSwitchBlock('
      '$token)',
    );
    indent++;
    var result = super.parseSwitchBlock(token);
    indent--;
    return result;
  }

  @override
  Token peekPastLabels(Token token) {
    doPrint(
      'peekPastLabels('
      '$token)',
    );
    indent++;
    var result = super.peekPastLabels(token);
    indent--;
    return result;
  }

  @override
  Token parseStatementsInSwitchCase(
    Token token,
    Token peek,
    Token begin,
    int labelCount,
    int expressionCount,
    Token? defaultKeyword,
    Token? colonAfterDefault,
  ) {
    doPrint(
      'parseStatementsInSwitchCase('
      '$token, '
      '$peek, '
      '$begin, '
      '$labelCount, '
      '$expressionCount, '
      '$defaultKeyword, '
      '$colonAfterDefault)',
    );
    indent++;
    var result = super.parseStatementsInSwitchCase(
      token,
      peek,
      begin,
      labelCount,
      expressionCount,
      defaultKeyword,
      colonAfterDefault,
    );
    indent--;
    return result;
  }

  @override
  Token parseBreakStatement(Token token) {
    doPrint(
      'parseBreakStatement('
      '$token)',
    );
    indent++;
    var result = super.parseBreakStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseAssert(Token token, Assert kind) {
    doPrint(
      'parseAssert('
      '$token, '
      '$kind)',
    );
    indent++;
    var result = super.parseAssert(token, kind);
    indent--;
    return result;
  }

  @override
  Token parseAssertStatement(Token token) {
    doPrint(
      'parseAssertStatement('
      '$token)',
    );
    indent++;
    var result = super.parseAssertStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseContinueStatement(Token token) {
    doPrint(
      'parseContinueStatement('
      '$token)',
    );
    indent++;
    var result = super.parseContinueStatement(token);
    indent--;
    return result;
  }

  @override
  Token parseEmptyStatement(Token token) {
    doPrint(
      'parseEmptyStatement('
      '$token)',
    );
    indent++;
    var result = super.parseEmptyStatement(token);
    indent--;
    return result;
  }

  @override
  Token previousToken(Token beforeToken, Token token) {
    doPrint(
      'previousToken('
      '$beforeToken, '
      '$token)',
    );
    indent++;
    var result = super.previousToken(beforeToken, token);
    indent--;
    return result;
  }

  @override
  Token parseInvalidOperatorDeclaration(
    Token beforeStart,
    Token? abstractToken,
    Token? augmentToken,
    Token? externalToken,
    Token? staticToken,
    Token? covariantToken,
    Token? lateToken,
    Token? varFinalOrConst,
    Token beforeType,
    DeclarationKind kind,
    String? enclosingDeclarationName,
  ) {
    doPrint(
      'parseInvalidOperatorDeclaration('
      '$beforeStart, '
      '$abstractToken, '
      '$augmentToken, '
      '$externalToken, '
      '$staticToken, '
      '$covariantToken, '
      '$lateToken, '
      '$varFinalOrConst, '
      '$beforeType, '
      '$kind, '
      '$enclosingDeclarationName)',
    );
    indent++;
    var result = super.parseInvalidOperatorDeclaration(
      beforeStart,
      abstractToken,
      augmentToken,
      externalToken,
      staticToken,
      covariantToken,
      lateToken,
      varFinalOrConst,
      beforeType,
      kind,
      enclosingDeclarationName,
    );
    indent--;
    return result;
  }

  @override
  Token recoverFromInvalidMember(
    Token token,
    Token beforeStart,
    Token? abstractToken,
    Token? augmentToken,
    Token? externalToken,
    Token? staticToken,
    Token? covariantToken,
    Token? lateToken,
    Token? varFinalOrConst,
    Token beforeType,
    TypeInfo typeInfo,
    Token? getOrSet,
    DeclarationKind kind,
    String? enclosingDeclarationName,
  ) {
    doPrint(
      'recoverFromInvalidMember('
      '$token, '
      '$beforeStart, '
      '$abstractToken, '
      '$augmentToken, '
      '$externalToken, '
      '$staticToken, '
      '$covariantToken, '
      '$lateToken, '
      '$varFinalOrConst, '
      '$beforeType, '
      '$typeInfo, '
      '$getOrSet, '
      '$kind, '
      '$enclosingDeclarationName)',
    );
    indent++;
    var result = super.recoverFromInvalidMember(
      token,
      beforeStart,
      abstractToken,
      augmentToken,
      externalToken,
      staticToken,
      covariantToken,
      lateToken,
      varFinalOrConst,
      beforeType,
      typeInfo,
      getOrSet,
      kind,
      enclosingDeclarationName,
    );
    indent--;
    return result;
  }

  @override
  Token recoverFromStackOverflow(Token token) {
    doPrint(
      'recoverFromStackOverflow('
      '$token)',
    );
    indent++;
    var result = super.recoverFromStackOverflow(token);
    indent--;
    return result;
  }

  @override
  void reportRecoverableError(Token token, codes.Message message) {
    doPrint(
      'reportRecoverableError('
      '$token, '
      '$message)',
    );
    indent++;
    var result = super.reportRecoverableError(token, message);
    indent--;
    return result;
  }

  @override
  void reportRecoverableErrorWithEnd(
    Token startToken,
    Token endToken,
    codes.Message message,
  ) {
    doPrint(
      'reportRecoverableErrorWithEnd('
      '$startToken, '
      '$endToken, '
      '$message)',
    );
    indent++;
    var result = super.reportRecoverableErrorWithEnd(
      startToken,
      endToken,
      message,
    );
    indent--;
    return result;
  }

  @override
  void reportExperimentNotEnabled(
    ExperimentalFlag experimentalFlag,
    Token startToken,
    Token endToken,
  ) {
    doPrint(
      'reportExperimentNotEnabled('
      '$experimentalFlag, '
      '$startToken, '
      '$endToken)',
    );
    indent++;
    var result = super.reportExperimentNotEnabled(
      experimentalFlag,
      startToken,
      endToken,
    );
    indent--;
    return result;
  }

  @override
  void reportRecoverableErrorWithToken(Token token, dynamic template) {
    doPrint(
      'reportRecoverableErrorWithToken('
      '$token, '
      '$template)',
    );
    indent++;
    var result = super.reportRecoverableErrorWithToken(token, template);
    indent--;
    return result;
  }

  @override
  Token reportAllErrorTokens(Token token) {
    doPrint(
      'reportAllErrorTokens('
      '$token)',
    );
    indent++;
    var result = super.reportAllErrorTokens(token);
    indent--;
    return result;
  }

  @override
  Token skipErrorTokens(Token token) {
    doPrint(
      'skipErrorTokens('
      '$token)',
    );
    indent++;
    var result = super.skipErrorTokens(token);
    indent--;
    return result;
  }

  @override
  Token parseInvalidTopLevelDeclaration(Token token) {
    doPrint(
      'parseInvalidTopLevelDeclaration('
      '$token)',
    );
    indent++;
    var result = super.parseInvalidTopLevelDeclaration(token);
    indent--;
    return result;
  }

  @override
  Token reportAndSkipClassInClass(Token token) {
    doPrint(
      'reportAndSkipClassInClass('
      '$token)',
    );
    indent++;
    var result = super.reportAndSkipClassInClass(token);
    indent--;
    return result;
  }

  @override
  Token reportAndSkipEnumInClass(Token token) {
    doPrint(
      'reportAndSkipEnumInClass('
      '$token)',
    );
    indent++;
    var result = super.reportAndSkipEnumInClass(token);
    indent--;
    return result;
  }

  @override
  Token reportAndSkipTypedefInClass(Token token) {
    doPrint(
      'reportAndSkipTypedefInClass('
      '$token)',
    );
    indent++;
    var result = super.reportAndSkipTypedefInClass(token);
    indent--;
    return result;
  }

  @override
  Token link(BeginToken beginToken, Token endToken) {
    doPrint(
      'link('
      '$beginToken, '
      '$endToken)',
    );
    indent++;
    var result = super.link(beginToken, endToken);
    indent--;
    return result;
  }

  @override
  Token syntheticPreviousToken(Token token) {
    doPrint(
      'syntheticPreviousToken('
      '$token)',
    );
    indent++;
    var result = super.syntheticPreviousToken(token);
    indent--;
    return result;
  }

  @override
  Token? findDartDoc(Token token) {
    doPrint(
      'findDartDoc('
      '$token)',
    );
    indent++;
    var result = super.findDartDoc(token);
    indent--;
    return result;
  }

  @override
  Token parsePattern(
    Token token,
    PatternContext patternContext, {
    int precedence = 1,
  }) {
    doPrint(
      'parsePattern('
      '$token, '
      '$patternContext, '
      'precedence: $precedence)',
    );
    indent++;
    var result = super.parsePattern(
      token,
      patternContext,
      precedence: precedence,
    );
    indent--;
    return result;
  }

  @override
  Token parsePrimaryPattern(Token token, PatternContext patternContext) {
    doPrint(
      'parsePrimaryPattern('
      '$token, '
      '$patternContext)',
    );
    indent++;
    var result = super.parsePrimaryPattern(token, patternContext);
    indent--;
    return result;
  }

  @override
  Token parseVariablePattern(
    Token token,
    PatternContext patternContext, {
    TypeInfo typeInfo = noType,
  }) {
    doPrint(
      'parseVariablePattern('
      '$token, '
      '$patternContext, '
      'typeInfo: $typeInfo)',
    );
    indent++;
    var result = super.parseVariablePattern(
      token,
      patternContext,
      typeInfo: typeInfo,
    );
    indent--;
    return result;
  }

  @override
  Token parseListPatternSuffix(Token token, PatternContext patternContext) {
    doPrint(
      'parseListPatternSuffix('
      '$token, '
      '$patternContext)',
    );
    indent++;
    var result = super.parseListPatternSuffix(token, patternContext);
    indent--;
    return result;
  }

  @override
  Token parseMapPatternSuffix(Token token, PatternContext patternContext) {
    doPrint(
      'parseMapPatternSuffix('
      '$token, '
      '$patternContext)',
    );
    indent++;
    var result = super.parseMapPatternSuffix(token, patternContext);
    indent--;
    return result;
  }

  @override
  Token parseParenthesizedPatternOrRecordPattern(
    Token token,
    PatternContext patternContext,
  ) {
    doPrint(
      'parseParenthesizedPatternOrRecordPattern('
      '$token, '
      '$patternContext)',
    );
    indent++;
    var result = super.parseParenthesizedPatternOrRecordPattern(
      token,
      patternContext,
    );
    indent--;
    return result;
  }

  @override
  Token parseObjectPatternRest(Token token, PatternContext patternContext) {
    doPrint(
      'parseObjectPatternRest('
      '$token, '
      '$patternContext)',
    );
    indent++;
    var result = super.parseObjectPatternRest(token, patternContext);
    indent--;
    return result;
  }

  @override
  bool looksLikeOuterPatternEquals(Token token) {
    doPrint(
      'looksLikeOuterPatternEquals('
      '$token)',
    );
    indent++;
    var result = super.looksLikeOuterPatternEquals(token);
    indent--;
    return result;
  }

  @override
  Token? skipOuterPattern(Token token) {
    doPrint(
      'skipOuterPattern('
      '$token)',
    );
    indent++;
    var result = super.skipOuterPattern(token);
    indent--;
    return result;
  }

  @override
  Token? skipObjectPatternRest(Token token) {
    doPrint(
      'skipObjectPatternRest('
      '$token)',
    );
    indent++;
    var result = super.skipObjectPatternRest(token);
    indent--;
    return result;
  }

  @override
  Token parsePatternVariableDeclarationStatement(
    Token keyword,
    Token start,
    Token varOrFinal,
  ) {
    doPrint(
      'parsePatternVariableDeclarationStatement('
      '$keyword, '
      '$start, '
      '$varOrFinal)',
    );
    indent++;
    var result = super.parsePatternVariableDeclarationStatement(
      keyword,
      start,
      varOrFinal,
    );
    indent--;
    return result;
  }

  @override
  Token parsePatternAssignment(Token token) {
    doPrint(
      'parsePatternAssignment('
      '$token)',
    );
    indent++;
    var result = super.parsePatternAssignment(token);
    indent--;
    return result;
  }

  @override
  Token parseSwitchExpression(Token token) {
    doPrint(
      'parseSwitchExpression('
      '$token)',
    );
    indent++;
    var result = super.parseSwitchExpression(token);
    indent--;
    return result;
  }

  @override
  Token? findNextCommaOrSemicolon(Token token, Token limit) {
    doPrint(
      'findNextCommaOrSemicolon('
      '$token, '
      '$limit)',
    );
    indent++;
    var result = super.findNextCommaOrSemicolon(token, limit);
    indent--;
    return result;
  }
}
