Skip to content

Commit 34bd36d

Browse files
Skip named arguments when adding, modifying or removing parameters
1 parent 2e1e9cc commit 34bd36d

7 files changed

Lines changed: 81 additions & 2 deletions

File tree

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
namespace Rector\Tests\Arguments\Rector\ClassMethod\ArgumentAdderRector\Fixture;
4+
5+
use Rector\Tests\Arguments\Rector\ClassMethod\ArgumentAdderRector\Source\SomeMultiArg;
6+
7+
class SkipNamedArguments
8+
{
9+
public function run()
10+
{
11+
$obj = new SomeMultiArg();
12+
$obj->run(b: 5);
13+
$obj->run(c: 4);
14+
$obj->run(0, 1, c: 6);
15+
}
16+
}
17+
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Rector\Tests\Arguments\Rector\ClassMethod\ReplaceArgumentDefaultValueRector\Fixture;
4+
5+
use Rector\Tests\Arguments\Rector\ClassMethod\ReplaceArgumentDefaultValueRector\Fixture\ReplaceMethodArgumentWithConstant;
6+
7+
class SkipNamedArguments
8+
{
9+
public function run()
10+
{
11+
$obj = new ReplaceMethodArgumentWithConstant();
12+
$obj->setSomeMethod(someValue: 'some value');
13+
}
14+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
namespace Rector\Tests\Arguments\Rector\FuncCall\FunctionArgumentDefaultValueReplacerRector\Fixture;
4+
5+
class SkipNamedArguments
6+
{
7+
public function run()
8+
{
9+
version_compare(version1: '5.6', version2: PHP_VERSION, operator: 'lte');
10+
version_compare('5.6', PHP_VERSION, operator: 'lte');
11+
}
12+
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
namespace Rector\Tests\Arguments\Rector\MethodCall\RemoveMethodCallParamRector\Fixture;
4+
5+
use Rector\Tests\Arguments\Rector\MethodCall\RemoveMethodCallParamRector\Source\MethodCaller;
6+
7+
final class SkipNamedArguments
8+
{
9+
public function run(MethodCaller $caller)
10+
{
11+
$caller->process(first: 1, second: 2);
12+
$caller->process(1, second: 2);
13+
}
14+
}

rules/Arguments/ArgumentDefaultValueReplacer.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@
1515
use PhpParser\Node\Stmt\ClassMethod;
1616
use Rector\Arguments\Contract\ReplaceArgumentDefaultValueInterface;
1717
use Rector\Arguments\ValueObject\ReplaceArgumentDefaultValue;
18+
use Rector\NodeAnalyzer\ArgsAnalyzer;
1819
use Rector\PhpParser\Node\NodeFactory;
1920
use Rector\PhpParser\Node\Value\ValueResolver;
2021

2122
final readonly class ArgumentDefaultValueReplacer
2223
{
2324
public function __construct(
2425
private NodeFactory $nodeFactory,
25-
private ValueResolver $valueResolver
26+
private ValueResolver $valueResolver,
27+
private ArgsAnalyzer $argsAnalyzer
2628
) {
2729
}
2830

@@ -101,6 +103,10 @@ private function processArgs(
101103
return null;
102104
}
103105

106+
if ($this->argsAnalyzer->hasNamedArg($expr->getArgs())) {
107+
return null;
108+
}
109+
104110
$position = $replaceArgumentDefaultValue->getPosition();
105111
$particularArg = $expr->getArgs()[$position] ?? null;
106112
if (! $particularArg instanceof Arg) {

rules/Arguments/Rector/ClassMethod/ArgumentAdderRector.php

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
use Rector\Contract\Rector\ConfigurableRectorInterface;
2525
use Rector\Enum\ObjectReference;
2626
use Rector\Exception\ShouldNotHappenException;
27+
use Rector\NodeAnalyzer\ArgsAnalyzer;
2728
use Rector\PhpParser\AstResolver;
2829
use Rector\PHPStanStaticTypeMapper\Enum\TypeKind;
2930
use Rector\Rector\AbstractRector;
@@ -48,7 +49,8 @@ public function __construct(
4849
private readonly ArgumentAddingScope $argumentAddingScope,
4950
private readonly ChangedArgumentsDetector $changedArgumentsDetector,
5051
private readonly AstResolver $astResolver,
51-
private readonly StaticTypeMapper $staticTypeMapper
52+
private readonly StaticTypeMapper $staticTypeMapper,
53+
private readonly ArgsAnalyzer $argsAnalyzer
5254
) {
5355
}
5456

@@ -249,6 +251,10 @@ private function shouldSkipParameter(
249251
return $this->changedArgumentsDetector->isTypeChanged($param, $argumentAdder->getArgumentType());
250252
}
251253

254+
if ($this->argsAnalyzer->hasNamedArg($node->getArgs())) {
255+
return true;
256+
}
257+
252258
if (isset($node->args[$position])) {
253259
return true;
254260
}

rules/Arguments/Rector/MethodCall/RemoveMethodCallParamRector.php

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
use PhpParser\Node\Expr\StaticCall;
1010
use Rector\Arguments\ValueObject\RemoveMethodCallParam;
1111
use Rector\Contract\Rector\ConfigurableRectorInterface;
12+
use Rector\NodeAnalyzer\ArgsAnalyzer;
1213
use Rector\Rector\AbstractRector;
1314
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
1415
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@@ -25,6 +26,11 @@ final class RemoveMethodCallParamRector extends AbstractRector implements Config
2526
*/
2627
private array $removeMethodCallParams = [];
2728

29+
public function __construct(
30+
private readonly ArgsAnalyzer $argsAnalyzer,
31+
) {
32+
}
33+
2834
public function getRuleDefinition(): RuleDefinition
2935
{
3036
return new RuleDefinition('Remove parameter of method call', [
@@ -73,6 +79,10 @@ public function refactor(Node $node): ?Node
7379
return null;
7480
}
7581

82+
if ($this->argsAnalyzer->hasNamedArg($node->getArgs())) {
83+
return null;
84+
}
85+
7686
foreach ($this->removeMethodCallParams as $removeMethodCallParam) {
7787
if (! $this->isName($node->name, $removeMethodCallParam->getMethodName())) {
7888
continue;

0 commit comments

Comments
 (0)