rector/packages/NodeTypeResolver/TypeComparator/ArrayTypeComparator.php
Tomas Votruba 3313a231b7 Updated Rector to commit bb609b28e327ca1fb7827b6bc548013d19a2cf4e
bb609b28e3 [Core] Always reset stopTraversal to false on next Rector visit (#4182)
2023-06-11 14:17:34 +00:00

45 lines
1.7 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\NodeTypeResolver\TypeComparator;
use PHPStan\Type\ArrayType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\MixedType;
use PHPStan\Type\UnionType;
use Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeCommonTypeNarrower;
/**
* @see \Rector\Tests\NodeTypeResolver\TypeComparator\ArrayTypeComparatorTest
*/
final class ArrayTypeComparator
{
/**
* @var \Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeCommonTypeNarrower
*/
private $unionTypeCommonTypeNarrower;
public function __construct(UnionTypeCommonTypeNarrower $unionTypeCommonTypeNarrower)
{
$this->unionTypeCommonTypeNarrower = $unionTypeCommonTypeNarrower;
}
public function isSubtype(ArrayType $checkedType, ArrayType $mainType) : bool
{
if (!$checkedType instanceof ConstantArrayType && !$mainType instanceof ConstantArrayType) {
return $mainType->isSuperTypeOf($checkedType)->yes();
}
$checkedKeyType = $checkedType->getKeyType();
$mainKeyType = $mainType->getKeyType();
if (!$mainKeyType instanceof MixedType && $mainKeyType->isSuperTypeOf($checkedKeyType)->yes()) {
return \true;
}
$checkedItemType = $checkedType->getItemType();
if ($checkedItemType instanceof UnionType) {
$checkedItemType = $this->unionTypeCommonTypeNarrower->narrowToGenericClassStringType($checkedItemType);
}
$mainItemType = $mainType->getItemType();
if ($mainItemType instanceof UnionType) {
$mainItemType = $this->unionTypeCommonTypeNarrower->narrowToGenericClassStringType($mainItemType);
}
return $checkedItemType->isSuperTypeOf($mainItemType)->yes();
}
}