From 938e72302b95d9f07f4d97e424849af6ebd70dc1 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 24 Oct 2025 21:55:33 +0700 Subject: [PATCH 1/7] [DeadCode] Allow FuncCall on RemoveNullArgOnNullDefaultParamRector --- .../Fixture/with_function_call.php.inc | 35 +++++++++++++++++++ .../Source/SomeFunctionWithDefaultNullArg.php | 7 ++++ .../CallLikeParamDefaultResolver.php | 5 +-- .../RemoveNullArgOnNullDefaultParamRector.php | 7 ++-- 4 files changed, 49 insertions(+), 5 deletions(-) create mode 100644 rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc create mode 100644 rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php diff --git a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc new file mode 100644 index 00000000000..296cecd7666 --- /dev/null +++ b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc @@ -0,0 +1,35 @@ + +----- + diff --git a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php new file mode 100644 index 00000000000..99ac5ad2205 --- /dev/null +++ b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php @@ -0,0 +1,7 @@ +reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); if (! $methodReflection instanceof MethodReflection) { @@ -43,7 +44,7 @@ public function resolveNullPositions(MethodCall|StaticCall|New_ $callLike): arra return $nullPositions; } - public function resolvePositionParameterByName(MethodCall|StaticCall|New_ $callLike, string $parameterName): ?int + public function resolvePositionParameterByName(MethodCall|StaticCall|New_|FuncCall $callLike, string $parameterName): ?int { $methodReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); if (! $methodReflection instanceof MethodReflection) { diff --git a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php index f8cc84bd9d3..400e4eb0ae9 100644 --- a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php +++ b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php @@ -5,6 +5,7 @@ namespace Rector\DeadCode\Rector\MethodCall; use PhpParser\Node; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\StaticCall; @@ -71,13 +72,13 @@ public function execute(?SomeClass $someClass = null) public function getNodeTypes(): array { - return [MethodCall::class, StaticCall::class, New_::class]; + return [MethodCall::class, StaticCall::class, New_::class, FuncCall::class]; } /** - * @param MethodCall|StaticCall|New_ $node + * @param MethodCall|StaticCall|New_|FuncCall $node */ - public function refactor(Node $node): StaticCall|MethodCall|New_|null + public function refactor(Node $node): StaticCall|MethodCall|New_|FuncCall|null { if ($node->isFirstClassCallable()) { return null; From 9a5cb6a83cb6b1dd84780e6ac7159e7c9343778a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 24 Oct 2025 21:56:09 +0700 Subject: [PATCH 2/7] update fixture --- .../Fixture/with_function_call.php.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc index 296cecd7666..f43057d7e0e 100644 --- a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc +++ b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc @@ -28,7 +28,7 @@ class WithFunctionCall { public function get() { - SomeFunctionWithDefaultNullArg(null); + SomeFunctionWithDefaultNullArg(); } } From f57b1d5e0a3db5bcbedb4e4fa57852b8c4f35e7a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 24 Oct 2025 22:05:17 +0700 Subject: [PATCH 3/7] implemetned --- .../Fixture/with_function_call.php.inc | 8 ++++++-- .../Source/SomeFunctionWithDefaultNullArg.php | 7 ------- .../NodeAnalyzer/CallLikeParamDefaultResolver.php | 12 ++++++------ 3 files changed, 12 insertions(+), 15 deletions(-) delete mode 100644 rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php diff --git a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc index f43057d7e0e..afbcd0981ac 100644 --- a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc +++ b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc @@ -4,7 +4,9 @@ declare(strict_types=1); namespace Rector\Tests\DeadCode\Rector\MethodCall\RemoveNullArgOnNullDefaultParamRector\Fixture; -use function Rector\Tests\DeadCode\Rector\MethodCall\RemoveNullArgOnNullDefaultParamRector\Source\SomeFunctionWithDefaultNullArg; +function SomeFunctionWithDefaultNullArg(?string $someClass = null) +{ +} class WithFunctionCall { @@ -22,7 +24,9 @@ declare(strict_types=1); namespace Rector\Tests\DeadCode\Rector\MethodCall\RemoveNullArgOnNullDefaultParamRector\Fixture; -use function Rector\Tests\DeadCode\Rector\MethodCall\RemoveNullArgOnNullDefaultParamRector\Source\SomeFunctionWithDefaultNullArg; +function SomeFunctionWithDefaultNullArg(?string $someClass = null) +{ +} class WithFunctionCall { diff --git a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php deleted file mode 100644 index 99ac5ad2205..00000000000 --- a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Source/SomeFunctionWithDefaultNullArg.php +++ /dev/null @@ -1,7 +0,0 @@ -reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); - if (! $methodReflection instanceof MethodReflection) { + $reflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); + if (! $reflection instanceof MethodReflection && ! $reflection instanceof \PHPStan\Reflection\FunctionReflection) { return []; } $nullPositions = []; - $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($methodReflection->getVariants()); + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($reflection->getVariants()); foreach ($extendedParametersAcceptor->getParameters() as $position => $extendedParameterReflection) { if (! $extendedParameterReflection->getDefaultValue() instanceof NullType) { continue; @@ -46,12 +46,12 @@ public function resolveNullPositions(MethodCall|StaticCall|New_|FuncCall $callLi public function resolvePositionParameterByName(MethodCall|StaticCall|New_|FuncCall $callLike, string $parameterName): ?int { - $methodReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); - if (! $methodReflection instanceof MethodReflection) { + $reflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); + if (! $reflection instanceof MethodReflection && ! $reflection instanceof \PHPStan\Reflection\FunctionReflection) { return null; } - $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($methodReflection->getVariants()); + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($reflection->getVariants()); foreach ($extendedParametersAcceptor->getParameters() as $position => $extendedParameterReflection) { if ($extendedParameterReflection->getName() === $parameterName) { return $position; From a6984f3010a5b4d61788dc40f78e8f2f5b483d74 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 24 Oct 2025 22:05:57 +0700 Subject: [PATCH 4/7] implemetned --- .../Fixture/with_function_call.php.inc | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc index afbcd0981ac..c8c068ea12f 100644 --- a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc +++ b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/with_function_call.php.inc @@ -8,13 +8,7 @@ function SomeFunctionWithDefaultNullArg(?string $someClass = null) { } -class WithFunctionCall -{ - public function get() - { - SomeFunctionWithDefaultNullArg(null); - } -} +SomeFunctionWithDefaultNullArg(null); ?> ----- @@ -28,12 +22,6 @@ function SomeFunctionWithDefaultNullArg(?string $someClass = null) { } -class WithFunctionCall -{ - public function get() - { - SomeFunctionWithDefaultNullArg(); - } -} +SomeFunctionWithDefaultNullArg(); ?> From 3525e0f9710c601c7d3551e9760b58a9b9f6830f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 24 Oct 2025 22:06:34 +0700 Subject: [PATCH 5/7] implemetned --- .../MethodCall/RemoveNullArgOnNullDefaultParamRector.php | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php index 400e4eb0ae9..6dcb0e76f75 100644 --- a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php +++ b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php @@ -92,6 +92,8 @@ public function refactor(Node $node): StaticCall|MethodCall|New_|FuncCall|null $args = $node->getArgs(); $lastArgPosition = count($args) - 1; + $nullPositions = $this->callLikeParamDefaultResolver->resolveNullPositions($node); + for ($position = $lastArgPosition; $position >= 0; --$position) { if (! isset($args[$position])) { continue; @@ -115,8 +117,7 @@ public function refactor(Node $node): StaticCall|MethodCall|New_|FuncCall|null break; } - $nullPositions = $this->callLikeParamDefaultResolver->resolveNullPositions($node); - if (! in_array($position, $nullPositions)) { + if (! in_array($position, $nullPositions, true)) { break; } From c85a904e24328ca1207bd5dad033817b4268774c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 24 Oct 2025 22:08:04 +0700 Subject: [PATCH 6/7] rectify --- .../NodeAnalyzer/CallLikeParamDefaultResolver.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php b/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php index 7a1236bcf89..c10095efc36 100644 --- a/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php +++ b/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\StaticCall; +use PHPStan\Reflection\FunctionReflection; use PHPStan\Reflection\MethodReflection; use PHPStan\Reflection\ParametersAcceptorSelector; use PHPStan\Type\NullType; @@ -26,7 +27,7 @@ public function __construct( public function resolveNullPositions(MethodCall|StaticCall|New_|FuncCall $callLike): array { $reflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); - if (! $reflection instanceof MethodReflection && ! $reflection instanceof \PHPStan\Reflection\FunctionReflection) { + if (! $reflection instanceof MethodReflection && ! $reflection instanceof FunctionReflection) { return []; } @@ -44,10 +45,12 @@ public function resolveNullPositions(MethodCall|StaticCall|New_|FuncCall $callLi return $nullPositions; } - public function resolvePositionParameterByName(MethodCall|StaticCall|New_|FuncCall $callLike, string $parameterName): ?int - { + public function resolvePositionParameterByName( + MethodCall|StaticCall|New_|FuncCall $callLike, + string $parameterName + ): ?int { $reflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); - if (! $reflection instanceof MethodReflection && ! $reflection instanceof \PHPStan\Reflection\FunctionReflection) { + if (! $reflection instanceof MethodReflection && ! $reflection instanceof FunctionReflection) { return null; } From eba7074c6047fd072339955e232464c5d5724970 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Fri, 24 Oct 2025 22:09:24 +0700 Subject: [PATCH 7/7] rectify --- .../MethodCall/RemoveNullArgOnNullDefaultParamRector.php | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php index 6dcb0e76f75..568a1063eb1 100644 --- a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php +++ b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php @@ -88,12 +88,14 @@ public function refactor(Node $node): StaticCall|MethodCall|New_|FuncCall|null return null; } - $hasChanged = false; + $nullPositions = $this->callLikeParamDefaultResolver->resolveNullPositions($node); + if ($nullPositions === []) { + return null; + } + $hasChanged = false; $args = $node->getArgs(); $lastArgPosition = count($args) - 1; - $nullPositions = $this->callLikeParamDefaultResolver->resolveNullPositions($node); - for ($position = $lastArgPosition; $position >= 0; --$position) { if (! isset($args[$position])) { continue;