diff --git a/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/skip_named_argument_position_not_match.php.inc b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/skip_named_argument_position_not_match.php.inc new file mode 100644 index 00000000000..76ab5f89e5b --- /dev/null +++ b/rules-tests/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector/Fixture/skip_named_argument_position_not_match.php.inc @@ -0,0 +1,15 @@ + +----- + diff --git a/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php b/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php index 20107ced2d4..47f7a23a51b 100644 --- a/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php +++ b/rules/DeadCode/NodeAnalyzer/CallLikeParamDefaultResolver.php @@ -42,4 +42,21 @@ public function resolveNullPositions(MethodCall|StaticCall|New_ $callLike): arra return $nullPositions; } + + public function resolvePositionParameterByName(MethodCall|StaticCall|New_ $callLike, string $parameterName): ?int + { + $methodReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($callLike); + if (! $methodReflection instanceof MethodReflection) { + return null; + } + + $extendedParametersAcceptor = ParametersAcceptorSelector::combineAcceptors($methodReflection->getVariants()); + foreach ($extendedParametersAcceptor->getParameters() as $position => $extendedParameterReflection) { + if ($extendedParameterReflection->getName() === $parameterName) { + return $position; + } + } + + return null; + } } diff --git a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php index ccbf86dcd15..f8cc84bd9d3 100644 --- a/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php +++ b/rules/DeadCode/Rector/MethodCall/RemoveNullArgOnNullDefaultParamRector.php @@ -8,6 +8,7 @@ use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\New_; use PhpParser\Node\Expr\StaticCall; +use PhpParser\Node\Identifier; use Rector\DeadCode\NodeAnalyzer\CallLikeParamDefaultResolver; use Rector\PhpParser\Node\Value\ValueResolver; use Rector\Rector\AbstractRector; @@ -90,7 +91,7 @@ public function refactor(Node $node): StaticCall|MethodCall|New_|null $args = $node->getArgs(); $lastArgPosition = count($args) - 1; - for ($position = $lastArgPosition; $position >=0; --$position) { + for ($position = $lastArgPosition; $position >= 0; --$position) { if (! isset($args[$position])) { continue; } @@ -100,8 +101,12 @@ public function refactor(Node $node): StaticCall|MethodCall|New_|null break; } - // skip named args - if ($arg->name instanceof Node) { + // stop when found named arg and position not match + if ($arg->name instanceof Identifier && + $position !== $this->callLikeParamDefaultResolver->resolvePositionParameterByName( + $node, + $arg->name->toString() + )) { break; } diff --git a/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php b/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php index 22b186da18b..2e45044d7e0 100644 --- a/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php +++ b/rules/Transform/Rector/Assign/PropertyAssignToMethodCallRector.php @@ -4,11 +4,11 @@ namespace Rector\Transform\Rector\Assign; -use Rector\Exception\ShouldNotHappenException; use PhpParser\Node; use PhpParser\Node\Expr\Assign; use Rector\Configuration\Deprecation\Contract\DeprecatedInterface; use Rector\Contract\Rector\ConfigurableRectorInterface; +use Rector\Exception\ShouldNotHappenException; use Rector\Rector\AbstractRector; use Rector\Transform\ValueObject\PropertyAssignToMethodCall; use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;