diff --git a/ecs.yaml b/ecs.yaml index 397b418a9699..9949ec7cea51 100644 --- a/ecs.yaml +++ b/ecs.yaml @@ -87,6 +87,7 @@ parameters: - 'src/Rector/Annotation/RenameAnnotationRector.php' - 'packages/NetteToSymfony/src/Event/EventInfosFactory.php' - 'packages/NetteTesterToPHPUnit/src/AssertManipulator.php' + - 'src/PhpParser/Node/Manipulator/CallManipulator.php' Symplify\CodingStandard\Sniffs\CleanCode\ForbiddenStaticFunctionSniff: - 'src/Util/*.php' diff --git a/packages/Php/tests/Rector/FuncCall/RemoveExtraParametersRector/Fixture/skip_invoke.php.inc b/packages/Php/tests/Rector/FuncCall/RemoveExtraParametersRector/Fixture/skip_invoke.php.inc new file mode 100644 index 000000000000..341cee64ad6e --- /dev/null +++ b/packages/Php/tests/Rector/FuncCall/RemoveExtraParametersRector/Fixture/skip_invoke.php.inc @@ -0,0 +1,16 @@ +getMethod('getSetItems'); + + $method->invoke($traitMock, 'some-param', 4, 5, 6); + } +} diff --git a/packages/Php/tests/Rector/FuncCall/RemoveExtraParametersRector/RemoveExtraParametersRectorTest.php b/packages/Php/tests/Rector/FuncCall/RemoveExtraParametersRector/RemoveExtraParametersRectorTest.php index 1defae478e36..ff3c3730e4ce 100644 --- a/packages/Php/tests/Rector/FuncCall/RemoveExtraParametersRector/RemoveExtraParametersRectorTest.php +++ b/packages/Php/tests/Rector/FuncCall/RemoveExtraParametersRector/RemoveExtraParametersRectorTest.php @@ -19,6 +19,7 @@ public function test(): void __DIR__ . '/Fixture/static_call_parent.php.inc', __DIR__ . '/Fixture/skip_commented_param_func_get_args.php.inc', __DIR__ . '/Fixture/skip_call_user_func_array.php.inc', + __DIR__ . '/Fixture/skip_invoke.php.inc', ]); } diff --git a/src/PhpParser/Node/Manipulator/CallManipulator.php b/src/PhpParser/Node/Manipulator/CallManipulator.php index 2f629d706c24..a7f8019871ae 100644 --- a/src/PhpParser/Node/Manipulator/CallManipulator.php +++ b/src/PhpParser/Node/Manipulator/CallManipulator.php @@ -78,6 +78,10 @@ public function isVariadic(ReflectionFunctionAbstract $reflectionFunctionAbstrac return true; } + if ($this->isVariadicByName($reflectionFunctionAbstract)) { + return true; + } + if ($reflectionFunctionAbstract instanceof ReflectionFunction) { $functionNode = $this->parsedNodesByType->findFunction($reflectionFunctionAbstract->getName()); if ($functionNode === null) { @@ -160,4 +164,20 @@ private function resolveMotherType(Node $callNode): string { return $callNode instanceof FuncCall ? Function_::class : ClassMethod::class; } + + /** + * native PHP bug fix + */ + private function isVariadicByName(ReflectionFunctionAbstract $reflectionFunctionAbstract): bool + { + if (! $reflectionFunctionAbstract instanceof ReflectionMethod) { + return false; + } + + if ($reflectionFunctionAbstract->getDeclaringClass()->getName() !== 'ReflectionMethod') { + return false; + } + + return $reflectionFunctionAbstract->getName() === 'invoke'; + } }