parseUnit(void)
  skipErrorTokens(void)
  listener: beginCompilationUnit(void)
  syntheticPreviousToken(void)
  parseTopLevelDeclarationImpl(, DirectiveContext(DirectiveState.Unknown))
    parseMetadataStar()
      listener: beginMetadataStar(void)
      listener: endMetadataStar(0)
    parseTopLevelMemberImpl()
      listener: beginTopLevelMember(void)
      parseTopLevelMethod(, null, null, , VoidType(), null, f, false)
        listener: beginTopLevelMethod(, null, null)
        listener: handleVoidKeyword(void)
        ensureIdentifierPotentiallyRecovered(void, topLevelFunctionDeclaration, false)
          listener: handleIdentifier(f, topLevelFunctionDeclaration)
        parseMethodTypeVar(f)
          listener: handleNoTypeVariables(()
        parseGetterOrFormalParameters(f, f, false, MemberKind.TopLevelMethod)
          parseFormalParameters(f, MemberKind.TopLevelMethod)
            parseFormalParametersRest((, MemberKind.TopLevelMethod)
              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
              parseFormalParameter((, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
                parseMetadataStar(()
                  listener: beginMetadataStar(x)
                  listener: endMetadataStar(0)
                listener: beginFormalParameter(x, MemberKind.TopLevelMethod, null, null, null)
                listener: handleNoType(()
                ensureIdentifier((, formalParameterDeclaration)
                  listener: handleIdentifier(x, formalParameterDeclaration)
                listener: handleFormalParameterWithoutValue())
                listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
              listener: endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
        parseAsyncModifierOpt())
          listener: handleAsyncModifier(null, null)
          inPlainSync()
        parseFunctionBody(), false, false)
          listener: beginBlockFunctionBody({)
          notEofOrValue(}, const)
          parseStatement({)
            parseStatementX({)
              parseExpressionStatementOrConstDeclaration({)
                parseExpressionStatementOrDeclarationAfterModifiers(const, {, null, const, NoType(), null)
                  looksLikeLocalFunction(y)
                  listener: beginMetadataStar(const)
                  listener: endMetadataStar(0)
                  listener: handleNoType(const)
                  listener: beginVariablesDeclaration(y, null, const)
                  parseVariablesDeclarationRest(const, true)
                    parseOptionallyInitializedIdentifier(const)
                      ensureIdentifier(const, localVariableDeclaration)
                        listener: handleIdentifier(y, localVariableDeclaration)
                      listener: beginInitializedIdentifier(y)
                      parseVariableInitializerOpt(y)
                        listener: beginVariableInitializer(=)
                        parseExpression(=)
                          looksLikeOuterPatternEquals(=)
                            skipOuterPattern(=)
                          parsePrecedenceExpression(=, 1, true, ConstantPatternContext.none)
                            parseUnaryExpression(=, true, ConstantPatternContext.none)
                              parsePrimary(=, expression, ConstantPatternContext.none)
                                parseLiteralInt(=)
                                  listener: handleLiteralInt(1)
                        listener: endVariableInitializer(=)
                      listener: endInitializedIdentifier(y)
                    ensureSemicolon(1)
                    listener: endVariablesDeclaration(1, ;)
          notEofOrValue(}, switch)
          parseStatement(;)
            parseStatementX(;)
              parseSwitchStatement(;)
                listener: beginSwitchStatement(switch)
                ensureParenthesizedCondition(switch, allowCase: false)
                  parseExpressionInParenthesisRest((, allowCase: false)
                    parseExpression(()
                      looksLikeOuterPatternEquals(()
                        skipOuterPattern(()
                          skipObjectPatternRest(x)
                      parsePrecedenceExpression((, 1, true, ConstantPatternContext.none)
                        parseUnaryExpression((, true, ConstantPatternContext.none)
                          parsePrimary((, expression, ConstantPatternContext.none)
                            parseSendOrFunctionLiteral((, expression, ConstantPatternContext.none)
                              parseSend((, expression, ConstantPatternContext.none)
                                isNextIdentifier(()
                                ensureIdentifier((, expression)
                                  listener: handleIdentifier(x, expression)
                                listener: handleNoTypeArguments())
                                parseArgumentsOpt(x)
                                  listener: handleNoArguments())
                                listener: handleSend(x, ))
                    ensureCloseParen(x, ()
                    listener: handleParenthesizedCondition((, null, null)
                parseSwitchBlock())
                  ensureBlock(), BlockKind(switch statement))
                  listener: beginSwitchBlock({)
                  notEofOrValue(}, case)
                  peekPastLabels(case)
                  listener: beginCaseExpression(case)
                  parsePattern(case, PatternContext.matching, precedence: 1)
                    listener: beginPattern(case)
                    parsePrimaryPattern(case, PatternContext.matching)
                      listener: beginConstantPattern(null)
                      parsePrecedenceExpression(case, 7, false, ConstantPatternContext.implicit)
                        parseUnaryExpression(case, false, ConstantPatternContext.implicit)
                          parsePrimary(case, expression, ConstantPatternContext.implicit)
                            parseSendOrFunctionLiteral(case, expression, ConstantPatternContext.implicit)
                              parseSend(case, expression, ConstantPatternContext.implicit)
                                isNextIdentifier(case)
                                ensureIdentifier(case, expression)
                                  listener: handleIdentifier(y, expression)
                                listener: handleNoTypeArguments(!)
                                parseArgumentsOpt(y)
                                  listener: handleNoArguments(!)
                                listener: handleSend(y, !)
                      listener: endConstantPattern(null)
                    listener: handleNullAssertPattern(!)
                    reportRecoverableErrorWithEnd(y, !, InvalidInsideUnaryPattern)
                      listener: handleRecoverableError(InvalidInsideUnaryPattern, y, !)
                    listener: handleNullAssertPattern(!)
                    listener: endPattern(!)
                  listener: handleSwitchCaseNoWhenClause(!)
                  ensureColon(!)
                  listener: endCaseExpression(case, null, :)
                  peekPastLabels(break)
                  parseStatementsInSwitchCase(:, break, case, 0, 1, null, null)
                    listener: beginSwitchCase(0, 1, case)
                    parseStatement(:)
                      parseStatementX(:)
                        parseBreakStatement(:)
                          isBreakAllowed()
                          ensureSemicolon(break)
                          listener: handleBreakStatement(false, break, ;)
                    peekPastLabels(})
                    listener: endSwitchCase(0, 1, null, null, 1, case, })
                  notEofOrValue(}, })
                  listener: endSwitchBlock(1, {, })
                listener: endSwitchStatement(switch, })
          notEofOrValue(}, })
          listener: endBlockFunctionBody(2, {, })
        listener: endTopLevelMethod(void, null, })
  listener: endTopLevelDeclaration()
  reportAllErrorTokens(void)
  listener: endCompilationUnit(1, )
