From 4ddf1fc17930560c9f199ebd761e79c225b33981 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Thu, 28 Apr 2022 10:34:12 +0200 Subject: [PATCH] fix --- src/Analyser/TypeSpecifier.php | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) diff --git a/src/Analyser/TypeSpecifier.php b/src/Analyser/TypeSpecifier.php index f7f707acdee..f9699a5a547 100644 --- a/src/Analyser/TypeSpecifier.php +++ b/src/Analyser/TypeSpecifier.php @@ -23,7 +23,9 @@ use PHPStan\Reflection\ReflectionProvider; use PHPStan\ShouldNotHappenException; use PHPStan\TrinaryLogic; +use PHPStan\Type\Accessory\AccessoryLiteralStringType; use PHPStan\Type\Accessory\AccessoryNonEmptyStringType; +use PHPStan\Type\Accessory\AccessoryNumericStringType; use PHPStan\Type\Accessory\HasOffsetType; use PHPStan\Type\Accessory\HasPropertyType; use PHPStan\Type\Accessory\NonEmptyArrayType; @@ -236,8 +238,18 @@ public function specifyTypesInCondition( } $argType = $scope->getType($exprNode->getArgs()[0]->value); if ($argType->isString()->yes()) { + $accessories = [ + new AccessoryNonEmptyStringType(), + ]; + if ($argType->isLiteralString()->yes()) { + $accessories[] = new AccessoryLiteralStringType(); + } + if ($argType->isNumericString()->yes()) { + $accessories[] = new AccessoryNumericStringType(); + } + $funcTypes = $this->create($exprNode, $constantType, $context, false, $scope, $rootExpr); - $valueTypes = $this->create($exprNode->getArgs()[0]->value, new AccessoryNonEmptyStringType(), $newContext, false, $scope, $rootExpr); + $valueTypes = $this->create($exprNode->getArgs()[0]->value, TypeCombinator::intersect(...$accessories), $newContext, false, $scope, $rootExpr); return $funcTypes->unionWith($valueTypes); } } @@ -536,7 +548,17 @@ public function specifyTypesInCondition( ) { $argType = $scope->getType($expr->right->getArgs()[0]->value); if ($argType->isString()->yes()) { - $result = $result->unionWith($this->create($expr->right->getArgs()[0]->value, new AccessoryNonEmptyStringType(), $context, false, $scope, $rootExpr)); + $accessories = [ + new AccessoryNonEmptyStringType(), + ]; + if ($argType->isLiteralString()->yes()) { + $accessories[] = new AccessoryLiteralStringType(); + } + if ($argType->isNumericString()->yes()) { + $accessories[] = new AccessoryNumericStringType(); + } + + $result = $result->unionWith($this->create($expr->right->getArgs()[0]->value, TypeCombinator::intersect(...$accessories), $context, false, $scope, $rootExpr)); } } }