Skip to content

Commit 2dce4b2

Browse files
committed
[type-declaration-docblocks] Add AddParamArrayDocblockFromDimFetchAccessRector
1 parent 92708a1 commit 2dce4b2

12 files changed

Lines changed: 375 additions & 16 deletions

File tree

config/set/php85.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
ChrArgModuloRector::class,
4343
SleepToSerializeRector::class,
4444
OrdSingleByteRector::class,
45-
WakeupToUnserializeRector::class
45+
WakeupToUnserializeRector::class,
4646
]
4747
);
4848

config/set/type-declaration-docblocks.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
use Rector\TypeDeclaration\Rector\ClassMethod\AddReturnArrayDocblockBasedOnArrayMapRector;
77
use Rector\TypeDeclaration\Rector\ClassMethod\AddReturnDocblockForScalarArrayFromAssignsRector;
88
use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarFromParamDocblockInConstructorRector;
9+
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector;
910
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddReturnDocblockForCommonObjectDenominatorRector;
1011
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\DocblockGetterReturnArrayFromPropertyDocblockVarRector;
1112

@@ -20,5 +21,6 @@
2021
DocblockVarFromParamDocblockInConstructorRector::class,
2122
DocblockGetterReturnArrayFromPropertyDocblockVarRector::class,
2223
AddReturnDocblockForCommonObjectDenominatorRector::class,
24+
AddParamArrayDocblockFromDimFetchAccessRector::class,
2325
]);
2426
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector;
6+
7+
use Iterator;
8+
use PHPUnit\Framework\Attributes\DataProvider;
9+
use Rector\Testing\PHPUnit\AbstractRectorTestCase;
10+
11+
final class AddParamArrayDocblockFromDimFetchAccessRectorTest extends AbstractRectorTestCase
12+
{
13+
#[DataProvider('provideData')]
14+
public function test(string $filePath): void
15+
{
16+
$this->doTestFile($filePath);
17+
}
18+
19+
public static function provideData(): Iterator
20+
{
21+
return self::yieldFilesFromDirectory(__DIR__ . '/Fixture');
22+
}
23+
24+
public function provideConfigFilePath(): string
25+
{
26+
return __DIR__ . '/config/configured_rule.php';
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
4+
5+
final class IntKeys
6+
{
7+
public function process(array $data): void
8+
{
9+
$item = $data[55];
10+
11+
$anotherItem = $data[132];
12+
}
13+
}
14+
15+
?>
16+
-----
17+
<?php
18+
19+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
20+
21+
final class IntKeys
22+
{
23+
/**
24+
* @param array<int, mixed> $data
25+
*/
26+
public function process(array $data): void
27+
{
28+
$item = $data[55];
29+
30+
$anotherItem = $data[132];
31+
}
32+
}
33+
34+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
4+
5+
final class ParamArray
6+
{
7+
public function process(array $data): void
8+
{
9+
$item = $data['key'];
10+
11+
$anotherItem = $data['another_key'];
12+
}
13+
}
14+
15+
?>
16+
-----
17+
<?php
18+
19+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
20+
21+
final class ParamArray
22+
{
23+
/**
24+
* @param array<string, mixed> $data
25+
*/
26+
public function process(array $data): void
27+
{
28+
$item = $data['key'];
29+
30+
$anotherItem = $data['another_key'];
31+
}
32+
}
33+
34+
?>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
4+
5+
final class SkipMixed
6+
{
7+
public function process(array $data, int|string $key): void
8+
{
9+
$item = $data[$key];
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
<?php
2+
3+
namespace Rector\Tests\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector\Fixture;
4+
5+
final class SkipNoAccess
6+
{
7+
public function process(array $data): void
8+
{
9+
$data[] = '111';
10+
}
11+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
use Rector\Config\RectorConfig;
6+
use Rector\TypeDeclarationDocblocks\Rector\ClassMethod\AddParamArrayDocblockFromDimFetchAccessRector;
7+
8+
return RectorConfig::configure()
9+
->withRules([AddParamArrayDocblockFromDimFetchAccessRector::class]);

rules/Php85/Rector/Class_/WakeupToUnserializeRector.php

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
namespace Rector\Php85\Rector\Class_;
66

77
use PhpParser\Node;
8+
use PhpParser\Node\Arg;
89
use PhpParser\Node\Expr\Assign;
910
use PhpParser\Node\Expr\FuncCall;
1011
use PhpParser\Node\Expr\PropertyFetch;
@@ -86,46 +87,43 @@ public function refactor(Node $node): ?Node
8687
if (! $classMethod instanceof ClassMethod) {
8788
return null;
8889
}
89-
90+
9091
$classMethod->name = new Identifier('__unserialize');
9192
$classMethod->returnType = new Identifier('void');
92-
$param = new Param(
93-
var: new Variable('data'),
94-
type: new Identifier('array')
95-
);
93+
94+
$param = new Param(var: new Variable('data'), type: new Identifier('array'));
9695

9796
$classMethod->params[] = $param;
9897

9998
$classMethod->stmts = [$this->assignProperties()];
100-
99+
101100
return $node;
102101
}
103102

104-
protected function assignProperties(): Foreach_{
103+
private function assignProperties(): Foreach_
104+
{
105105
$assign = new Assign(
106106
new PropertyFetch(new Variable('this'), new Variable('property')),
107107
new Variable('value')
108108
);
109109

110110
$if = new If_(
111111
new FuncCall(new Name('property_exists'), [
112-
new Node\Arg(new Variable('this')),
113-
new Node\Arg(new Variable('property')),
112+
new Arg(new Variable('this')),
113+
new Arg(new Variable('property')),
114114
]),
115115
[
116116
'stmts' => [new Expression($assign)],
117117
]
118118
);
119119

120-
$foreach = new Foreach_(
120+
return new Foreach_(
121121
new Variable('data'),
122122
new Variable('value'),
123123
[
124124
'keyVar' => new Variable('property'),
125-
'stmts' => [$if],
125+
'stmts' => [$if],
126126
]
127127
);
128-
129-
return $foreach;
130128
}
131129
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Rector\TypeDeclarationDocblocks\NodeFinder;
6+
7+
use PhpParser\Node;
8+
use PhpParser\Node\Expr\ArrayDimFetch;
9+
use PhpParser\Node\Expr\Variable;
10+
use Rector\NodeNameResolver\NodeNameResolver;
11+
use Rector\PhpParser\Node\BetterNodeFinder;
12+
13+
final readonly class DimFetchFinder
14+
{
15+
public function __construct(
16+
private BetterNodeFinder $betterNodeFinder,
17+
private NodeNameResolver $nodeNameResolver
18+
) {
19+
}
20+
21+
/**
22+
* @return ArrayDimFetch[]
23+
*/
24+
public function findByVariableName(Node $node, string $variableName): array
25+
{
26+
$dimFetches = $this->betterNodeFinder->findInstancesOfScoped([$node], ArrayDimFetch::class);
27+
28+
return array_filter($dimFetches, function (ArrayDimFetch $arrayDimFetch) use ($variableName): bool {
29+
if (! $arrayDimFetch->var instanceof Variable) {
30+
return false;
31+
}
32+
33+
return $this->nodeNameResolver->isName($arrayDimFetch->var, $variableName);
34+
});
35+
}
36+
}

0 commit comments

Comments
 (0)