parseUnit(f)
  skipErrorTokens(f)
  listener: beginCompilationUnit(f)
  syntheticPreviousToken(f)
  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
    parseMetadataStar()
      listener: beginMetadataStar(f)
      listener: endMetadataStar(0)
    parseTopLevelMemberImpl()
      listener: beginTopLevelMember(f)
      isReservedKeyword(()
      parseTopLevelMethod(, null, null, , Instance of 'NoType', null, f, false)
        listener: beginTopLevelMethod(, null, null)
        listener: handleNoType()
        ensureIdentifierPotentiallyRecovered(, 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)
          parseExpressionFunctionBody(=>, false)
            parseExpression(=>)
              looksLikeOuterPatternEquals(=>)
                skipOuterPattern(=>)
              parsePrecedenceExpression(=>, 1, true)
                parseUnaryExpression(=>, true)
                  parsePrimary(=>, expression)
                    inPlainSync()
                    parseSwitchExpression(=>)
                      listener: beginSwitchExpression(switch)
                      ensureParenthesizedCondition(switch, allowCase: false)
                        parseExpressionInParenthesisRest((, allowCase: false)
                          parseExpression(()
                            looksLikeOuterPatternEquals(()
                              skipOuterPattern(()
                                skipObjectPatternRest(x)
                            parsePrecedenceExpression((, 1, true)
                              parseUnaryExpression((, true)
                                parsePrimary((, expression)
                                  parseSendOrFunctionLiteral((, expression)
                                    parseSend((, expression)
                                      isNextIdentifier(()
                                      ensureIdentifier((, expression)
                                        listener: handleIdentifier(x, expression)
                                      listener: handleNoTypeArguments())
                                      parseArgumentsOpt(x)
                                        listener: handleNoArguments())
                                      listener: handleSend(x, ))
                          ensureCloseParen(x, ()
                          listener: handleParenthesizedCondition((, null, null)
                      ensureBlock(), null, switch expression)
                      listener: beginSwitchExpressionBlock({)
                      listener: beginSwitchExpressionCase()
                      parsePattern({, PatternContext.matching, precedence: 1)
                        parsePrimaryPattern({, PatternContext.matching)
                          parseVariablePattern({, PatternContext.matching, typeInfo: Instance of 'NoType')
                            listener: handleNoType({)
                            listener: handleVariablePattern(null, _, false)
                      listener: handleSwitchExpressionCasePattern(_)
                      parseExpression(when)
                        looksLikeOuterPatternEquals(when)
                          skipOuterPattern(when)
                        parsePrecedenceExpression(when, 1, true)
                          parseUnaryExpression(when, true)
                            parsePrimary(when, expression)
                              inPlainSync()
                              parseSwitchExpression(when)
                                listener: beginSwitchExpression(switch)
                                ensureParenthesizedCondition(switch, allowCase: false)
                                  parseExpressionInParenthesisRest((, allowCase: false)
                                    parseExpression(()
                                      looksLikeOuterPatternEquals(()
                                        skipOuterPattern(()
                                          skipObjectPatternRest(x)
                                      parsePrecedenceExpression((, 1, true)
                                        parseUnaryExpression((, true)
                                          parsePrimary((, expression)
                                            parseSendOrFunctionLiteral((, expression)
                                              parseSend((, expression)
                                                isNextIdentifier(()
                                                ensureIdentifier((, expression)
                                                  listener: handleIdentifier(x, expression)
                                                listener: handleNoTypeArguments())
                                                parseArgumentsOpt(x)
                                                  listener: handleNoArguments())
                                                listener: handleSend(x, ))
                                    ensureCloseParen(x, ()
                                    listener: handleParenthesizedCondition((, null, null)
                                ensureBlock(), null, switch expression)
                                listener: beginSwitchExpressionBlock({)
                                listener: endSwitchExpressionBlock(0, {, })
                                listener: endSwitchExpression(switch, })
                          listener: beginBinaryExpression(+)
                          parsePrecedenceExpression(+, 14, true)
                            parseUnaryExpression(+, true)
                              parsePrimary(+, expression)
                                parseParenthesizedExpressionFunctionLiteralOrRecordLiteral(+)
                                  parseParenthesizedExpressionOrRecordLiteral(+, null)
                                    listener: beginParenthesizedExpressionOrRecordLiteral(()
                                    ensureCloseParen((, ()
                                    listener: endRecordLiteral((, 0, null)
                          listener: endBinaryExpression(+)
                      ensureFunctionArrow())
                      parseExpression(=>)
                        looksLikeOuterPatternEquals(=>)
                          skipOuterPattern(=>)
                        parsePrecedenceExpression(=>, 1, true)
                          parseUnaryExpression(=>, true)
                            parsePrimary(=>, expression)
                              parseLiteralInt(=>)
                                listener: handleLiteralInt(0)
                      listener: endSwitchExpressionCase(when, =>, 0)
                      listener: endSwitchExpressionBlock(1, {, })
                      listener: endSwitchExpression(switch, })
            ensureSemicolon(})
            listener: handleExpressionFunctionBody(=>, ;)
            inGenerator()
        listener: endTopLevelMethod(f, null, ;)
  listener: endTopLevelDeclaration()
  reportAllErrorTokens(f)
  listener: endCompilationUnit(1, )
