Skip to content

Commit cfe590f

Browse files
committed
Updated Rector to commit 147c96190e99909c71c2d920a83ae96cc9b3bd57
rectorphp/rector-src@147c961 Add known type casting to AnnotationToAttributeRector (#6217)
1 parent 9005492 commit cfe590f

File tree

6 files changed

+116
-7
lines changed

6 files changed

+116
-7
lines changed

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 = '0f09b7a0b9f9f3a445a8c4014c8d951579d1de03';
22+
public const PACKAGE_VERSION = '147c96190e99909c71c2d920a83ae96cc9b3bd57';
2323
/**
2424
* @api
2525
* @var string
2626
*/
27-
public const RELEASE_DATE = '2024-08-06 11:27:51';
27+
public const RELEASE_DATE = '2024-08-06 12:31:33';
2828
/**
2929
* @var int
3030
*/

src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ public function unwrapFirstObjectTypeFromUnionType(Type $type) : Type
2121
}
2222
return $type;
2323
}
24-
public function removeNullTypeFromUnionType(UnionType $unionType) : UnionType
24+
public function removeNullTypeFromUnionType(UnionType $unionType) : Type
2525
{
2626
$unionedTypesWithoutNullType = [];
2727
foreach ($unionType->getTypes() as $type) {
@@ -30,6 +30,9 @@ public function removeNullTypeFromUnionType(UnionType $unionType) : UnionType
3030
}
3131
$unionedTypesWithoutNullType[] = $type;
3232
}
33+
if ($unionedTypesWithoutNullType !== []) {
34+
return $unionedTypesWithoutNullType[0];
35+
}
3336
return new UnionType($unionedTypesWithoutNullType);
3437
}
3538
}
Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
<?php
2+
3+
declare (strict_types=1);
4+
namespace Rector\PhpAttribute\NodeFactory;
5+
6+
use PhpParser\Node\Arg;
7+
use PhpParser\Node\Expr\ArrayItem;
8+
use PhpParser\Node\Scalar\LNumber;
9+
use PhpParser\Node\Scalar\String_;
10+
use PHPStan\Reflection\ClassReflection;
11+
use PHPStan\Reflection\ParameterReflection;
12+
use PHPStan\Reflection\ParametersAcceptorSelector;
13+
use PHPStan\Reflection\ReflectionProvider;
14+
use PHPStan\Type\IntegerType;
15+
use PHPStan\Type\Type;
16+
use PHPStan\Type\UnionType;
17+
use Rector\Php80\ValueObject\AnnotationToAttribute;
18+
use RectorPrefix202408\Webmozart\Assert\Assert;
19+
final class AnnotationToAttributeIntegerValueCaster
20+
{
21+
/**
22+
* @readonly
23+
* @var \PHPStan\Reflection\ReflectionProvider
24+
*/
25+
private $reflectionProvider;
26+
public function __construct(ReflectionProvider $reflectionProvider)
27+
{
28+
$this->reflectionProvider = $reflectionProvider;
29+
}
30+
/**
31+
* @param Arg[] $args
32+
*/
33+
public function castAttributeTypes(AnnotationToAttribute $annotationToAttribute, array $args) : void
34+
{
35+
Assert::allIsInstanceOf($args, Arg::class);
36+
if (!$this->reflectionProvider->hasClass($annotationToAttribute->getAttributeClass())) {
37+
return;
38+
}
39+
$attributeClassReflection = $this->reflectionProvider->getClass($annotationToAttribute->getAttributeClass());
40+
if (!$attributeClassReflection->hasConstructor()) {
41+
return;
42+
}
43+
$parameterReflections = $this->resolveConstructorParameterReflections($attributeClassReflection);
44+
foreach ($parameterReflections as $parameterReflection) {
45+
foreach ($args as $arg) {
46+
if (!$arg->value instanceof ArrayItem) {
47+
continue;
48+
}
49+
$arrayItem = $arg->value;
50+
if (!$arrayItem->key instanceof String_) {
51+
continue;
52+
}
53+
$keyString = $arrayItem->key;
54+
if ($keyString->value !== $parameterReflection->getName()) {
55+
continue;
56+
}
57+
// ensure type is casted to integer
58+
if (!$arrayItem->value instanceof String_) {
59+
continue;
60+
}
61+
if (!$this->containsInteger($parameterReflection->getType())) {
62+
continue;
63+
}
64+
$valueString = $arrayItem->value;
65+
if (!\is_numeric($valueString->value)) {
66+
continue;
67+
}
68+
$arrayItem->value = new LNumber((int) $valueString->value);
69+
}
70+
}
71+
}
72+
private function containsInteger(Type $type) : bool
73+
{
74+
if ($type instanceof IntegerType) {
75+
return \true;
76+
}
77+
if (!$type instanceof UnionType) {
78+
return \false;
79+
}
80+
foreach ($type->getTypes() as $unionedType) {
81+
if ($unionedType instanceof IntegerType) {
82+
return \true;
83+
}
84+
}
85+
return \false;
86+
}
87+
/**
88+
* @return ParameterReflection[]
89+
*/
90+
private function resolveConstructorParameterReflections(ClassReflection $classReflection) : array
91+
{
92+
$extendedMethodReflection = $classReflection->getConstructor();
93+
$parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::selectSingle($extendedMethodReflection->getVariants());
94+
return $parametersAcceptorWithPhpDocs->getParameters();
95+
}
96+
}

src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -45,12 +45,18 @@ final class PhpAttributeGroupFactory
4545
* @var \Rector\PhpAttribute\AttributeArrayNameInliner
4646
*/
4747
private $attributeArrayNameInliner;
48-
public function __construct(AnnotationToAttributeMapper $annotationToAttributeMapper, \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory, \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory, AttributeArrayNameInliner $attributeArrayNameInliner)
48+
/**
49+
* @readonly
50+
* @var \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster
51+
*/
52+
private $annotationToAttributeIntegerValueCaster;
53+
public function __construct(AnnotationToAttributeMapper $annotationToAttributeMapper, \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory, \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory, AttributeArrayNameInliner $attributeArrayNameInliner, \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster $annotationToAttributeIntegerValueCaster)
4954
{
5055
$this->annotationToAttributeMapper = $annotationToAttributeMapper;
5156
$this->attributeNameFactory = $attributeNameFactory;
5257
$this->namedArgsFactory = $namedArgsFactory;
5358
$this->attributeArrayNameInliner = $attributeArrayNameInliner;
59+
$this->annotationToAttributeIntegerValueCaster = $annotationToAttributeIntegerValueCaster;
5460
}
5561
public function createFromSimpleTag(AnnotationToAttribute $annotationToAttribute) : AttributeGroup
5662
{
@@ -72,7 +78,7 @@ public function createFromClass(string $attributeClass) : AttributeGroup
7278
public function createFromClassWithItems(string $attributeClass, array $items) : AttributeGroup
7379
{
7480
$fullyQualified = new FullyQualified($attributeClass);
75-
$args = $this->createArgsFromItems($items, $attributeClass);
81+
$args = $this->createArgsFromItems($items);
7682
$attribute = new Attribute($fullyQualified, $args);
7783
return new AttributeGroup([$attribute]);
7884
}
@@ -82,7 +88,8 @@ public function createFromClassWithItems(string $attributeClass, array $items) :
8288
public function create(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode, AnnotationToAttribute $annotationToAttribute, array $uses) : AttributeGroup
8389
{
8490
$values = $doctrineAnnotationTagValueNode->getValuesWithSilentKey();
85-
$args = $this->createArgsFromItems($values, $annotationToAttribute->getAttributeClass(), $annotationToAttribute->getClassReferenceFields());
91+
$args = $this->createArgsFromItems($values, '', $annotationToAttribute->getClassReferenceFields());
92+
$this->annotationToAttributeIntegerValueCaster->castAttributeTypes($annotationToAttribute, $args);
8693
$args = $this->attributeArrayNameInliner->inlineArrayToArgs($args);
8794
$attributeName = $this->attributeNameFactory->create($annotationToAttribute, $doctrineAnnotationTagValueNode, $uses);
8895
// keep FQN in the attribute, so it can be easily detected later
@@ -100,9 +107,10 @@ public function create(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValu
100107
*
101108
* @param ArrayItemNode[]|mixed[] $items
102109
* @param string[] $classReferencedFields
110+
*
103111
* @return Arg[]
104112
*/
105-
public function createArgsFromItems(array $items, string $attributeClass, array $classReferencedFields = []) : array
113+
public function createArgsFromItems(array $items, string $attributeClass = '', array $classReferencedFields = []) : array
106114
{
107115
$mappedItems = $this->annotationToAttributeMapper->map($items);
108116
$this->mapClassReferences($mappedItems, $classReferencedFields);

vendor/composer/autoload_classmap.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1976,6 +1976,7 @@
19761976
'Rector\\PhpAttribute\\AttributeArrayNameInliner' => $baseDir . '/src/PhpAttribute/AttributeArrayNameInliner.php',
19771977
'Rector\\PhpAttribute\\Contract\\AnnotationToAttributeMapperInterface' => $baseDir . '/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php',
19781978
'Rector\\PhpAttribute\\Enum\\DocTagNodeState' => $baseDir . '/src/PhpAttribute/Enum/DocTagNodeState.php',
1979+
'Rector\\PhpAttribute\\NodeFactory\\AnnotationToAttributeIntegerValueCaster' => $baseDir . '/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php',
19791980
'Rector\\PhpAttribute\\NodeFactory\\AttributeNameFactory' => $baseDir . '/src/PhpAttribute/NodeFactory/AttributeNameFactory.php',
19801981
'Rector\\PhpAttribute\\NodeFactory\\NamedArgsFactory' => $baseDir . '/src/PhpAttribute/NodeFactory/NamedArgsFactory.php',
19811982
'Rector\\PhpAttribute\\NodeFactory\\PhpAttributeGroupFactory' => $baseDir . '/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php',

vendor/composer/autoload_static.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2195,6 +2195,7 @@ class ComposerStaticInite9e62f8370526a5f08ea47a490713455
21952195
'Rector\\PhpAttribute\\AttributeArrayNameInliner' => __DIR__ . '/../..' . '/src/PhpAttribute/AttributeArrayNameInliner.php',
21962196
'Rector\\PhpAttribute\\Contract\\AnnotationToAttributeMapperInterface' => __DIR__ . '/../..' . '/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php',
21972197
'Rector\\PhpAttribute\\Enum\\DocTagNodeState' => __DIR__ . '/../..' . '/src/PhpAttribute/Enum/DocTagNodeState.php',
2198+
'Rector\\PhpAttribute\\NodeFactory\\AnnotationToAttributeIntegerValueCaster' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php',
21982199
'Rector\\PhpAttribute\\NodeFactory\\AttributeNameFactory' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/AttributeNameFactory.php',
21992200
'Rector\\PhpAttribute\\NodeFactory\\NamedArgsFactory' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/NamedArgsFactory.php',
22002201
'Rector\\PhpAttribute\\NodeFactory\\PhpAttributeGroupFactory' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php',

0 commit comments

Comments
 (0)