Problems reported:

parser/augmentation/augment_super:6:3: Can't have modifier 'augment' here.
  augment int local;
  ^^^^^^^

parser/augmentation/augment_super:23:3: Can't have modifier 'augment' here.
  augment int local;
  ^^^^^^^

parser/augmentation/augment_super:33:5: Can't have modifier 'augment' here.
    augment int local;
    ^^^^^^^

parser/augmentation/augment_super:50:5: Can't have modifier 'augment' here.
    augment int local;
    ^^^^^^^

beginCompilationUnit(augment)
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginTopLevelMethod(, augment, null)
      handleVoidKeyword(void)
      handleIdentifier(topLevelMethod, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleAugmentSuperExpression(augment, super, expression)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(augment, ))
        handleExpressionStatement(augment, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(augment, null, })
  endTopLevelDeclaration(})
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginTopLevelMethod(}, augment, null)
      handleVoidKeyword(void)
      handleIdentifier(topLevelMethodError, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'augment' here., Try removing 'augment'., {lexeme: augment}], augment, augment)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(local)
        handleType(int, null)
        beginVariablesDeclaration(local, null, null)
          handleIdentifier(local, localVariableDeclaration)
          beginInitializedIdentifier(local)
            handleNoVariableInitializer(local)
          endInitializedIdentifier(local)
        endVariablesDeclaration(1, ;)
        handleIdentifier(augment, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(augment, augment)
        handleExpressionStatement(augment, ;)
      endBlockFunctionBody(2, {, })
    endTopLevelMethod(augment, null, })
  endTopLevelDeclaration(})
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginTopLevelMethod(}, augment, null)
      handleIdentifier(List, typeReference)
      beginTypeArguments(<)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(>)
        handleType(int, null)
      endTypeArguments(1, <, >)
      handleType(List, null)
      handleIdentifier(topLevelProperty, topLevelFunctionDeclaration)
      handleNoTypeVariables({)
      handleNoFormalParameters({, MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginReturnStatement(return)
          handleNoTypeArguments([)
          handleAugmentSuperExpression(augment, super, expression)
          handleSpreadExpression(...)
          handleAugmentSuperExpression(augment, super, expression)
          handleLiteralInt(0)
          handleIndexedExpression(null, [, ])
          handleLiteralList(2, [, null, ])
        endReturnStatement(true, return, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(augment, get, })
  endTopLevelDeclaration(})
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginTopLevelMethod(}, augment, null)
      handleVoidKeyword(void)
      handleIdentifier(topLevelProperty, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
        beginMetadataStar(List)
        endMetadataStar(0)
        beginFormalParameter(List, MemberKind.TopLevelMethod, null, null, null)
          handleIdentifier(List, typeReference)
          beginTypeArguments(<)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(>)
            handleType(int, null)
          endTypeArguments(1, <, >)
          handleType(List, null)
          handleIdentifier(value, formalParameterDeclaration)
          handleFormalParameterWithoutValue())
        endFormalParameter(null, null, null, value, null, null, FormalParameterKind.requiredPositional, MemberKind.TopLevelMethod)
      endFormalParameters(1, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleAugmentSuperExpression(augment, super, expression)
        handleLiteralInt(0)
        handleIndexedExpression(null, [, ])
        handleIdentifier(value, expression)
        handleNoTypeArguments([)
        handleNoArguments([)
        handleSend(value, value)
        handleLiteralInt(1)
        handleIndexedExpression(null, [, ])
        handleAssignmentExpression(=, ])
        handleExpressionStatement(augment, ;)
        handleAugmentSuperExpression(augment, super, expression)
        handleIdentifier(value, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(value, value)
        handleAssignmentExpression(=, value)
        handleExpressionStatement(augment, ;)
      endBlockFunctionBody(2, {, })
    endTopLevelMethod(augment, set, })
  endTopLevelDeclaration(})
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(}, null, null)
      handleVoidKeyword(void)
      handleIdentifier(injectedTopLevelMethod, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        handleAugmentSuperExpression(augment, super, expression)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(augment, ))
        handleExpressionStatement(augment, ;)
        handleAugmentSuperExpression(augment, super, expression)
        handleExpressionStatement(augment, ;)
        handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'augment' here., Try removing 'augment'., {lexeme: augment}], augment, augment)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(int, typeReference)
        handleNoTypeArguments(local)
        handleType(int, null)
        beginVariablesDeclaration(local, null, null)
          handleIdentifier(local, localVariableDeclaration)
          beginInitializedIdentifier(local)
            handleNoVariableInitializer(local)
          endInitializedIdentifier(local)
        endVariablesDeclaration(1, ;)
        handleIdentifier(augment, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(augment, augment)
        handleExpressionStatement(augment, ;)
      endBlockFunctionBody(4, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(})
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(augment)
    handleIdentifier(Class, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(augment, null, null, null, null, null, null, augment, null, Class)
      handleNoType(Class)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(augment, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, null, instanceMethod, Class)
            handleVoidKeyword(void)
            handleIdentifier(instanceMethod, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleAugmentSuperExpression(augment, super, expression)
              handleNoTypeArguments(()
              beginArguments(()
              endArguments(0, (, ))
              handleSend(augment, ))
              handleExpressionStatement(augment, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, null, instanceMethodErrors, Class)
            handleVoidKeyword(void)
            handleIdentifier(instanceMethodErrors, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'augment' here., Try removing 'augment'., {lexeme: augment}], augment, augment)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(local)
              handleType(int, null)
              beginVariablesDeclaration(local, null, null)
                handleIdentifier(local, localVariableDeclaration)
                beginInitializedIdentifier(local)
                  handleNoVariableInitializer(local)
                endInitializedIdentifier(local)
              endVariablesDeclaration(1, ;)
              handleIdentifier(augment, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(augment, augment)
              handleExpressionStatement(augment, ;)
            endBlockFunctionBody(2, {, })
          endClassMethod(null, augment, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, get, instanceProperty, Class)
            handleIdentifier(int, typeReference)
            handleNoTypeArguments(get)
            handleType(int, null)
            handleIdentifier(instanceProperty, methodDeclaration)
            handleNoTypeVariables({)
            handleNoFormalParameters({, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleAugmentSuperExpression(augment, super, expression)
              handleUnaryPostfixAssignmentExpression(++)
              handleExpressionStatement(augment, ;)
              handleAugmentSuperExpression(augment, super, expression)
              handleUnaryPrefixAssignmentExpression(--)
              handleExpressionStatement(--, ;)
              beginReturnStatement(return)
                handleAugmentSuperExpression(augment, super, expression)
                handleUnaryPrefixExpression(-)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(3, {, })
          endClassMethod(get, augment, {, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, augment, null, null, null, null, set, instanceProperty, Class)
            handleVoidKeyword(void)
            handleIdentifier(instanceProperty, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(int)
              endMetadataStar(0)
              beginFormalParameter(int, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(int, typeReference)
                handleNoTypeArguments(value)
                handleType(int, null)
                handleIdentifier(value, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, value, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleAugmentSuperExpression(augment, super, expression)
              handleIdentifier(value, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(value, value)
              handleAssignmentExpression(=, value)
              handleExpressionStatement(augment, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(set, augment, (, null, })
        endMember()
        beginMetadataStar(void)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, injectedInstanceMethod, Class)
            handleVoidKeyword(void)
            handleIdentifier(injectedInstanceMethod, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              handleAugmentSuperExpression(augment, super, expression)
              handleNoTypeArguments(()
              beginArguments(()
              endArguments(0, (, ))
              handleSend(augment, ))
              handleExpressionStatement(augment, ;)
              handleAugmentSuperExpression(augment, super, expression)
              handleExpressionStatement(augment, ;)
              handleRecoverableError(Message[ExtraneousModifier, Can't have modifier 'augment' here., Try removing 'augment'., {lexeme: augment}], augment, augment)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(local)
              handleType(int, null)
              beginVariablesDeclaration(local, null, null)
                handleIdentifier(local, localVariableDeclaration)
                beginInitializedIdentifier(local)
                  handleNoVariableInitializer(local)
                endInitializedIdentifier(local)
              endVariablesDeclaration(1, ;)
              handleIdentifier(augment, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(augment, augment)
              handleExpressionStatement(augment, ;)
            endBlockFunctionBody(4, {, })
          endClassMethod(null, void, (, null, })
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 5, {, })
    endClassDeclaration(augment, })
  endTopLevelDeclaration(})
endCompilationUnit(6, )
