Skip to content

Commit

Permalink
Type::isConstantValue()
Browse files Browse the repository at this point in the history
  • Loading branch information
ondrejmirtes committed Feb 20, 2023
1 parent 4c7046e commit de1fa93
Show file tree
Hide file tree
Showing 40 changed files with 161 additions and 29 deletions.
10 changes: 0 additions & 10 deletions phpstan-baseline.neon
Original file line number Diff line number Diff line change
Expand Up @@ -1442,11 +1442,6 @@ parameters:
count: 2
path: src/Type/UnionType.php

-
message: "#^Doing instanceof PHPStan\\\\Type\\\\Constant\\\\ConstantBooleanType is error\\-prone and deprecated\\. Use Type\\:\\:isTrue\\(\\) or Type\\:\\:isFalse\\(\\) instead\\.$#"
count: 1
path: src/Type/UnionType.php

-
message: "#^Doing instanceof PHPStan\\\\Type\\\\Generic\\\\GenericClassStringType is error\\-prone and deprecated\\. Use Type\\:\\:isClassStringType\\(\\) and Type\\:\\:getClassStringObjectType\\(\\) instead\\.$#"
count: 1
Expand Down Expand Up @@ -1487,11 +1482,6 @@ parameters:
count: 2
path: src/Type/UnionTypeHelper.php

-
message: "#^Doing instanceof PHPStan\\\\Type\\\\NullType is error\\-prone and deprecated\\. Use Type\\:\\:isNull\\(\\) instead\\.$#"
count: 1
path: src/Type/VerbosityLevel.php

-
message: "#^Doing instanceof PHPStan\\\\Type\\\\VoidType is error\\-prone and deprecated\\. Use Type\\:\\:isVoid\\(\\) instead\\.$#"
count: 3
Expand Down
3 changes: 1 addition & 2 deletions src/Analyser/ConstantResolver.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
use PHPStan\Type\Constant\ConstantFloatType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\GeneralizePrecision;
use PHPStan\Type\IntegerRangeType;
use PHPStan\Type\IntersectionType;
Expand Down Expand Up @@ -293,7 +292,7 @@ public function resolvePredefinedConstant(string $resolvedConstantName): ?Type

public function resolveConstantType(string $constantName, Type $constantType): Type
{
if ($constantType instanceof ConstantType && in_array($constantName, $this->dynamicConstantNames, true)) {
if ($constantType->isConstantValue()->yes() && in_array($constantName, $this->dynamicConstantNames, true)) {
return $constantType->generalize(GeneralizePrecision::lessSpecific());
}

Expand Down
5 changes: 2 additions & 3 deletions src/Analyser/TypeSpecifier.php
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,6 @@
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\FloatType;
use PHPStan\Type\FunctionTypeSpecifyingExtension;
use PHPStan\Type\Generic\GenericClassStringType;
Expand Down Expand Up @@ -230,7 +229,7 @@ public function specifyTypesInCondition(
if (
$exprLeftType instanceof ConstantScalarType
|| count($exprLeftType->getEnumCases()) === 1
|| ($exprLeftType instanceof ConstantType && !$exprRightType->equals($exprLeftType) && $exprRightType->isSuperTypeOf($exprLeftType)->yes())
|| ($exprLeftType->isConstantValue()->yes() && !$exprRightType->equals($exprLeftType) && $exprRightType->isSuperTypeOf($exprLeftType)->yes())
) {
$types = $this->create(
$expr->right,
Expand All @@ -244,7 +243,7 @@ public function specifyTypesInCondition(
if (
$exprRightType instanceof ConstantScalarType
|| count($exprRightType->getEnumCases()) === 1
|| ($exprRightType instanceof ConstantType && !$exprLeftType->equals($exprRightType) && $exprLeftType->isSuperTypeOf($exprRightType)->yes())
|| ($exprRightType->isConstantValue()->yes() && !$exprLeftType->equals($exprRightType) && $exprLeftType->isSuperTypeOf($exprRightType)->yes())
) {
$leftType = $this->create(
$expr->left,
Expand Down
2 changes: 2 additions & 0 deletions src/Rules/Api/ApiInstanceofTypeRule.php
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\Enum\EnumCaseObjectType;
use PHPStan\Type\FloatType;
use PHPStan\Type\Generic\GenericClassStringType;
Expand Down Expand Up @@ -71,6 +72,7 @@ class ApiInstanceofTypeRule implements Rule
GenericClassStringType::class => 'Type::isClassStringType() and Type::getClassStringObjectType()',
GenericObjectType::class => null,
IntersectionType::class => null,
ConstantType::class => 'Type::isConstantValue() or Type::generalize()',

// accessory types
NonEmptyArrayType::class => 'Type::isIterableAtLeastOnce()',
Expand Down
3 changes: 1 addition & 2 deletions src/Rules/PhpDoc/VarTagTypeRuleHelper.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,6 @@
use PHPStan\PhpDoc\Tag\VarTag;
use PHPStan\Rules\RuleError;
use PHPStan\Rules\RuleErrorBuilder;
use PHPStan\Type\ConstantType;
use PHPStan\Type\Generic\GenericObjectType;
use PHPStan\Type\ObjectType;
use PHPStan\Type\Type;
Expand Down Expand Up @@ -108,7 +107,7 @@ private function shouldVarTagTypeBeReported(Node\Expr $expr, Type $type, Type $v

private function checkType(Type $type, Type $varTagType): bool
{
if ($type instanceof ConstantType) {
if ($type->isConstantValue()->yes()) {
return $type->isSuperTypeOf($varTagType)->no();
}

Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryArrayListType.php
Original file line number Diff line number Diff line change
Expand Up @@ -297,6 +297,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryLiteralStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -200,6 +200,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryNonEmptyStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryNonFalsyStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -201,6 +201,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/AccessoryNumericStringType.php
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createMaybe();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/HasOffsetType.php
Original file line number Diff line number Diff line change
Expand Up @@ -202,6 +202,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/HasOffsetValueType.php
Original file line number Diff line number Diff line change
Expand Up @@ -257,6 +257,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/NonEmptyArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -282,6 +282,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Accessory/OversizedArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/ArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -286,6 +286,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/CallableType.php
Original file line number Diff line number Diff line change
Expand Up @@ -353,6 +353,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/ClosureType.php
Original file line number Diff line number Diff line change
Expand Up @@ -434,6 +434,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/Constant/ConstantArrayType.php
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,11 @@ public function getConstantArrays(): array
return [$this];
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createYes();
}

/** @deprecated Use isIterableAtLeastOnce()->no() instead */
public function isEmpty(): bool
{
Expand Down
5 changes: 5 additions & 0 deletions src/Type/FloatType.php
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/IntersectionType.php
Original file line number Diff line number Diff line change
Expand Up @@ -759,6 +759,11 @@ public function isNull(): TrinaryLogic
return $this->intersectResults(static fn (Type $type): TrinaryLogic => $type->isNull());
}

public function isConstantValue(): TrinaryLogic
{
return $this->intersectResults(static fn (Type $type): TrinaryLogic => $type->isConstantValue());
}

public function isTrue(): TrinaryLogic
{
return $this->intersectResults(static fn (Type $type): TrinaryLogic => $type->isTrue());
Expand Down
5 changes: 5 additions & 0 deletions src/Type/IterableType.php
Original file line number Diff line number Diff line change
Expand Up @@ -291,6 +291,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/JustNullableTypeTrait.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/MixedType.php
Original file line number Diff line number Diff line change
Expand Up @@ -673,6 +673,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createMaybe();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
if ($this->subtractedType !== null) {
Expand Down
5 changes: 5 additions & 0 deletions src/Type/NeverType.php
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/NullType.php
Original file line number Diff line number Diff line change
Expand Up @@ -203,6 +203,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createYes();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createYes();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
5 changes: 5 additions & 0 deletions src/Type/ObjectType.php
Original file line number Diff line number Diff line change
Expand Up @@ -933,6 +933,11 @@ public function isNull(): TrinaryLogic
return TrinaryLogic::createNo();
}

public function isConstantValue(): TrinaryLogic
{
return TrinaryLogic::createNo();
}

public function isTrue(): TrinaryLogic
{
return TrinaryLogic::createNo();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\Constant\ConstantIntegerType;
use PHPStan\Type\Constant\ConstantStringType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\FloatType;
use PHPStan\Type\IntegerType;
Expand Down Expand Up @@ -51,7 +50,7 @@ public function getTypeFromFunctionCall(FunctionReflection $functionReflection,
}

$componentType = $scope->getType($functionCall->getArgs()[1]->value);
if ($componentType instanceof ConstantType === false || $componentType->equals(new NullType())) {
if (!$componentType->isNull()->no()) {
return $this->createAllComponentsReturnType();
}

Expand Down
3 changes: 1 addition & 2 deletions src/Type/Php/MinMaxFunctionReturnTypeExtension.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
use PHPStan\Type\Constant\ConstantArrayType;
use PHPStan\Type\Constant\ConstantBooleanType;
use PHPStan\Type\ConstantScalarType;
use PHPStan\Type\ConstantType;
use PHPStan\Type\DynamicFunctionReturnTypeExtension;
use PHPStan\Type\ErrorType;
use PHPStan\Type\Type;
Expand Down Expand Up @@ -158,7 +157,7 @@ private function processType(
{
$resultType = null;
foreach ($types as $type) {
if (!$type instanceof ConstantType) {
if (!$type->isConstantValue()->yes()) {
return TypeCombinator::union(...$types);
}

Expand Down
Loading

0 comments on commit de1fa93

Please sign in to comment.