parseUnit(main)
  skipErrorTokens(main)
  listener: beginCompilationUnit(main)
  syntheticPreviousToken(main)
  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
    parseMetadataStar()
      listener: beginMetadataStar(main)
      listener: endMetadataStar(0)
    parseTopLevelMemberImpl()
      listener: beginTopLevelMember(main)
      isReservedKeyword(()
      parseTopLevelMethod(, null, , Instance of 'NoType', null, main, false)
        listener: beginTopLevelMethod(, null)
        listener: handleNoType()
        ensureIdentifierPotentiallyRecovered(, topLevelFunctionDeclaration, false)
          listener: handleIdentifier(main, topLevelFunctionDeclaration)
        parseMethodTypeVar(main)
          listener: handleNoTypeVariables(()
        parseGetterOrFormalParameters(main, main, false, MemberKind.TopLevelMethod)
          parseFormalParameters(main, MemberKind.TopLevelMethod)
            parseFormalParametersRest((, MemberKind.TopLevelMethod)
              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
        parseAsyncModifierOpt())
          listener: handleAsyncModifier(null, null)
          inPlainSync()
        parseFunctionBody(), false, false)
          listener: beginBlockFunctionBody({)
          notEofOrValue(}, {)
          parseStatement({)
            parseStatementX({)
              parseBlock({, BlockKind(statement))
                ensureBlock({, null, null)
                listener: beginBlock({, BlockKind(statement))
                notEofOrValue(}, s)
                parseStatement({)
                  parseStatementX({)
                    parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
                      looksLikeLocalFunction(A)
                      listener: beginMetadataStar(s)
                      listener: endMetadataStar(0)
                      listener: handleIdentifier(s, typeReference)
                      listener: handleNoTypeArguments(A)
                      listener: handleType(s, null)
                      listener: beginVariablesDeclaration(A, null, null)
                      parseVariablesDeclarationRest(s, true)
                        parseOptionallyInitializedIdentifier(s)
                          ensureIdentifier(s, localVariableDeclaration)
                            listener: handleIdentifier(A, localVariableDeclaration)
                          listener: beginInitializedIdentifier(A)
                          parseVariableInitializerOpt(A)
                            listener: handleNoVariableInitializer(<)
                          listener: endInitializedIdentifier(A)
                        ensureSemicolon(A)
                          reportRecoverableError(A, Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}])
                            listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], A, A)
                          rewriter()
                        listener: endVariablesDeclaration(1, ;)
                notEofOrValue(}, <)
                parseStatement(;)
                  parseStatementX(;)
                    parseExpressionStatementOrDeclaration(;, false)
                      parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
                        looksLikeLocalFunction(<)
                        parseExpressionStatement(;)
                          parseExpression(;)
                            parsePrecedenceExpression(;, 1, true)
                              parseUnaryExpression(;, true)
                                parsePrimary(;, expression)
                                  parseLiteralListSetMapOrFunction(;, null)
                                    listener: beginTypeArguments(<)
                                    reportRecoverableErrorWithToken(}, Instance of 'Template<(Token) => Message>')
                                      listener: handleRecoverableError(Message[ExpectedType, Expected a type, but got '}'., null, {token: }}], }, })
                                    rewriter()
                                    listener: handleIdentifier(, typeReference)
                                    listener: handleNoTypeArguments(})
                                    listener: handleType(, null)
                                    listener: endTypeArguments(1, <, >)
                                    reportRecoverableError(}, Message[ExpectedButGot, Expected '[' before this., null, {string: [}])
                                      listener: handleRecoverableError(Message[ExpectedButGot, Expected '[' before this., null, {string: [}], }, })
                                    rewriter()
                                    parseLiteralListSuffix(>, null)
                                      rewriteSquareBrackets(>)
                                        link([, ])
                                        rewriter()
                                      listener: handleLiteralList(0, [, null, ])
                          ensureSemicolon(])
                            reportRecoverableError([, Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}])
                              listener: handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], }, })
                            rewriter()
                          listener: handleExpressionStatement(;)
                notEofOrValue(}, })
                listener: endBlock(2, {, }, BlockKind(statement))
          notEofOrValue(}, )
          listener: endBlockFunctionBody(1, {, )
        listener: endTopLevelMethod(main, null, )
  listener: endTopLevelDeclaration()
  reportAllErrorTokens(main)
  listener: endCompilationUnit(1, )
