parseUnit(void)
  skipErrorTokens(void)
  listener: beginCompilationUnit(void)
  syntheticPreviousToken(void)
  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
    parseMetadataStar()
      listener: beginMetadataStar(void)
      listener: endMetadataStar(0)
    parseTopLevelMemberImpl()
      listener: beginTopLevelMember(void)
      parseTopLevelMethod(, null, null, , Instance of '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)
          parseExpressionFunctionBody(=>, false)
            parseExpression(=>)
              looksLikeOuterPatternEquals(=>)
                skipOuterPattern(=>)
              parsePrecedenceExpression(=>, 1, true)
                parseUnaryExpression(=>, true)
                  parsePrimary(=>, expression)
                    listener: handleNoTypeArguments([)
                    parseLiteralListSuffix(=>, null)
                      listener: beginForControlFlow(null, for)
                      parseForLoopPartsStart(null, for, ForPartsContext(null))
                        parseExpressionStatementOrDeclaration((, ForPartsContext(null))
                          parseExpressionStatementOrDeclarationAfterModifiers(var, (, null, var, null, ForPartsContext(null))
                            skipOuterPattern(var)
                            listener: beginMetadataStar(var)
                            listener: endMetadataStar(0)
                            parsePattern(var, PatternContext.declaration, precedence: 1)
                              parsePrimaryPattern(var, PatternContext.declaration)
                                parseParenthesizedPatternOrRecordPattern(var, PatternContext.declaration)
                                  parsePattern((, PatternContext.declaration, precedence: 1)
                                    parsePrimaryPattern((, PatternContext.declaration)
                                      parseVariablePattern((, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                        listener: handleNoType(()
                                        listener: handleVariablePattern(null, a, false)
                                  listener: handlePatternField(null)
                                  parsePattern(,, PatternContext.declaration, precedence: 1)
                                    parsePrimaryPattern(,, PatternContext.declaration)
                                      parseVariablePattern(,, PatternContext.declaration, typeInfo: Instance of 'NoType')
                                        listener: handleNoType(,)
                                        listener: handleVariablePattern(null, b, false)
                                  listener: handlePatternField(null)
                                  ensureCloseParen(b, ()
                                  listener: handleRecordPattern((, 2)
                      parseForInLoopPartsRest(), null, for, var, null)
                        listener: beginForInExpression(x)
                        parseExpression(in)
                          looksLikeOuterPatternEquals(in)
                            skipOuterPattern(in)
                              skipObjectPatternRest(x)
                          parsePrecedenceExpression(in, 1, true)
                            parseUnaryExpression(in, true)
                              parsePrimary(in, expression)
                                parseSendOrFunctionLiteral(in, expression)
                                  parseSend(in, expression)
                                    isNextIdentifier(in)
                                    ensureIdentifier(in, expression)
                                      listener: handleIdentifier(x, expression)
                                    listener: handleNoTypeArguments())
                                    parseArgumentsOpt(x)
                                      listener: handleNoArguments())
                                    listener: handleSend(x, ))
                        ensureCloseParen(x, ()
                        listener: endForInExpression())
                        listener: handleForInLoopParts(null, for, (, var, in)
                      parseExpression())
                        looksLikeOuterPatternEquals())
                          skipOuterPattern())
                        parsePrecedenceExpression(), 1, true)
                          parseUnaryExpression(), true)
                            parsePrimary(), expression)
                              parseLiteralInt())
                                listener: handleLiteralInt(0)
                      listener: endForInControlFlow(0)
                      listener: handleLiteralList(1, [, null, ])
            ensureSemicolon(])
            listener: handleExpressionFunctionBody(=>, ;)
            inGenerator()
        listener: endTopLevelMethod(void, null, ;)
  listener: endTopLevelDeclaration()
  reportAllErrorTokens(void)
  listener: endCompilationUnit(1, )
