Skip to content

Commit 274878f

Browse files
committed
Updated Rector to commit 9548641518f579776d75d5f0a4a1c1ea2cc615a8
rectorphp/rector-src@9548641 [tdd] Add AddVarArrayDocblockFromDimFetchAssignRector (#7801)
1 parent d69a8ed commit 274878f

File tree

11 files changed

+515
-181
lines changed

11 files changed

+515
-181
lines changed

rules/TypeDeclarationDocblocks/NodeFinder/ArrayDimFetchFinder.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,9 @@
77
use PhpParser\Node\Expr;
88
use PhpParser\Node\Expr\ArrayDimFetch;
99
use PhpParser\Node\Expr\Assign;
10+
use PhpParser\Node\Expr\PropertyFetch;
1011
use PhpParser\Node\Expr\Variable;
12+
use PhpParser\Node\Stmt\Class_;
1113
use PhpParser\Node\Stmt\ClassMethod;
1214
use Rector\NodeNameResolver\NodeNameResolver;
1315
use Rector\PhpParser\Node\BetterNodeFinder;
@@ -48,6 +50,36 @@ public function findDimFetchAssignToVariableName(ClassMethod $classMethod, strin
4850
}
4951
return $exprs;
5052
}
53+
/**
54+
* Look for bare assigns, $this->someProperty[] = ...
55+
* @return Expr[]
56+
*/
57+
public function findDimFetchAssignToPropertyName(Class_ $class, string $variableName): array
58+
{
59+
$assigns = $this->betterNodeFinder->findInstancesOfScoped($class->getMethods(), Assign::class);
60+
$exprs = [];
61+
foreach ($assigns as $assign) {
62+
if (!$assign->var instanceof ArrayDimFetch) {
63+
continue;
64+
}
65+
$arrayDimFetch = $assign->var;
66+
if ($arrayDimFetch->dim instanceof Expr) {
67+
continue;
68+
}
69+
if (!$arrayDimFetch->var instanceof PropertyFetch) {
70+
continue;
71+
}
72+
$propertyFetch = $arrayDimFetch->var;
73+
if (!$this->nodeNameResolver->isName($propertyFetch->var, 'this')) {
74+
continue;
75+
}
76+
if (!$this->nodeNameResolver->isName($propertyFetch->name, $variableName)) {
77+
continue;
78+
}
79+
$exprs[] = $assign->expr;
80+
}
81+
return $exprs;
82+
}
5183
/**
5284
* @return ArrayDimFetch[]
5385
*/
Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\TypeDeclarationDocblocks\Rector\Class_;
5+
6+
use PhpParser\Node;
7+
use PhpParser\Node\Identifier;
8+
use PhpParser\Node\Stmt\Class_;
9+
use PhpParser\Node\Stmt\Property;
10+
use PHPStan\Type\ArrayType;
11+
use PHPStan\Type\MixedType;
12+
use PHPStan\Type\UnionType;
13+
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
14+
use Rector\NodeTypeResolver\PHPStan\Type\TypeFactory;
15+
use Rector\Rector\AbstractRector;
16+
use Rector\TypeDeclarationDocblocks\NodeDocblockTypeDecorator;
17+
use Rector\TypeDeclarationDocblocks\NodeFinder\ArrayDimFetchFinder;
18+
use Rector\TypeDeclarationDocblocks\TagNodeAnalyzer\UsefulArrayTagNodeAnalyzer;
19+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
20+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
21+
/**
22+
* @see \Rector\Tests\TypeDeclarationDocblocks\Rector\Class_\AddVarArrayDocblockFromDimFetchAssignRector\AddVarArrayDocblockFromDimFetchAssignRectorTest
23+
*/
24+
final class AddVarArrayDocblockFromDimFetchAssignRector extends AbstractRector
25+
{
26+
/**
27+
* @readonly
28+
*/
29+
private TypeFactory $typeFactory;
30+
/**
31+
* @readonly
32+
*/
33+
private PhpDocInfoFactory $phpDocInfoFactory;
34+
/**
35+
* @readonly
36+
*/
37+
private UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer;
38+
/**
39+
* @readonly
40+
*/
41+
private NodeDocblockTypeDecorator $nodeDocblockTypeDecorator;
42+
/**
43+
* @readonly
44+
*/
45+
private ArrayDimFetchFinder $arrayDimFetchFinder;
46+
public function __construct(TypeFactory $typeFactory, PhpDocInfoFactory $phpDocInfoFactory, UsefulArrayTagNodeAnalyzer $usefulArrayTagNodeAnalyzer, NodeDocblockTypeDecorator $nodeDocblockTypeDecorator, ArrayDimFetchFinder $arrayDimFetchFinder)
47+
{
48+
$this->typeFactory = $typeFactory;
49+
$this->phpDocInfoFactory = $phpDocInfoFactory;
50+
$this->usefulArrayTagNodeAnalyzer = $usefulArrayTagNodeAnalyzer;
51+
$this->nodeDocblockTypeDecorator = $nodeDocblockTypeDecorator;
52+
$this->arrayDimFetchFinder = $arrayDimFetchFinder;
53+
}
54+
public function getRuleDefinition(): RuleDefinition
55+
{
56+
return new RuleDefinition('Add @param array docblock if array_map is used on the parameter', [new CodeSample(<<<'CODE_SAMPLE'
57+
final class SomeClass
58+
{
59+
private array $items = [];
60+
61+
public function run()
62+
{
63+
$this->items[] = [
64+
'name' => 'John',
65+
];
66+
}
67+
}
68+
CODE_SAMPLE
69+
, <<<'CODE_SAMPLE'
70+
final class SomeClass
71+
{
72+
/**
73+
* @var array<array<string, string>>
74+
*/
75+
private array $items = [];
76+
77+
public function run()
78+
{
79+
$this->items[] = [
80+
'name' => 'John',
81+
];
82+
}
83+
}
84+
CODE_SAMPLE
85+
)]);
86+
}
87+
/**
88+
* @return array<class-string<Node>>
89+
*/
90+
public function getNodeTypes(): array
91+
{
92+
return [Class_::class];
93+
}
94+
/**
95+
* @param Class_ $node
96+
*/
97+
public function refactor(Node $node): ?Node
98+
{
99+
$hasChanged = \false;
100+
foreach ($node->getProperties() as $property) {
101+
if (!$this->isPropertyTypeArray($property)) {
102+
continue;
103+
}
104+
$propertyPhpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($property);
105+
if ($this->usefulArrayTagNodeAnalyzer->isUsefulArrayTag($propertyPhpDocInfo->getVarTagValueNode())) {
106+
continue;
107+
}
108+
$propertyName = $this->getName($property);
109+
$assignedExprs = $this->arrayDimFetchFinder->findDimFetchAssignToPropertyName($node, $propertyName);
110+
$assignedExprTypes = [];
111+
foreach ($assignedExprs as $assignedExpr) {
112+
$assignedExprTypes[] = $this->getType($assignedExpr);
113+
}
114+
// nothing to add
115+
if ($assignedExprTypes === []) {
116+
continue;
117+
}
118+
$uniqueGeneralizedUnionTypes = $this->typeFactory->uniquateTypes($assignedExprTypes);
119+
if (count($uniqueGeneralizedUnionTypes) > 1) {
120+
$generalizedUnionedTypes = new UnionType($uniqueGeneralizedUnionTypes);
121+
} else {
122+
$generalizedUnionedTypes = $uniqueGeneralizedUnionTypes[0];
123+
}
124+
$arrayReturnType = new ArrayType(new MixedType(), $generalizedUnionedTypes);
125+
$hasPropertyChanged = $this->nodeDocblockTypeDecorator->decorateGenericIterableVarType($arrayReturnType, $propertyPhpDocInfo, $property);
126+
if ($hasPropertyChanged === \false) {
127+
continue;
128+
}
129+
$hasChanged = \true;
130+
}
131+
if (!$hasChanged) {
132+
return null;
133+
}
134+
return $node;
135+
}
136+
private function isPropertyTypeArray(Property $property): bool
137+
{
138+
if (!$property->type instanceof Identifier) {
139+
return \false;
140+
}
141+
return $this->isName($property->type, 'array');
142+
}
143+
}

src/Application/VersionResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ final class VersionResolver
1919
* @api
2020
* @var string
2121
*/
22-
public const PACKAGE_VERSION = '2681751795bc580f4bab291b42cb7a6adbba03b8';
22+
public const PACKAGE_VERSION = '9548641518f579776d75d5f0a4a1c1ea2cc615a8';
2323
/**
2424
* @api
2525
* @var string
2626
*/
27-
public const RELEASE_DATE = '2026-01-13 14:09:25';
27+
public const RELEASE_DATE = '2026-01-13 15:02:58';
2828
/**
2929
* @var int
3030
*/

src/Config/Level/TypeDeclarationDocblocksLevel.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
use Rector\TypeDeclaration\Rector\ClassMethod\AddReturnArrayDocblockBasedOnArrayMapRector;
99
use Rector\TypeDeclaration\Rector\ClassMethod\AddReturnDocblockForScalarArrayFromAssignsRector;
1010
use Rector\TypeDeclarationDocblocks\Rector\Class_\AddReturnDocblockDataProviderRector;
11+
use Rector\TypeDeclarationDocblocks\Rector\Class_\AddVarArrayDocblockFromDimFetchAssignRector;
1112
use Rector\TypeDeclarationDocblocks\Rector\Class_\ClassMethodArrayDocblockParamFromLocalCallsRector;
1213
use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarArrayFromGetterReturnRector;
1314
use Rector\TypeDeclarationDocblocks\Rector\Class_\DocblockVarArrayFromPropertyDefaultsRector;
@@ -51,6 +52,7 @@ final class TypeDeclarationDocblocksLevel
5152
// property var
5253
DocblockVarFromParamDocblockInConstructorRector::class,
5354
DocblockVarArrayFromGetterReturnRector::class,
55+
AddVarArrayDocblockFromDimFetchAssignRector::class,
5456
// return
5557
DocblockGetterReturnArrayFromPropertyDocblockVarRector::class,
5658
// run latter after other rules, as more generic

src/PhpParser/Node/BetterNodeFinder.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
declare (strict_types=1);
44
namespace Rector\PhpParser\Node;
55

6+
use PhpParser\Node\Stmt\ClassMethod;
67
use PhpParser\Node;
78
use PhpParser\Node\Expr\Variable;
89
use PhpParser\Node\Expr\Yield_;
@@ -215,7 +216,7 @@ public function findInstancesOfScoped(array $nodes, $types): array
215216
/** @var T[] $foundNodes */
216217
$foundNodes = [];
217218
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($nodes, static function (Node $subNode) use ($types, &$foundNodes): ?int {
218-
if ($subNode instanceof Class_ || $subNode instanceof FunctionLike) {
219+
if ($subNode instanceof Class_ || $subNode instanceof FunctionLike && !$subNode instanceof ClassMethod) {
219220
return NodeVisitor::DONT_TRAVERSE_CURRENT_AND_CHILDREN;
220221
}
221222
foreach ($types as $type) {

vendor/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2762,6 +2762,7 @@
27622762
'Rector\\TypeDeclarationDocblocks\\Rector\\ClassMethod\\DocblockReturnArrayFromDirectArrayInstanceRector' => $baseDir . '/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php',
27632763
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\AddReturnArrayDocblockFromDataProviderParamRector' => $baseDir . '/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector.php',
27642764
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\AddReturnDocblockDataProviderRector' => $baseDir . '/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php',
2765+
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\AddVarArrayDocblockFromDimFetchAssignRector' => $baseDir . '/rules/TypeDeclarationDocblocks/Rector/Class_/AddVarArrayDocblockFromDimFetchAssignRector.php',
27652766
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\ClassMethodArrayDocblockParamFromLocalCallsRector' => $baseDir . '/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php',
27662767
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\DocblockVarArrayFromGetterReturnRector' => $baseDir . '/rules/TypeDeclarationDocblocks/Rector/Class_/DocblockVarArrayFromGetterReturnRector.php',
27672768
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\DocblockVarArrayFromPropertyDefaultsRector' => $baseDir . '/rules/TypeDeclarationDocblocks/Rector/Class_/DocblockVarArrayFromPropertyDefaultsRector.php',

vendor/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3022,6 +3022,7 @@ class ComposerStaticInit7001fb5f7b9b8dbb950c02836c7af51c
30223022
'Rector\\TypeDeclarationDocblocks\\Rector\\ClassMethod\\DocblockReturnArrayFromDirectArrayInstanceRector' => __DIR__ . '/../..' . '/rules/TypeDeclarationDocblocks/Rector/ClassMethod/DocblockReturnArrayFromDirectArrayInstanceRector.php',
30233023
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\AddReturnArrayDocblockFromDataProviderParamRector' => __DIR__ . '/../..' . '/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnArrayDocblockFromDataProviderParamRector.php',
30243024
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\AddReturnDocblockDataProviderRector' => __DIR__ . '/../..' . '/rules/TypeDeclarationDocblocks/Rector/Class_/AddReturnDocblockDataProviderRector.php',
3025+
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\AddVarArrayDocblockFromDimFetchAssignRector' => __DIR__ . '/../..' . '/rules/TypeDeclarationDocblocks/Rector/Class_/AddVarArrayDocblockFromDimFetchAssignRector.php',
30253026
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\ClassMethodArrayDocblockParamFromLocalCallsRector' => __DIR__ . '/../..' . '/rules/TypeDeclarationDocblocks/Rector/Class_/ClassMethodArrayDocblockParamFromLocalCallsRector.php',
30263027
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\DocblockVarArrayFromGetterReturnRector' => __DIR__ . '/../..' . '/rules/TypeDeclarationDocblocks/Rector/Class_/DocblockVarArrayFromGetterReturnRector.php',
30273028
'Rector\\TypeDeclarationDocblocks\\Rector\\Class_\\DocblockVarArrayFromPropertyDefaultsRector' => __DIR__ . '/../..' . '/rules/TypeDeclarationDocblocks/Rector/Class_/DocblockVarArrayFromPropertyDefaultsRector.php',

vendor/composer/installed.json

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3293,17 +3293,17 @@
32933293
},
32943294
{
32953295
"name": "webmozart\/assert",
3296-
"version": "2.1.1",
3297-
"version_normalized": "2.1.1.0",
3296+
"version": "2.1.2",
3297+
"version_normalized": "2.1.2.0",
32983298
"source": {
32993299
"type": "git",
33003300
"url": "https:\/\/github.com\/webmozarts\/assert.git",
3301-
"reference": "bdbabc199a7ba9965484e4725d66170e5711323b"
3301+
"reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649"
33023302
},
33033303
"dist": {
33043304
"type": "zip",
3305-
"url": "https:\/\/api.github.com\/repos\/webmozarts\/assert\/zipball\/bdbabc199a7ba9965484e4725d66170e5711323b",
3306-
"reference": "bdbabc199a7ba9965484e4725d66170e5711323b",
3305+
"url": "https:\/\/api.github.com\/repos\/webmozarts\/assert\/zipball\/ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
3306+
"reference": "ce6a2f100c404b2d32a1dd1270f9b59ad4f57649",
33073307
"shasum": ""
33083308
},
33093309
"require": {
@@ -3317,7 +3317,7 @@
33173317
"ext-simplexml": "",
33183318
"ext-spl": ""
33193319
},
3320-
"time": "2026-01-08T11:28:40+00:00",
3320+
"time": "2026-01-13T14:02:24+00:00",
33213321
"type": "library",
33223322
"extra": {
33233323
"branch-alias": {
@@ -3352,7 +3352,7 @@
33523352
],
33533353
"support": {
33543354
"issues": "https:\/\/github.com\/webmozarts\/assert\/issues",
3355-
"source": "https:\/\/github.com\/webmozarts\/assert\/tree\/2.1.1"
3355+
"source": "https:\/\/github.com\/webmozarts\/assert\/tree\/2.1.2"
33563356
},
33573357
"install-path": "..\/webmozart\/assert"
33583358
}

0 commit comments

Comments
 (0)