// 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;

  new(
    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? sealedToken,
    Token? baseToken,
    Token? interfaceToken,
    DirectiveContext? directiveState,
  ) {
    doPrint(
      'parseTopLevelKeywordDeclaration('
      '$beginToken, '
      '$modifierStart, '
      '$keyword, '
      '$sealedToken, '
      '$baseToken, '
      '$interfaceToken, '
      '$directiveState)',
    );
    indent++;
    var result = super.parseTopLevelKeywordDeclaration(
      beginToken,
      modifierStart,
      keyword,
      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(
    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(
    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? sealedToken,
    Token? baseToken,
    Token? interfaceToken,
    Token? finalToken,
    Token? augmentToken,
    Token? mixinToken,
    Token classKeyword,
  ) {
    doPrint(
      'parseClassOrNamedMixinApplication('
      '$beginToken, '
      '$abstractToken, '
      '$sealedToken, '
      '$baseToken, '
      '$interfaceToken, '
      '$finalToken, '
      '$augmentToken, '
      '$mixinToken, '
      '$classKeyword)',
    );
    indent++;
    var result = super.parseClassOrNamedMixinApplication(
      beginToken,
      abstractToken,
      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? constKeyword,
    Token mixinKeyword,
  ) {
    doPrint(
      'parseMixinHeaderOpt('
      '$token, '
      '$constKeyword, '
      '$mixinKeyword)',
    );
    indent++;
    var result = super.parseMixinHeaderOpt(token, constKeyword, 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(
    DeclarationKind kind,
    Token token,
    Token? constKeyword, {
    bool allowExtensionTypeRepresentation = true,
  }) {
    doPrint(
      'parsePrimaryConstructorOpt('
      '$kind, '
      '$token, '
      '$constKeyword, '
      'allowExtensionTypeRepresentation: $allowExtensionTypeRepresentation)',
    );
    indent++;
    var result = super.parsePrimaryConstructorOpt(
      kind,
      token,
      constKeyword,
      allowExtensionTypeRepresentation: allowExtensionTypeRepresentation,
    );
    indent--;
    return result;
  }

  @override
  Token parsePrimaryConstructorBody(Token token) {
    doPrint(
      'parsePrimaryConstructorBody('
      '$token)',
    );
    indent++;
    var result = super.parsePrimaryConstructorBody(token);
    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(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? newToken,
    Token name,
    DeclarationKind kind,
    String? enclosingDeclarationName,
    bool nameIsRecovered,
  ) {
    doPrint(
      'parseMethod('
      '$beforeStart, '
      '$abstractToken, '
      '$augmentToken, '
      '$externalToken, '
      '$staticToken, '
      '$covariantToken, '
      '$lateToken, '
      '$varFinalOrConst, '
      '$beforeType, '
      '$typeInfo, '
      '$getOrSet, '
      '$newToken, '
      '$name, '
      '$kind, '
      '$enclosingDeclarationName, '
      '$nameIsRecovered)',
    );
    indent++;
    var result = super.parseMethod(
      beforeStart,
      abstractToken,
      augmentToken,
      externalToken,
      staticToken,
      covariantToken,
      lateToken,
      varFinalOrConst,
      beforeType,
      typeInfo,
      getOrSet,
      newToken,
      name,
      kind,
      enclosingDeclarationName,
      nameIsRecovered,
    );
    indent--;
    return result;
  }

  @override
  Token parseFactoryMethod(
    Token token,
    DeclarationKind kind,
    Token beforeStart,
    Token? augmentToken,
    Token? externalToken,
    Token? staticOrCovariant,
    Token? varFinalOrConst,
    bool hasName,
  ) {
    doPrint(
      'parseFactoryMethod('
      '$token, '
      '$kind, '
      '$beforeStart, '
      '$augmentToken, '
      '$externalToken, '
      '$staticOrCovariant, '
      '$varFinalOrConst, '
      '$hasName)',
    );
    indent++;
    var result = super.parseFactoryMethod(
      token,
      kind,
      beforeStart,
      augmentToken,
      externalToken,
      staticOrCovariant,
      varFinalOrConst,
      hasName,
    );
    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 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(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(Token start) {
    doPrint(
      'parseExpressionStatementOrConstDeclaration('
      '$start)',
    );
    indent++;
    var result = super.parseExpressionStatementOrConstDeclaration(start);
    indent--;
    return result;
  }

  @override
  Token parseExpressionStatementOrDeclaration(
    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,
    Token? newToken,
    DeclarationKind kind,
    String? enclosingDeclarationName,
  ) {
    doPrint(
      'recoverFromInvalidMember('
      '$token, '
      '$beforeStart, '
      '$abstractToken, '
      '$augmentToken, '
      '$externalToken, '
      '$staticToken, '
      '$covariantToken, '
      '$lateToken, '
      '$varFinalOrConst, '
      '$beforeType, '
      '$typeInfo, '
      '$getOrSet, '
      '$newToken, '
      '$kind, '
      '$enclosingDeclarationName)',
    );
    indent++;
    var result = super.recoverFromInvalidMember(
      token,
      beforeStart,
      abstractToken,
      augmentToken,
      externalToken,
      staticToken,
      covariantToken,
      lateToken,
      varFinalOrConst,
      beforeType,
      typeInfo,
      getOrSet,
      newToken,
      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,
    codes.Template<codes.Message Function({required Token lexeme})> 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;
  }
}
