|
173 | 173 | use PHPStan\Type\Constant\ConstantArrayTypeBuilder; |
174 | 174 | use PHPStan\Type\Constant\ConstantIntegerType; |
175 | 175 | use PHPStan\Type\Constant\ConstantStringType; |
| 176 | +use PHPStan\Type\ConstantTypeHelper; |
176 | 177 | use PHPStan\Type\FileTypeMapper; |
177 | 178 | use PHPStan\Type\GeneralizePrecision; |
178 | 179 | use PHPStan\Type\Generic\TemplateTypeHelper; |
@@ -6108,6 +6109,41 @@ private function processAssignVar( |
6108 | 6109 | $conditionalExpressions = $this->processSureNotTypesForConditionalExpressionsAfterAssign($scope, $var->name, $conditionalExpressions, $falseySpecifiedTypes, $falseyType); |
6109 | 6110 | } |
6110 | 6111 |
|
| 6112 | + foreach ([null, false, 0, 0.0, '', '0', []] as $falseyScalar) { |
| 6113 | + $falseyType = ConstantTypeHelper::getTypeFromValue($falseyScalar); |
| 6114 | + $withoutFalseyType = TypeCombinator::remove($type, $falseyType); |
| 6115 | + if ( |
| 6116 | + $withoutFalseyType->equals($type) |
| 6117 | + || $withoutFalseyType->equals($truthyType) |
| 6118 | + ) { |
| 6119 | + continue; |
| 6120 | + } |
| 6121 | + |
| 6122 | + if ($falseyScalar === null) { |
| 6123 | + $astNode = new ConstFetch(new Name('null')); |
| 6124 | + } elseif ($falseyScalar === false) { |
| 6125 | + $astNode = new ConstFetch(new Name('false')); |
| 6126 | + } elseif ($falseyScalar === 0) { |
| 6127 | + $astNode = new Node\Scalar\Int_($falseyScalar); |
| 6128 | + } elseif ($falseyScalar === 0.0) { |
| 6129 | + $astNode = new Node\Scalar\Float_($falseyScalar); |
| 6130 | + } elseif (in_array($falseyScalar, ['', '0'], true)) { |
| 6131 | + $astNode = new Node\Scalar\String_($falseyScalar); |
| 6132 | + } elseif ($falseyScalar === []) { |
| 6133 | + $astNode = new Node\Expr\Array_($falseyScalar); |
| 6134 | + } |
| 6135 | + |
| 6136 | + $notIdenticalConditionExpr = new Expr\BinaryOp\NotIdentical($assignedExpr, $astNode); |
| 6137 | + $notIdenticalSpecifiedTypes = $this->typeSpecifier->specifyTypesInCondition($scope, $notIdenticalConditionExpr, TypeSpecifierContext::createTrue()); |
| 6138 | + $conditionalExpressions = $this->processSureTypesForConditionalExpressionsAfterAssign($scope, $var->name, $conditionalExpressions, $notIdenticalSpecifiedTypes, $withoutFalseyType); |
| 6139 | + $conditionalExpressions = $this->processSureNotTypesForConditionalExpressionsAfterAssign($scope, $var->name, $conditionalExpressions, $notIdenticalSpecifiedTypes, $withoutFalseyType); |
| 6140 | + |
| 6141 | + $identicalConditionExpr = new Expr\BinaryOp\Identical($assignedExpr, $astNode); |
| 6142 | + $identicalSpecifiedTypes = $this->typeSpecifier->specifyTypesInCondition($scope, $identicalConditionExpr, TypeSpecifierContext::createTrue()); |
| 6143 | + $conditionalExpressions = $this->processSureTypesForConditionalExpressionsAfterAssign($scope, $var->name, $conditionalExpressions, $identicalSpecifiedTypes, $falseyType); |
| 6144 | + $conditionalExpressions = $this->processSureNotTypesForConditionalExpressionsAfterAssign($scope, $var->name, $conditionalExpressions, $identicalSpecifiedTypes, $falseyType); |
| 6145 | + } |
| 6146 | + |
6111 | 6147 | $this->callNodeCallback($nodeCallback, new VariableAssignNode($var, $assignedExpr), $scopeBeforeAssignEval, $storage); |
6112 | 6148 | $scope = $scope->assignVariable($var->name, $type, $scope->getNativeType($assignedExpr), TrinaryLogic::createYes()); |
6113 | 6149 | foreach ($conditionalExpressions as $exprString => $holders) { |
|
0 commit comments