From 6c6eae8a914eb39b6af02e3a877667c2645d0763 Mon Sep 17 00:00:00 2001 From: Michael Chekin Date: Sat, 30 Jan 2021 14:38:59 +0100 Subject: [PATCH 1/7] Making sure variadic parameters do not have default values Signed-off-by: Michael Chekin --- src/Generator/ParameterGenerator.php | 5 ++ test/Generator/ParameterGeneratorTest.php | 76 ++++++++++++++--------- 2 files changed, 53 insertions(+), 28 deletions(-) diff --git a/src/Generator/ParameterGenerator.php b/src/Generator/ParameterGenerator.php index 0a1b52d4..169c87ac 100644 --- a/src/Generator/ParameterGenerator.php +++ b/src/Generator/ParameterGenerator.php @@ -300,6 +300,11 @@ public function generate() } if ($this->defaultValue instanceof ValueGenerator) { + + if ($this->variadic) { + throw new Exception\InvalidArgumentException('Variadic parameter cannot have a default value'); + } + $output .= ' = '; $this->defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE); $output .= $this->defaultValue; diff --git a/test/Generator/ParameterGeneratorTest.php b/test/Generator/ParameterGeneratorTest.php index 84b13913..b0077870 100644 --- a/test/Generator/ParameterGeneratorTest.php +++ b/test/Generator/ParameterGeneratorTest.php @@ -9,7 +9,9 @@ namespace LaminasTest\Code\Generator; use Closure; +use Laminas\Code\Generator\Exception\InvalidArgumentException; use Laminas\Code\Generator\ParameterGenerator; +use Laminas\Code\Generator\TypeGenerator; use Laminas\Code\Generator\ValueGenerator; use Laminas\Code\Reflection\ClassReflection; use Laminas\Code\Reflection\MethodReflection; @@ -66,7 +68,7 @@ public function testDefaultValueGetterAndSetterPersistValue() $value = new ValueGenerator('Foo', ValueGenerator::TYPE_CONSTANT); $parameterGenerator->setDefaultValue($value); - self::assertEquals('Foo', (string) $parameterGenerator->getDefaultValue()); + self::assertEquals('Foo', (string)$parameterGenerator->getDefaultValue()); } public function testPositionGetterAndSetterPersistValue() @@ -91,7 +93,7 @@ public function testGenerateIsCorrect() public function testFromReflectionGetParameterName() { $reflectionParameter = $this->getFirstReflectionParameter('name'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals('param', $codeGenParam->getName()); } @@ -99,7 +101,7 @@ public function testFromReflectionGetParameterName() public function testFromReflectionGetParameterType() { $reflectionParameter = $this->getFirstReflectionParameter('type'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals('stdClass', $codeGenParam->getType()); } @@ -107,7 +109,7 @@ public function testFromReflectionGetParameterType() public function testFromReflectionGetReference() { $reflectionParameter = $this->getFirstReflectionParameter('reference'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertTrue($codeGenParam->getPassedByReference()); } @@ -115,10 +117,10 @@ public function testFromReflectionGetReference() public function testFromReflectionGetDefaultValue() { $reflectionParameter = $this->getFirstReflectionParameter('defaultValue'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); $defaultValue = $codeGenParam->getDefaultValue(); - self::assertEquals('\'foo\'', (string) $defaultValue); + self::assertEquals('\'foo\'', (string)$defaultValue); } /** @@ -140,7 +142,7 @@ public function testFromReflectionGetDefaultValueNotOptional() public function testFromReflectionGetArrayHint() { $reflectionParameter = $this->getFirstReflectionParameter('fromArray'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals('array', $codeGenParam->getType()); } @@ -148,7 +150,7 @@ public function testFromReflectionGetArrayHint() public function testFromReflectionGetWithNativeType() { $reflectionParameter = $this->getFirstReflectionParameter('hasNativeDocTypes'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertNotEquals('int', $codeGenParam->getType()); self::assertEquals('', $codeGenParam->getType()); @@ -171,7 +173,7 @@ public function testCallableTypeHint() public function testFromReflectionGenerate($methodName, $expectedCode) { $reflectionParameter = $this->getFirstReflectionParameter($methodName); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals($expectedCode, $codeGenParam->generate()); } @@ -208,7 +210,7 @@ public function dataFromReflectionGenerate(): array protected function getFirstReflectionParameter($method) { $reflectionClass = new ClassReflection(ParameterClass::class); - $method = $reflectionClass->getMethod($method); + $method = $reflectionClass->getMethod($method); $params = $method->getParameters(); @@ -218,15 +220,15 @@ protected function getFirstReflectionParameter($method) public function testCreateFromArray() { $parameterGenerator = ParameterGenerator::fromArray([ - 'name' => 'SampleParameter', - 'type' => 'int', - 'defaultvalue' => 'default-foo', + 'name' => 'SampleParameter', + 'type' => 'int', + 'defaultvalue' => 'default-foo', 'passedbyreference' => false, - 'position' => 1, - 'sourcedirty' => false, - 'sourcecontent' => 'foo', - 'indentation' => '-', - 'omitdefaultvalue' => true, + 'position' => 1, + 'sourcedirty' => false, + 'sourcecontent' => 'foo', + 'indentation' => '-', + 'omitdefaultvalue' => true, ]); self::assertEquals('SampleParameter', $parameterGenerator->getName()); @@ -254,7 +256,7 @@ public function testParameterGeneratorReturnsCorrectTypeForNonNamespaceClasses() require_once __DIR__ . '/../TestAsset/NonNamespaceClass.php'; $reflClass = new ClassReflection('LaminasTest_Code_NsTest_BarClass'); - $params = $reflClass->getMethod('fooMethod')->getParameters(); + $params = $reflClass->getMethod('fooMethod')->getParameters(); $param = ParameterGenerator::fromReflection($params[0]); @@ -269,7 +271,7 @@ public function testTypehintsWithNamespaceInNamepsacedClassReturnTypewithBacksla require_once __DIR__ . '/TestAsset/NamespaceTypeHintClass.php'; $reflClass = new ClassReflection('Namespaced\TypeHint\Bar'); - $params = $reflClass->getMethod('method')->getParameters(); + $params = $reflClass->getMethod('method')->getParameters(); $param = ParameterGenerator::fromReflection($params[0]); @@ -373,9 +375,9 @@ public function validClassName() /** * @group zendframework/zend-code#29 * @dataProvider reflectionHints - * @param string $className - * @param string $methodName - * @param string $parameterName + * @param string $className + * @param string $methodName + * @param string $parameterName * @param string|null $expectedType */ public function testTypeHintFromReflection($className, $methodName, $parameterName, $expectedType) @@ -397,9 +399,9 @@ public function testTypeHintFromReflection($className, $methodName, $parameterNa /** * @group zendframework/zend-code#29 * @dataProvider reflectionHints - * @param string $className - * @param string $methodName - * @param string $parameterName + * @param string $className + * @param string $methodName + * @param string $parameterName * @param string|null $expectedType */ public function testTypeHintFromReflectionGeneratedCode($className, $methodName, $parameterName, $expectedType) @@ -516,16 +518,34 @@ public function testVariadicArgumentFromReflection( $methodName, $parameterName, $expectedGeneratedSignature - ) { + ): void { $parameter = ParameterGenerator::fromReflection(new ParameterReflection( [$className, $methodName], $parameterName )); self::assertTrue($parameter->getVariadic()); + self::assertNull($parameter->getDefaultValue()); self::assertSame($expectedGeneratedSignature, $parameter->generate()); } + public function testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgumentException(): void + { + $parameter = new ParameterGenerator(); + + $parameter->setName('parameter'); + $parameter->setType('int'); + $parameter->setPosition(1); + $parameter->setVariadic(true); + + $parameter->setDefaultValue([]); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Variadic parameter cannot have a default value'); + + $parameter->generate(); + } + /** * @return string[][] */ @@ -583,7 +603,7 @@ public function testGetInternalClassDefaultParameterValue() { $parameter = ParameterGenerator::fromReflection(new ParameterReflection([Phar::class, 'compress'], 1)); - self::assertSame('null', strtolower((string) $parameter->getDefaultValue())); + self::assertSame('null', strtolower((string)$parameter->getDefaultValue())); } /** From 1accc78bd871bed05714f8945d276c9008e46a0e Mon Sep 17 00:00:00 2001 From: Michael Chekin Date: Sat, 30 Jan 2021 14:42:30 +0100 Subject: [PATCH 2/7] Revert "Making sure variadic parameters do not have default values" This reverts commit 6c6eae8a914eb39b6af02e3a877667c2645d0763. Signed-off-by: Michael Chekin --- src/Generator/ParameterGenerator.php | 5 -- test/Generator/ParameterGeneratorTest.php | 76 +++++++++-------------- 2 files changed, 28 insertions(+), 53 deletions(-) diff --git a/src/Generator/ParameterGenerator.php b/src/Generator/ParameterGenerator.php index 169c87ac..0a1b52d4 100644 --- a/src/Generator/ParameterGenerator.php +++ b/src/Generator/ParameterGenerator.php @@ -300,11 +300,6 @@ public function generate() } if ($this->defaultValue instanceof ValueGenerator) { - - if ($this->variadic) { - throw new Exception\InvalidArgumentException('Variadic parameter cannot have a default value'); - } - $output .= ' = '; $this->defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE); $output .= $this->defaultValue; diff --git a/test/Generator/ParameterGeneratorTest.php b/test/Generator/ParameterGeneratorTest.php index b0077870..84b13913 100644 --- a/test/Generator/ParameterGeneratorTest.php +++ b/test/Generator/ParameterGeneratorTest.php @@ -9,9 +9,7 @@ namespace LaminasTest\Code\Generator; use Closure; -use Laminas\Code\Generator\Exception\InvalidArgumentException; use Laminas\Code\Generator\ParameterGenerator; -use Laminas\Code\Generator\TypeGenerator; use Laminas\Code\Generator\ValueGenerator; use Laminas\Code\Reflection\ClassReflection; use Laminas\Code\Reflection\MethodReflection; @@ -68,7 +66,7 @@ public function testDefaultValueGetterAndSetterPersistValue() $value = new ValueGenerator('Foo', ValueGenerator::TYPE_CONSTANT); $parameterGenerator->setDefaultValue($value); - self::assertEquals('Foo', (string)$parameterGenerator->getDefaultValue()); + self::assertEquals('Foo', (string) $parameterGenerator->getDefaultValue()); } public function testPositionGetterAndSetterPersistValue() @@ -93,7 +91,7 @@ public function testGenerateIsCorrect() public function testFromReflectionGetParameterName() { $reflectionParameter = $this->getFirstReflectionParameter('name'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals('param', $codeGenParam->getName()); } @@ -101,7 +99,7 @@ public function testFromReflectionGetParameterName() public function testFromReflectionGetParameterType() { $reflectionParameter = $this->getFirstReflectionParameter('type'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals('stdClass', $codeGenParam->getType()); } @@ -109,7 +107,7 @@ public function testFromReflectionGetParameterType() public function testFromReflectionGetReference() { $reflectionParameter = $this->getFirstReflectionParameter('reference'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertTrue($codeGenParam->getPassedByReference()); } @@ -117,10 +115,10 @@ public function testFromReflectionGetReference() public function testFromReflectionGetDefaultValue() { $reflectionParameter = $this->getFirstReflectionParameter('defaultValue'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); $defaultValue = $codeGenParam->getDefaultValue(); - self::assertEquals('\'foo\'', (string)$defaultValue); + self::assertEquals('\'foo\'', (string) $defaultValue); } /** @@ -142,7 +140,7 @@ public function testFromReflectionGetDefaultValueNotOptional() public function testFromReflectionGetArrayHint() { $reflectionParameter = $this->getFirstReflectionParameter('fromArray'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals('array', $codeGenParam->getType()); } @@ -150,7 +148,7 @@ public function testFromReflectionGetArrayHint() public function testFromReflectionGetWithNativeType() { $reflectionParameter = $this->getFirstReflectionParameter('hasNativeDocTypes'); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertNotEquals('int', $codeGenParam->getType()); self::assertEquals('', $codeGenParam->getType()); @@ -173,7 +171,7 @@ public function testCallableTypeHint() public function testFromReflectionGenerate($methodName, $expectedCode) { $reflectionParameter = $this->getFirstReflectionParameter($methodName); - $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); + $codeGenParam = ParameterGenerator::fromReflection($reflectionParameter); self::assertEquals($expectedCode, $codeGenParam->generate()); } @@ -210,7 +208,7 @@ public function dataFromReflectionGenerate(): array protected function getFirstReflectionParameter($method) { $reflectionClass = new ClassReflection(ParameterClass::class); - $method = $reflectionClass->getMethod($method); + $method = $reflectionClass->getMethod($method); $params = $method->getParameters(); @@ -220,15 +218,15 @@ protected function getFirstReflectionParameter($method) public function testCreateFromArray() { $parameterGenerator = ParameterGenerator::fromArray([ - 'name' => 'SampleParameter', - 'type' => 'int', - 'defaultvalue' => 'default-foo', + 'name' => 'SampleParameter', + 'type' => 'int', + 'defaultvalue' => 'default-foo', 'passedbyreference' => false, - 'position' => 1, - 'sourcedirty' => false, - 'sourcecontent' => 'foo', - 'indentation' => '-', - 'omitdefaultvalue' => true, + 'position' => 1, + 'sourcedirty' => false, + 'sourcecontent' => 'foo', + 'indentation' => '-', + 'omitdefaultvalue' => true, ]); self::assertEquals('SampleParameter', $parameterGenerator->getName()); @@ -256,7 +254,7 @@ public function testParameterGeneratorReturnsCorrectTypeForNonNamespaceClasses() require_once __DIR__ . '/../TestAsset/NonNamespaceClass.php'; $reflClass = new ClassReflection('LaminasTest_Code_NsTest_BarClass'); - $params = $reflClass->getMethod('fooMethod')->getParameters(); + $params = $reflClass->getMethod('fooMethod')->getParameters(); $param = ParameterGenerator::fromReflection($params[0]); @@ -271,7 +269,7 @@ public function testTypehintsWithNamespaceInNamepsacedClassReturnTypewithBacksla require_once __DIR__ . '/TestAsset/NamespaceTypeHintClass.php'; $reflClass = new ClassReflection('Namespaced\TypeHint\Bar'); - $params = $reflClass->getMethod('method')->getParameters(); + $params = $reflClass->getMethod('method')->getParameters(); $param = ParameterGenerator::fromReflection($params[0]); @@ -375,9 +373,9 @@ public function validClassName() /** * @group zendframework/zend-code#29 * @dataProvider reflectionHints - * @param string $className - * @param string $methodName - * @param string $parameterName + * @param string $className + * @param string $methodName + * @param string $parameterName * @param string|null $expectedType */ public function testTypeHintFromReflection($className, $methodName, $parameterName, $expectedType) @@ -399,9 +397,9 @@ public function testTypeHintFromReflection($className, $methodName, $parameterNa /** * @group zendframework/zend-code#29 * @dataProvider reflectionHints - * @param string $className - * @param string $methodName - * @param string $parameterName + * @param string $className + * @param string $methodName + * @param string $parameterName * @param string|null $expectedType */ public function testTypeHintFromReflectionGeneratedCode($className, $methodName, $parameterName, $expectedType) @@ -518,34 +516,16 @@ public function testVariadicArgumentFromReflection( $methodName, $parameterName, $expectedGeneratedSignature - ): void { + ) { $parameter = ParameterGenerator::fromReflection(new ParameterReflection( [$className, $methodName], $parameterName )); self::assertTrue($parameter->getVariadic()); - self::assertNull($parameter->getDefaultValue()); self::assertSame($expectedGeneratedSignature, $parameter->generate()); } - public function testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgumentException(): void - { - $parameter = new ParameterGenerator(); - - $parameter->setName('parameter'); - $parameter->setType('int'); - $parameter->setPosition(1); - $parameter->setVariadic(true); - - $parameter->setDefaultValue([]); - - $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('Variadic parameter cannot have a default value'); - - $parameter->generate(); - } - /** * @return string[][] */ @@ -603,7 +583,7 @@ public function testGetInternalClassDefaultParameterValue() { $parameter = ParameterGenerator::fromReflection(new ParameterReflection([Phar::class, 'compress'], 1)); - self::assertSame('null', strtolower((string)$parameter->getDefaultValue())); + self::assertSame('null', strtolower((string) $parameter->getDefaultValue())); } /** From bca79ddefd97b8d274662741f3c478c5d445500f Mon Sep 17 00:00:00 2001 From: Michael Chekin Date: Sat, 30 Jan 2021 14:47:21 +0100 Subject: [PATCH 3/7] Make sure default value is null for variadic parameters (no extra-changes) Signed-off-by: Michael Chekin --- src/Generator/ParameterGenerator.php | 5 +++++ test/Generator/ParameterGeneratorTest.php | 21 ++++++++++++++++++++- 2 files changed, 25 insertions(+), 1 deletion(-) diff --git a/src/Generator/ParameterGenerator.php b/src/Generator/ParameterGenerator.php index 0a1b52d4..169c87ac 100644 --- a/src/Generator/ParameterGenerator.php +++ b/src/Generator/ParameterGenerator.php @@ -300,6 +300,11 @@ public function generate() } if ($this->defaultValue instanceof ValueGenerator) { + + if ($this->variadic) { + throw new Exception\InvalidArgumentException('Variadic parameter cannot have a default value'); + } + $output .= ' = '; $this->defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE); $output .= $this->defaultValue; diff --git a/test/Generator/ParameterGeneratorTest.php b/test/Generator/ParameterGeneratorTest.php index 84b13913..6c0e0c88 100644 --- a/test/Generator/ParameterGeneratorTest.php +++ b/test/Generator/ParameterGeneratorTest.php @@ -9,6 +9,7 @@ namespace LaminasTest\Code\Generator; use Closure; +use Laminas\Code\Generator\Exception\InvalidArgumentException; use Laminas\Code\Generator\ParameterGenerator; use Laminas\Code\Generator\ValueGenerator; use Laminas\Code\Reflection\ClassReflection; @@ -516,16 +517,34 @@ public function testVariadicArgumentFromReflection( $methodName, $parameterName, $expectedGeneratedSignature - ) { + ): void { $parameter = ParameterGenerator::fromReflection(new ParameterReflection( [$className, $methodName], $parameterName )); self::assertTrue($parameter->getVariadic()); + self::assertNull($parameter->getDefaultValue()); self::assertSame($expectedGeneratedSignature, $parameter->generate()); } + public function testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgumentException(): void + { + $parameter = new ParameterGenerator(); + + $parameter->setName('parameter'); + $parameter->setType('int'); + $parameter->setPosition(1); + $parameter->setVariadic(true); + + $parameter->setDefaultValue([]); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Variadic parameter cannot have a default value'); + + $parameter->generate(); + } + /** * @return string[][] */ From 80972cbc5836a5aa0d227f51dcf0d1f76e7b70e3 Mon Sep 17 00:00:00 2001 From: Michael Chekin Date: Sat, 30 Jan 2021 14:54:11 +0100 Subject: [PATCH 4/7] Removing extra black space Signed-off-by: Michael Chekin --- src/Generator/ParameterGenerator.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Generator/ParameterGenerator.php b/src/Generator/ParameterGenerator.php index 169c87ac..9008126a 100644 --- a/src/Generator/ParameterGenerator.php +++ b/src/Generator/ParameterGenerator.php @@ -300,7 +300,6 @@ public function generate() } if ($this->defaultValue instanceof ValueGenerator) { - if ($this->variadic) { throw new Exception\InvalidArgumentException('Variadic parameter cannot have a default value'); } From 610be1823f828253048caa68c2539a0794892584 Mon Sep 17 00:00:00 2001 From: Michael Chekin Date: Sat, 30 Jan 2021 15:06:18 +0100 Subject: [PATCH 5/7] Moving ParameterGeneratorTest::testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgumentException Signed-off-by: Michael Chekin --- test/Generator/ParameterGeneratorTest.php | 36 +++++++++++------------ 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/test/Generator/ParameterGeneratorTest.php b/test/Generator/ParameterGeneratorTest.php index 6c0e0c88..5640b9dc 100644 --- a/test/Generator/ParameterGeneratorTest.php +++ b/test/Generator/ParameterGeneratorTest.php @@ -524,27 +524,10 @@ public function testVariadicArgumentFromReflection( )); self::assertTrue($parameter->getVariadic()); - self::assertNull($parameter->getDefaultValue()); + self::assertTrue($parameter->isOptional()); self::assertSame($expectedGeneratedSignature, $parameter->generate()); } - public function testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgumentException(): void - { - $parameter = new ParameterGenerator(); - - $parameter->setName('parameter'); - $parameter->setType('int'); - $parameter->setPosition(1); - $parameter->setVariadic(true); - - $parameter->setDefaultValue([]); - - $this->expectException(InvalidArgumentException::class); - $this->expectExceptionMessage('Variadic parameter cannot have a default value'); - - $parameter->generate(); - } - /** * @return string[][] */ @@ -595,6 +578,23 @@ public function testSetGetVariadic() self::assertSame('$foo', $parameter->generate()); } + public function testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgumentException(): void + { + $parameter = new ParameterGenerator(); + + $parameter->setName('parameter'); + $parameter->setType('int'); + $parameter->setPosition(1); + $parameter->setVariadic(true); + + $parameter->setDefaultValue([]); + + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Variadic parameter cannot have a default value'); + + $parameter->generate(); + } + /** * @group zendframework/zend-code#29 */ From 91151f850d99437e1336cbda8f39d1cbf69584ce Mon Sep 17 00:00:00 2001 From: Michael Chekin Date: Sat, 30 Jan 2021 15:08:42 +0100 Subject: [PATCH 6/7] Removing extra code which fails Signed-off-by: Michael Chekin --- test/Generator/ParameterGeneratorTest.php | 1 - 1 file changed, 1 deletion(-) diff --git a/test/Generator/ParameterGeneratorTest.php b/test/Generator/ParameterGeneratorTest.php index 5640b9dc..91240412 100644 --- a/test/Generator/ParameterGeneratorTest.php +++ b/test/Generator/ParameterGeneratorTest.php @@ -524,7 +524,6 @@ public function testVariadicArgumentFromReflection( )); self::assertTrue($parameter->getVariadic()); - self::assertTrue($parameter->isOptional()); self::assertSame($expectedGeneratedSignature, $parameter->generate()); } From d031130dce896f2c155813ee1edeaaf94be84a99 Mon Sep 17 00:00:00 2001 From: Michael Chekin Date: Tue, 30 Mar 2021 12:35:15 +0200 Subject: [PATCH 7/7] Preventing variadic parameter with default value in a setters instead of during the parameter generation. Signed-off-by: Michael Chekin --- src/Generator/ParameterGenerator.php | 12 ++++++++---- test/Generator/ParameterGeneratorTest.php | 18 ++++++++++++++++-- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/Generator/ParameterGenerator.php b/src/Generator/ParameterGenerator.php index 9008126a..ffce6147 100644 --- a/src/Generator/ParameterGenerator.php +++ b/src/Generator/ParameterGenerator.php @@ -207,6 +207,10 @@ public function getName() */ public function setDefaultValue($defaultValue) { + if ($this->variadic) { + throw new Exception\InvalidArgumentException('Variadic parameter cannot have a default value'); + } + if (! $defaultValue instanceof ValueGenerator) { $defaultValue = new ValueGenerator($defaultValue); } @@ -265,6 +269,10 @@ public function setPassedByReference($passedByReference) */ public function setVariadic($variadic) { + if (isset($this->defaultValue)) { + throw new Exception\InvalidArgumentException('Variadic parameter cannot have a default value'); + } + $this->variadic = (bool) $variadic; return $this; @@ -300,10 +308,6 @@ public function generate() } if ($this->defaultValue instanceof ValueGenerator) { - if ($this->variadic) { - throw new Exception\InvalidArgumentException('Variadic parameter cannot have a default value'); - } - $output .= ' = '; $this->defaultValue->setOutputMode(ValueGenerator::OUTPUT_SINGLE_LINE); $output .= $this->defaultValue; diff --git a/test/Generator/ParameterGeneratorTest.php b/test/Generator/ParameterGeneratorTest.php index 91240412..8dad9d3c 100644 --- a/test/Generator/ParameterGeneratorTest.php +++ b/test/Generator/ParameterGeneratorTest.php @@ -577,7 +577,7 @@ public function testSetGetVariadic() self::assertSame('$foo', $parameter->generate()); } - public function testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgumentException(): void + public function testAssigningDefaultValueToVariadicParameterThrowsInvalidArgumentException(): void { $parameter = new ParameterGenerator(); @@ -586,12 +586,26 @@ public function testGeneratingVariadicParameterWithDefaultValueThrowsInvalidArgu $parameter->setPosition(1); $parameter->setVariadic(true); + $this->expectException(InvalidArgumentException::class); + $this->expectExceptionMessage('Variadic parameter cannot have a default value'); + + $parameter->setDefaultValue([]); + } + + public function testMakingParameterVariadicWithExistingDefaultValueThrowsInvalidArgumentException(): void + { + $parameter = new ParameterGenerator(); + + $parameter->setName('parameter'); + $parameter->setType('int'); + $parameter->setPosition(1); + $parameter->setDefaultValue([]); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Variadic parameter cannot have a default value'); - $parameter->generate(); + $parameter->setVariadic(true); } /**