Skip to content

Commit d8b401e

Browse files
authored
add target document support to CompletePropertyDocblockFromToManyRector (#465)
* add target document support to CompletePropertyDocblockFromToManyRector * move safer rules to collections docblocks
1 parent 7c59c5c commit d8b401e

7 files changed

Lines changed: 62 additions & 11 deletions

File tree

config/sets/typed-collections-docblocks.php

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,15 @@
33
declare(strict_types=1);
44

55
use Rector\Config\RectorConfig;
6+
use Rector\Doctrine\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector;
67
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionDocblockGenericTypeRector;
8+
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\DefaultCollectionKeyRector;
79

810
return static function (RectorConfig $rectorConfig): void {
911
$rectorConfig->rules([
1012
// safe rules that handle only docblocks
1113
CollectionDocblockGenericTypeRector::class,
14+
DefaultCollectionKeyRector::class,
15+
CompletePropertyDocblockFromToManyRector::class,
1216
]);
1317
};

config/sets/typed-collections.php

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@
66
use Rector\Doctrine\TypedCollections\Rector\Assign\ArrayDimFetchAssignToAddCollectionCallRector;
77
use Rector\Doctrine\TypedCollections\Rector\Assign\ArrayOffsetSetToSetCollectionCallRector;
88
use Rector\Doctrine\TypedCollections\Rector\Class_\CompleteParamDocblockFromSetterToCollectionRector;
9-
use Rector\Doctrine\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector;
109
use Rector\Doctrine\TypedCollections\Rector\Class_\CompleteReturnDocblockFromToManyRector;
1110
use Rector\Doctrine\TypedCollections\Rector\Class_\InitializeCollectionInConstructorRector;
1211
use Rector\Doctrine\TypedCollections\Rector\Class_\RemoveNullFromInstantiatedArrayCollectionPropertyRector;
1312
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionGetterNativeTypeRector;
1413
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionParamTypeSetterToCollectionPropertyRector;
1514
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\CollectionSetterParamNativeTypeRector;
16-
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\DefaultCollectionKeyRector;
1715
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowArrayCollectionToCollectionRector;
1816
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowParamUnionToCollectionRector;
1917
use Rector\Doctrine\TypedCollections\Rector\ClassMethod\NarrowReturnUnionToCollectionRector;
@@ -73,15 +71,13 @@
7371
RemoveNullFromNullableCollectionTypeRector::class,
7472

7573
// docblocks
76-
DefaultCollectionKeyRector::class,
7774
NarrowArrayCollectionToCollectionRector::class,
7875

7976
// @param docblock
8077
CompleteParamDocblockFromSetterToCollectionRector::class,
8178
NarrowParamUnionToCollectionRector::class,
8279

8380
// @var docblock
84-
CompletePropertyDocblockFromToManyRector::class,
8581
NarrowPropertyUnionToCollectionRector::class,
8682

8783
// @return docblock
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
<?php
2+
3+
namespace Rector\Doctrine\Tests\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector\Fixture\Odm;
4+
5+
use Rector\Doctrine\Tests\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector\Source\Training;
6+
use Doctrine\ODM\MongoDB\Mapping\Annotations\Document;
7+
use Doctrine\ODM\MongoDB\Mapping\Annotations\ReferenceMany;
8+
9+
#[Document]
10+
final class OdmMany
11+
{
12+
#[ReferenceMany(targetDocument: Training::class)]
13+
private $items = [];
14+
15+
public function getItems()
16+
{
17+
return $this->items;
18+
}
19+
}
20+
21+
?>
22+
-----
23+
<?php
24+
25+
namespace Rector\Doctrine\Tests\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector\Fixture\Odm;
26+
27+
use Rector\Doctrine\Tests\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector\Source\Training;
28+
use Doctrine\ODM\MongoDB\Mapping\Annotations\Document;
29+
use Doctrine\ODM\MongoDB\Mapping\Annotations\ReferenceMany;
30+
31+
#[Document]
32+
final class OdmMany
33+
{
34+
/**
35+
* @var \Doctrine\Common\Collections\Collection<int, \Rector\Doctrine\Tests\TypedCollections\Rector\Class_\CompletePropertyDocblockFromToManyRector\Source\Training>
36+
*/
37+
#[ReferenceMany(targetDocument: Training::class)]
38+
private $items = [];
39+
40+
public function getItems()
41+
{
42+
return $this->items;
43+
}
44+
}
45+
46+
?>

rules/CodeQuality/Enum/OdmMappingKey.php renamed to rules/CodeQuality/Enum/DocumentMappingKey.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
/**
88
* @api
99
*/
10-
final class OdmMappingKey
10+
final class DocumentMappingKey
1111
{
1212
/**
1313
* @var string

src/NodeAnalyzer/TargetEntityResolver.php

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
use PhpParser\Node\Identifier;
1111
use PhpParser\Node\Scalar\String_;
1212
use PHPStan\Reflection\ReflectionProvider;
13+
use Rector\Doctrine\CodeQuality\Enum\DocumentMappingKey;
1314
use Rector\Doctrine\CodeQuality\Enum\EntityMappingKey;
1415
use Rector\Exception\NotImplementedYetException;
1516
use Rector\NodeNameResolver\NodeNameResolver;
@@ -29,7 +30,11 @@ public function resolveFromAttribute(Attribute $attribute): ?string
2930
continue;
3031
}
3132

32-
if ($arg->name->toString() !== EntityMappingKey::TARGET_ENTITY) {
33+
if (! in_array(
34+
$arg->name->toString(),
35+
[EntityMappingKey::TARGET_ENTITY, DocumentMappingKey::TARGET_DOCUMENT],
36+
true
37+
)) {
3338
continue;
3439
}
3540

src/NodeManipulator/ToManyRelationPropertyTypeResolver.php

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@
1414
use Rector\BetterPhpDocParser\PhpDoc\StringNode;
1515
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
1616
use Rector\Doctrine\CodeQuality\Enum\CollectionMapping;
17+
use Rector\Doctrine\CodeQuality\Enum\DocumentMappingKey;
1718
use Rector\Doctrine\CodeQuality\Enum\EntityMappingKey;
18-
use Rector\Doctrine\CodeQuality\Enum\OdmMappingKey;
1919
use Rector\Doctrine\Enum\DoctrineClass;
2020
use Rector\Doctrine\NodeAnalyzer\AttributeFinder;
2121
use Rector\Doctrine\PhpDoc\ShortClassExpander;
@@ -48,7 +48,7 @@ public function resolve(Property $property): ?Type
4848
$expr = $this->attributeFinder->findAttributeByClassesArgByNames(
4949
$property,
5050
CollectionMapping::TO_MANY_CLASSES,
51-
[EntityMappingKey::TARGET_ENTITY, OdmMappingKey::TARGET_DOCUMENT]
51+
[EntityMappingKey::TARGET_ENTITY, DocumentMappingKey::TARGET_DOCUMENT]
5252
);
5353

5454
if (! $expr instanceof Expr) {
@@ -64,7 +64,7 @@ private function processToManyRelation(
6464
): Type|null {
6565
$targetEntityArrayItemNode = $doctrineAnnotationTagValueNode->getValue(
6666
EntityMappingKey::TARGET_ENTITY
67-
) ?: $doctrineAnnotationTagValueNode->getValue(OdmMappingKey::TARGET_DOCUMENT);
67+
) ?: $doctrineAnnotationTagValueNode->getValue(DocumentMappingKey::TARGET_DOCUMENT);
6868
if (! $targetEntityArrayItemNode instanceof ArrayItemNode) {
6969
// most likely mapped superclass
7070
return new ObjectType(DoctrineClass::COLLECTION);

src/TypeAnalyzer/CollectionTypeResolver.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@
2323
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfo;
2424
use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory;
2525
use Rector\Doctrine\CodeQuality\Enum\CollectionMapping;
26+
use Rector\Doctrine\CodeQuality\Enum\DocumentMappingKey;
2627
use Rector\Doctrine\CodeQuality\Enum\EntityMappingKey;
27-
use Rector\Doctrine\CodeQuality\Enum\OdmMappingKey;
2828
use Rector\Doctrine\NodeAnalyzer\AttrinationFinder;
2929
use Rector\Doctrine\NodeAnalyzer\TargetEntityResolver;
3030
use Rector\Doctrine\PhpDoc\ShortClassExpander;
@@ -111,7 +111,7 @@ public function resolveFromToManyProperty(Property $property): ?FullyQualifiedOb
111111
if ($doctrineAnnotationTagValueNodeOrAttribute instanceof Attribute) {
112112
$targetEntityExpr = $this->findExprByArgNames(
113113
$doctrineAnnotationTagValueNodeOrAttribute->args,
114-
[EntityMappingKey::TARGET_ENTITY, OdmMappingKey::TARGET_DOCUMENT]
114+
[EntityMappingKey::TARGET_ENTITY, DocumentMappingKey::TARGET_DOCUMENT]
115115
);
116116

117117
if (! $targetEntityExpr instanceof ClassConstFetch) {

0 commit comments

Comments
 (0)