Skip to content

Commit 1c7d31e

Browse files
committed
Updated Rector to commit 865e85b65ff9297009e97c6b91bc8d27393668d7
rectorphp/rector-src@865e85b cs
1 parent 813105f commit 1c7d31e

9 files changed

Lines changed: 157 additions & 11 deletions

File tree

vendor/composer/autoload_classmap.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1443,12 +1443,14 @@
14431443
'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeFactory' => $vendorDir . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php',
14441444
'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeResolver' => $vendorDir . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php',
14451445
'Rector\\Doctrine\\TypeAnalyzer\\CollectionVarTagValueNodeResolver' => $vendorDir . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php',
1446+
'Rector\\Doctrine\\TypedCollections\\DocBlockAnalyzer\\CollectionTagValueNodeAnalyzer' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php',
14461447
'Rector\\Doctrine\\TypedCollections\\DocBlockProcessor\\UnionCollectionTagValueNodeNarrower' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php',
14471448
'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\CollectionParamCallDetector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php',
14481449
'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\EntityLikeClassDetector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php',
14491450
'Rector\\Doctrine\\TypedCollections\\Rector\\Assign\\ArrayDimFetchAssignToAddCollectionCallRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php',
14501451
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionGetterNativeTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php',
14511452
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionParamTypeSetterToCollectionPropertyRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php',
1453+
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionSetterParamNativeTypeRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php',
14521454
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\DefaultCollectionKeyRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php',
14531455
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowArrayCollectionToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php',
14541456
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowParamUnionToCollectionRector' => $vendorDir . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php',

vendor/composer/autoload_static.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1662,12 +1662,14 @@ class ComposerStaticInit912e02b74e97bb7d91c242d9973e0c44
16621662
'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeFactory' => __DIR__ . '/..' . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeFactory.php',
16631663
'Rector\\Doctrine\\TypeAnalyzer\\CollectionTypeResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionTypeResolver.php',
16641664
'Rector\\Doctrine\\TypeAnalyzer\\CollectionVarTagValueNodeResolver' => __DIR__ . '/..' . '/rector/rector-doctrine/src/TypeAnalyzer/CollectionVarTagValueNodeResolver.php',
1665+
'Rector\\Doctrine\\TypedCollections\\DocBlockAnalyzer\\CollectionTagValueNodeAnalyzer' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/DocBlockAnalyzer/CollectionTagValueNodeAnalyzer.php',
16651666
'Rector\\Doctrine\\TypedCollections\\DocBlockProcessor\\UnionCollectionTagValueNodeNarrower' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/DocBlockProcessor/UnionCollectionTagValueNodeNarrower.php',
16661667
'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\CollectionParamCallDetector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/CollectionParamCallDetector.php',
16671668
'Rector\\Doctrine\\TypedCollections\\NodeAnalyzer\\EntityLikeClassDetector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/NodeAnalyzer/EntityLikeClassDetector.php',
16681669
'Rector\\Doctrine\\TypedCollections\\Rector\\Assign\\ArrayDimFetchAssignToAddCollectionCallRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/Assign/ArrayDimFetchAssignToAddCollectionCallRector.php',
16691670
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionGetterNativeTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionGetterNativeTypeRector.php',
16701671
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionParamTypeSetterToCollectionPropertyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionParamTypeSetterToCollectionPropertyRector.php',
1672+
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\CollectionSetterParamNativeTypeRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/CollectionSetterParamNativeTypeRector.php',
16711673
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\DefaultCollectionKeyRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php',
16721674
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowArrayCollectionToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowArrayCollectionToCollectionRector.php',
16731675
'Rector\\Doctrine\\TypedCollections\\Rector\\ClassMethod\\NarrowParamUnionToCollectionRector' => __DIR__ . '/..' . '/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/NarrowParamUnionToCollectionRector.php',

vendor/composer/installed.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1687,12 +1687,12 @@
16871687
"source": {
16881688
"type": "git",
16891689
"url": "https:\/\/github.com\/rectorphp\/rector-doctrine.git",
1690-
"reference": "b5adbe0d965482933a5f65e57595c40e0f4d0faa"
1690+
"reference": "4af35d2c57072a006900eb33c4da5bfcbfa1af51"
16911691
},
16921692
"dist": {
16931693
"type": "zip",
1694-
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/b5adbe0d965482933a5f65e57595c40e0f4d0faa",
1695-
"reference": "b5adbe0d965482933a5f65e57595c40e0f4d0faa",
1694+
"url": "https:\/\/api.github.com\/repos\/rectorphp\/rector-doctrine\/zipball\/4af35d2c57072a006900eb33c4da5bfcbfa1af51",
1695+
"reference": "4af35d2c57072a006900eb33c4da5bfcbfa1af51",
16961696
"shasum": ""
16971697
},
16981698
"require": {
@@ -1715,7 +1715,7 @@
17151715
"tomasvotruba\/class-leak": "^2.0",
17161716
"tracy\/tracy": "^2.10"
17171717
},
1718-
"time": "2025-05-28T14:48:47+00:00",
1718+
"time": "2025-05-28T15:21:59+00:00",
17191719
"default-branch": true,
17201720
"type": "rector-extension",
17211721
"extra": {

vendor/composer/installed.php

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

vendor/rector/extension-installer/src/GeneratedConfig.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
*/
1010
final class GeneratedConfig
1111
{
12-
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main b5adbe0'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main e43dd7a'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 52398e7'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main ca5ee11'));
12+
public const EXTENSIONS = array('rector/rector-doctrine' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-doctrine', 'relative_install_path' => '../../rector-doctrine', 'extra' => NULL, 'version' => 'dev-main 4af35d2'), 'rector/rector-downgrade-php' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-downgrade-php', 'relative_install_path' => '../../rector-downgrade-php', 'extra' => NULL, 'version' => 'dev-main e43dd7a'), 'rector/rector-phpunit' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-phpunit', 'relative_install_path' => '../../rector-phpunit', 'extra' => NULL, 'version' => 'dev-main 52398e7'), 'rector/rector-symfony' => array('install_path' => '/home/runner/work/rector-src/rector-src/rector-build/vendor/rector/rector-symfony', 'relative_install_path' => '../../rector-symfony', 'extra' => NULL, 'version' => 'dev-main ca5ee11'));
1313
private function __construct()
1414
{
1515
}

vendor/rector/rector-doctrine/config/sets/typed-collections.php

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use Rector\Doctrine\TypedCollections\Rector\Class_\InitializeCollectionInConstructorRector;
1212
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionGetterNativeTypeRector;
1313
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionParamTypeSetterToCollectionPropertyRector;
14+
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionSetterParamNativeTypeRector;
1415
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\DefaultCollectionKeyRector;
1516
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowArrayCollectionToCollectionRector;
1617
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowParamUnionToCollectionRector;
@@ -46,6 +47,7 @@
4647
InArrayOnCollectionToContainsCallRector::class,
4748
// native type declarations
4849
CollectionGetterNativeTypeRector::class,
50+
CollectionSetterParamNativeTypeRector::class,
4951
CollectionParamTypeSetterToCollectionPropertyRector::class,
5052
TypedPropertyFromToManyRelationTypeRector::class,
5153
RemoveNullFromNullableCollectionTypeRector::class,
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\Doctrine\TypedCollections\DocBlockAnalyzer;
5+
6+
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
7+
use PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode;
8+
use PHPStan\PhpDocParser\Ast\Type\GenericTypeNode;
9+
use Rector\Doctrine\Enum\DoctrineClass;
10+
final class CollectionTagValueNodeAnalyzer
11+
{
12+
/**
13+
* @param \PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode|\PHPStan\PhpDocParser\Ast\PhpDoc\ReturnTagValueNode $tagValueNode
14+
*/
15+
public function detect($tagValueNode) : bool
16+
{
17+
if (!$tagValueNode->type instanceof GenericTypeNode) {
18+
return \false;
19+
}
20+
$genericTypeNode = $tagValueNode->type;
21+
if ($genericTypeNode->type->name === 'Collection') {
22+
return \true;
23+
}
24+
return $genericTypeNode->type->name === DoctrineClass::COLLECTION;
25+
}
26+
}
Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\Doctrine\TypedCollections\Rector\ClassMethod;
5+
6+
use PhpParser\Node;
7+
use PhpParser\Node\Name\FullyQualified;
8+
use PhpParser\Node\Stmt\ClassMethod;
9+
use PHPStan\PhpDocParser\Ast\PhpDoc\ParamTagValueNode;
10+
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
11+
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
12+
use Rector\Doctrine\Enum\DoctrineClass;
13+
use Rector\Doctrine\TypedCollections\DocBlockAnalyzer\CollectionTagValueNodeAnalyzer;
14+
use Rector\Rector\AbstractRector;
15+
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
16+
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
17+
/**
18+
* @see \Rector\Doctrine\Tests\TypedCollections\Rector\ClassMethod\CollectionSetterParamNativeTypeRector\CollectionSetterParamNativeTypeRectorTest
19+
*/
20+
final class CollectionSetterParamNativeTypeRector extends AbstractRector
21+
{
22+
/**
23+
* @readonly
24+
*/
25+
private PhpDocInfoFactory $phpDocInfoFactory;
26+
/**
27+
* @readonly
28+
*/
29+
private CollectionTagValueNodeAnalyzer $collectionTagValueNodeAnalyzer;
30+
public function __construct(PhpDocInfoFactory $phpDocInfoFactory, CollectionTagValueNodeAnalyzer $collectionTagValueNodeAnalyzer)
31+
{
32+
$this->phpDocInfoFactory = $phpDocInfoFactory;
33+
$this->collectionTagValueNodeAnalyzer = $collectionTagValueNodeAnalyzer;
34+
}
35+
public function getRuleDefinition() : RuleDefinition
36+
{
37+
return new RuleDefinition('Add native param type to a Collection setter', [new CodeSample(<<<'CODE_SAMPLE'
38+
use Doctrine\Common\Collections\Collection;
39+
40+
final class SomeClass
41+
{
42+
private $items;
43+
44+
/**
45+
* @param Collection<int, string> $items
46+
*/
47+
public function setItems($items): void
48+
{
49+
$this->items = $items;
50+
}
51+
}
52+
CODE_SAMPLE
53+
, <<<'CODE_SAMPLE'
54+
use Doctrine\Common\Collections\Collection;
55+
56+
final class SomeClass
57+
{
58+
private $items;
59+
60+
/**
61+
* @param Collection<int, string> $items
62+
*/
63+
public function setItems(Collection $items): void
64+
{
65+
$this->items = $items;
66+
}
67+
}
68+
CODE_SAMPLE
69+
)]);
70+
}
71+
public function getNodeTypes() : array
72+
{
73+
return [ClassMethod::class];
74+
}
75+
/**
76+
* @param ClassMethod $node
77+
*/
78+
public function refactor(Node $node) : ?ClassMethod
79+
{
80+
if ($node->isAbstract() || $node->stmts === null) {
81+
return null;
82+
}
83+
$hasChanged = \false;
84+
$classMethodPhpDocInfo = $this->phpDocInfoFactory->createFromNode($node);
85+
if (!$classMethodPhpDocInfo instanceof PhpDocInfo) {
86+
return null;
87+
}
88+
if ($classMethodPhpDocInfo->getParamTagValueNodes() === []) {
89+
return null;
90+
}
91+
foreach ($node->params as $param) {
92+
if ($param->type instanceof Node) {
93+
continue;
94+
}
95+
$paramTagValueNode = $classMethodPhpDocInfo->getParamTagValueByName($this->getName($param));
96+
if (!$paramTagValueNode instanceof ParamTagValueNode) {
97+
continue;
98+
}
99+
if (!$this->collectionTagValueNodeAnalyzer->detect($paramTagValueNode)) {
100+
continue;
101+
}
102+
$hasChanged = \true;
103+
$param->type = new FullyQualified(DoctrineClass::COLLECTION);
104+
}
105+
if ($hasChanged) {
106+
return $node;
107+
}
108+
return null;
109+
}
110+
}

vendor/rector/rector-doctrine/rules/TypedCollections/Rector/ClassMethod/DefaultCollectionKeyRector.php

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode;
1212
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
1313
use Rector\Comments\NodeDocBlock\DocBlockUpdater;
14+
use Rector\Doctrine\TypedCollections\DocBlockAnalyzer\CollectionTagValueNodeAnalyzer;
1415
use Rector\Rector\AbstractRector;
1516
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
1617
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
@@ -27,10 +28,15 @@ final class DefaultCollectionKeyRector extends AbstractRector
2728
* @readonly
2829
*/
2930
private DocBlockUpdater $docBlockUpdater;
30-
public function __construct(PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater)
31+
/**
32+
* @readonly
33+
*/
34+
private CollectionTagValueNodeAnalyzer $collectionTagValueNodeAnalyzer;
35+
public function __construct(PhpDocInfoFactory $phpDocInfoFactory, DocBlockUpdater $docBlockUpdater, CollectionTagValueNodeAnalyzer $collectionTagValueNodeAnalyzer)
3136
{
3237
$this->phpDocInfoFactory = $phpDocInfoFactory;
3338
$this->docBlockUpdater = $docBlockUpdater;
39+
$this->collectionTagValueNodeAnalyzer = $collectionTagValueNodeAnalyzer;
3440
}
3541
public function getRuleDefinition() : RuleDefinition
3642
{
@@ -96,16 +102,14 @@ public function refactor(Node $node) : ?ClassMethod
96102
*/
97103
private function processTagValueNode($tagValueNode) : bool
98104
{
99-
if (!$tagValueNode->type instanceof GenericTypeNode) {
105+
if (!$this->collectionTagValueNodeAnalyzer->detect($tagValueNode)) {
100106
return \false;
101107
}
108+
/** @var GenericTypeNode $genericTypeNode */
102109
$genericTypeNode = $tagValueNode->type;
103110
if (\count($genericTypeNode->genericTypes) !== 1) {
104111
return \false;
105112
}
106-
if ($genericTypeNode->type->name !== 'Collection') {
107-
return \false;
108-
}
109113
$valueGenericType = $genericTypeNode->genericTypes[0];
110114
$genericTypeNode->genericTypes = [new IdentifierTypeNode('int'), $valueGenericType];
111115
return \true;

0 commit comments

Comments
 (0)