rector/packages/NodeTypeResolver/PHPStan/Type/StaticTypeAnalyzer.php
Abdul Malik Ikhsan fc10fce13d
[Rectify] [Php81] Enable Rectify on Readonly Property only (#1384)
* re-enable rectify and ecs

* [Rectify] [Php81] Enable Rectify on Readonly Property only

* comment

* [ci-review] Rector Rectify

* [ci-review] Rector Rectify

* [ci-review] Rector Rectify

* [ci-review] Rector Rectify

* [ci-review] Rector Rectify

Co-authored-by: GitHub Action <action@github.com>
2021-12-04 15:32:52 +03:00

96 lines
2.4 KiB
PHP

<?php
declare(strict_types=1);
namespace Rector\NodeTypeResolver\PHPStan\Type;
use PHPStan\Type\ArrayType;
use PHPStan\Type\BooleanType;
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
use PHPStan\Type\MixedType;
use PHPStan\Type\NullType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\StringType;
use PHPStan\Type\Type;
use PHPStan\Type\UnionType;
use Rector\PHPStanStaticTypeMapper\TypeAnalyzer\UnionTypeAnalyzer;
final class StaticTypeAnalyzer
{
public function __construct(
private readonly UnionTypeAnalyzer $unionTypeAnalyzer
) {
}
public function isAlwaysTruableType(Type $type): bool
{
if ($type instanceof MixedType) {
return false;
}
if ($type instanceof ConstantArrayType) {
return true;
}
if ($type instanceof ArrayType) {
return $this->isAlwaysTruableArrayType($type);
}
if ($type instanceof UnionType && $this->unionTypeAnalyzer->isNullable($type)) {
return false;
}
// always trueish
if ($type instanceof ObjectType) {
return true;
}
if ($type instanceof ConstantScalarType && ! $type instanceof NullType) {
return (bool) $type->getValue();
}
if ($this->isScalarType($type)) {
return false;
}
return $this->isAlwaysTruableUnionType($type);
}
private function isScalarType(Type $type): bool
{
if ($type instanceof NullType) {
return true;
}
return $type instanceof BooleanType || $type instanceof StringType || $type instanceof IntegerType || $type instanceof FloatType;
}
private function isAlwaysTruableUnionType(Type $type): bool
{
if (! $type instanceof UnionType) {
return false;
}
foreach ($type->getTypes() as $unionedType) {
if (! $this->isAlwaysTruableType($unionedType)) {
return false;
}
}
return true;
}
private function isAlwaysTruableArrayType(ArrayType $arrayType): bool
{
$itemType = $arrayType->getItemType();
if (! $itemType instanceof ConstantScalarType) {
return false;
}
return (bool) $itemType->getValue();
}
}