Problems reported:

parser/general/new_as_identifier:16:44: Expected an identifier, but got 'new'.
  C.constructor_field_initializer() : this.new = null;
                                           ^^^

parser/general/new_as_identifier:16:39: Expected an assignment after the field name.
  C.constructor_field_initializer() : this.new = null;
                                      ^^^^

parser/general/new_as_identifier:16:44: Expected a function body, but got 'new'.
  C.constructor_field_initializer() : this.new = null;
                                           ^^^

parser/general/new_as_identifier:16:44: Expected a class member, but got 'new'.
  C.constructor_field_initializer() : this.new = null;
                                           ^^^

parser/general/new_as_identifier:16:48: Operator declarations must be preceded by the keyword 'operator'.
  C.constructor_field_initializer() : this.new = null;
                                               ^

parser/general/new_as_identifier:16:48: The string '=' isn't a user-definable operator.
  C.constructor_field_initializer() : this.new = null;
                                               ^

parser/general/new_as_identifier:16:48: A method declaration needs an explicit list of parameters.
  C.constructor_field_initializer() : this.new = null;
                                               ^

parser/general/new_as_identifier:16:50: Expected a function body, but got 'null'.
  C.constructor_field_initializer() : this.new = null;
                                                 ^^^^

parser/general/new_as_identifier:16:50: Expected a class member, but got 'null'.
  C.constructor_field_initializer() : this.new = null;
                                                 ^^^^

parser/general/new_as_identifier:16:54: Expected a class member, but got ';'.
  C.constructor_field_initializer() : this.new = null;
                                                     ^

beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(C, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, C)
      handleNoType(C)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(C)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, C)
            handleNoType({)
            handleIdentifier(C, methodDeclaration)
            handleNewAsIdentifier(new)
            handleIdentifier(new, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleEmptyFunctionBody(;)
          endClassConstructor(null, C, (, null, ;)
        endMember()
        beginMetadataStar(C)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, C)
            handleNoType(;)
            handleIdentifier(C, methodDeclaration)
            handleIdentifier(constructor_field_initializer, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(this)
                handleRecoverableError(Message[ExpectedIdentifier, Expected an identifier, but got 'new'., Try inserting an identifier before 'new'., {lexeme: new}], new, new)
                handleRecoverableError(MissingAssignmentInInitializer, this, this)
                handleIdentifier(, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(, =)
                handleThisExpression(this, expression)
                handleIdentifier(, expressionContinuation)
                handleNoTypeArguments(new)
                handleNoArguments(new)
                handleSend(, new)
                handleEndingBinaryExpression(.)
                handleAssignmentExpression(=)
              endInitializer(new)
            endInitializers(1, :, new)
            handleAsyncModifier(null, null)
            handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got 'new'., null, {lexeme: new}], new, new)
            handleInvalidFunctionBody({)
          endClassConstructor(null, C, (, :, })
        endMember()
        beginMetadataStar(new)
        endMetadataStar(0)
        beginMember()
          handleRecoverableError(Message[ExpectedClassMember, Expected a class member, but got 'new'., null, {lexeme: new}], new, new)
          handleInvalidMember(new)
        endMember()
        beginMetadataStar(=)
        endMetadataStar(0)
        beginMember()
          handleRecoverableError(MissingOperatorKeyword, =, =)
          beginMethod(DeclarationKind.Class, null, null, null, null, null, operator)
            handleNoType(new)
            handleRecoverableError(Message[InvalidOperator, The string '=' isn't a user-definable operator., null, {lexeme: =}], =, =)
            handleInvalidOperatorName(operator, =)
            handleNoTypeVariables(null)
            handleRecoverableError(MissingMethodParameters, =, =)
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleRecoverableError(Message[ExpectedFunctionBody, Expected a function body, but got 'null'., null, {lexeme: null}], null, null)
            handleInvalidFunctionBody({)
          endClassMethod(null, operator, (, null, })
        endMember()
        beginMetadataStar(null)
        endMetadataStar(0)
        beginMember()
          handleRecoverableError(Message[ExpectedClassMember, Expected a class member, but got 'null'., null, {lexeme: null}], null, null)
          handleInvalidMember(null)
        endMember()
        beginMetadataStar(;)
        endMetadataStar(0)
        beginMember()
          handleRecoverableError(Message[ExpectedClassMember, Expected a class member, but got ';'., null, {lexeme: ;}], ;, ;)
          handleInvalidMember(;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 6, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(D, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, D)
      handleNoType(D)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleClassOrMixinImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(factory)
        endMetadataStar(0)
        beginMember()
          beginFactoryMethod(DeclarationKind.Class, {, null, null)
            handleIdentifier(D, methodDeclaration)
            handleNewAsIdentifier(new)
            handleIdentifier(new, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.Factory)
            endFormalParameters(0, (, ), MemberKind.Factory)
            handleAsyncModifier(null, null)
            handleIdentifier(C, expression)
            handleNoTypeArguments(()
            beginArguments(()
            endArguments(0, (, ))
            handleSend(C, ;)
            handleExpressionFunctionBody(=>, ;)
          endClassFactoryMethod(factory, factory, ;)
        endMember()
        beginMetadataStar(factory)
        endMetadataStar(0)
        beginMember()
          beginFactoryMethod(DeclarationKind.Class, ;, null, null)
            handleIdentifier(D, methodDeclaration)
            handleIdentifier(factory_redirection, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.Factory)
            endFormalParameters(0, (, ), MemberKind.Factory)
            handleAsyncModifier(null, null)
            beginRedirectingFactoryBody(=)
              handleIdentifier(C, constructorReference)
              beginConstructorReference(C)
                handleNewAsIdentifier(new)
                handleIdentifier(new, constructorReferenceContinuation)
                handleQualified(.)
                handleNoTypeArguments(;)
                handleNoConstructorReferenceContinuationAfterTypeArguments(;)
              endConstructorReference(C, null, ;, ConstructorReferenceContext.RedirectingFactory)
            endRedirectingFactoryBody(=, ;)
          endClassFactoryMethod(factory, factory, ;)
        endMember()
        beginMetadataStar(factory)
        endMetadataStar(0)
        beginMember()
          beginFactoryMethod(DeclarationKind.Class, ;, null, null)
            handleIdentifier(D, methodDeclaration)
            handleIdentifier(factory_redirection_generic, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.Factory)
            endFormalParameters(0, (, ), MemberKind.Factory)
            handleAsyncModifier(null, null)
            beginRedirectingFactoryBody(=)
              handleIdentifier(C, constructorReference)
              beginConstructorReference(C)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                handleNewAsIdentifier(new)
                handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
              endConstructorReference(C, ., ;, ConstructorReferenceContext.RedirectingFactory)
            endRedirectingFactoryBody(=, ;)
          endClassFactoryMethod(factory, factory, ;)
        endMember()
        beginMetadataStar(factory)
        endMetadataStar(0)
        beginMember()
          beginFactoryMethod(DeclarationKind.Class, ;, null, null)
            handleIdentifier(D, methodDeclaration)
            handleIdentifier(factory_redirection_prefixed, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.Factory)
            endFormalParameters(0, (, ), MemberKind.Factory)
            handleAsyncModifier(null, null)
            beginRedirectingFactoryBody(=)
              handleIdentifier(prefix, constructorReference)
              beginConstructorReference(prefix)
                handleIdentifier(C, constructorReferenceContinuation)
                handleQualified(.)
                handleNoTypeArguments(.)
                handleNewAsIdentifier(new)
                handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
              endConstructorReference(prefix, ., ;, ConstructorReferenceContext.RedirectingFactory)
            endRedirectingFactoryBody(=, ;)
          endClassFactoryMethod(factory, factory, ;)
        endMember()
        beginMetadataStar(factory)
        endMetadataStar(0)
        beginMember()
          beginFactoryMethod(DeclarationKind.Class, ;, null, null)
            handleIdentifier(D, methodDeclaration)
            handleIdentifier(factory_redirection_prefixed_generic, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.Factory)
            endFormalParameters(0, (, ), MemberKind.Factory)
            handleAsyncModifier(null, null)
            beginRedirectingFactoryBody(=)
              handleIdentifier(prefix, constructorReference)
              beginConstructorReference(prefix)
                handleIdentifier(C, constructorReferenceContinuation)
                handleQualified(.)
                beginTypeArguments(<)
                  handleIdentifier(int, typeReference)
                  handleNoTypeArguments(>)
                  handleType(int, null)
                endTypeArguments(1, <, >)
                handleNewAsIdentifier(new)
                handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
              endConstructorReference(prefix, ., ;, ConstructorReferenceContext.RedirectingFactory)
            endRedirectingFactoryBody(=, ;)
          endClassFactoryMethod(factory, factory, ;)
        endMember()
        beginMetadataStar(D)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, D)
            handleNoType(;)
            handleIdentifier(D, methodDeclaration)
            handleIdentifier(super_invocation, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(super)
                handleNewAsIdentifier(new)
                handleSuperExpression(super, expression)
                handleIdentifier(new, expressionContinuation)
                handleNoTypeArguments(()
                beginArguments(()
                endArguments(0, (, ))
                handleSend(new, ;)
                handleEndingBinaryExpression(.)
              endInitializer(;)
            endInitializers(1, :, ;)
            handleAsyncModifier(null, null)
            handleEmptyFunctionBody(;)
          endClassConstructor(null, D, (, :, ;)
        endMember()
        beginMetadataStar(D)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, D)
            handleNoType(;)
            handleIdentifier(D, methodDeclaration)
            handleIdentifier(this_redirection, methodDeclarationContinuation)
            handleQualified(.)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(this)
                handleNewAsIdentifier(new)
                handleThisExpression(this, expression)
                handleIdentifier(new, expressionContinuation)
                handleNoTypeArguments(()
                beginArguments(()
                endArguments(0, (, ))
                handleSend(new, ;)
                handleEndingBinaryExpression(.)
              endInitializer(;)
            endInitializers(1, :, ;)
            handleAsyncModifier(null, null)
            handleEmptyFunctionBody(;)
          endClassConstructor(null, D, (, :, ;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 7, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, })
      handleNoType(var)
      handleIdentifier(constructor_invocation_const, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginConstExpression(const)
          handleIdentifier(C, constructorReference)
          beginConstructorReference(C)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuation)
            handleQualified(.)
            handleNoTypeArguments(()
            handleNoConstructorReferenceContinuationAfterTypeArguments(()
          endConstructorReference(C, null, (, ConstructorReferenceContext.Const)
          beginArguments(()
          endArguments(0, (, ))
        endConstExpression(const)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_const_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginConstExpression(const)
          handleIdentifier(C, constructorReference)
          beginConstructorReference(C)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(C, ., (, ConstructorReferenceContext.Const)
          beginArguments(()
          endArguments(0, (, ))
        endConstExpression(const)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_const_prefixed, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginConstExpression(const)
          handleIdentifier(prefix, constructorReference)
          beginConstructorReference(prefix)
            handleIdentifier(C, constructorReferenceContinuation)
            handleQualified(.)
            handleNoTypeArguments(.)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(prefix, ., (, ConstructorReferenceContext.Const)
          beginArguments(()
          endArguments(0, (, ))
        endConstExpression(const)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_const_prefixed_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginConstExpression(const)
          handleIdentifier(prefix, constructorReference)
          beginConstructorReference(prefix)
            handleIdentifier(C, constructorReferenceContinuation)
            handleQualified(.)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(prefix, ., (, ConstructorReferenceContext.Const)
          beginArguments(()
          endArguments(0, (, ))
        endConstExpression(const)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_explicit, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginNewExpression(new)
          handleIdentifier(C, constructorReference)
          beginConstructorReference(C)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuation)
            handleQualified(.)
            handleNoTypeArguments(()
            handleNoConstructorReferenceContinuationAfterTypeArguments(()
          endConstructorReference(C, null, (, ConstructorReferenceContext.New)
          beginArguments(()
          endArguments(0, (, ))
        endNewExpression(new)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_explicit_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginNewExpression(new)
          handleIdentifier(C, constructorReference)
          beginConstructorReference(C)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(C, ., (, ConstructorReferenceContext.New)
          beginArguments(()
          endArguments(0, (, ))
        endNewExpression(new)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_explicit_prefixed, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginNewExpression(new)
          handleIdentifier(prefix, constructorReference)
          beginConstructorReference(prefix)
            handleIdentifier(C, constructorReferenceContinuation)
            handleQualified(.)
            handleNoTypeArguments(.)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(prefix, ., (, ConstructorReferenceContext.New)
          beginArguments(()
          endArguments(0, (, ))
        endNewExpression(new)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_explicit_prefixed_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginNewExpression(new)
          handleIdentifier(prefix, constructorReference)
          beginConstructorReference(prefix)
            handleIdentifier(C, constructorReferenceContinuation)
            handleQualified(.)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(prefix, ., (, ConstructorReferenceContext.New)
          beginArguments(()
          endArguments(0, (, ))
        endNewExpression(new)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_implicit, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(C, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(C, .)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(new, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_implicit_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginImplicitCreationExpression(=)
          handleIdentifier(C, constructorReference)
          beginConstructorReference(C)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(C, ., (, ConstructorReferenceContext.Implicit)
          beginArguments(()
          endArguments(0, (, ))
        endImplicitCreationExpression(=)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_implicit_prefixed, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(prefix, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(prefix, .)
        handleIdentifier(C, expressionContinuation)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(C, .)
        handleEndingBinaryExpression(.)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(new, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_invocation_implicit_prefixed_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        beginImplicitCreationExpression(=)
          handleIdentifier(prefix, constructorReference)
          beginConstructorReference(prefix)
            handleIdentifier(C, constructorReferenceContinuation)
            handleQualified(.)
            beginTypeArguments(<)
              handleIdentifier(int, typeReference)
              handleNoTypeArguments(>)
              handleType(int, null)
            endTypeArguments(1, <, >)
            handleNewAsIdentifier(new)
            handleIdentifier(new, constructorReferenceContinuationAfterTypeArguments)
          endConstructorReference(prefix, ., (, ConstructorReferenceContext.Implicit)
          beginArguments(()
          endArguments(0, (, ))
        endImplicitCreationExpression(=)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(C, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(C, .)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(new, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(C, expression)
        handleNoTypeArguments(<)
        handleNoArguments(<)
        handleSend(C, <)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleTypeArgumentApplication(<)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(new, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff_generic_method_invocation, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(C, expression)
        handleNoTypeArguments(<)
        handleNoArguments(<)
        handleSend(C, <)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleTypeArgumentApplication(<)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(new, .)
        handleEndingBinaryExpression(.)
        handleIdentifier(toString, expressionContinuation)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(toString, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff_method_invocation, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(C, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(C, .)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(new, .)
        handleEndingBinaryExpression(.)
        handleIdentifier(toString, expressionContinuation)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(toString, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff_prefixed, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(prefix, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(prefix, .)
        handleIdentifier(C, expressionContinuation)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(C, .)
        handleEndingBinaryExpression(.)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(new, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff_prefixed_generic, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(prefix, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(prefix, .)
        handleIdentifier(C, expressionContinuation)
        handleNoTypeArguments(<)
        handleNoArguments(<)
        handleSend(C, <)
        handleEndingBinaryExpression(.)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleTypeArgumentApplication(<)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(;)
        handleNoArguments(;)
        handleSend(new, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff_prefixed_generic_method_invocation, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(prefix, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(prefix, .)
        handleIdentifier(C, expressionContinuation)
        handleNoTypeArguments(<)
        handleNoArguments(<)
        handleSend(C, <)
        handleEndingBinaryExpression(.)
        beginTypeArguments(<)
          handleIdentifier(int, typeReference)
          handleNoTypeArguments(>)
          handleType(int, null)
        endTypeArguments(1, <, >)
        handleTypeArgumentApplication(<)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(new, .)
        handleEndingBinaryExpression(.)
        handleIdentifier(toString, expressionContinuation)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(toString, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration(var)
  beginMetadataStar(var)
  endMetadataStar(0)
  beginTopLevelMember(var)
    beginFields(DeclarationKind.TopLevel, null, null, null, null, null, var, ;)
      handleNoType(var)
      handleIdentifier(constructor_tearoff_prefixed_method_invocation, topLevelVariableDeclaration)
      beginFieldInitializer(=)
        handleIdentifier(prefix, expression)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(prefix, .)
        handleIdentifier(C, expressionContinuation)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(C, .)
        handleEndingBinaryExpression(.)
        handleNewAsIdentifier(new)
        handleIdentifier(new, expressionContinuation)
        handleNoTypeArguments(.)
        handleNoArguments(.)
        handleSend(new, .)
        handleEndingBinaryExpression(.)
        handleIdentifier(toString, expressionContinuation)
        handleNoTypeArguments(()
        beginArguments(()
        endArguments(0, (, ))
        handleSend(toString, ;)
        handleEndingBinaryExpression(.)
      endFieldInitializer(=, ;)
    endTopLevelFields(null, null, null, null, var, 1, var, ;)
  endTopLevelDeclaration()
endCompilationUnit(22, )
