mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-03 01:40:49 +00:00
fc10fce13d
* 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>
96 lines
2.4 KiB
PHP
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();
|
|
}
|
|
}
|