Problems reported:

parser/general/augment_super:1:1: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
augment void topLevelMethod() {
^^^^^^^

parser/general/augment_super:1:1: Expected ';' after this.
augment void topLevelMethod() {
^^^^^^^

parser/general/augment_super:2:11: 'super' can't be used as an identifier because it's a keyword.
  augment super();
          ^^^^^

parser/general/augment_super:2:11: Expected ';' after this.
  augment super();
          ^^^^^

parser/general/augment_super:2:17: Expected an identifier, but got ')'.
  augment super();
                ^

parser/general/augment_super:5:1: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
augment void topLevelMethodError() {
^^^^^^^

parser/general/augment_super:5:1: Expected ';' after this.
augment void topLevelMethodError() {
^^^^^^^

parser/general/augment_super:6:11: Expected ';' after this.
  augment int local;
          ^^^

parser/general/augment_super:11:9: A function declaration needs an explicit list of parameters.
augment List<int> get topLevelProperty {
        ^^^^

parser/general/augment_super:11:19: Expected a function body, but got 'get'.
augment List<int> get topLevelProperty {
                  ^^^

parser/general/augment_super:12:23: Expected ',' before this.
  return [... augment super, augment super[0]];
                      ^^^^^

parser/general/augment_super:12:38: Expected ',' before this.
  return [... augment super, augment super[0]];
                                     ^^^^^

parser/general/augment_super:15:1: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
augment void set topLevelProperty(List<int> value) {
^^^^^^^

parser/general/augment_super:15:1: Expected ';' after this.
augment void set topLevelProperty(List<int> value) {
^^^^^^^

parser/general/augment_super:16:11: 'super' can't be used as an identifier because it's a keyword.
  augment super[0] = value[1];
          ^^^^^

parser/general/augment_super:16:11: Expected ';' after this.
  augment super[0] = value[1];
          ^^^^^

parser/general/augment_super:17:11: 'super' can't be used as an identifier because it's a keyword.
  augment super = value;
          ^^^^^

parser/general/augment_super:21:11: 'super' can't be used as an identifier because it's a keyword.
  augment super();
          ^^^^^

parser/general/augment_super:21:11: Expected ';' after this.
  augment super();
          ^^^^^

parser/general/augment_super:21:17: Expected an identifier, but got ')'.
  augment super();
                ^

parser/general/augment_super:22:11: 'super' can't be used as an identifier because it's a keyword.
  augment super;
          ^^^^^

parser/general/augment_super:23:11: Expected ';' after this.
  augment int local;
          ^^^

parser/general/augment_super:27:1: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
augment class Class {
^^^^^^^

parser/general/augment_super:27:1: Expected ';' after this.
augment class Class {
^^^^^^^

parser/general/augment_super:28:3: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
  augment void instanceMethod() {
  ^^^^^^^

parser/general/augment_super:28:3: Expected ';' after this.
  augment void instanceMethod() {
  ^^^^^^^

parser/general/augment_super:29:13: 'super' can't be used as an identifier because it's a keyword.
    augment super();
            ^^^^^

parser/general/augment_super:29:13: Expected ';' after this.
    augment super();
            ^^^^^

parser/general/augment_super:29:19: Expected an identifier, but got ')'.
    augment super();
                  ^

parser/general/augment_super:32:3: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
  augment void instanceMethodErrors() {
  ^^^^^^^

parser/general/augment_super:32:3: Expected ';' after this.
  augment void instanceMethodErrors() {
  ^^^^^^^

parser/general/augment_super:33:13: Expected ';' after this.
    augment int local;
            ^^^

parser/general/augment_super:37:11: Expected ';' after this.
  augment int get instanceProperty {
          ^^^

parser/general/augment_super:38:13: 'super' can't be used as an identifier because it's a keyword.
    augment super++;
            ^^^^^

parser/general/augment_super:38:13: Expected ';' after this.
    augment super++;
            ^^^^^

parser/general/augment_super:38:20: Expected an identifier, but got ';'.
    augment super++;
                   ^

parser/general/augment_super:39:7: Expected ';' after this.
    --augment super;
      ^^^^^^^

parser/general/augment_super:40:13: Expected ';' after this.
    return -augment super;
            ^^^^^^^

parser/general/augment_super:43:3: Variables must be declared using the keywords 'const', 'final', 'var' or a type name.
  augment void set instanceProperty(int value) {
  ^^^^^^^

parser/general/augment_super:43:3: Expected ';' after this.
  augment void set instanceProperty(int value) {
  ^^^^^^^

parser/general/augment_super:44:13: 'super' can't be used as an identifier because it's a keyword.
    augment super = value;
            ^^^^^

parser/general/augment_super:48:13: 'super' can't be used as an identifier because it's a keyword.
    augment super();
            ^^^^^

parser/general/augment_super:48:13: Expected ';' after this.
    augment super();
            ^^^^^

parser/general/augment_super:48:19: Expected an identifier, but got ')'.
    augment super();
                  ^

parser/general/augment_super:49:13: 'super' can't be used as an identifier because it's a keyword.
    augment super;
            ^^^^^

parser/general/augment_super:50:13: Expected ';' after this.
    augment int local;
            ^^^

beginCompilationUnit(augment)
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, null, )
      handleRecoverableError(MissingConstFinalVarOrType, augment, augment)
      handleNoType()
      handleIdentifier(augment, topLevelVariableDeclaration)
      handleNoFieldInitializer(void)
      handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
    endTopLevelFields(null, null, null, null, null, 1, augment, ;)
  endTopLevelDeclaration(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(;, null, null)
      handleVoidKeyword(void)
      handleIdentifier(topLevelMethod, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(augment, typeReference)
        handleNoTypeArguments(super)
        handleType(augment, null)
        beginVariablesDeclaration(super, null, null)
          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
          handleIdentifier(super, localVariableDeclaration)
          beginInitializedIdentifier(super)
            handleNoVariableInitializer(super)
          endInitializedIdentifier(super)
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
        endVariablesDeclaration(1, ;)
        beginParenthesizedExpressionOrRecordLiteral(()
          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
          handleIdentifier(, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(, ))
        endParenthesizedExpression(()
        handleExpressionStatement(;)
      endBlockFunctionBody(2, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(augment)
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, null, })
      handleRecoverableError(MissingConstFinalVarOrType, augment, augment)
      handleNoType(})
      handleIdentifier(augment, topLevelVariableDeclaration)
      handleNoFieldInitializer(void)
      handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
    endTopLevelFields(null, null, null, null, null, 1, augment, ;)
  endTopLevelDeclaration(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(;, null, null)
      handleVoidKeyword(void)
      handleIdentifier(topLevelMethodError, topLevelFunctionDeclaration)
      handleNoTypeVariables(()
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(augment, typeReference)
        handleNoTypeArguments(int)
        handleType(augment, null)
        beginVariablesDeclaration(int, null, null)
          handleIdentifier(int, localVariableDeclaration)
          beginInitializedIdentifier(int)
            handleNoVariableInitializer(int)
          endInitializedIdentifier(int)
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], int, int)
        endVariablesDeclaration(1, ;)
        handleIdentifier(local, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(local, ;)
        handleExpressionStatement(;)
        handleIdentifier(augment, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(augment, ;)
        handleExpressionStatement(;)
      endBlockFunctionBody(3, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(augment)
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginTopLevelMethod(}, null, null)
      handleIdentifier(augment, typeReference)
      handleNoTypeArguments(List)
      handleType(augment, null)
      handleIdentifier(List, topLevelFunctionDeclaration)
      beginTypeVariables(<)
        beginMetadataStar(int)
        endMetadataStar(0)
        handleIdentifier(int, typeVariableDeclaration)
        beginTypeVariable(int)
          handleTypeVariablesDefined(int, 1)
          handleNoType(int)
        endTypeVariable(>, 0, null, null)
      endTypeVariables(<, >)
      handleRecoverableError(MissingFunctionParameters, List, List)
      beginFormalParameters((, MemberKind.TopLevelMethod)
      endFormalParameters(0, (, ), MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got 'get'., null, {lexeme: get}], get, get)
      handleInvalidFunctionBody({)
    endTopLevelMethod(augment, null, })
  endTopLevelDeclaration(get)
  beginMetadataStar(get)
  endMetadataStar(0)
  beginTopLevelMember(get)
    beginTopLevelMethod(}, null, null)
      handleNoType(})
      handleIdentifier(topLevelProperty, topLevelFunctionDeclaration)
      handleNoTypeVariables({)
      handleNoFormalParameters({, MemberKind.TopLevelMethod)
      handleAsyncModifier(null, null)
      beginBlockFunctionBody({)
        beginReturnStatement(return)
          handleNoTypeArguments([)
          handleIdentifier(augment, expression)
          handleNoTypeArguments(super)
          handleNoArguments(super)
          handleSend(augment, super)
          handleSpreadExpression(...)
          handleRecoverableError(Message[ExpectedButGot, Expected ',' before this., null, {string: ,}], super, super)
          handleSuperExpression(super, expression)
          handleIdentifier(augment, expression)
          handleNoTypeArguments(super)
          handleNoArguments(super)
          handleSend(augment, super)
          handleRecoverableError(Message[ExpectedButGot, Expected ',' before this., null, {string: ,}], super, super)
          handleSuperExpression(super, expression)
          handleLiteralInt(0)
          handleIndexedExpression(null, [, ])
          handleLiteralList(4, [, null, ])
        endReturnStatement(true, return, ;)
      endBlockFunctionBody(1, {, })
    endTopLevelMethod(get, get, })
  endTopLevelDeclaration(augment)
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, null, })
      handleRecoverableError(MissingConstFinalVarOrType, augment, augment)
      handleNoType(})
      handleIdentifier(augment, topLevelVariableDeclaration)
      handleNoFieldInitializer(void)
      handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
    endTopLevelFields(null, null, null, null, null, 1, augment, ;)
  endTopLevelDeclaration(void)
  beginMetadataStar(void)
  endMetadataStar(0)
  beginTopLevelMember(void)
    beginTopLevelMethod(;, null, 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({)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(augment, typeReference)
        handleNoTypeArguments(super)
        handleType(augment, null)
        beginVariablesDeclaration(super, null, null)
          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
          handleIdentifier(super, localVariableDeclaration)
          beginInitializedIdentifier(super)
            handleNoVariableInitializer(super)
          endInitializedIdentifier(super)
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
        endVariablesDeclaration(1, ;)
        handleNoTypeArguments([)
        handleLiteralInt(0)
        handleLiteralList(1, [, null, ])
        handleIdentifier(value, expression)
        handleNoTypeArguments([)
        handleNoArguments([)
        handleSend(value, [)
        handleLiteralInt(1)
        handleIndexedExpression(null, [, ])
        handleAssignmentExpression(=)
        handleExpressionStatement(;)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(augment, typeReference)
        handleNoTypeArguments(super)
        handleType(augment, null)
        beginVariablesDeclaration(super, null, null)
          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
          handleIdentifier(super, localVariableDeclaration)
          beginInitializedIdentifier(super)
            beginVariableInitializer(=)
              handleIdentifier(value, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(value, ;)
            endVariableInitializer(=)
          endInitializedIdentifier(super)
        endVariablesDeclaration(1, ;)
      endBlockFunctionBody(3, {, })
    endTopLevelMethod(void, set, })
  endTopLevelDeclaration(void)
  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({)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(augment, typeReference)
        handleNoTypeArguments(super)
        handleType(augment, null)
        beginVariablesDeclaration(super, null, null)
          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
          handleIdentifier(super, localVariableDeclaration)
          beginInitializedIdentifier(super)
            handleNoVariableInitializer(super)
          endInitializedIdentifier(super)
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
        endVariablesDeclaration(1, ;)
        beginParenthesizedExpressionOrRecordLiteral(()
          handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
          handleIdentifier(, expression)
          handleNoTypeArguments())
          handleNoArguments())
          handleSend(, ))
        endParenthesizedExpression(()
        handleExpressionStatement(;)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(augment, typeReference)
        handleNoTypeArguments(super)
        handleType(augment, null)
        beginVariablesDeclaration(super, null, null)
          handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
          handleIdentifier(super, localVariableDeclaration)
          beginInitializedIdentifier(super)
            handleNoVariableInitializer(super)
          endInitializedIdentifier(super)
        endVariablesDeclaration(1, ;)
        beginMetadataStar(augment)
        endMetadataStar(0)
        handleIdentifier(augment, typeReference)
        handleNoTypeArguments(int)
        handleType(augment, null)
        beginVariablesDeclaration(int, null, null)
          handleIdentifier(int, localVariableDeclaration)
          beginInitializedIdentifier(int)
            handleNoVariableInitializer(int)
          endInitializedIdentifier(int)
          handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], int, int)
        endVariablesDeclaration(1, ;)
        handleIdentifier(local, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(local, ;)
        handleExpressionStatement(;)
        handleIdentifier(augment, expression)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(augment, ;)
        handleExpressionStatement(;)
      endBlockFunctionBody(6, {, })
    endTopLevelMethod(void, null, })
  endTopLevelDeclaration(augment)
  beginMetadataStar(augment)
  endMetadataStar(0)
  beginTopLevelMember(augment)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, null, null, })
      handleRecoverableError(MissingConstFinalVarOrType, augment, augment)
      handleNoType(})
      handleIdentifier(augment, topLevelVariableDeclaration)
      handleNoFieldInitializer(class)
      handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
    endTopLevelFields(null, null, null, null, null, 1, augment, ;)
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(Class, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, null, null, Class)
      handleNoType(Class)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
            handleRecoverableError(MissingConstFinalVarOrType, augment, augment)
            handleNoType({)
            handleIdentifier(augment, fieldDeclaration)
            handleNoFieldInitializer(void)
            handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
          endClassFields(null, null, null, null, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(void)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, instanceMethod)
            handleVoidKeyword(void)
            handleIdentifier(instanceMethod, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(augment, typeReference)
              handleNoTypeArguments(super)
              handleType(augment, null)
              beginVariablesDeclaration(super, null, null)
                handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
                handleIdentifier(super, localVariableDeclaration)
                beginInitializedIdentifier(super)
                  handleNoVariableInitializer(super)
                endInitializedIdentifier(super)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
              endVariablesDeclaration(1, ;)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
                handleIdentifier(, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(, ))
              endParenthesizedExpression(()
              handleExpressionStatement(;)
            endBlockFunctionBody(2, {, })
          endClassMethod(null, void, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, })
            handleRecoverableError(MissingConstFinalVarOrType, augment, augment)
            handleNoType(})
            handleIdentifier(augment, fieldDeclaration)
            handleNoFieldInitializer(void)
            handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
          endClassFields(null, null, null, null, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(void)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, instanceMethodErrors)
            handleVoidKeyword(void)
            handleIdentifier(instanceMethodErrors, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(augment, typeReference)
              handleNoTypeArguments(int)
              handleType(augment, null)
              beginVariablesDeclaration(int, null, null)
                handleIdentifier(int, localVariableDeclaration)
                beginInitializedIdentifier(int)
                  handleNoVariableInitializer(int)
                endInitializedIdentifier(int)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], int, int)
              endVariablesDeclaration(1, ;)
              handleIdentifier(local, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(local, ;)
              handleExpressionStatement(;)
              handleIdentifier(augment, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(augment, ;)
              handleExpressionStatement(;)
            endBlockFunctionBody(3, {, })
          endClassMethod(null, void, (, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, })
            handleIdentifier(augment, typeReference)
            handleNoTypeArguments(int)
            handleType(augment, null)
            handleIdentifier(int, fieldDeclaration)
            handleNoFieldInitializer(get)
            handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], int, int)
          endClassFields(null, null, null, null, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(get)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, get, instanceProperty)
            handleNoType(;)
            handleIdentifier(instanceProperty, methodDeclaration)
            handleNoTypeVariables({)
            handleNoFormalParameters({, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(augment, typeReference)
              handleNoTypeArguments(super)
              handleType(augment, null)
              beginVariablesDeclaration(super, null, null)
                handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
                handleIdentifier(super, localVariableDeclaration)
                beginInitializedIdentifier(super)
                  handleNoVariableInitializer(super)
                endInitializedIdentifier(super)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
              endVariablesDeclaration(1, ;)
              handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ';'., Try inserting an identifier before ';'., {lexeme: ;}], ;, ;)
              handleIdentifier(, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(, ;)
              handleUnaryPrefixAssignmentExpression(++)
              handleExpressionStatement(;)
              handleIdentifier(augment, expression)
              handleNoTypeArguments(super)
              handleNoArguments(super)
              handleSend(augment, super)
              handleUnaryPrefixAssignmentExpression(--)
              handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
              handleExpressionStatement(;)
              handleSuperExpression(super, expression)
              handleExpressionStatement(;)
              beginReturnStatement(return)
                handleIdentifier(augment, expression)
                handleNoTypeArguments(super)
                handleNoArguments(super)
                handleSend(augment, super)
                handleUnaryPrefixExpression(-)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
              endReturnStatement(true, return, ;)
              handleSuperExpression(super, expression)
              handleExpressionStatement(;)
            endBlockFunctionBody(6, {, })
          endClassMethod(get, get, {, null, })
        endMember()
        beginMetadataStar(augment)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, })
            handleRecoverableError(MissingConstFinalVarOrType, augment, augment)
            handleNoType(})
            handleIdentifier(augment, fieldDeclaration)
            handleNoFieldInitializer(void)
            handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], augment, augment)
          endClassFields(null, null, null, null, null, null, null, 1, augment, ;)
        endMember()
        beginMetadataStar(void)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, set, instanceProperty)
            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({)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(augment, typeReference)
              handleNoTypeArguments(super)
              handleType(augment, null)
              beginVariablesDeclaration(super, null, null)
                handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
                handleIdentifier(super, localVariableDeclaration)
                beginInitializedIdentifier(super)
                  beginVariableInitializer(=)
                    handleIdentifier(value, expression)
                    handleNoTypeArguments(;)
                    handleNoArguments(;)
                    handleSend(value, ;)
                  endVariableInitializer(=)
                endInitializedIdentifier(super)
              endVariablesDeclaration(1, ;)
            endBlockFunctionBody(1, {, })
          endClassMethod(set, void, (, null, })
        endMember()
        beginMetadataStar(void)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, injectedInstanceMethod)
            handleVoidKeyword(void)
            handleIdentifier(injectedInstanceMethod, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(augment, typeReference)
              handleNoTypeArguments(super)
              handleType(augment, null)
              beginVariablesDeclaration(super, null, null)
                handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
                handleIdentifier(super, localVariableDeclaration)
                beginInitializedIdentifier(super)
                  handleNoVariableInitializer(super)
                endInitializedIdentifier(super)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], super, super)
              endVariablesDeclaration(1, ;)
              beginParenthesizedExpressionOrRecordLiteral(()
                handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got ')'., Try inserting an identifier before ')'., {lexeme: )}], ), ))
                handleIdentifier(, expression)
                handleNoTypeArguments())
                handleNoArguments())
                handleSend(, ))
              endParenthesizedExpression(()
              handleExpressionStatement(;)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(augment, typeReference)
              handleNoTypeArguments(super)
              handleType(augment, null)
              beginVariablesDeclaration(super, null, null)
                handleRecoverableError(Message[ExpectedIdentifierButGotKeyword, 'super' 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: super}], super, super)
                handleIdentifier(super, localVariableDeclaration)
                beginInitializedIdentifier(super)
                  handleNoVariableInitializer(super)
                endInitializedIdentifier(super)
              endVariablesDeclaration(1, ;)
              beginMetadataStar(augment)
              endMetadataStar(0)
              handleIdentifier(augment, typeReference)
              handleNoTypeArguments(int)
              handleType(augment, null)
              beginVariablesDeclaration(int, null, null)
                handleIdentifier(int, localVariableDeclaration)
                beginInitializedIdentifier(int)
                  handleNoVariableInitializer(int)
                endInitializedIdentifier(int)
                handleRecoverableError(Message[ExpectedAfterButGot, Expected ';' after this., null, {string: ;}], int, int)
              endVariablesDeclaration(1, ;)
              handleIdentifier(local, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(local, ;)
              handleExpressionStatement(;)
              handleIdentifier(augment, expression)
              handleNoTypeArguments(;)
              handleNoArguments(;)
              handleSend(augment, ;)
              handleExpressionStatement(;)
            endBlockFunctionBody(6, {, })
          endClassMethod(null, void, (, null, })
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 9, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration()
endCompilationUnit(11, )
