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(C, classOrMixinDeclaration)
        listener: handleNoTypeVariables({)
        listener: beginClassDeclaration(class, null, null, C)
        parseClass(C, class, class, C)
          parseClassHeaderOpt(C, class, class)
            parseClassExtendsOpt(C)
              listener: handleNoType(C)
              listener: handleClassExtends(null, 1)
            parseClassWithClauseOpt(C)
              listener: handleClassNoWithClause()
            parseClassOrMixinOrEnumImplementsOpt(C)
              listener: handleImplements(null, 0)
            listener: handleClassHeader(class, class, null)
          parseClassOrMixinOrExtensionBody(C, DeclarationKind.Class, C)
            listener: beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
            notEofOrValue(}, int)
            parseClassOrMixinOrExtensionOrEnumMemberImpl({, DeclarationKind.Class, C)
              parseMetadataStar({)
                listener: beginMetadataStar(int)
                listener: endMetadataStar(0)
              listener: beginMember()
              isReservedKeyword(with)
              indicatesMethodOrField(()
              parseMethod({, null, null, null, null, null, null, {, Instance of 'SimpleType', null, with, DeclarationKind.Class, C, true)
                listener: beginMethod(DeclarationKind.Class, null, null, null, null, null, with)
                listener: handleIdentifier(int, typeReference)
                listener: handleNoTypeArguments(with)
                listener: handleType(int, null)
                ensureIdentifierPotentiallyRecovered(int, methodDeclaration, true)
                  reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
                    listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                  listener: handleIdentifier(with, methodDeclaration)
                parseQualifiedRestOpt(with, methodDeclarationContinuation)
                parseMethodTypeVar(with)
                  listener: handleNoTypeVariables(()
                parseGetterOrFormalParameters(with, with, false, MemberKind.NonStaticMethod)
                  parseFormalParameters(with, MemberKind.NonStaticMethod)
                    parseFormalParametersRest((, MemberKind.NonStaticMethod)
                      listener: beginFormalParameters((, MemberKind.NonStaticMethod)
                      listener: endFormalParameters(0, (, ), 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)
                            parseLiteralInt(=>)
                              listener: handleLiteralInt(7)
                    ensureSemicolon(7)
                    listener: handleExpressionFunctionBody(=>, ;)
                    inGenerator()
                listener: endClassMethod(null, int, (, null, ;)
              listener: endMember()
            notEofOrValue(}, int)
            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
              parseMetadataStar(;)
                listener: beginMetadataStar(int)
                listener: endMetadataStar(0)
              listener: beginMember()
              isReservedKeyword(with)
              indicatesMethodOrField(=)
              parseFields(;, null, null, null, null, null, null, ;, Instance of 'SimpleType', with, DeclarationKind.Class, C, true)
                listener: beginFields(DeclarationKind.Class, null, null, null, null, null, null, ;)
                listener: handleIdentifier(int, typeReference)
                listener: handleNoTypeArguments(with)
                listener: handleType(int, null)
                ensureIdentifierPotentiallyRecovered(int, fieldDeclaration, true)
                  reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
                    listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                  listener: handleIdentifier(with, fieldDeclaration)
                parseFieldInitializerOpt(with, with, null, null, null, null, DeclarationKind.Class, C)
                  listener: beginFieldInitializer(=)
                  parseExpression(=)
                    parsePrecedenceExpression(=, 1, true)
                      parseUnaryExpression(=, true)
                        parsePrimary(=, expression)
                          parseLiteralInt(=)
                            listener: handleLiteralInt(7)
                  listener: endFieldInitializer(=, ;)
                listener: endClassFields(null, null, null, null, null, null, 1, int, ;)
              listener: endMember()
            notEofOrValue(}, int)
            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
              parseMetadataStar(;)
                listener: beginMetadataStar(int)
                listener: endMetadataStar(0)
              listener: beginMember()
              isReservedKeyword(with)
              indicatesMethodOrField(=>)
              parseMethod(;, null, null, null, null, null, null, ;, Instance of 'SimpleType', get, with, DeclarationKind.Class, C, true)
                listener: beginMethod(DeclarationKind.Class, null, null, null, null, get, with)
                listener: handleIdentifier(int, typeReference)
                listener: handleNoTypeArguments(get)
                listener: handleType(int, null)
                ensureIdentifierPotentiallyRecovered(get, methodDeclaration, true)
                  reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
                    listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                  listener: handleIdentifier(with, methodDeclaration)
                parseQualifiedRestOpt(with, methodDeclarationContinuation)
                listener: handleNoTypeVariables(=>)
                parseGetterOrFormalParameters(with, with, true, MemberKind.NonStaticMethod)
                  listener: handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
                parseInitializersOpt(with)
                  listener: handleNoInitializers()
                parseAsyncModifierOpt(with)
                  listener: handleAsyncModifier(null, null)
                  inPlainSync()
                inPlainSync()
                inPlainSync()
                parseFunctionBody(with, false, true)
                  parseExpressionFunctionBody(=>, false)
                    parseExpression(=>)
                      parsePrecedenceExpression(=>, 1, true)
                        parseUnaryExpression(=>, true)
                          parsePrimary(=>, expression)
                            parseLiteralInt(=>)
                              listener: handleLiteralInt(7)
                    ensureSemicolon(7)
                    listener: handleExpressionFunctionBody(=>, ;)
                    inGenerator()
                listener: endClassMethod(get, int, =>, null, ;)
              listener: endMember()
            notEofOrValue(}, void)
            parseClassOrMixinOrExtensionOrEnumMemberImpl(;, DeclarationKind.Class, C)
              parseMetadataStar(;)
                listener: beginMetadataStar(void)
                listener: endMetadataStar(0)
              listener: beginMember()
              isReservedKeyword(with)
              indicatesMethodOrField(()
              parseMethod(;, null, null, null, null, null, null, ;, Instance of 'VoidType', set, with, DeclarationKind.Class, C, true)
                listener: beginMethod(DeclarationKind.Class, null, null, null, null, set, with)
                listener: handleVoidKeyword(void)
                ensureIdentifierPotentiallyRecovered(set, methodDeclaration, true)
                  reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
                    listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
                  listener: handleIdentifier(with, methodDeclaration)
                parseQualifiedRestOpt(with, methodDeclarationContinuation)
                listener: handleNoTypeVariables(()
                parseGetterOrFormalParameters(with, with, false, MemberKind.NonStaticMethod)
                  parseFormalParameters(with, 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(x)
                        listener: handleType(int, null)
                        ensureIdentifier(int, formalParameterDeclaration)
                          listener: handleIdentifier(x, formalParameterDeclaration)
                        listener: handleFormalParameterWithoutValue())
                        listener: endFormalParameter(null, null, null, x, null, null, FormalParameterKind.mandatory, MemberKind.NonStaticMethod)
                      listener: endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
                parseInitializersOpt())
                  listener: handleNoInitializers()
                parseAsyncModifierOpt())
                  listener: handleAsyncModifier(null, null)
                  inPlainSync()
                inPlainSync()
                inPlainSync()
                parseFunctionBody(), false, true)
                  listener: beginBlockFunctionBody({)
                  notEofOrValue(}, })
                  listener: endBlockFunctionBody(0, {, })
                listener: endClassMethod(set, void, (, null, })
              listener: endMember()
            notEofOrValue(}, })
            listener: endClassOrMixinOrExtensionBody(DeclarationKind.Class, 4, {, })
          listener: endClassDeclaration(class, })
  listener: endTopLevelDeclaration(int)
  parseTopLevelDeclarationImpl(}, Instance of 'DirectiveContext')
    parseMetadataStar(})
      listener: beginMetadataStar(int)
      listener: endMetadataStar(0)
    parseTopLevelMemberImpl(})
      listener: beginTopLevelMember(int)
      isReservedKeyword(with)
      indicatesMethodOrField(()
      parseTopLevelMethod(}, null, }, Instance of 'SimpleType', null, with, true)
        listener: beginTopLevelMethod(}, null)
        listener: handleIdentifier(int, typeReference)
        listener: handleNoTypeArguments(with)
        listener: handleType(int, null)
        ensureIdentifierPotentiallyRecovered(int, topLevelFunctionDeclaration, true)
          reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
          listener: handleIdentifier(with, topLevelFunctionDeclaration)
        parseMethodTypeVar(with)
          listener: handleNoTypeVariables(()
        parseGetterOrFormalParameters(with, with, false, MemberKind.TopLevelMethod)
          parseFormalParameters(with, MemberKind.TopLevelMethod)
            parseFormalParametersRest((, MemberKind.TopLevelMethod)
              listener: beginFormalParameters((, MemberKind.TopLevelMethod)
              listener: endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
        parseAsyncModifierOpt())
          listener: handleAsyncModifier(null, null)
          inPlainSync()
        parseFunctionBody(), false, false)
          parseExpressionFunctionBody(=>, false)
            parseExpression(=>)
              parsePrecedenceExpression(=>, 1, true)
                parseUnaryExpression(=>, true)
                  parsePrimary(=>, expression)
                    parseLiteralInt(=>)
                      listener: handleLiteralInt(7)
            ensureSemicolon(7)
            listener: handleExpressionFunctionBody(=>, ;)
            inGenerator()
        listener: endTopLevelMethod(int, null, ;)
  listener: endTopLevelDeclaration(int)
  parseTopLevelDeclarationImpl(;, Instance of 'DirectiveContext')
    parseMetadataStar(;)
      listener: beginMetadataStar(int)
      listener: endMetadataStar(0)
    parseTopLevelMemberImpl(;)
      listener: beginTopLevelMember(int)
      isReservedKeyword(with)
      indicatesMethodOrField(=)
      parseFields(;, null, null, null, null, null, null, ;, Instance of 'SimpleType', with, DeclarationKind.TopLevel, null, true)
        listener: beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, ;)
        listener: handleIdentifier(int, typeReference)
        listener: handleNoTypeArguments(with)
        listener: handleType(int, null)
        ensureIdentifierPotentiallyRecovered(int, topLevelVariableDeclaration, true)
          reportRecoverableErrorWithToken(with, Instance of 'Template<(Token) => Message>')
            listener: handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'with' can't be used as an identifier because it's a keyword., Try renaming this to be an identifier that isn't a keyword., {lexeme: with}], with, with)
          listener: handleIdentifier(with, topLevelVariableDeclaration)
        parseFieldInitializerOpt(with, with, null, null, null, null, DeclarationKind.TopLevel, null)
          listener: beginFieldInitializer(=)
          parseExpression(=)
            parsePrecedenceExpression(=, 1, true)
              parseUnaryExpression(=, true)
                parsePrimary(=, expression)
                  parseLiteralInt(=)
                    listener: handleLiteralInt(7)
          listener: endFieldInitializer(=, ;)
        listener: endTopLevelFields(null, null, null, null, null, 1, int, ;)
  listener: endTopLevelDeclaration()
  reportAllErrorTokens(class)
  listener: endCompilationUnit(3, )
