Skip to content

Commit

Permalink
Updated Rector to commit 147c96190e99909c71c2d920a83ae96cc9b3bd57
Browse files Browse the repository at this point in the history
rectorphp/rector-src@147c961 Add known type casting to AnnotationToAttributeRector (#6217)
  • Loading branch information
TomasVotruba committed Aug 6, 2024
1 parent 9005492 commit cfe590f
Show file tree
Hide file tree
Showing 6 changed files with 116 additions and 7 deletions.
4 changes: 2 additions & 2 deletions src/Application/VersionResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,12 @@ final class VersionResolver
* @api
* @var string
*/
public const PACKAGE_VERSION = '0f09b7a0b9f9f3a445a8c4014c8d951579d1de03';
public const PACKAGE_VERSION = '147c96190e99909c71c2d920a83ae96cc9b3bd57';
/**
* @api
* @var string
*/
public const RELEASE_DATE = '2024-08-06 11:27:51';
public const RELEASE_DATE = '2024-08-06 12:31:33';
/**
* @var int
*/
Expand Down
5 changes: 4 additions & 1 deletion src/PHPStanStaticTypeMapper/Utils/TypeUnwrapper.php
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public function unwrapFirstObjectTypeFromUnionType(Type $type) : Type
}
return $type;
}
public function removeNullTypeFromUnionType(UnionType $unionType) : UnionType
public function removeNullTypeFromUnionType(UnionType $unionType) : Type
{
$unionedTypesWithoutNullType = [];
foreach ($unionType->getTypes() as $type) {
Expand All @@ -30,6 +30,9 @@ public function removeNullTypeFromUnionType(UnionType $unionType) : UnionType
}
$unionedTypesWithoutNullType[] = $type;
}
if ($unionedTypesWithoutNullType !== []) {
return $unionedTypesWithoutNullType[0];
}
return new UnionType($unionedTypesWithoutNullType);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,96 @@
<?php

declare (strict_types=1);
namespace Rector\PhpAttribute\NodeFactory;

use PhpParser\Node\Arg;
use PhpParser\Node\Expr\ArrayItem;
use PhpParser\Node\Scalar\LNumber;
use PhpParser\Node\Scalar\String_;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Reflection\ParameterReflection;
use PHPStan\Reflection\ParametersAcceptorSelector;
use PHPStan\Reflection\ReflectionProvider;
use PHPStan\Type\IntegerType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
use Rector\Php80\ValueObject\AnnotationToAttribute;
use RectorPrefix202408\Webmozart\Assert\Assert;
final class AnnotationToAttributeIntegerValueCaster
{
/**
* @readonly
* @var \PHPStan\Reflection\ReflectionProvider
*/
private $reflectionProvider;
public function __construct(ReflectionProvider $reflectionProvider)
{
$this->reflectionProvider = $reflectionProvider;
}
/**
* @param Arg[] $args
*/
public function castAttributeTypes(AnnotationToAttribute $annotationToAttribute, array $args) : void
{
Assert::allIsInstanceOf($args, Arg::class);
if (!$this->reflectionProvider->hasClass($annotationToAttribute->getAttributeClass())) {
return;
}
$attributeClassReflection = $this->reflectionProvider->getClass($annotationToAttribute->getAttributeClass());
if (!$attributeClassReflection->hasConstructor()) {
return;
}
$parameterReflections = $this->resolveConstructorParameterReflections($attributeClassReflection);
foreach ($parameterReflections as $parameterReflection) {
foreach ($args as $arg) {
if (!$arg->value instanceof ArrayItem) {
continue;
}
$arrayItem = $arg->value;
if (!$arrayItem->key instanceof String_) {
continue;
}
$keyString = $arrayItem->key;
if ($keyString->value !== $parameterReflection->getName()) {
continue;
}
// ensure type is casted to integer
if (!$arrayItem->value instanceof String_) {
continue;
}
if (!$this->containsInteger($parameterReflection->getType())) {
continue;
}
$valueString = $arrayItem->value;
if (!\is_numeric($valueString->value)) {
continue;
}
$arrayItem->value = new LNumber((int) $valueString->value);
}
}
}
private function containsInteger(Type $type) : bool
{
if ($type instanceof IntegerType) {
return \true;
}
if (!$type instanceof UnionType) {
return \false;
}
foreach ($type->getTypes() as $unionedType) {
if ($unionedType instanceof IntegerType) {
return \true;
}
}
return \false;
}
/**
* @return ParameterReflection[]
*/
private function resolveConstructorParameterReflections(ClassReflection $classReflection) : array
{
$extendedMethodReflection = $classReflection->getConstructor();
$parametersAcceptorWithPhpDocs = ParametersAcceptorSelector::selectSingle($extendedMethodReflection->getVariants());
return $parametersAcceptorWithPhpDocs->getParameters();
}
}
16 changes: 12 additions & 4 deletions src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,12 +45,18 @@ final class PhpAttributeGroupFactory
* @var \Rector\PhpAttribute\AttributeArrayNameInliner
*/
private $attributeArrayNameInliner;
public function __construct(AnnotationToAttributeMapper $annotationToAttributeMapper, \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory, \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory, AttributeArrayNameInliner $attributeArrayNameInliner)
/**
* @readonly
* @var \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster
*/
private $annotationToAttributeIntegerValueCaster;
public function __construct(AnnotationToAttributeMapper $annotationToAttributeMapper, \Rector\PhpAttribute\NodeFactory\AttributeNameFactory $attributeNameFactory, \Rector\PhpAttribute\NodeFactory\NamedArgsFactory $namedArgsFactory, AttributeArrayNameInliner $attributeArrayNameInliner, \Rector\PhpAttribute\NodeFactory\AnnotationToAttributeIntegerValueCaster $annotationToAttributeIntegerValueCaster)
{
$this->annotationToAttributeMapper = $annotationToAttributeMapper;
$this->attributeNameFactory = $attributeNameFactory;
$this->namedArgsFactory = $namedArgsFactory;
$this->attributeArrayNameInliner = $attributeArrayNameInliner;
$this->annotationToAttributeIntegerValueCaster = $annotationToAttributeIntegerValueCaster;
}
public function createFromSimpleTag(AnnotationToAttribute $annotationToAttribute) : AttributeGroup
{
Expand All @@ -72,7 +78,7 @@ public function createFromClass(string $attributeClass) : AttributeGroup
public function createFromClassWithItems(string $attributeClass, array $items) : AttributeGroup
{
$fullyQualified = new FullyQualified($attributeClass);
$args = $this->createArgsFromItems($items, $attributeClass);
$args = $this->createArgsFromItems($items);
$attribute = new Attribute($fullyQualified, $args);
return new AttributeGroup([$attribute]);
}
Expand All @@ -82,7 +88,8 @@ public function createFromClassWithItems(string $attributeClass, array $items) :
public function create(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValueNode, AnnotationToAttribute $annotationToAttribute, array $uses) : AttributeGroup
{
$values = $doctrineAnnotationTagValueNode->getValuesWithSilentKey();
$args = $this->createArgsFromItems($values, $annotationToAttribute->getAttributeClass(), $annotationToAttribute->getClassReferenceFields());
$args = $this->createArgsFromItems($values, '', $annotationToAttribute->getClassReferenceFields());
$this->annotationToAttributeIntegerValueCaster->castAttributeTypes($annotationToAttribute, $args);
$args = $this->attributeArrayNameInliner->inlineArrayToArgs($args);
$attributeName = $this->attributeNameFactory->create($annotationToAttribute, $doctrineAnnotationTagValueNode, $uses);
// keep FQN in the attribute, so it can be easily detected later
Expand All @@ -100,9 +107,10 @@ public function create(DoctrineAnnotationTagValueNode $doctrineAnnotationTagValu
*
* @param ArrayItemNode[]|mixed[] $items
* @param string[] $classReferencedFields
*
* @return Arg[]
*/
public function createArgsFromItems(array $items, string $attributeClass, array $classReferencedFields = []) : array
public function createArgsFromItems(array $items, string $attributeClass = '', array $classReferencedFields = []) : array
{
$mappedItems = $this->annotationToAttributeMapper->map($items);
$this->mapClassReferences($mappedItems, $classReferencedFields);
Expand Down
1 change: 1 addition & 0 deletions vendor/composer/autoload_classmap.php
Original file line number Diff line number Diff line change
Expand Up @@ -1976,6 +1976,7 @@
'Rector\\PhpAttribute\\AttributeArrayNameInliner' => $baseDir . '/src/PhpAttribute/AttributeArrayNameInliner.php',
'Rector\\PhpAttribute\\Contract\\AnnotationToAttributeMapperInterface' => $baseDir . '/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php',
'Rector\\PhpAttribute\\Enum\\DocTagNodeState' => $baseDir . '/src/PhpAttribute/Enum/DocTagNodeState.php',
'Rector\\PhpAttribute\\NodeFactory\\AnnotationToAttributeIntegerValueCaster' => $baseDir . '/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php',
'Rector\\PhpAttribute\\NodeFactory\\AttributeNameFactory' => $baseDir . '/src/PhpAttribute/NodeFactory/AttributeNameFactory.php',
'Rector\\PhpAttribute\\NodeFactory\\NamedArgsFactory' => $baseDir . '/src/PhpAttribute/NodeFactory/NamedArgsFactory.php',
'Rector\\PhpAttribute\\NodeFactory\\PhpAttributeGroupFactory' => $baseDir . '/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php',
Expand Down
1 change: 1 addition & 0 deletions vendor/composer/autoload_static.php
Original file line number Diff line number Diff line change
Expand Up @@ -2195,6 +2195,7 @@ class ComposerStaticInite9e62f8370526a5f08ea47a490713455
'Rector\\PhpAttribute\\AttributeArrayNameInliner' => __DIR__ . '/../..' . '/src/PhpAttribute/AttributeArrayNameInliner.php',
'Rector\\PhpAttribute\\Contract\\AnnotationToAttributeMapperInterface' => __DIR__ . '/../..' . '/src/PhpAttribute/Contract/AnnotationToAttributeMapperInterface.php',
'Rector\\PhpAttribute\\Enum\\DocTagNodeState' => __DIR__ . '/../..' . '/src/PhpAttribute/Enum/DocTagNodeState.php',
'Rector\\PhpAttribute\\NodeFactory\\AnnotationToAttributeIntegerValueCaster' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/AnnotationToAttributeIntegerValueCaster.php',
'Rector\\PhpAttribute\\NodeFactory\\AttributeNameFactory' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/AttributeNameFactory.php',
'Rector\\PhpAttribute\\NodeFactory\\NamedArgsFactory' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/NamedArgsFactory.php',
'Rector\\PhpAttribute\\NodeFactory\\PhpAttributeGroupFactory' => __DIR__ . '/../..' . '/src/PhpAttribute/NodeFactory/PhpAttributeGroupFactory.php',
Expand Down

0 comments on commit cfe590f

Please sign in to comment.