Skip to content

Commit 966cfd9

Browse files
authored
Cover named args in ClassMethodArrayDocblockParamFromLocalCallsRector (#7357)
* named args * cover named args in ClassMethodArrayDocblockParamFromLocalCallsRector * add flipped fixture
1 parent 7ecd72d commit 966cfd9

4 files changed

Lines changed: 88 additions & 9 deletions

File tree

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\ClassMethodArrayDocblockParamFromLocalCallsRector\Fixture\NamedArgs;
4+
5+
final class FlippedArgs
6+
{
7+
public function go()
8+
{
9+
$this->run(names: ['John', 'Doe'], items: [123, 456]);
10+
}
11+
12+
private function run(array $items, array $names)
13+
{
14+
}
15+
}
16+
17+
?>
18+
-----
19+
<?php
20+
21+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\ClassMethodArrayDocblockParamFromLocalCallsRector\Fixture\NamedArgs;
22+
23+
final class FlippedArgs
24+
{
25+
public function go()
26+
{
27+
$this->run(names: ['John', 'Doe'], items: [123, 456]);
28+
}
29+
30+
/**
31+
* @param int[] $items
32+
* @param string[] $names
33+
*/
34+
private function run(array $items, array $names)
35+
{
36+
}
37+
}
38+
39+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\ClassMethodArrayDocblockParamFromLocalCallsRector\Fixture\NamedArgs;
4+
5+
final class CoverMixedAndKnown
6+
{
7+
public function go()
8+
{
9+
$this->run(items: ['item1', 'item2']);
10+
}
11+
12+
private function run(array $items)
13+
{
14+
}
15+
}
16+
17+
?>
18+
-----
19+
<?php
20+
21+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\ClassMethodArrayDocblockParamFromLocalCallsRector\Fixture\NamedArgs;
22+
23+
final class CoverMixedAndKnown
24+
{
25+
public function go()
26+
{
27+
$this->run(items: ['item1', 'item2']);
28+
}
29+
30+
/**
31+
* @param string[] $items
32+
*/
33+
private function run(array $items)
34+
{
35+
}
36+
}
37+
38+
?>

rules/TypeDeclaration/NodeAnalyzer/CallTypesResolver.php

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ public function resolveStrictTypesFromCalls(array $calls): array
5858

5959
/**
6060
* @param MethodCall[]|StaticCall[] $calls
61-
* @return array<int, Type>
61+
* @return array<int|string, Type>
6262
*/
6363
public function resolveTypesFromCalls(array $calls): array
6464
{
@@ -67,7 +67,7 @@ public function resolveTypesFromCalls(array $calls): array
6767
foreach ($calls as $call) {
6868
foreach ($call->args as $position => $arg) {
6969
if ($this->shouldSkipArg($arg)) {
70-
return [];
70+
continue;
7171
}
7272

7373
/** @var Arg $arg */
@@ -76,7 +76,13 @@ public function resolveTypesFromCalls(array $calls): array
7676
continue;
7777
}
7878

79-
$staticTypesByArgumentPosition[$position][] = $this->resolveArgValueType($arg);
79+
if ($arg->name instanceof Identifier) {
80+
$positionOrName = $arg->name->toString();
81+
} else {
82+
$positionOrName = $position;
83+
}
84+
85+
$staticTypesByArgumentPosition[$positionOrName][] = $this->resolveArgValueType($arg);
8086
}
8187
}
8288

@@ -206,11 +212,7 @@ private function shouldSkipArg(Arg|VariadicPlaceholder $arg): bool
206212
return true;
207213
}
208214

209-
if ($arg->unpack) {
210-
return true;
211-
}
212-
213-
return $arg->name instanceof Identifier;
215+
return $arg->unpack;
214216
}
215217

216218
private function isEmptyArray(Expr $expr): bool

rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ public function refactor(Node $node): ?Node
107107
continue;
108108
}
109109

110-
$resolvedParameterType = $classMethodParameterTypes[$parameterPosition] ?? null;
110+
$resolvedParameterType = $classMethodParameterTypes[$parameterPosition] ?? $classMethodParameterTypes[$parameterName] ?? null;
111111
if (! $resolvedParameterType instanceof Type) {
112112
continue;
113113
}

0 commit comments

Comments
 (0)