parseUnit(class)
  skipErrorTokens(class)
  listener: beginCompilationUnit(class)
  syntheticPreviousToken(class)
  parseTopLevelDeclarationImpl(, Instance of 'DirectiveContext')
    parseMetadataStar()
      listener: beginMetadataStar(class)
      listener: endMetadataStar(0)
    parseTopLevelKeywordDeclaration(, class, null, Instance of 'DirectiveContext')
      parseClassDeclarationModifiers(, class)
      parseClassOrNamedMixinApplication(null, null, class)
        listener: beginClassOrMixinOrNamedMixinApplicationPrelude(class)
        ensureIdentifier(class, classOrMixinDeclaration)
          listener: handleIdentifier(A, classOrMixinDeclaration)
        listener: handleNoTypeVariables({)
        listener: beginClassDeclaration(class, null, null, A)
        parseClass(A, class, class, A)
          parseClassHeaderOpt(A, class, class)
            parseClassExtendsOpt(A)
              listener: handleNoType(A)
              listener: handleClassExtends(null, 1)
            parseClassWithClauseOpt(A)
              listener: handleClassNoWithClause()
            parseClassOrMixinOrEnumImplementsOpt(A)
              listener: handleImplements(null, 0)
            listener: handleClassHeader(class, class, null)
          parseClassOrMixinOrExtensionBody(A, DeclarationKind.Class, A)
            listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
            notEofOrValue(}, operator)
            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, A)
              parseMetadataStar({)
                listener: beginMetadataStar(operator)
                listener: endMetadataStar(0)
              listener: beginMember()
              parseMethod({, null, null, null, null, null, null, {, Instance of 'NoType', null, operator, DeclarationKind.Class, A, false)
                listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, operator)
                listener: handleNoType({)
                parseOperatorName({)
                  listener: handleOperatorName(operator, [])
                parseMethodTypeVar([])
                  listener: handleNoTypeVariables(()
                parseGetterOrFormalParameters([], operator, false, MemberKind.NonStaticMethod)
                  parseFormalParameters([], MemberKind.NonStaticMethod)
                    parseFormalParametersRest((, MemberKind.NonStaticMethod)
                      listener: beginFormalParameters((, MemberKind.NonStaticMethod)
                      parseFormalParameter((, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                        parseMetadataStar(()
                          listener: beginMetadataStar(int)
                          listener: endMetadataStar(0)
                        listener: beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                        listener: handleIdentifier(int, typeReference)
                        listener: handleNoTypeArguments(index)
                        listener: handleType(int, null)
                        ensureIdentifier(int, formalParameterDeclaration)
                          listener: handleIdentifier(index, formalParameterDeclaration)
                        listener: handleFormalParameterWithoutValue())
                        listener: endFormalParameter(null, null, null, index, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                      listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                parseInitializersOpt())
                  listener: handleNoInitializers()
                parseAsyncModifierOpt())
                  listener: handleAsyncModifier(null, null)
                  inPlainSync()
                inPlainSync()
                parseFunctionBody(), false, true)
                  parseExpressionFunctionBody(=>, false)
                    parseExpression(=>)
                      parsePrecedenceExpression(=>, 1, true)
                        parseUnaryExpression(=>, true)
                          parsePrimary(=>, expression)
                            parseSendOrFunctionLiteral(=>, expression)
                              parseSend(=>, expression)
                                isNextIdentifier(=>)
                                ensureIdentifier(=>, expression)
                                  listener: handleIdentifier(index, expression)
                                listener: handleNoTypeArguments(;)
                                parseArgumentsOpt(index)
                                  listener: handleNoArguments(;)
                                listener: handleSend(index, ;)
                    ensureSemicolon(index)
                    listener: handleExpressionFunctionBody(=>, ;)
                    inGenerator()
                listener: endClassMethod(null, operator, (, null, ;)
              listener: endMember()
            notEofOrValue(}, })
            listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, })
          listener: endClassDeclaration(class, })
  listener: endTopLevelDeclaration(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(}, A)
          parseStatement({)
            parseStatementX({)
              parseExpressionStatementOrDeclarationAfterModifiers({, {, null, null, null, false)
                looksLikeLocalFunction(a)
                parseExpressionWithoutCascade(=)
                  parsePrecedenceExpression(=, 1, false)
                    parseUnaryExpression(=, false)
                      parsePrimary(=, expression)
                        parseLiteralNull(=)
                listener: beginMetadataStar(A)
                listener: endMetadataStar(0)
                listener: handleIdentifier(A, typeReference)
                listener: handleNoTypeArguments(?)
                listener: handleType(A, ?)
                listener: beginVariablesDeclaration(a, null, null)
                parseVariablesDeclarationRest(?, true)
                  parseOptionallyInitializedIdentifier(?)
                    ensureIdentifier(?, localVariableDeclaration)
                      listener: handleIdentifier(a, localVariableDeclaration)
                    listener: beginInitializedIdentifier(a)
                    parseVariableInitializerOpt(a)
                      listener: beginVariableInitializer(=)
                      parseExpression(=)
                        parsePrecedenceExpression(=, 1, true)
                          parseUnaryExpression(=, true)
                            parsePrimary(=, expression)
                              parseLiteralNull(=)
                                listener: handleLiteralNull(null)
                      listener: endVariableInitializer(=)
                    listener: endInitializedIdentifier(a)
                  ensureSemicolon(null)
                  listener: endVariablesDeclaration(1, ;)
          notEofOrValue(}, a)
          parseStatement(;)
            parseStatementX(;)
              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
                looksLikeLocalFunction(a)
                parseExpressionStatement(;)
                  parseExpression(;)
                    parsePrecedenceExpression(;, 1, true)
                      parseUnaryExpression(;, true)
                        parsePrimary(;, expression)
                          parseSendOrFunctionLiteral(;, expression)
                            parseSend(;, expression)
                              isNextIdentifier(;)
                              ensureIdentifier(;, expression)
                                listener: handleIdentifier(a, expression)
                              listener: handleNoTypeArguments(!)
                              parseArgumentsOpt(a)
                                listener: handleNoArguments(!)
                              listener: handleSend(a, !)
                      listener: handleNonNullAssertExpression(!)
                      parsePrimary(?., expressionContinuation)
                        parseSendOrFunctionLiteral(?., expressionContinuation)
                          looksLikeFunctionBody(;)
                          parseSend(?., expressionContinuation)
                            isNextIdentifier(?.)
                            ensureIdentifier(?., expressionContinuation)
                              listener: handleIdentifier(toString, expressionContinuation)
                            listener: handleNoTypeArguments(()
                            parseArgumentsOpt(toString)
                              parseArguments(toString)
                                parseArgumentsRest(()
                                  listener: beginArguments(()
                                  listener: endArguments(0, (, ))
                            listener: handleSend(toString, ;)
                      listener: handleEndingBinaryExpression(?.)
                  ensureSemicolon())
                  listener: handleExpressionStatement(;)
          notEofOrValue(}, a)
          parseStatement(;)
            parseStatementX(;)
              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
                looksLikeLocalFunction(a)
                parseExpressionStatement(;)
                  parseExpression(;)
                    parsePrecedenceExpression(;, 1, true)
                      parseUnaryExpression(;, true)
                        parsePrimary(;, expression)
                          parseSendOrFunctionLiteral(;, expression)
                            parseSend(;, expression)
                              isNextIdentifier(;)
                              ensureIdentifier(;, expression)
                                listener: handleIdentifier(a, expression)
                              listener: handleNoTypeArguments(!)
                              parseArgumentsOpt(a)
                                listener: handleNoArguments(!)
                              listener: handleSend(a, !)
                      listener: handleNonNullAssertExpression(!)
                      parsePrimary(?., expressionContinuation)
                        listener: handleNoTypeArguments([)
                        parseLiteralListSuffix(?., null)
                          parseExpression([)
                            parsePrecedenceExpression([, 1, true)
                              parseUnaryExpression([, true)
                                parsePrimary([, expression)
                                  parseLiteralInt([)
                                    listener: handleLiteralInt(42)
                          listener: handleLiteralList(1, [, null, ])
                      listener: handleEndingBinaryExpression(?.)
                  ensureSemicolon(])
                  listener: handleExpressionStatement(;)
          notEofOrValue(}, a)
          parseStatement(;)
            parseStatementX(;)
              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
                looksLikeLocalFunction(a)
                parseExpressionStatement(;)
                  parseExpression(;)
                    parsePrecedenceExpression(;, 1, true)
                      parseUnaryExpression(;, true)
                        parsePrimary(;, expression)
                          parseSendOrFunctionLiteral(;, expression)
                            parseSend(;, expression)
                              isNextIdentifier(;)
                              ensureIdentifier(;, expression)
                                listener: handleIdentifier(a, expression)
                              listener: handleNoTypeArguments(!)
                              parseArgumentsOpt(a)
                                listener: handleNoArguments(!)
                              listener: handleSend(a, !)
                      listener: handleNonNullAssertExpression(!)
                      canParseAsConditional(?)
                        parseExpressionWithoutCascade(?)
                          parsePrecedenceExpression(?, 1, false)
                            parseUnaryExpression(?, false)
                              parsePrimary(?, expression)
                                parseLiteralListSuffix(?, null)
                                  parseExpression([)
                                    parsePrecedenceExpression([, 1, true)
                                      parseUnaryExpression([, true)
                                        parsePrimary([, expression)
                                          parseLiteralInt([)
                      parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg', true)
                        parseExpression([)
                          parsePrecedenceExpression([, 1, true)
                            parseUnaryExpression([, true)
                              parsePrimary([, expression)
                                parseLiteralInt([)
                                  listener: handleLiteralInt(42)
                        listener: handleIndexedExpression(?, [, ])
                  ensureSemicolon(])
                  listener: handleExpressionStatement(;)
          notEofOrValue(}, a)
          parseStatement(;)
            parseStatementX(;)
              parseExpressionStatementOrDeclarationAfterModifiers(;, ;, null, null, null, false)
                looksLikeLocalFunction(a)
                parseExpressionStatement(;)
                  parseExpression(;)
                    parsePrecedenceExpression(;, 1, true)
                      parseUnaryExpression(;, true)
                        parsePrimary(;, expression)
                          parseSendOrFunctionLiteral(;, expression)
                            parseSend(;, expression)
                              isNextIdentifier(;)
                              ensureIdentifier(;, expression)
                                listener: handleIdentifier(a, expression)
                              listener: handleNoTypeArguments(!)
                              parseArgumentsOpt(a)
                                listener: handleNoArguments(!)
                              listener: handleSend(a, !)
                      listener: handleNonNullAssertExpression(!)
                      canParseAsConditional(?)
                        parseExpressionWithoutCascade(?)
                          parsePrecedenceExpression(?, 1, false)
                            parseUnaryExpression(?, false)
                              parsePrimary(?, expression)
                                parseLiteralListSuffix(?, null)
                                  parseExpression([)
                                    parsePrecedenceExpression([, 1, true)
                                      parseUnaryExpression([, true)
                                        parsePrimary([, expression)
                                          parseLiteralInt([)
                      parseArgumentOrIndexStar(!, Instance of 'NoTypeParamOrArg', true)
                        parseExpression([)
                          parsePrecedenceExpression([, 1, true)
                            parseUnaryExpression([, true)
                              parsePrimary([, expression)
                                parseLiteralInt([)
                                  listener: handleLiteralInt(42)
                        listener: handleIndexedExpression(?, [, ])
                  ensureSemicolon(])
                  listener: handleExpressionStatement(;)
          notEofOrValue(}, })
          listener: endBlockFunctionBody(5, {, })
        listener: endTopLevelMethod(main, null, })
  listener: endTopLevelDeclaration()
  reportAllErrorTokens(class)
  listener: endCompilationUnit(2, )
