From 8aa01e026a445385fc8d5fd70a8f58aff026db6f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 7 Mar 2022 18:46:20 +0700 Subject: [PATCH 1/3] [TypeDeclaration] Skip ArrayShapeFromConstantArrayReturnRector on class name as key --- .../TypeMapper/ArrayShapeTypeMapper.php | 11 +++++++++-- rector.php | 5 ----- .../Fixture/skip_class_name_as_key.php.inc | 11 +++++++++++ 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc diff --git a/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php b/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php index 30c0b568143..08b092bb0d0 100644 --- a/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php +++ b/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php @@ -7,6 +7,7 @@ use PHPStan\PhpDocParser\Ast\Type\ArrayShapeItemNode; use PHPStan\PhpDocParser\Ast\Type\ArrayShapeNode; use PHPStan\PhpDocParser\Ast\Type\IdentifierTypeNode; +use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ArrayType; use PHPStan\Type\Constant\ConstantArrayType; use PHPStan\Type\Constant\ConstantStringType; @@ -18,7 +19,8 @@ final class ArrayShapeTypeMapper { public function __construct( - private readonly PHPStanStaticTypeMapper $phpStanStaticTypeMapper + private readonly PHPStanStaticTypeMapper $phpStanStaticTypeMapper, + private readonly ReflectionProvider $reflectionProvider ) { } @@ -37,7 +39,8 @@ public function mapConstantArrayType(ConstantArrayType $constantArrayType): Arra return null; } - $keyDocTypeNode = new IdentifierTypeNode($keyType->getValue()); + $keyValue = $keyType->getValue(); + $keyDocTypeNode = new IdentifierTypeNode($keyValue); $valueType = $constantArrayType->getValueTypes()[$index]; $valueDocTypeNode = $this->phpStanStaticTypeMapper->mapToPHPStanPhpDocTypeNode( @@ -45,6 +48,10 @@ public function mapConstantArrayType(ConstantArrayType $constantArrayType): Arra TypeKind::RETURN() ); + if ($this->reflectionProvider->hasClass($keyValue)) { + return null; + } + $arrayShapeItemNodes[] = new ArrayShapeItemNode( $keyDocTypeNode, $constantArrayType->isOptionalKey($index), diff --git a/rector.php b/rector.php index 9997188020d..93e3e549d52 100644 --- a/rector.php +++ b/rector.php @@ -16,7 +16,6 @@ use Rector\Privatization\Rector\Class_\FinalizeClassesWithoutChildrenRector; use Rector\Set\ValueObject\LevelSetList; use Rector\Set\ValueObject\SetList; -use Rector\TypeDeclaration\Rector\ClassMethod\ArrayShapeFromConstantArrayReturnRector; use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator; return static function (ContainerConfigurator $containerConfigurator): void { @@ -74,10 +73,6 @@ MyCLabsClassToEnumRector::class, SpatieEnumClassToEnumRector::class, - ArrayShapeFromConstantArrayReturnRector::class => [ - __DIR__ . '/rules/Transform/Rector/ClassMethod/ReturnTypeWillChangeRector.php', - ], - // test paths '*/tests/**/Fixture/*', '*/rules-tests/**/Fixture/*', diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc new file mode 100644 index 00000000000..04a730bd9fc --- /dev/null +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc @@ -0,0 +1,11 @@ + $name]; + } +} \ No newline at end of file From a4b7ac9699b5d088a9d71b161889fc437b43e782 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 7 Mar 2022 18:47:59 +0700 Subject: [PATCH 2/3] final touch: eol --- .../Fixture/skip_class_name_as_key.php.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc b/rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc index 04a730bd9fc..16c04d6771f 100644 --- a/rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc +++ b/rules-tests/TypeDeclaration/Rector/ClassMethod/ArrayShapeFromConstantArrayReturnRector/Fixture/skip_class_name_as_key.php.inc @@ -8,4 +8,4 @@ final class SkipClassNameAsKey { return ['ArrayAccess' => $name]; } -} \ No newline at end of file +} From 9043d0e915c61b2919918b2620a576da9c0b2d3d Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 7 Mar 2022 18:48:24 +0700 Subject: [PATCH 3/3] final touch: clean up --- .../TypeMapper/ArrayShapeTypeMapper.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php b/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php index 08b092bb0d0..59ed6f2fc27 100644 --- a/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php +++ b/packages/PHPStanStaticTypeMapper/TypeMapper/ArrayShapeTypeMapper.php @@ -40,6 +40,11 @@ public function mapConstantArrayType(ConstantArrayType $constantArrayType): Arra } $keyValue = $keyType->getValue(); + + if ($this->reflectionProvider->hasClass($keyValue)) { + return null; + } + $keyDocTypeNode = new IdentifierTypeNode($keyValue); $valueType = $constantArrayType->getValueTypes()[$index]; @@ -48,10 +53,6 @@ public function mapConstantArrayType(ConstantArrayType $constantArrayType): Arra TypeKind::RETURN() ); - if ($this->reflectionProvider->hasClass($keyValue)) { - return null; - } - $arrayShapeItemNodes[] = new ArrayShapeItemNode( $keyDocTypeNode, $constantArrayType->isOptionalKey($index),