Problems reported:

parser/general/issue_41121:10:12: The name of a constructor must match the name of the enclosing class.
  void set configuration(Configuration configuration)
           ^^^^^^^^^^^^^

parser/general/issue_41121:10:8: Constructors can't be a setter.
  void set configuration(Configuration configuration)
       ^^^

parser/general/issue_41121:10:3: Constructors can't have a return type.
  void set configuration(Configuration configuration)
  ^^^^

parser/general/issue_41121:16:21: A method declaration needs an explicit list of parameters.
  Configuration get configuration
                    ^^^^^^^^^^^^^

parser/general/issue_41121:16:21: The name of a constructor must match the name of the enclosing class.
  Configuration get configuration
                    ^^^^^^^^^^^^^

parser/general/issue_41121:16:17: Constructors can't be a getter.
  Configuration get configuration
                ^^^

parser/general/issue_41121:16:3: Constructors can't have a return type.
  Configuration get configuration
  ^^^^^^^^^^^^^

parser/general/issue_41121:23:8: The name of a constructor must match the name of the enclosing class.
  void method() : _configuration = null {
       ^^^^^^

parser/general/issue_41121:23:3: Constructors can't have a return type.
  void method() : _configuration = null {
  ^^^^

parser/general/issue_41121:27:3: The name of a constructor must match the name of the enclosing class.
  Foo() : _configuration = null {
  ^^^

beginCompilationUnit(class)
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(ConfigurationService, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, null, null, null, null, null, null, null, ConfigurationService)
      handleNoType(ConfigurationService)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(Configuration)
        endMetadataStar(0)
        beginMember()
          beginFields(DeclarationKind.Class, null, null, null, null, null, null, null, {)
            handleIdentifier(Configuration, typeReference)
            handleNoTypeArguments(_configuration)
            handleType(Configuration, null)
            handleIdentifier(_configuration, fieldDeclaration)
            handleNoFieldInitializer(;)
          endClassFields(null, null, null, null, null, null, null, 1, Configuration, ;)
        endMember()
        beginMetadataStar(ConfigurationService)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, ConfigurationService, ConfigurationService)
            handleNoType(;)
            handleIdentifier(ConfigurationService, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(Configuration)
              endMetadataStar(0)
              beginFormalParameter(Configuration, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(Configuration, typeReference)
                handleNoTypeArguments(configuration)
                handleType(Configuration, null)
                handleIdentifier(configuration, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(assert)
                beginAssert(assert, Assert.Initializer)
                  handleIdentifier(configuration, expression)
                  handleNoTypeArguments(!=)
                  handleNoArguments(!=)
                  handleSend(configuration, configuration)
                  beginBinaryExpression(!=)
                    handleLiteralNull(null)
                  endBinaryExpression(!=, null)
                endAssert(assert, Assert.Initializer, (, null, ))
              endInitializer())
              beginInitializer(_configuration)
                handleIdentifier(_configuration, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(_configuration, _configuration)
                handleIdentifier(configuration, expression)
                handleNoTypeArguments({)
                handleNoArguments({)
                handleSend(configuration, configuration)
                handleAssignmentExpression(=, configuration)
              endInitializer(configuration)
            endInitializers(2, :, configuration)
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
          endClassConstructor(null, ConfigurationService, (, :, })
        endMember()
        beginMetadataStar(void)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, set, configuration, ConfigurationService)
            handleVoidKeyword(void)
            handleIdentifier(configuration, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
              beginMetadataStar(Configuration)
              endMetadataStar(0)
              beginFormalParameter(Configuration, MemberKind.NonStaticMethod, null, null, null)
                handleIdentifier(Configuration, typeReference)
                handleNoTypeArguments(configuration)
                handleType(Configuration, null)
                handleIdentifier(configuration, formalParameterDeclaration)
                handleFormalParameterWithoutValue())
              endFormalParameter(null, null, null, configuration, null, null, FormalParameterKind.requiredPositional, MemberKind.NonStaticMethod)
            endFormalParameters(1, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(assert)
                beginAssert(assert, Assert.Initializer)
                  handleIdentifier(configuration, expression)
                  handleNoTypeArguments(!=)
                  handleNoArguments(!=)
                  handleSend(configuration, configuration)
                  beginBinaryExpression(!=)
                    handleLiteralNull(null)
                  endBinaryExpression(!=, null)
                endAssert(assert, Assert.Initializer, (, null, ))
              endInitializer())
              beginInitializer(_configuration)
                handleIdentifier(_configuration, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(_configuration, _configuration)
                handleIdentifier(configuration, expression)
                handleNoTypeArguments({)
                handleNoArguments({)
                handleSend(configuration, configuration)
                handleAssignmentExpression(=, configuration)
              endInitializer(configuration)
            endInitializers(2, :, configuration)
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
            handleRecoverableError(ConstructorWithWrongName, configuration, configuration)
            handleRecoverableError(SetterConstructor, set, set)
            handleRecoverableError(ConstructorWithReturnType, void, void)
          endClassConstructor(set, void, (, :, })
        endMember()
        beginMetadataStar(Configuration)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, get, configuration, ConfigurationService)
            handleIdentifier(Configuration, typeReference)
            handleNoTypeArguments(get)
            handleType(Configuration, null)
            handleIdentifier(configuration, methodDeclaration)
            handleNoTypeVariables(:)
            handleRecoverableError(MissingMethodParameters, configuration, configuration)
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(assert)
                beginAssert(assert, Assert.Initializer)
                  handleIdentifier(_configuration, expression)
                  handleNoTypeArguments(!=)
                  handleNoArguments(!=)
                  handleSend(_configuration, _configuration)
                  beginBinaryExpression(!=)
                    handleLiteralNull(null)
                  endBinaryExpression(!=, null)
                endAssert(assert, Assert.Initializer, (, null, ))
              endInitializer())
              beginInitializer(_configuration)
                handleIdentifier(_configuration, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(_configuration, _configuration)
                handleIdentifier(_configuration, expression)
                handleNoTypeArguments(.)
                handleNoArguments(.)
                handleSend(_configuration, _configuration)
                handleIdentifier(foo, expressionContinuation)
                handleNoTypeArguments({)
                handleNoArguments({)
                handleSend(foo, foo)
                handleEndingBinaryExpression(., foo)
                handleAssignmentExpression(=, foo)
              endInitializer(foo)
            endInitializers(2, :, foo)
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
              beginReturnStatement(return)
                handleIdentifier(_configuration, expression)
                handleNoTypeArguments(;)
                handleNoArguments(;)
                handleSend(_configuration, _configuration)
              endReturnStatement(true, return, ;)
            endBlockFunctionBody(1, {, })
            handleRecoverableError(ConstructorWithWrongName, configuration, configuration)
            handleRecoverableError(GetterConstructor, get, get)
            handleRecoverableError(ConstructorWithReturnType, Configuration, Configuration)
          endClassConstructor(get, Configuration, (, :, })
        endMember()
        beginMetadataStar(void)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, method, ConfigurationService)
            handleVoidKeyword(void)
            handleIdentifier(method, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(_configuration)
                handleIdentifier(_configuration, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(_configuration, _configuration)
                handleLiteralNull(null)
                handleAssignmentExpression(=, null)
              endInitializer(null)
            endInitializers(1, :, null)
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
            handleRecoverableError(ConstructorWithWrongName, method, method)
            handleRecoverableError(ConstructorWithReturnType, void, void)
          endClassConstructor(null, void, (, :, })
        endMember()
        beginMetadataStar(Foo)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, null, Foo, ConfigurationService)
            handleNoType(})
            handleIdentifier(Foo, methodDeclaration)
            handleNoTypeVariables(()
            beginFormalParameters((, MemberKind.NonStaticMethod)
            endFormalParameters(0, (, ), MemberKind.NonStaticMethod)
            beginInitializers(:)
              beginInitializer(_configuration)
                handleIdentifier(_configuration, expression)
                handleNoTypeArguments(=)
                handleNoArguments(=)
                handleSend(_configuration, _configuration)
                handleLiteralNull(null)
                handleAssignmentExpression(=, null)
              endInitializer(null)
            endInitializers(1, :, null)
            handleAsyncModifier(null, null)
            beginBlockFunctionBody({)
            endBlockFunctionBody(0, {, })
            handleRecoverableError(ConstructorWithWrongName, Foo, Foo)
          endClassConstructor(null, Foo, (, :, })
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 6, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(})
  beginMetadataStar(class)
  endMetadataStar(0)
  beginClassOrMixinOrNamedMixinApplicationPrelude(class)
    handleIdentifier(Configuration, classOrMixinDeclaration)
    handleNoTypeVariables({)
    beginClassDeclaration(class, null, null, null, null, null, null, null, null, Configuration)
      handleNoType(Configuration)
      handleClassExtends(null, 1)
      handleClassNoWithClause()
      handleImplements(null, 0)
      handleClassHeader(class, class, null)
      beginClassOrMixinOrExtensionBody(DeclarationKind.Class, {)
        beginMetadataStar(Configuration)
        endMetadataStar(0)
        beginMember()
          beginMethod(DeclarationKind.Class, null, null, null, null, null, get, foo, Configuration)
            handleIdentifier(Configuration, typeReference)
            handleNoTypeArguments(get)
            handleType(Configuration, null)
            handleIdentifier(foo, methodDeclaration)
            handleNoTypeVariables(=>)
            handleNoFormalParameters(=>, MemberKind.NonStaticMethod)
            handleNoInitializers()
            handleAsyncModifier(null, null)
            handleThisExpression(this, expression)
            handleExpressionFunctionBody(=>, ;)
          endClassMethod(get, Configuration, =>, null, ;)
        endMember()
      endClassOrMixinOrExtensionBody(DeclarationKind.Class, 1, {, })
    endClassDeclaration(class, })
  endTopLevelDeclaration(})
endCompilationUnit(2, )
