diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 4b4096c92c..e75ce4046b 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1077,6 +1077,12 @@ parameters: count: 2 path: src/Type/Enum/EnumCaseObjectType.php + - + rawMessage: 'Doing instanceof PHPStan\Type\ErrorType is error-prone and deprecated. Use Type::isError() instead.' + identifier: phpstanApi.instanceofType + count: 1 + path: src/Type/ErrorType.php + - rawMessage: 'Doing instanceof PHPStan\Type\ConstantScalarType is error-prone and deprecated. Use Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues() instead.' identifier: phpstanApi.instanceofType @@ -1479,6 +1485,12 @@ parameters: count: 1 path: src/Type/ObjectType.php + - + rawMessage: 'Doing instanceof PHPStan\Type\ErrorType is error-prone and deprecated. Use Type::isError() instead.' + identifier: phpstanApi.instanceofType + count: 4 + path: src/Type/ObjectType.php + - rawMessage: Doing instanceof PHPStan\Type\Generic\GenericObjectType is error-prone and deprecated. identifier: phpstanApi.instanceofType diff --git a/src/Analyser/MutatingScope.php b/src/Analyser/MutatingScope.php index 65a2969f90..d813a4dd19 100644 --- a/src/Analyser/MutatingScope.php +++ b/src/Analyser/MutatingScope.php @@ -1800,7 +1800,7 @@ static function (Node $node, Scope $scope) use ($arrowScope, &$arrowFunctionImpu $returnType = $functionReflection->getReturnType(); $generatorSendType = $returnType->getTemplateType(Generator::class, 'TSend'); - if ($generatorSendType instanceof ErrorType) { + if ($generatorSendType->isError()->yes()) { return new MixedType(); } @@ -1808,7 +1808,7 @@ static function (Node $node, Scope $scope) use ($arrowScope, &$arrowFunctionImpu } elseif ($node instanceof Expr\YieldFrom) { $yieldFromType = $this->getType($node->expr); $generatorReturnType = $yieldFromType->getTemplateType(Generator::class, 'TReturn'); - if ($generatorReturnType instanceof ErrorType) { + if ($generatorReturnType->isError()->yes()) { return new MixedType(); } @@ -6040,7 +6040,7 @@ classReflection: $classReflection->withTypes($types)->asFinal(), return TypeTraverser::map($newGenericType, static function (Type $type, callable $traverse) use ($resolvedTemplateTypeMap): Type { if ($type instanceof TemplateType && !$type->isArgument()) { $newType = $resolvedTemplateTypeMap->getType($type->getName()); - if ($newType === null || $newType instanceof ErrorType) { + if ($newType === null || $newType->isError()->yes()) { return $type->getDefault() ?? $type->getBound(); } diff --git a/src/Reflection/ClassReflection.php b/src/Reflection/ClassReflection.php index b6e2f2e908..cbb1fd1ae8 100644 --- a/src/Reflection/ClassReflection.php +++ b/src/Reflection/ClassReflection.php @@ -1643,7 +1643,7 @@ public function getActiveTemplateTypeMap(): TemplateTypeMap if ($resolved !== null) { $templateTypeMap = $this->getTemplateTypeMap(); return $this->activeTemplateTypeMap = $resolved->map(static function (string $name, Type $type) use ($templateTypeMap): Type { - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { $templateType = $templateTypeMap->getType($name); if ($templateType !== null) { return TemplateTypeHelper::resolveToDefaults($templateType); diff --git a/src/Reflection/InitializerExprTypeResolver.php b/src/Reflection/InitializerExprTypeResolver.php index 47157cf01a..c3ae1bb05b 100644 --- a/src/Reflection/InitializerExprTypeResolver.php +++ b/src/Reflection/InitializerExprTypeResolver.php @@ -518,7 +518,7 @@ public function resolveConcatType(Type $left, Type $right): Type if (TypeCombinator::union( $leftStringType, $rightStringType, - ) instanceof ErrorType) { + )->isError()->yes()) { return new ErrorType(); } @@ -974,7 +974,7 @@ public function getBitwiseAndType(Expr $left, Expr $right, callable $getTypeCall $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1001,7 +1001,7 @@ public function getBitwiseAndType(Expr $left, Expr $right, callable $getTypeCall $leftNumberType = $leftType->toNumber(); $rightNumberType = $rightType->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1043,7 +1043,7 @@ public function getBitwiseOrType(Expr $left, Expr $right, callable $getTypeCallb $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1067,7 +1067,7 @@ public function getBitwiseOrType(Expr $left, Expr $right, callable $getTypeCallb return new StringType(); } - if (TypeCombinator::union($leftType->toNumber(), $rightType->toNumber()) instanceof ErrorType) { + if (TypeCombinator::union($leftType->toNumber(), $rightType->toNumber())->isError()->yes()) { return new ErrorType(); } @@ -1102,7 +1102,7 @@ public function getBitwiseXorType(Expr $left, Expr $right, callable $getTypeCall $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1126,7 +1126,7 @@ public function getBitwiseXorType(Expr $left, Expr $right, callable $getTypeCall return new StringType(); } - if (TypeCombinator::union($leftType->toNumber(), $rightType->toNumber()) instanceof ErrorType) { + if (TypeCombinator::union($leftType->toNumber(), $rightType->toNumber())->isError()->yes()) { return new ErrorType(); } @@ -1187,7 +1187,7 @@ public function getDivType(Expr $left, Expr $right, callable $getTypeCallback): $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1238,7 +1238,7 @@ public function getModType(Expr $left, Expr $right, callable $getTypeCallback): return $extensionSpecified; } - if ($leftType->toNumber() instanceof ErrorType || $rightType->toNumber() instanceof ErrorType) { + if ($leftType->toNumber()->isError()->yes() || $rightType->toNumber()->isError()->yes()) { return new ErrorType(); } @@ -1255,7 +1255,7 @@ public function getModType(Expr $left, Expr $right, callable $getTypeCallback): $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1354,7 +1354,7 @@ public function getPlusType(Expr $left, Expr $right, callable $getTypeCallback): $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1533,7 +1533,7 @@ public function getMinusType(Expr $left, Expr $right, callable $getTypeCallback) $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1577,7 +1577,7 @@ public function getMulType(Expr $left, Expr $right, callable $getTypeCallback): $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1630,7 +1630,7 @@ public function getPowType(Expr $left, Expr $right, callable $getTypeCallback): } $exponentiatedTyped = $leftType->exponentiate($rightType); - if (!$exponentiatedTyped instanceof ErrorType) { + if (!$exponentiatedTyped->isError()->yes()) { return $exponentiatedTyped; } @@ -1662,7 +1662,7 @@ public function getShiftLeftType(Expr $left, Expr $right, callable $getTypeCallb $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1689,7 +1689,7 @@ public function getShiftLeftType(Expr $left, Expr $right, callable $getTypeCallb $leftNumberType = $leftType->toNumber(); $rightNumberType = $rightType->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1721,7 +1721,7 @@ public function getShiftRightType(Expr $left, Expr $right, callable $getTypeCall $leftNumberType = $leftTypeInner->toNumber(); $rightNumberType = $rightTypeInner->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1748,7 +1748,7 @@ public function getShiftRightType(Expr $left, Expr $right, callable $getTypeCall $leftNumberType = $leftType->toNumber(); $rightNumberType = $rightType->toNumber(); - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } @@ -1966,7 +1966,7 @@ private function resolveCommonMath(Expr\BinaryOp $expr, Type $leftType, Type $ri return new ErrorType(); } - if ($leftNumberType instanceof ErrorType || $rightNumberType instanceof ErrorType) { + if ($leftNumberType->isError()->yes() || $rightNumberType->isError()->yes()) { return new ErrorType(); } if ($leftNumberType instanceof NeverType || $rightNumberType instanceof NeverType) { diff --git a/src/Reflection/Php/PhpClassReflectionExtension.php b/src/Reflection/Php/PhpClassReflectionExtension.php index 37959a7a64..0f8bd0190d 100644 --- a/src/Reflection/Php/PhpClassReflectionExtension.php +++ b/src/Reflection/Php/PhpClassReflectionExtension.php @@ -41,7 +41,6 @@ use PHPStan\Type\Constant\ConstantArrayTypeBuilder; use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\Enum\EnumCaseObjectType; -use PHPStan\Type\ErrorType; use PHPStan\Type\FileTypeMapper; use PHPStan\Type\GeneralizePrecision; use PHPStan\Type\Generic\TemplateMixedType; @@ -1161,7 +1160,7 @@ private function inferAndCachePropertyTypes( } $propertyType = $methodScope->getType($expr->expr); - if ($propertyType instanceof ErrorType || $propertyType instanceof NeverType) { + if ($propertyType->isError()->yes() || $propertyType instanceof NeverType) { continue; } diff --git a/src/Reflection/ResolvedFunctionVariantWithOriginal.php b/src/Reflection/ResolvedFunctionVariantWithOriginal.php index 21108d658e..4a02b9e80c 100644 --- a/src/Reflection/ResolvedFunctionVariantWithOriginal.php +++ b/src/Reflection/ResolvedFunctionVariantWithOriginal.php @@ -4,7 +4,6 @@ use PHPStan\Reflection\Php\ExtendedDummyParameter; use PHPStan\Type\ConditionalTypeForParameter; -use PHPStan\Type\ErrorType; use PHPStan\Type\Generic\GenericObjectType; use PHPStan\Type\Generic\GenericStaticType; use PHPStan\Type\Generic\TemplateType; @@ -211,7 +210,7 @@ private function resolveResolvableTemplateTypes(Type $type, TemplateTypeVariance && $type->getScope()->getFunctionName() !== null ) { $newType = $this->resolvedTemplateTypeMap->getType($type->getName()); - if ($newType === null || $newType instanceof ErrorType) { + if ($newType === null || $newType->isError()->yes()) { return $traverse($type); } @@ -252,7 +251,7 @@ private function resolveResolvableTemplateTypes(Type $type, TemplateTypeVariance if ($type instanceof TemplateType && !$type->isArgument()) { $newType = $this->resolvedTemplateTypeMap->getType($type->getName()); - if ($newType === null || $newType instanceof ErrorType) { + if ($newType === null || $newType->isError()->yes()) { return $traverse($type); } diff --git a/src/Rules/Api/ApiInstanceofTypeRule.php b/src/Rules/Api/ApiInstanceofTypeRule.php index c88c5114bf..e633c57523 100644 --- a/src/Rules/Api/ApiInstanceofTypeRule.php +++ b/src/Rules/Api/ApiInstanceofTypeRule.php @@ -32,6 +32,7 @@ use PHPStan\Type\Constant\ConstantStringType; use PHPStan\Type\ConstantScalarType; use PHPStan\Type\Enum\EnumCaseObjectType; +use PHPStan\Type\ErrorType; use PHPStan\Type\FloatType; use PHPStan\Type\Generic\GenericClassStringType; use PHPStan\Type\Generic\GenericObjectType; @@ -79,6 +80,7 @@ final class ApiInstanceofTypeRule implements Rule IntersectionType::class => null, ConstantScalarType::class => 'Type::isConstantScalarValue() or Type::getConstantScalarTypes() or Type::getConstantScalarValues()', ObjectShapeType::class => 'Type::isObject() and Type::hasProperty()', + ErrorType::class => 'Type::isError()', // accessory types NonEmptyArrayType::class => 'Type::isIterableAtLeastOnce()', diff --git a/src/Rules/Arrays/ArrayDestructuringRule.php b/src/Rules/Arrays/ArrayDestructuringRule.php index eac1a12956..9ea574ca5b 100644 --- a/src/Rules/Arrays/ArrayDestructuringRule.php +++ b/src/Rules/Arrays/ArrayDestructuringRule.php @@ -14,7 +14,6 @@ use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; use PHPStan\Type\Constant\ConstantIntegerType; -use PHPStan\Type\ErrorType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; @@ -65,7 +64,7 @@ private function getErrors(Scope $scope, Node\Expr\List_ $var, Expr $expr): arra static fn (Type $varType): bool => $varType->isArray()->yes() || (new ObjectType(ArrayAccess::class))->isSuperTypeOf($varType)->yes(), ); $exprType = $exprTypeResult->getType(); - if ($exprType instanceof ErrorType) { + if ($exprType->isError()->yes()) { return []; } if (!$exprType->isArray()->yes() && !(new ObjectType(ArrayAccess::class))->isSuperTypeOf($exprType)->yes()) { diff --git a/src/Rules/Arrays/ArrayUnpackingRule.php b/src/Rules/Arrays/ArrayUnpackingRule.php index 4dc25092a9..496d137296 100644 --- a/src/Rules/Arrays/ArrayUnpackingRule.php +++ b/src/Rules/Arrays/ArrayUnpackingRule.php @@ -11,7 +11,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -46,7 +45,7 @@ public function processNode(Node $node, Scope $scope): array ); $keyType = $typeResult->getType(); - if ($keyType instanceof ErrorType) { + if ($keyType->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php index 0723234b36..0ceca79417 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayDimFetchRule.php @@ -10,7 +10,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -49,7 +48,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $varType): bool => $varType->isArray()->no(), )->getType(); - if ($varType instanceof ErrorType) { + if ($varType->isError()->yes()) { return []; } @@ -65,7 +64,7 @@ public function processNode(Node $node, Scope $scope): array '', static fn (Type $dimType): bool => $allowedArrayKeys->isSuperTypeOf($dimType)->yes(), )->getType(); - if ($dimensionType instanceof ErrorType) { + if ($dimensionType->isError()->yes()) { return []; } diff --git a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php index 298c65b565..d3b28c8450 100644 --- a/src/Rules/Arrays/InvalidKeyInArrayItemRule.php +++ b/src/Rules/Arrays/InvalidKeyInArrayItemRule.php @@ -9,7 +9,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -46,7 +45,7 @@ public function processNode(Node $node, Scope $scope): array '', static fn (Type $dimType): bool => $allowedArrayKeys->isSuperTypeOf($dimType)->yes(), )->getType(); - if ($dimensionType instanceof ErrorType) { + if ($dimensionType->isError()->yes()) { return []; } diff --git a/src/Rules/Arrays/IterableInForeachRule.php b/src/Rules/Arrays/IterableInForeachRule.php index 2e4204b35b..68243b8396 100644 --- a/src/Rules/Arrays/IterableInForeachRule.php +++ b/src/Rules/Arrays/IterableInForeachRule.php @@ -9,7 +9,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -40,7 +39,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->isIterable()->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } if ($type->isIterable()->yes()) { diff --git a/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchCheck.php b/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchCheck.php index 3e4b1e7b3f..46a24ac5f4 100644 --- a/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchCheck.php +++ b/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchCheck.php @@ -11,7 +11,6 @@ use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; use PHPStan\Type\BenevolentUnionType; -use PHPStan\Type\ErrorType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; @@ -54,7 +53,7 @@ public function check( static fn (Type $type): bool => $type->hasOffsetValueType($dimType)->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php b/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php index 9a4947d521..a3485c7148 100644 --- a/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php +++ b/src/Rules/Arrays/NonexistentOffsetInArrayDimFetchRule.php @@ -15,7 +15,6 @@ use PHPStan\Rules\RuleLevelHelper; use PHPStan\TrinaryLogic; use PHPStan\Type\Constant\ConstantIntegerType; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function count; @@ -65,7 +64,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->isOffsetAccessible()->yes(), ); $isOffsetAccessibleType = $isOffsetAccessibleTypeResult->getType(); - if ($isOffsetAccessibleType instanceof ErrorType) { + if ($isOffsetAccessibleType->isError()->yes()) { return $isOffsetAccessibleTypeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Arrays/OffsetAccessAssignOpRule.php b/src/Rules/Arrays/OffsetAccessAssignOpRule.php index 466d5cd5c8..eac6c16f7b 100644 --- a/src/Rules/Arrays/OffsetAccessAssignOpRule.php +++ b/src/Rules/Arrays/OffsetAccessAssignOpRule.php @@ -9,7 +9,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; @@ -50,7 +49,7 @@ public function processNode(Node $node, Scope $scope): array '', static function (Type $varType) use ($potentialDimType): bool { $arrayDimType = $varType->setOffsetValueType($potentialDimType, new MixedType()); - return !($arrayDimType instanceof ErrorType); + return !($arrayDimType->isError()->yes()); }, ); $varType = $varTypeResult->getType(); @@ -62,7 +61,7 @@ static function (Type $varType) use ($potentialDimType): bool { '', static function (Type $dimType) use ($varType): bool { $arrayDimType = $varType->setOffsetValueType($dimType, new MixedType()); - return !($arrayDimType instanceof ErrorType); + return !($arrayDimType->isError()->yes()); }, ); $dimType = $dimTypeResult->getType(); @@ -74,7 +73,7 @@ static function (Type $dimType) use ($varType): bool { } $resultType = $varType->setOffsetValueType($dimType, new MixedType()); - if (!($resultType instanceof ErrorType)) { + if (!($resultType->isError()->yes())) { return []; } diff --git a/src/Rules/Arrays/OffsetAccessAssignmentRule.php b/src/Rules/Arrays/OffsetAccessAssignmentRule.php index 838636feb6..adb030d2d9 100644 --- a/src/Rules/Arrays/OffsetAccessAssignmentRule.php +++ b/src/Rules/Arrays/OffsetAccessAssignmentRule.php @@ -9,7 +9,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; @@ -48,11 +47,11 @@ public function processNode(Node $node, Scope $scope): array '', static function (Type $varType) use ($potentialDimType): bool { $arrayDimType = $varType->setOffsetValueType($potentialDimType, new MixedType()); - return !($arrayDimType instanceof ErrorType); + return !($arrayDimType->isError()->yes()); }, ); $varType = $varTypeResult->getType(); - if ($varType instanceof ErrorType) { + if ($varType->isError()->yes()) { return []; } if (!$varType->isOffsetAccessible()->yes()) { @@ -66,7 +65,7 @@ static function (Type $varType) use ($potentialDimType): bool { '', static function (Type $dimType) use ($varType): bool { $arrayDimType = $varType->setOffsetValueType($dimType, new MixedType()); - return !($arrayDimType instanceof ErrorType); + return !($arrayDimType->isError()->yes()); }, ); $dimType = $dimTypeResult->getType(); @@ -75,7 +74,7 @@ static function (Type $dimType) use ($varType): bool { } $resultType = $varType->setOffsetValueType($dimType, new MixedType()); - if (!($resultType instanceof ErrorType)) { + if (!($resultType->isError()->yes())) { return []; } diff --git a/src/Rules/Arrays/OffsetAccessValueAssignmentRule.php b/src/Rules/Arrays/OffsetAccessValueAssignmentRule.php index 3d21a95970..f538a334a3 100644 --- a/src/Rules/Arrays/OffsetAccessValueAssignmentRule.php +++ b/src/Rules/Arrays/OffsetAccessValueAssignmentRule.php @@ -11,7 +11,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; @@ -65,11 +64,11 @@ public function processNode(Node $node, Scope $scope): array '', static function (Type $varType) use ($assignedValueType): bool { $result = $varType->setOffsetValueType(new MixedType(), $assignedValueType); - return !($result instanceof ErrorType); + return !($result->isError()->yes()); }, ); $arrayType = $arrayTypeResult->getType(); - if ($arrayType instanceof ErrorType) { + if ($arrayType->isError()->yes()) { return []; } $isOffsetAccessible = $arrayType->isOffsetAccessible(); @@ -77,7 +76,7 @@ static function (Type $varType) use ($assignedValueType): bool { return []; } $resultType = $arrayType->setOffsetValueType(new MixedType(), $assignedValueType); - if (!$resultType instanceof ErrorType) { + if (!$resultType->isError()->yes()) { return []; } diff --git a/src/Rules/Arrays/UnpackIterableInArrayRule.php b/src/Rules/Arrays/UnpackIterableInArrayRule.php index 0e7907b59d..c123ad7c4c 100644 --- a/src/Rules/Arrays/UnpackIterableInArrayRule.php +++ b/src/Rules/Arrays/UnpackIterableInArrayRule.php @@ -9,7 +9,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -51,7 +50,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->isIterable()->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { continue; } diff --git a/src/Rules/Cast/EchoRule.php b/src/Rules/Cast/EchoRule.php index 4844d1e0a0..442e52cefc 100644 --- a/src/Rules/Cast/EchoRule.php +++ b/src/Rules/Cast/EchoRule.php @@ -8,7 +8,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -38,11 +37,11 @@ public function processNode(Node $node, Scope $scope): array $scope, $expr, '', - static fn (Type $type): bool => !$type->toString() instanceof ErrorType, + static fn (Type $type): bool => !$type->toString()->isError()->yes(), ); - if ($typeResult->getType() instanceof ErrorType - || !$typeResult->getType()->toString() instanceof ErrorType + if ($typeResult->getType()->isError()->yes() + || !$typeResult->getType()->toString()->isError()->yes() ) { continue; } diff --git a/src/Rules/Cast/InvalidCastRule.php b/src/Rules/Cast/InvalidCastRule.php index 38b97e396a..af5b7956a0 100644 --- a/src/Rules/Cast/InvalidCastRule.php +++ b/src/Rules/Cast/InvalidCastRule.php @@ -9,7 +9,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function get_class; @@ -64,11 +63,11 @@ static function (Type $type) use ($castTypeCallback): bool { [$castType] = $castResult; - return !$castType instanceof ErrorType; + return !$castType->isError()->yes(); }, ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return []; } @@ -79,7 +78,7 @@ static function (Type $type) use ($castTypeCallback): bool { [$castType, $castIdentifier] = $castResult; - if ($castType instanceof ErrorType) { + if ($castType->isError()->yes()) { $classReflection = $this->reflectionProvider->getClass(get_class($node)); $shortName = $classReflection->getNativeReflection()->getShortName(); $shortName = strtolower($shortName); diff --git a/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php b/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php index d8d899e72d..a404cd3659 100644 --- a/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php +++ b/src/Rules/Cast/InvalidPartOfEncapsedStringRule.php @@ -9,7 +9,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -45,15 +44,15 @@ public function processNode(Node $node, Scope $scope): array $scope, $part, '', - static fn (Type $type): bool => !$type->toString() instanceof ErrorType, + static fn (Type $type): bool => !$type->toString()->isError()->yes(), ); $partType = $typeResult->getType(); - if ($partType instanceof ErrorType) { + if ($partType->isError()->yes()) { continue; } $stringPartType = $partType->toString(); - if (!$stringPartType instanceof ErrorType) { + if (!$stringPartType->isError()->yes()) { continue; } $messages[] = RuleErrorBuilder::message(sprintf( diff --git a/src/Rules/Cast/PrintRule.php b/src/Rules/Cast/PrintRule.php index 8e881f8ba3..5b049c844e 100644 --- a/src/Rules/Cast/PrintRule.php +++ b/src/Rules/Cast/PrintRule.php @@ -8,7 +8,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -35,11 +34,11 @@ public function processNode(Node $node, Scope $scope): array $scope, $node->expr, '', - static fn (Type $type): bool => !$type->toString() instanceof ErrorType, + static fn (Type $type): bool => !$type->toString()->isError()->yes(), ); - if (!$typeResult->getType() instanceof ErrorType - && $typeResult->getType()->toString() instanceof ErrorType + if (!$typeResult->getType()->isError()->yes() + && $typeResult->getType()->toString()->isError()->yes() ) { return [RuleErrorBuilder::message(sprintf( 'Parameter %s of print cannot be converted to string.', diff --git a/src/Rules/Classes/ClassConstantRule.php b/src/Rules/Classes/ClassConstantRule.php index a8220d5e11..ccca894bce 100644 --- a/src/Rules/Classes/ClassConstantRule.php +++ b/src/Rules/Classes/ClassConstantRule.php @@ -21,7 +21,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\StringType; use PHPStan\Type\ThisType; use PHPStan\Type\Type; @@ -77,7 +76,7 @@ public function processNode(Node $node, Scope $scope): array ); $nameType = $nameTypeResult->getType(); - if (!$nameType instanceof ErrorType && !$nameType->isString()->yes()) { + if (!$nameType->isError()->yes() && !$nameType->isString()->yes()) { $className = $node->class instanceof Name ? $scope->resolveName($node->class) : $scope->getType($node->class)->describe(VerbosityLevel::typeOnly()); @@ -205,7 +204,7 @@ private function processSingleClassConstFetch(Scope $scope, ClassConstFetch $nod static fn (Type $type): bool => $type->canAccessConstants()->yes() && $type->hasConstant($constantName)->yes(), ); $classType = $classTypeResult->getType(); - if ($classType instanceof ErrorType) { + if ($classType->isError()->yes()) { return $classTypeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Classes/ImpossibleInstanceOfRule.php b/src/Rules/Classes/ImpossibleInstanceOfRule.php index 7c866cc30e..83b8d5d70d 100644 --- a/src/Rules/Classes/ImpossibleInstanceOfRule.php +++ b/src/Rules/Classes/ImpossibleInstanceOfRule.php @@ -11,7 +11,6 @@ use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; use PHPStan\Type\Constant\ConstantBooleanType; -use PHPStan\Type\ErrorType; use PHPStan\Type\ObjectType; use PHPStan\Type\ObjectWithoutClassType; use PHPStan\Type\StringType; @@ -61,7 +60,7 @@ public function processNode(Node $node, Scope $scope): array '', static fn (Type $type): bool => !$allowed->isSuperTypeOf($type)->yes(), ); - if (!$typeResult->getType() instanceof ErrorType && !$allowed->isSuperTypeOf($typeResult->getType())->yes()) { + if (!$typeResult->getType()->isError()->yes() && !$allowed->isSuperTypeOf($typeResult->getType())->yes()) { return [ RuleErrorBuilder::message(sprintf( 'Instanceof between %s and %s results in an error.', diff --git a/src/Rules/Classes/LocalTypeAliasesCheck.php b/src/Rules/Classes/LocalTypeAliasesCheck.php index a849ecac8c..a14547c029 100644 --- a/src/Rules/Classes/LocalTypeAliasesCheck.php +++ b/src/Rules/Classes/LocalTypeAliasesCheck.php @@ -21,7 +21,6 @@ use PHPStan\Rules\PhpDoc\UnresolvableTypeHelper; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Type\CircularTypeAliasErrorType; -use PHPStan\Type\ErrorType; use PHPStan\Type\Generic\TemplateType; use PHPStan\Type\Type; use PHPStan\Type\TypeTraverser; @@ -359,7 +358,7 @@ private function hasErrorType(Type $type, string $aliasName, array &$errors): bo return $type; } - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { $errors[] = RuleErrorBuilder::message(sprintf('Invalid type definition detected in type alias %s.', $aliasName)) ->identifier('typeAlias.invalidType') ->build(); diff --git a/src/Rules/Constants/DynamicClassConstantFetchRule.php b/src/Rules/Constants/DynamicClassConstantFetchRule.php index 62046c1b50..c1a6970896 100644 --- a/src/Rules/Constants/DynamicClassConstantFetchRule.php +++ b/src/Rules/Constants/DynamicClassConstantFetchRule.php @@ -10,7 +10,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -53,7 +52,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->isString()->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return []; } if ($type->isString()->yes()) { diff --git a/src/Rules/Exceptions/ThrowExprTypeRule.php b/src/Rules/Exceptions/ThrowExprTypeRule.php index e2b0debb30..347b9fdc18 100644 --- a/src/Rules/Exceptions/ThrowExprTypeRule.php +++ b/src/Rules/Exceptions/ThrowExprTypeRule.php @@ -8,7 +8,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; @@ -44,7 +43,7 @@ public function processNode(Node $node, Scope $scope): array ); $foundType = $typeResult->getType(); - if ($foundType instanceof ErrorType) { + if ($foundType->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/FunctionCallParametersCheck.php b/src/Rules/FunctionCallParametersCheck.php index 5cb8b48761..9dcfc5385a 100644 --- a/src/Rules/FunctionCallParametersCheck.php +++ b/src/Rules/FunctionCallParametersCheck.php @@ -18,7 +18,6 @@ use PHPStan\TrinaryLogic; use PHPStan\Type\ConditionalType; use PHPStan\Type\Constant\ConstantIntegerType; -use PHPStan\Type\ErrorType; use PHPStan\Type\Generic\TemplateType; use PHPStan\Type\IntegerRangeType; use PHPStan\Type\NeverType; @@ -302,7 +301,7 @@ public function check( ); $iterableTypeResultType = $iterableTypeResult->getType(); if ( - !$iterableTypeResultType instanceof ErrorType + !$iterableTypeResultType->isError()->yes() && !$iterableTypeResultType->isIterable()->yes() ) { $errors[] = RuleErrorBuilder::message(sprintf( @@ -351,7 +350,7 @@ public function check( if ( !$parameter->passedByReference()->createsNewVariable() - || (!$isBuiltin && !$argumentValueType instanceof ErrorType) + || (!$isBuiltin && !$argumentValueType->isError()->yes()) ) { $accepts = $this->ruleLevelHelper->accepts($parameterType, $argumentValueType, $scope->isDeclareStrictTypes()); @@ -501,7 +500,7 @@ static function (Type $type, callable $traverse) use (&$returnTemplateTypes): Ty foreach ($resolvedTypes as $name => $type) { if ( - !($type instanceof ErrorType) + !($type->isError()->yes()) && ( !$type instanceof NeverType || $type->isExplicit() diff --git a/src/Rules/FunctionReturnTypeCheck.php b/src/Rules/FunctionReturnTypeCheck.php index e61965ca3a..b371f75cb3 100644 --- a/src/Rules/FunctionReturnTypeCheck.php +++ b/src/Rules/FunctionReturnTypeCheck.php @@ -7,7 +7,6 @@ use PhpParser\Node\Expr; use PHPStan\Analyser\Scope; use PHPStan\DependencyInjection\AutowiredService; -use PHPStan\Type\ErrorType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; use PHPStan\Type\TypeUtils; @@ -50,7 +49,7 @@ public function checkReturnType( if ($isGenerator) { $returnType = $returnType->getTemplateType(Generator::class, 'TReturn'); - if ($returnType instanceof ErrorType) { + if ($returnType->isError()->yes()) { return []; } } diff --git a/src/Rules/Functions/CallCallablesRule.php b/src/Rules/Functions/CallCallablesRule.php index 4ab0af4b01..54045ae260 100644 --- a/src/Rules/Functions/CallCallablesRule.php +++ b/src/Rules/Functions/CallCallablesRule.php @@ -16,7 +16,6 @@ use PHPStan\Rules\RuleLevelHelper; use PHPStan\TrinaryLogic; use PHPStan\Type\ClosureType; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function array_merge; @@ -61,7 +60,7 @@ public function processNode( static fn (Type $type): bool => $type->isCallable()->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Functions/FunctionCallableRule.php b/src/Rules/Functions/FunctionCallableRule.php index a4b698d357..5ea97e6c84 100644 --- a/src/Rules/Functions/FunctionCallableRule.php +++ b/src/Rules/Functions/FunctionCallableRule.php @@ -13,7 +13,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -98,7 +97,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->isCallable()->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Functions/PrintfParameterTypeRule.php b/src/Rules/Functions/PrintfParameterTypeRule.php index 68b79d0f00..8ae2624ac6 100644 --- a/src/Rules/Functions/PrintfParameterTypeRule.php +++ b/src/Rules/Functions/PrintfParameterTypeRule.php @@ -10,7 +10,6 @@ use PHPStan\Rules\RuleLevelHelper; use PHPStan\ShouldNotHappenException; use PHPStan\Type\BooleanType; -use PHPStan\Type\ErrorType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; use PHPStan\Type\NullType; @@ -130,7 +129,7 @@ public function processNode(Node $node, Scope $scope): array fn (Type $t) => $placeholder->doesArgumentTypeMatchPlaceholder($t, $this->checkStrictPrintfPlaceholderTypes), )->getType(); - if ($argType instanceof ErrorType || $placeholder->doesArgumentTypeMatchPlaceholder($argType, $this->checkStrictPrintfPlaceholderTypes)) { + if ($argType->isError()->yes() || $placeholder->doesArgumentTypeMatchPlaceholder($argType, $this->checkStrictPrintfPlaceholderTypes)) { continue; } diff --git a/src/Rules/Functions/PrintfPlaceholder.php b/src/Rules/Functions/PrintfPlaceholder.php index c151395308..883c78430c 100644 --- a/src/Rules/Functions/PrintfPlaceholder.php +++ b/src/Rules/Functions/PrintfPlaceholder.php @@ -4,7 +4,6 @@ use PHPStan\ShouldNotHappenException; use PHPStan\Type\Accessory\AccessoryNumericStringType; -use PHPStan\Type\ErrorType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; use PHPStan\Type\IntersectionType; @@ -35,7 +34,7 @@ public function doesArgumentTypeMatchPlaceholder(Type $argumentType, bool $stric case 'int': return $strictPlaceholderTypes ? (new IntegerType())->accepts($argumentType, true)->yes() - : ! $argumentType->toInteger() instanceof ErrorType; + : ! $argumentType->toInteger()->isError()->yes(); case 'float': return $strictPlaceholderTypes ? TypeCombinator::union( @@ -43,7 +42,7 @@ public function doesArgumentTypeMatchPlaceholder(Type $argumentType, bool $stric // numeric-string is allowed for consistency with phpstan-strict-rules. new IntersectionType([new StringType(), new AccessoryNumericStringType()]), )->accepts($argumentType, true)->yes() - : ! $argumentType->toFloat() instanceof ErrorType; + : ! $argumentType->toFloat()->isError()->yes(); case 'string': case 'mixed': // The function signature already limits the parameters to stringable types, so there's diff --git a/src/Rules/Functions/SortParameterCastableToStringRule.php b/src/Rules/Functions/SortParameterCastableToStringRule.php index 1625024bd6..80cd21e178 100644 --- a/src/Rules/Functions/SortParameterCastableToStringRule.php +++ b/src/Rules/Functions/SortParameterCastableToStringRule.php @@ -12,7 +12,6 @@ use PHPStan\Rules\ParameterCastableToStringCheck; use PHPStan\Rules\Rule; use PHPStan\Type\Constant\ConstantIntegerType; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\TypeUtils; use function array_key_exists; @@ -112,7 +111,7 @@ public function processNode(Node $node, Scope $scope): array $castFn = static function (Type $t): Type { $float = $t->toFloat(); - return $float instanceof ErrorType + return $float->isError()->yes() ? $float : $t->toString(); }; diff --git a/src/Rules/Generators/YieldFromTypeRule.php b/src/Rules/Generators/YieldFromTypeRule.php index b77f04b53a..bfd6cedf23 100644 --- a/src/Rules/Generators/YieldFromTypeRule.php +++ b/src/Rules/Generators/YieldFromTypeRule.php @@ -11,7 +11,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\MixedType; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -118,7 +117,7 @@ public function processNode(Node $node, Scope $scope): array $currentReturnType = $scopeFunction->getReturnType(); $exprSendType = $exprType->getTemplateType(Generator::class, 'TSend'); $thisSendType = $currentReturnType->getTemplateType(Generator::class, 'TSend'); - if ($exprSendType instanceof ErrorType || $thisSendType instanceof ErrorType) { + if ($exprSendType->isError()->yes() || $thisSendType->isError()->yes()) { return $messages; } diff --git a/src/Rules/Methods/CallToMethodStatementWithNoDiscardRule.php b/src/Rules/Methods/CallToMethodStatementWithNoDiscardRule.php index 53755ee620..bbc773d566 100644 --- a/src/Rules/Methods/CallToMethodStatementWithNoDiscardRule.php +++ b/src/Rules/Methods/CallToMethodStatementWithNoDiscardRule.php @@ -10,7 +10,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use function sprintf; @@ -80,7 +79,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes(), ); $calledOnType = $typeResult->getType(); - if ($calledOnType instanceof ErrorType) { + if ($calledOnType->isError()->yes()) { return []; } if (!$calledOnType->canCallMethods()->yes()) { diff --git a/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php b/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php index 3a064dc646..82c3c69d99 100644 --- a/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php +++ b/src/Rules/Methods/CallToMethodStatementWithoutSideEffectsRule.php @@ -10,7 +10,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; use function count; @@ -56,7 +55,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes(), ); $calledOnType = $typeResult->getType(); - if ($calledOnType instanceof ErrorType) { + if ($calledOnType->isError()->yes()) { return []; } if (!$calledOnType->canCallMethods()->yes()) { diff --git a/src/Rules/Methods/CallToStaticMethodStatementWithNoDiscardRule.php b/src/Rules/Methods/CallToStaticMethodStatementWithNoDiscardRule.php index a1fa42d31e..dd13b1b476 100644 --- a/src/Rules/Methods/CallToStaticMethodStatementWithNoDiscardRule.php +++ b/src/Rules/Methods/CallToStaticMethodStatementWithNoDiscardRule.php @@ -11,7 +11,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; use function sprintf; @@ -89,7 +88,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes(), ); $calledOnType = $typeResult->getType(); - if ($calledOnType instanceof ErrorType) { + if ($calledOnType->isError()->yes()) { return []; } } diff --git a/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php b/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php index a6fde544ca..39c27a9c58 100644 --- a/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php +++ b/src/Rules/Methods/CallToStaticMethodStatementWithoutSideEffectsRule.php @@ -11,7 +11,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\NeverType; use PHPStan\Type\ObjectType; use PHPStan\Type\Type; @@ -68,7 +67,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes(), ); $calledOnType = $typeResult->getType(); - if ($calledOnType instanceof ErrorType) { + if ($calledOnType->isError()->yes()) { return []; } } diff --git a/src/Rules/Methods/MethodCallCheck.php b/src/Rules/Methods/MethodCallCheck.php index 3be2032165..06fd38559f 100644 --- a/src/Rules/Methods/MethodCallCheck.php +++ b/src/Rules/Methods/MethodCallCheck.php @@ -16,7 +16,6 @@ use PHPStan\Rules\IdentifierRuleError; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\StaticType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; @@ -57,7 +56,7 @@ public function check( ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return [$typeResult->getUnknownClassErrors(), null]; } diff --git a/src/Rules/Methods/StaticMethodCallCheck.php b/src/Rules/Methods/StaticMethodCallCheck.php index b0a6f057e5..31998d0289 100644 --- a/src/Rules/Methods/StaticMethodCallCheck.php +++ b/src/Rules/Methods/StaticMethodCallCheck.php @@ -23,7 +23,6 @@ use PHPStan\Rules\RuleLevelHelper; use PHPStan\ShouldNotHappenException; use PHPStan\TrinaryLogic; -use PHPStan\Type\ErrorType; use PHPStan\Type\Generic\GenericClassStringType; use PHPStan\Type\StaticType; use PHPStan\Type\StringType; @@ -179,7 +178,7 @@ public function check( static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes(), ); $classType = $classTypeResult->getType(); - if ($classType instanceof ErrorType) { + if ($classType->isError()->yes()) { return [$classTypeResult->getUnknownClassErrors(), null]; } } diff --git a/src/Rules/Missing/MissingReturnRule.php b/src/Rules/Missing/MissingReturnRule.php index 5bc9d3d40e..70b8f98a13 100644 --- a/src/Rules/Missing/MissingReturnRule.php +++ b/src/Rules/Missing/MissingReturnRule.php @@ -12,7 +12,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\ShouldNotHappenException; -use PHPStan\Type\ErrorType; use PHPStan\Type\Generic\TemplateMixedType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; @@ -84,7 +83,7 @@ public function processNode(Node $node, Scope $scope): array if ($statementResult->hasYield()) { if ($this->checkPhpDocMissingReturn) { $generatorReturnType = $returnType->getTemplateType(Generator::class, 'TReturn'); - if (!$generatorReturnType instanceof ErrorType) { + if (!$generatorReturnType->isError()->yes()) { $returnType = $generatorReturnType; if ($returnType->isVoid()->yes()) { return []; diff --git a/src/Rules/Operators/InvalidBinaryOperationRule.php b/src/Rules/Operators/InvalidBinaryOperationRule.php index 374aa87bfc..2b648557de 100644 --- a/src/Rules/Operators/InvalidBinaryOperationRule.php +++ b/src/Rules/Operators/InvalidBinaryOperationRule.php @@ -12,7 +12,6 @@ use PHPStan\Rules\RuleLevelHelper; use PHPStan\ShouldNotHappenException; use PHPStan\TrinaryLogic; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -70,11 +69,11 @@ public function processNode(Node $node, Scope $scope): array } if ($node instanceof Node\Expr\AssignOp\Concat || $node instanceof Node\Expr\BinaryOp\Concat) { - $callback = static fn (Type $type): bool => !$type->toString() instanceof ErrorType; + $callback = static fn (Type $type): bool => !$type->toString()->isError()->yes(); } elseif ($node instanceof Node\Expr\AssignOp\Plus || $node instanceof Node\Expr\BinaryOp\Plus) { - $callback = static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType || $type->isArray()->yes(); + $callback = static fn (Type $type): bool => !$type->toNumber()->isError()->yes() || $type->isArray()->yes(); } else { - $callback = static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType; + $callback = static fn (Type $type): bool => !$type->toNumber()->isError()->yes(); } $leftType = $this->ruleLevelHelper->findTypeToCheck( @@ -83,7 +82,7 @@ public function processNode(Node $node, Scope $scope): array '', $callback, )->getType(); - if ($leftType instanceof ErrorType) { + if ($leftType->isError()->yes()) { return []; } @@ -93,7 +92,7 @@ public function processNode(Node $node, Scope $scope): array '', $callback, )->getType(); - if ($rightType instanceof ErrorType) { + if ($rightType->isError()->yes()) { return []; } @@ -105,7 +104,7 @@ public function processNode(Node $node, Scope $scope): array ->assignVariable($leftName, $leftType, $leftType, TrinaryLogic::createYes()) ->assignVariable($rightName, $rightType, $rightType, TrinaryLogic::createYes()); - if (!$scope->getType($newNode) instanceof ErrorType) { + if (!$scope->getType($newNode)->isError()->yes()) { return []; } diff --git a/src/Rules/Operators/InvalidComparisonOperationRule.php b/src/Rules/Operators/InvalidComparisonOperationRule.php index b410ae0fb9..b8ff469b5a 100644 --- a/src/Rules/Operators/InvalidComparisonOperationRule.php +++ b/src/Rules/Operators/InvalidComparisonOperationRule.php @@ -13,7 +13,6 @@ use PHPStan\Rules\RuleLevelHelper; use PHPStan\ShouldNotHappenException; use PHPStan\Type\ArrayType; -use PHPStan\Type\ErrorType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; use PHPStan\Type\MixedType; @@ -73,7 +72,7 @@ public function processNode(Node $node, Scope $scope): array ); if ($result !== null) { - if (! $result instanceof ErrorType) { + if (! $result->isError()->yes()) { return []; } @@ -104,7 +103,7 @@ private function isNumberType(Scope $scope, Node\Expr $expr): bool $type = $this->ruleLevelHelper->findTypeToCheck($scope, $expr, '', $onlyNumber)->getType(); if ( - $type instanceof ErrorType + $type->isError()->yes() || !$type->equals($scope->getType($expr)) ) { return false; diff --git a/src/Rules/Operators/InvalidIncDecOperationRule.php b/src/Rules/Operators/InvalidIncDecOperationRule.php index 44ea25b7e0..e0a7dce865 100644 --- a/src/Rules/Operators/InvalidIncDecOperationRule.php +++ b/src/Rules/Operators/InvalidIncDecOperationRule.php @@ -12,7 +12,6 @@ use PHPStan\ShouldNotHappenException; use PHPStan\Type\Accessory\AccessoryNumericStringType; use PHPStan\Type\BooleanType; -use PHPStan\Type\ErrorType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; use PHPStan\Type\IntersectionType; @@ -141,7 +140,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $allowedTypes->isSuperTypeOf($type)->yes(), )->getType(); - if ($varType instanceof ErrorType || $allowedTypes->isSuperTypeOf($varType)->yes()) { + if ($varType->isError()->yes() || $allowedTypes->isSuperTypeOf($varType)->yes()) { return []; } diff --git a/src/Rules/Operators/InvalidUnaryOperationRule.php b/src/Rules/Operators/InvalidUnaryOperationRule.php index 1b688dc06d..410a92f0b1 100644 --- a/src/Rules/Operators/InvalidUnaryOperationRule.php +++ b/src/Rules/Operators/InvalidUnaryOperationRule.php @@ -11,7 +11,6 @@ use PHPStan\Rules\RuleLevelHelper; use PHPStan\ShouldNotHappenException; use PHPStan\TrinaryLogic; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -53,7 +52,7 @@ public function processNode(Node $node, Scope $scope): array if ($node instanceof Node\Expr\BitwiseNot) { $callback = static fn (Type $type): bool => $type->isString()->yes() || $type->isInteger()->yes() || $type->isFloat()->yes(); } else { - $callback = static fn (Type $type): bool => !$type->toNumber() instanceof ErrorType; + $callback = static fn (Type $type): bool => !$type->toNumber()->isError()->yes(); } $exprType = $this->ruleLevelHelper->findTypeToCheck( @@ -62,7 +61,7 @@ public function processNode(Node $node, Scope $scope): array '', $callback, )->getType(); - if ($exprType instanceof ErrorType) { + if ($exprType->isError()->yes()) { return []; } @@ -71,7 +70,7 @@ public function processNode(Node $node, Scope $scope): array } $scope = $scope->assignVariable($varName, $exprType, $exprType, TrinaryLogic::createYes()); - if (!$scope->getType($newNode) instanceof ErrorType) { + if (!$scope->getType($newNode)->isError()->yes()) { return []; } diff --git a/src/Rules/Operators/PipeOperatorRule.php b/src/Rules/Operators/PipeOperatorRule.php index 07cfedeb7e..070a96184f 100644 --- a/src/Rules/Operators/PipeOperatorRule.php +++ b/src/Rules/Operators/PipeOperatorRule.php @@ -8,7 +8,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use function sprintf; @@ -36,7 +35,7 @@ public function processNode(Node $node, Scope $scope): array '', static fn (Type $type) => $type->isCallable()->yes(), )->getType(); - if ($rightType instanceof ErrorType) { + if ($rightType->isError()->yes()) { return []; } if (!$rightType->isCallable()->yes()) { diff --git a/src/Rules/ParameterCastableToStringCheck.php b/src/Rules/ParameterCastableToStringCheck.php index 244cd1ba4f..15cddf88c2 100644 --- a/src/Rules/ParameterCastableToStringCheck.php +++ b/src/Rules/ParameterCastableToStringCheck.php @@ -7,7 +7,6 @@ use PHPStan\Analyser\Scope; use PHPStan\DependencyInjection\AutowiredService; use PHPStan\Reflection\ParameterReflection; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function sprintf; @@ -38,12 +37,12 @@ public function checkParameter( $scope, $parameter->value, '', - static fn (Type $type): bool => $type->isArray()->yes() && !$castFn($type->getIterableValueType()) instanceof ErrorType, + static fn (Type $type): bool => $type->isArray()->yes() && !$castFn($type->getIterableValueType())->isError()->yes(), ); if ( ! $typeResult->getType()->isArray()->yes() - || !$castFn($typeResult->getType()->getIterableValueType()) instanceof ErrorType + || !$castFn($typeResult->getType()->getIterableValueType())->isError()->yes() ) { return null; } diff --git a/src/Rules/PhpDoc/AssertRuleHelper.php b/src/Rules/PhpDoc/AssertRuleHelper.php index 0dc14b638a..7bf91a7645 100644 --- a/src/Rules/PhpDoc/AssertRuleHelper.php +++ b/src/Rules/PhpDoc/AssertRuleHelper.php @@ -20,7 +20,6 @@ use PHPStan\Rules\IdentifierRuleError; use PHPStan\Rules\MissingTypehintCheck; use PHPStan\Rules\RuleErrorBuilder; -use PHPStan\Type\ErrorType; use PHPStan\Type\ObjectType; use PHPStan\Type\VerbosityLevel; use function array_key_exists; @@ -83,7 +82,7 @@ public function check( $assertedExpr = $assert->getParameter()->getExpr(new TypeExpr($parametersByName[$parameterName])); $assertedExprType = $scope->getType($assertedExpr); $assertedExprString = $assert->getParameter()->describe(); - if ($assertedExprType instanceof ErrorType) { + if ($assertedExprType->isError()->yes()) { $errors[] = RuleErrorBuilder::message(sprintf('Assert references unknown %s.', $assertedExprString)) ->identifier('assert.unknownExpr') ->build(); diff --git a/src/Rules/PhpDoc/UnresolvableTypeHelper.php b/src/Rules/PhpDoc/UnresolvableTypeHelper.php index 69f539f373..39f66e63cc 100644 --- a/src/Rules/PhpDoc/UnresolvableTypeHelper.php +++ b/src/Rules/PhpDoc/UnresolvableTypeHelper.php @@ -3,7 +3,6 @@ namespace PHPStan\Rules\PhpDoc; use PHPStan\DependencyInjection\AutowiredService; -use PHPStan\Type\ErrorType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; use PHPStan\Type\TypeTraverser; @@ -16,7 +15,7 @@ public function containsUnresolvableType(Type $type): bool { $containsUnresolvable = false; TypeTraverser::map($type, static function (Type $type, callable $traverse) use (&$containsUnresolvable): Type { - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { $containsUnresolvable = true; return $type; } diff --git a/src/Rules/Properties/AccessPropertiesCheck.php b/src/Rules/Properties/AccessPropertiesCheck.php index 82d1753a1d..9932a9b32e 100644 --- a/src/Rules/Properties/AccessPropertiesCheck.php +++ b/src/Rules/Properties/AccessPropertiesCheck.php @@ -21,7 +21,6 @@ use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; use PHPStan\Type\Constant\ConstantStringType; -use PHPStan\Type\ErrorType; use PHPStan\Type\StaticType; use PHPStan\Type\Type; use PHPStan\Type\TypeCombinator; @@ -66,13 +65,13 @@ public function check(PropertyFetch $node, Scope $scope, bool $write): array $scope, $node->name, '', - static fn (Type $type) => !$type->toString() instanceof ErrorType && $type->toString()->isString()->yes(), + static fn (Type $type) => !$type->toString()->isError()->yes() && $type->toString()->isString()->yes(), ); $nameType = $nameTypeResult->getType(); if ( - !$nameType instanceof ErrorType + !$nameType->isError()->yes() && ( - $nameType->toString() instanceof ErrorType + $nameType->toString()->isError()->yes() || !$nameType->toString()->isString()->yes() ) ) { @@ -106,7 +105,7 @@ private function processSingleProperty(Scope $scope, PropertyFetch $node, string ), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Properties/AccessStaticPropertiesCheck.php b/src/Rules/Properties/AccessStaticPropertiesCheck.php index 487453f428..9dbc6383c7 100644 --- a/src/Rules/Properties/AccessStaticPropertiesCheck.php +++ b/src/Rules/Properties/AccessStaticPropertiesCheck.php @@ -19,7 +19,6 @@ use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; use PHPStan\Type\Constant\ConstantStringType; -use PHPStan\Type\ErrorType; use PHPStan\Type\StringType; use PHPStan\Type\ThisType; use PHPStan\Type\Type; @@ -154,7 +153,7 @@ private function processSingleProperty(Scope $scope, StaticPropertyFetch $node, static fn (Type $type): bool => $type->canAccessProperties()->yes() && $type->hasStaticProperty($name)->yes(), ); $classType = $classTypeResult->getType(); - if ($classType instanceof ErrorType) { + if ($classType->isError()->yes()) { return $classTypeResult->getUnknownClassErrors(); } } diff --git a/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php b/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php index 8f8ad16229..074a37c0ff 100644 --- a/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedClassConstantUsageRule.php @@ -12,7 +12,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; /** @@ -63,7 +62,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canAccessConstants()->yes() && $type->hasConstant($constantName)->yes(), ); - if ($classTypeResult->getType() instanceof ErrorType) { + if ($classTypeResult->getType()->isError()->yes()) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php b/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php index 22230ca299..d2408afdfb 100644 --- a/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedStaticMethodCallableUsageRule.php @@ -13,7 +13,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; /** @@ -64,7 +63,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes(), ); - if ($classTypeResult->getType() instanceof ErrorType) { + if ($classTypeResult->getType()->isError()->yes()) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php b/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php index 898075b514..2b1e26d62c 100644 --- a/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedStaticMethodUsageRule.php @@ -12,7 +12,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; /** @@ -63,7 +62,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canCallMethods()->yes() && $type->hasMethod($methodName)->yes(), ); - if ($classTypeResult->getType() instanceof ErrorType) { + if ($classTypeResult->getType()->isError()->yes()) { return []; } diff --git a/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php b/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php index 6361276a20..97b55881e7 100644 --- a/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php +++ b/src/Rules/RestrictedUsage/RestrictedStaticPropertyUsageRule.php @@ -12,7 +12,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; /** @@ -63,7 +62,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->canAccessProperties()->yes() && $type->hasInstanceProperty($propertyName)->yes(), ); - if ($classTypeResult->getType() instanceof ErrorType) { + if ($classTypeResult->getType()->isError()->yes()) { return []; } diff --git a/src/Rules/Variables/ParameterOutAssignedTypeRule.php b/src/Rules/Variables/ParameterOutAssignedTypeRule.php index 5bc0118057..3bb844552a 100644 --- a/src/Rules/Variables/ParameterOutAssignedTypeRule.php +++ b/src/Rules/Variables/ParameterOutAssignedTypeRule.php @@ -10,7 +10,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\TypeUtils; use PHPStan\Type\VerbosityLevel; @@ -85,7 +84,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $outType->isSuperTypeOf($type)->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Variables/ParameterOutExecutionEndTypeRule.php b/src/Rules/Variables/ParameterOutExecutionEndTypeRule.php index edddff8a91..fb34626f7d 100644 --- a/src/Rules/Variables/ParameterOutExecutionEndTypeRule.php +++ b/src/Rules/Variables/ParameterOutExecutionEndTypeRule.php @@ -14,7 +14,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; use PHPStan\Type\TypeUtils; @@ -102,7 +101,7 @@ private function processSingleParameter( static fn (Type $type): bool => $outType->isSuperTypeOf($type)->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } diff --git a/src/Rules/Variables/VariableCloningRule.php b/src/Rules/Variables/VariableCloningRule.php index bab0f8d995..f1e6d49c02 100644 --- a/src/Rules/Variables/VariableCloningRule.php +++ b/src/Rules/Variables/VariableCloningRule.php @@ -10,7 +10,6 @@ use PHPStan\Rules\Rule; use PHPStan\Rules\RuleErrorBuilder; use PHPStan\Rules\RuleLevelHelper; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; use PHPStan\Type\VerbosityLevel; use function is_string; @@ -41,7 +40,7 @@ public function processNode(Node $node, Scope $scope): array static fn (Type $type): bool => $type->isCloneable()->yes(), ); $type = $typeResult->getType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return $typeResult->getUnknownClassErrors(); } if ($type->isCloneable()->yes()) { diff --git a/src/Type/Accessory/AccessoryArrayListType.php b/src/Type/Accessory/AccessoryArrayListType.php index 6ed6baeced..4dd44f5dcc 100644 --- a/src/Type/Accessory/AccessoryArrayListType.php +++ b/src/Type/Accessory/AccessoryArrayListType.php @@ -424,6 +424,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/Accessory/AccessoryLiteralStringType.php b/src/Type/Accessory/AccessoryLiteralStringType.php index d8a02005d6..d9e9631bfc 100644 --- a/src/Type/Accessory/AccessoryLiteralStringType.php +++ b/src/Type/Accessory/AccessoryLiteralStringType.php @@ -147,7 +147,7 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni { $stringOffset = (new StringType())->setOffsetValueType($offsetType, $valueType, $unionValues); - if ($stringOffset instanceof ErrorType) { + if ($stringOffset->isError()->yes()) { return $stringOffset; } @@ -332,6 +332,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createYes(); diff --git a/src/Type/Accessory/AccessoryLowercaseStringType.php b/src/Type/Accessory/AccessoryLowercaseStringType.php index 3e1383bdb4..fde23aef39 100644 --- a/src/Type/Accessory/AccessoryLowercaseStringType.php +++ b/src/Type/Accessory/AccessoryLowercaseStringType.php @@ -144,7 +144,7 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni { $stringOffset = (new StringType())->setOffsetValueType($offsetType, $valueType, $unionValues); - if ($stringOffset instanceof ErrorType) { + if ($stringOffset->isError()->yes()) { return $stringOffset; } @@ -329,6 +329,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createYes(); diff --git a/src/Type/Accessory/AccessoryNonEmptyStringType.php b/src/Type/Accessory/AccessoryNonEmptyStringType.php index a8b573809a..36f1f9081e 100644 --- a/src/Type/Accessory/AccessoryNonEmptyStringType.php +++ b/src/Type/Accessory/AccessoryNonEmptyStringType.php @@ -156,7 +156,7 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni { $stringOffset = (new StringType())->setOffsetValueType($offsetType, $valueType, $unionValues); - if ($stringOffset instanceof ErrorType) { + if ($stringOffset->isError()->yes()) { return $stringOffset; } @@ -327,6 +327,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createYes(); diff --git a/src/Type/Accessory/AccessoryNonFalsyStringType.php b/src/Type/Accessory/AccessoryNonFalsyStringType.php index f32d613154..2ae0e3a201 100644 --- a/src/Type/Accessory/AccessoryNonFalsyStringType.php +++ b/src/Type/Accessory/AccessoryNonFalsyStringType.php @@ -151,7 +151,7 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni { $stringOffset = (new StringType())->setOffsetValueType($offsetType, $valueType, $unionValues); - if ($stringOffset instanceof ErrorType) { + if ($stringOffset->isError()->yes()) { return $stringOffset; } @@ -327,6 +327,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createYes(); diff --git a/src/Type/Accessory/AccessoryNumericStringType.php b/src/Type/Accessory/AccessoryNumericStringType.php index c10dd28082..43f59ef061 100644 --- a/src/Type/Accessory/AccessoryNumericStringType.php +++ b/src/Type/Accessory/AccessoryNumericStringType.php @@ -152,7 +152,7 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni { $stringOffset = (new StringType())->setOffsetValueType($offsetType, $valueType, $unionValues); - if ($stringOffset instanceof ErrorType) { + if ($stringOffset->isError()->yes()) { return $stringOffset; } @@ -332,6 +332,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createYes(); diff --git a/src/Type/Accessory/AccessoryUppercaseStringType.php b/src/Type/Accessory/AccessoryUppercaseStringType.php index 5688e62df7..8dfcbff46f 100644 --- a/src/Type/Accessory/AccessoryUppercaseStringType.php +++ b/src/Type/Accessory/AccessoryUppercaseStringType.php @@ -144,7 +144,7 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni { $stringOffset = (new StringType())->setOffsetValueType($offsetType, $valueType, $unionValues); - if ($stringOffset instanceof ErrorType) { + if ($stringOffset->isError()->yes()) { return $stringOffset; } @@ -329,6 +329,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createYes(); diff --git a/src/Type/Accessory/HasOffsetType.php b/src/Type/Accessory/HasOffsetType.php index da6c176655..8e42871379 100644 --- a/src/Type/Accessory/HasOffsetType.php +++ b/src/Type/Accessory/HasOffsetType.php @@ -342,6 +342,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createMaybe(); diff --git a/src/Type/Accessory/HasOffsetValueType.php b/src/Type/Accessory/HasOffsetValueType.php index 5e7c834942..c1adf989ea 100644 --- a/src/Type/Accessory/HasOffsetValueType.php +++ b/src/Type/Accessory/HasOffsetValueType.php @@ -421,6 +421,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createMaybe(); diff --git a/src/Type/Accessory/NonEmptyArrayType.php b/src/Type/Accessory/NonEmptyArrayType.php index a58f87cb86..ca42eaa3ce 100644 --- a/src/Type/Accessory/NonEmptyArrayType.php +++ b/src/Type/Accessory/NonEmptyArrayType.php @@ -410,6 +410,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/Accessory/OversizedArrayType.php b/src/Type/Accessory/OversizedArrayType.php index 77fdec48fb..6904fc6806 100644 --- a/src/Type/Accessory/OversizedArrayType.php +++ b/src/Type/Accessory/OversizedArrayType.php @@ -394,6 +394,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/ArrayType.php b/src/Type/ArrayType.php index f97ac2a014..2426cc0931 100644 --- a/src/Type/ArrayType.php +++ b/src/Type/ArrayType.php @@ -269,7 +269,7 @@ public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType public function hasOffsetValueType(Type $offsetType): TrinaryLogic { $offsetArrayKeyType = $offsetType->toArrayKey(); - if ($offsetArrayKeyType instanceof ErrorType) { + if ($offsetArrayKeyType->isError()->yes()) { $allowedArrayKeys = AllowedArrayKeysTypes::getType(); $offsetArrayKeyType = TypeCombinator::intersect($allowedArrayKeys, $offsetType)->toArrayKey(); if ($offsetArrayKeyType instanceof NeverType) { @@ -297,7 +297,7 @@ public function getOffsetValueType(Type $offsetType): Type } $type = $this->getItemType(); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return new MixedType(); } @@ -440,7 +440,7 @@ public function fillKeysArray(Type $valueType): Type $itemType = $this->getItemType(); if ($itemType->isInteger()->no()) { $stringKeyType = $itemType->toString(); - if ($stringKeyType instanceof ErrorType) { + if ($stringKeyType->isError()->yes()) { return $stringKeyType; } diff --git a/src/Type/BenevolentUnionType.php b/src/Type/BenevolentUnionType.php index e6d826abdc..c28b91d2b6 100644 --- a/src/Type/BenevolentUnionType.php +++ b/src/Type/BenevolentUnionType.php @@ -39,7 +39,7 @@ protected function unionTypes(callable $getType): Type $resultTypes = []; foreach ($this->getTypes() as $type) { $result = $getType($type); - if ($result instanceof ErrorType) { + if ($result->isError()->yes()) { continue; } @@ -78,7 +78,7 @@ public function getOffsetValueType(Type $offsetType): Type $types = []; foreach ($this->getTypes() as $innerType) { $valueType = $innerType->getOffsetValueType($offsetType); - if ($valueType instanceof ErrorType) { + if ($valueType->isError()->yes()) { continue; } diff --git a/src/Type/CallableType.php b/src/Type/CallableType.php index 079afc8c1e..c7cf4ec3e9 100644 --- a/src/Type/CallableType.php +++ b/src/Type/CallableType.php @@ -624,6 +624,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return new ObjectWithoutClassType(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isVoid(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/ClosureType.php b/src/Type/ClosureType.php index 49bbfe8c1b..8ec126ce7a 100644 --- a/src/Type/ClosureType.php +++ b/src/Type/ClosureType.php @@ -796,6 +796,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return $this; } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isVoid(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/Constant/ConstantArrayType.php b/src/Type/Constant/ConstantArrayType.php index 4cec2bf409..f68f543ba3 100644 --- a/src/Type/Constant/ConstantArrayType.php +++ b/src/Type/Constant/ConstantArrayType.php @@ -583,7 +583,7 @@ public function findTypeAndMethodNames(): array public function hasOffsetValueType(Type $offsetType): TrinaryLogic { $offsetArrayKeyType = $offsetType->toArrayKey(); - if ($offsetArrayKeyType instanceof ErrorType) { + if ($offsetArrayKeyType->isError()->yes()) { $allowedArrayKeys = AllowedArrayKeysTypes::getType(); $offsetArrayKeyType = TypeCombinator::intersect($allowedArrayKeys, $offsetType)->toArrayKey(); if ($offsetArrayKeyType instanceof NeverType) { @@ -677,7 +677,7 @@ public function getOffsetValueType(Type $offsetType): Type if (count($matchingValueTypes) > 0) { $type = TypeCombinator::union(...$matchingValueTypes); - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { return new MixedType(); } @@ -818,7 +818,7 @@ public function fillKeysArray(Type $valueType): Type foreach ($this->valueTypes as $i => $keyType) { if ($keyType->isInteger()->no()) { $stringKeyType = $keyType->toString(); - if ($stringKeyType instanceof ErrorType) { + if ($stringKeyType->isError()->yes()) { return $stringKeyType; } diff --git a/src/Type/Constant/ConstantStringType.php b/src/Type/Constant/ConstantStringType.php index e4c34e609f..55a05d6a26 100644 --- a/src/Type/Constant/ConstantStringType.php +++ b/src/Type/Constant/ConstantStringType.php @@ -399,7 +399,7 @@ public function getOffsetValueType(Type $offsetType): Type public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $unionValues = true): Type { $valueStringType = $valueType->toString(); - if ($valueStringType instanceof ErrorType) { + if ($valueStringType->isError()->yes()) { return new ErrorType(); } if ( diff --git a/src/Type/ErrorType.php b/src/Type/ErrorType.php index 751271aef3..781bd7fe8a 100644 --- a/src/Type/ErrorType.php +++ b/src/Type/ErrorType.php @@ -2,6 +2,8 @@ namespace PHPStan\Type; +use PHPStan\TrinaryLogic; + /** @api */ class ErrorType extends MixedType { @@ -36,6 +38,11 @@ public function subtract(Type $type): Type return new self(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createYes(); + } + public function equals(Type $type): bool { return $type instanceof self; diff --git a/src/Type/FloatType.php b/src/Type/FloatType.php index 92ebb92cf1..2987d7e4b6 100644 --- a/src/Type/FloatType.php +++ b/src/Type/FloatType.php @@ -266,6 +266,11 @@ public function isScalar(): TrinaryLogic return TrinaryLogic::createYes(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType { return new BooleanType(); diff --git a/src/Type/Generic/GenericObjectType.php b/src/Type/Generic/GenericObjectType.php index 54bef86b29..a9450ceaa5 100644 --- a/src/Type/Generic/GenericObjectType.php +++ b/src/Type/Generic/GenericObjectType.php @@ -174,7 +174,7 @@ private function isSuperTypeOfInternal(Type $type, bool $acceptsContext): IsSupe if (!isset($this->types[$i])) { continue; } - if ($templateType instanceof ErrorType) { + if ($templateType->isError()->yes()) { continue; } if (!$templateType instanceof TemplateType) { diff --git a/src/Type/Generic/TemplateTypeHelper.php b/src/Type/Generic/TemplateTypeHelper.php index 29ecd48720..acfaeead3b 100644 --- a/src/Type/Generic/TemplateTypeHelper.php +++ b/src/Type/Generic/TemplateTypeHelper.php @@ -3,7 +3,6 @@ namespace PHPStan\Type\Generic; use PHPStan\Reflection\ParametersAcceptor; -use PHPStan\Type\ErrorType; use PHPStan\Type\GeneralizePrecision; use PHPStan\Type\NonAcceptingNeverType; use PHPStan\Type\Type; @@ -44,7 +43,7 @@ public static function resolveTemplateTypes( return $traverse($type); } - if ($newType instanceof ErrorType && !$keepErrorTypes) { + if ($newType->isError()->yes() && !$keepErrorTypes) { return $traverse($type->getDefault() ?? $type->getBound()); } diff --git a/src/Type/Generic/TemplateTypeTrait.php b/src/Type/Generic/TemplateTypeTrait.php index 584439c12d..4fe6b147c9 100644 --- a/src/Type/Generic/TemplateTypeTrait.php +++ b/src/Type/Generic/TemplateTypeTrait.php @@ -6,7 +6,6 @@ use PHPStan\PhpDocParser\Ast\Type\TypeNode; use PHPStan\TrinaryLogic; use PHPStan\Type\AcceptsResult; -use PHPStan\Type\ErrorType; use PHPStan\Type\IntersectionType; use PHPStan\Type\IsSuperTypeOfResult; use PHPStan\Type\MixedType; @@ -18,6 +17,7 @@ use PHPStan\Type\TypeUtils; use PHPStan\Type\UnionType; use PHPStan\Type\VerbosityLevel; +use function is_string; use function sprintf; /** @@ -74,7 +74,7 @@ public function describe(VerbosityLevel $level): string $defaultDescription = ''; if ($this->default !== null) { $recursionGuard = RecursionGuard::runOnObjectIdentity($this->default, fn () => $this->default->describe($level)); - if (!$recursionGuard instanceof ErrorType) { + if (is_string($recursionGuard)) { $defaultDescription .= sprintf(' = %s', $recursionGuard); } } diff --git a/src/Type/IntersectionType.php b/src/Type/IntersectionType.php index 16cb33d2dd..a95802f21f 100644 --- a/src/Type/IntersectionType.php +++ b/src/Type/IntersectionType.php @@ -786,6 +786,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return $this->intersectTypes(static fn (Type $type): Type => $type->getObjectTypeOrClassStringObjectType()); } + public function isError(): TrinaryLogic + { + return $this->intersectResults(static fn (Type $type): TrinaryLogic => $type->isError()); + } + public function isVoid(): TrinaryLogic { return $this->intersectResults(static fn (Type $type): TrinaryLogic => $type->isVoid()); diff --git a/src/Type/IterableType.php b/src/Type/IterableType.php index c2b44b809b..5238a24e1a 100644 --- a/src/Type/IterableType.php +++ b/src/Type/IterableType.php @@ -406,6 +406,11 @@ public function isVoid(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isScalar(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/JustNullableTypeTrait.php b/src/Type/JustNullableTypeTrait.php index 5435c540ff..85319aa71a 100644 --- a/src/Type/JustNullableTypeTrait.php +++ b/src/Type/JustNullableTypeTrait.php @@ -164,6 +164,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return new ErrorType(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isVoid(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/MixedType.php b/src/Type/MixedType.php index ad8d4fbfb1..71b8ca942f 100644 --- a/src/Type/MixedType.php +++ b/src/Type/MixedType.php @@ -1065,6 +1065,17 @@ public function isScalar(): TrinaryLogic return TrinaryLogic::createMaybe(); } + public function isError(): TrinaryLogic + { + if ($this->subtractedType !== null) { + if ($this->subtractedType->isSuperTypeOf(new ErrorType())->yes()) { + return TrinaryLogic::createNo(); + } + } + + return TrinaryLogic::createMaybe(); + } + public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType { return new BooleanType(); diff --git a/src/Type/NeverType.php b/src/Type/NeverType.php index 5fc9a05280..d7d310c366 100644 --- a/src/Type/NeverType.php +++ b/src/Type/NeverType.php @@ -548,6 +548,11 @@ public function isScalar(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType { return new BooleanType(); diff --git a/src/Type/NullType.php b/src/Type/NullType.php index ef2408e713..f162347069 100644 --- a/src/Type/NullType.php +++ b/src/Type/NullType.php @@ -335,6 +335,11 @@ public function isScalar(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType { if ($type instanceof ConstantScalarType) { diff --git a/src/Type/ObjectType.php b/src/Type/ObjectType.php index 3b7a72baaa..5572d76038 100644 --- a/src/Type/ObjectType.php +++ b/src/Type/ObjectType.php @@ -156,7 +156,7 @@ public function hasProperty(string $propertyName): TrinaryLogic } $classHasProperty = RecursionGuard::run($this, static fn (): bool => $classReflection->hasProperty($propertyName)); - if ($classHasProperty === true || $classHasProperty instanceof ErrorType) { + if ($classHasProperty !== false) { return TrinaryLogic::createYes(); } @@ -262,7 +262,7 @@ public function hasInstanceProperty(string $propertyName): TrinaryLogic } $classHasProperty = RecursionGuard::run($this, static fn (): bool => $classReflection->hasInstanceProperty($propertyName)); - if ($classHasProperty === true || $classHasProperty instanceof ErrorType) { + if ($classHasProperty !== false) { return TrinaryLogic::createYes(); } @@ -368,7 +368,7 @@ public function hasStaticProperty(string $propertyName): TrinaryLogic } $classHasProperty = RecursionGuard::run($this, static fn (): bool => $classReflection->hasStaticProperty($propertyName)); - if ($classHasProperty === true || $classHasProperty instanceof ErrorType) { + if ($classHasProperty !== false) { return TrinaryLogic::createYes(); } @@ -1076,7 +1076,7 @@ public function getTemplateType(string $ancestorClassName, string $templateTypeN if ($type === null) { return new ErrorType(); } - if ($type instanceof ErrorType) { + if ($type->isError()->yes()) { $templateTypeMap = $ancestorClassReflection->getTemplateTypeMap(); $templateType = $templateTypeMap->getType($templateTypeName); if ($templateType === null) { @@ -1138,7 +1138,7 @@ public function getIterableKeyType(): Type if (!$extraOffsetAccessible && $this->isInstanceOf(Traversable::class)->yes()) { $isTraversable = true; $tKey = $this->getTemplateType(Traversable::class, 'TKey'); - if (!$tKey instanceof ErrorType) { + if (!$tKey->isError()->yes()) { if (!$tKey instanceof MixedType || $tKey->isExplicitMixed()) { return $tKey; } @@ -1185,7 +1185,7 @@ public function getIterableValueType(): Type if (!$extraOffsetAccessible && $this->isInstanceOf(Traversable::class)->yes()) { $isTraversable = true; $tValue = $this->getTemplateType(Traversable::class, 'TValue'); - if (!$tValue instanceof ErrorType) { + if (!$tValue->isError()->yes()) { if (!$tValue instanceof MixedType || $tValue->isExplicitMixed()) { return $tValue; } @@ -1317,6 +1317,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return $this; } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isVoid(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/Php/AbsFunctionDynamicReturnTypeExtension.php b/src/Type/Php/AbsFunctionDynamicReturnTypeExtension.php index 7de2eebbd7..5a1c7ebd32 100644 --- a/src/Type/Php/AbsFunctionDynamicReturnTypeExtension.php +++ b/src/Type/Php/AbsFunctionDynamicReturnTypeExtension.php @@ -7,7 +7,6 @@ use PHPStan\DependencyInjection\AutowiredService; use PHPStan\Reflection\FunctionReflection; use PHPStan\Type\DynamicFunctionReturnTypeExtension; -use PHPStan\Type\ErrorType; use PHPStan\Type\Type; #[AutowiredService] @@ -35,7 +34,7 @@ public function getTypeFromFunctionCall( $outputType = $inputType->toAbsoluteNumber(); - if ($outputType instanceof ErrorType) { + if ($outputType->isError()->yes()) { return null; } diff --git a/src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php b/src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php index a9b9c0e042..6e63747a79 100644 --- a/src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php +++ b/src/Type/Php/ArrayCombineFunctionReturnTypeExtension.php @@ -14,7 +14,6 @@ use PHPStan\Type\Constant\ConstantBooleanType; use PHPStan\Type\ConstantScalarType; use PHPStan\Type\DynamicFunctionReturnTypeExtension; -use PHPStan\Type\ErrorType; use PHPStan\Type\MixedType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; @@ -98,7 +97,7 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection, $itemType = $keysParamType->getIterableValueType(); if ($itemType->isInteger()->no()) { - if ($itemType->toString() instanceof ErrorType) { + if ($itemType->toString()->isError()->yes()) { return new NeverType(); } @@ -140,7 +139,7 @@ private function sanitizeConstantArrayKeyTypes(array $types): ?array $sanitizedTypes = []; foreach ($types as $type) { - if ($type->isInteger()->no() && ! $type->toString() instanceof ErrorType) { + if ($type->isInteger()->no() && ! $type->toString()->isError()->yes()) { $type = $type->toString(); } diff --git a/src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php b/src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php index b4ed3b2d18..d0d43d65dd 100644 --- a/src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php +++ b/src/Type/Php/IteratorToArrayFunctionReturnTypeExtension.php @@ -9,7 +9,6 @@ use PHPStan\Type\Accessory\AccessoryArrayListType; use PHPStan\Type\ArrayType; use PHPStan\Type\DynamicFunctionReturnTypeExtension; -use PHPStan\Type\ErrorType; use PHPStan\Type\IntegerType; use PHPStan\Type\NeverType; use PHPStan\Type\Type; @@ -48,7 +47,7 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection, $arrayKeyType = $traversableType->getIterableKeyType()->toArrayKey(); - if ($arrayKeyType instanceof ErrorType) { + if ($arrayKeyType->isError()->yes()) { return new NeverType(true); } diff --git a/src/Type/Php/StrvalFamilyFunctionReturnTypeExtension.php b/src/Type/Php/StrvalFamilyFunctionReturnTypeExtension.php index 3fa0403bab..24647a25ec 100644 --- a/src/Type/Php/StrvalFamilyFunctionReturnTypeExtension.php +++ b/src/Type/Php/StrvalFamilyFunctionReturnTypeExtension.php @@ -8,7 +8,6 @@ use PHPStan\Reflection\FunctionReflection; use PHPStan\ShouldNotHappenException; use PHPStan\Type\DynamicFunctionReturnTypeExtension; -use PHPStan\Type\ErrorType; use PHPStan\Type\FloatType; use PHPStan\Type\IntegerType; use PHPStan\Type\NullType; @@ -50,13 +49,13 @@ public function getTypeFromFunctionCall( return $argType->toString(); case 'intval': $type = $argType->toInteger(); - return $type instanceof ErrorType ? new IntegerType() : $type; + return $type->isError()->yes() ? new IntegerType() : $type; case 'boolval': return $argType->toBoolean(); case 'floatval': case 'doubleval': $type = $argType->toFloat(); - return $type instanceof ErrorType ? new FloatType() : $type; + return $type->isError()->yes() ? new FloatType() : $type; default: throw new ShouldNotHappenException(); } diff --git a/src/Type/StaticType.php b/src/Type/StaticType.php index 21622b5b93..fe0d295910 100644 --- a/src/Type/StaticType.php +++ b/src/Type/StaticType.php @@ -659,6 +659,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return $this; } + public function isError(): TrinaryLogic + { + return $this->getStaticObjectType()->isError(); + } + public function isVoid(): TrinaryLogic { return $this->getStaticObjectType()->isVoid(); diff --git a/src/Type/StrictMixedType.php b/src/Type/StrictMixedType.php index 71678b77a4..643d986db8 100644 --- a/src/Type/StrictMixedType.php +++ b/src/Type/StrictMixedType.php @@ -330,6 +330,11 @@ public function isScalar(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType { return new BooleanType(); diff --git a/src/Type/StringType.php b/src/Type/StringType.php index 44fa96ab15..2a97ee42fc 100644 --- a/src/Type/StringType.php +++ b/src/Type/StringType.php @@ -86,7 +86,7 @@ public function setOffsetValueType(?Type $offsetType, Type $valueType, bool $uni } $valueStringType = $valueType->toString(); - if ($valueStringType instanceof ErrorType) { + if ($valueStringType->isError()->yes()) { return new ErrorType(); } diff --git a/src/Type/Traits/ArrayTypeTrait.php b/src/Type/Traits/ArrayTypeTrait.php index 813b0136d9..15a004c4f5 100644 --- a/src/Type/Traits/ArrayTypeTrait.php +++ b/src/Type/Traits/ArrayTypeTrait.php @@ -179,6 +179,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return new ErrorType(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isVoid(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/Traits/LateResolvableTypeTrait.php b/src/Type/Traits/LateResolvableTypeTrait.php index d35ee72461..aeaa9a69bc 100644 --- a/src/Type/Traits/LateResolvableTypeTrait.php +++ b/src/Type/Traits/LateResolvableTypeTrait.php @@ -523,6 +523,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return $this->resolve()->getObjectTypeOrClassStringObjectType(); } + public function isError(): TrinaryLogic + { + return $this->resolve()->isError(); + } + public function isVoid(): TrinaryLogic { return $this->resolve()->isVoid(); diff --git a/src/Type/Traits/ObjectTypeTrait.php b/src/Type/Traits/ObjectTypeTrait.php index 51a4922f43..b4282a58dc 100644 --- a/src/Type/Traits/ObjectTypeTrait.php +++ b/src/Type/Traits/ObjectTypeTrait.php @@ -265,6 +265,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return $this; } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function isVoid(): TrinaryLogic { return TrinaryLogic::createNo(); diff --git a/src/Type/Type.php b/src/Type/Type.php index e9cbca0b7a..1e316fc51e 100644 --- a/src/Type/Type.php +++ b/src/Type/Type.php @@ -292,6 +292,8 @@ public function isVoid(): TrinaryLogic; public function isScalar(): TrinaryLogic; + public function isError(): TrinaryLogic; + public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType; public function getSmallerType(PhpVersion $phpVersion): Type; diff --git a/src/Type/TypehintHelper.php b/src/Type/TypehintHelper.php index 076fedcacc..6796c7ddcc 100644 --- a/src/Type/TypehintHelper.php +++ b/src/Type/TypehintHelper.php @@ -85,7 +85,7 @@ public static function decideType( return $type; } - if ($phpDocType !== null && !$phpDocType instanceof ErrorType) { + if ($phpDocType !== null && !$phpDocType->isError()->yes()) { if ($phpDocType instanceof NeverType && $phpDocType->isExplicit()) { return $phpDocType; } diff --git a/src/Type/UnionType.php b/src/Type/UnionType.php index a1855a713b..425dd2c9e5 100644 --- a/src/Type/UnionType.php +++ b/src/Type/UnionType.php @@ -732,6 +732,11 @@ public function getObjectTypeOrClassStringObjectType(): Type return $this->unionTypes(static fn (Type $type): Type => $type->getObjectTypeOrClassStringObjectType()); } + public function isError(): TrinaryLogic + { + return $this->unionResults(static fn (Type $type): TrinaryLogic => $type->isError()); + } + public function isVoid(): TrinaryLogic { return $this->unionResults(static fn (Type $type): TrinaryLogic => $type->isVoid()); @@ -769,7 +774,7 @@ public function getOffsetValueType(Type $offsetType): Type $types = []; foreach ($this->types as $innerType) { $valueType = $innerType->getOffsetValueType($offsetType); - if ($valueType instanceof ErrorType) { + if ($valueType->isError()->yes()) { continue; } diff --git a/src/Type/VoidType.php b/src/Type/VoidType.php index 83c5a05726..f02857ee63 100644 --- a/src/Type/VoidType.php +++ b/src/Type/VoidType.php @@ -239,6 +239,11 @@ public function isScalar(): TrinaryLogic return TrinaryLogic::createNo(); } + public function isError(): TrinaryLogic + { + return TrinaryLogic::createNo(); + } + public function looseCompare(Type $type, PhpVersion $phpVersion): BooleanType { return new BooleanType();