|
139 | 139 | use PHPStan\Rules\Properties\ReadWritePropertiesExtensionProvider; |
140 | 140 | use PHPStan\ShouldNotHappenException; |
141 | 141 | use PHPStan\TrinaryLogic; |
142 | | -use PHPStan\Type\ArrayType; |
143 | 142 | use PHPStan\Type\ClosureType; |
144 | 143 | use PHPStan\Type\Constant\ConstantIntegerType; |
145 | 144 | use PHPStan\Type\Constant\ConstantStringType; |
146 | 145 | use PHPStan\Type\FileTypeMapper; |
147 | 146 | use PHPStan\Type\Generic\TemplateTypeHelper; |
148 | 147 | use PHPStan\Type\Generic\TemplateTypeMap; |
149 | | -use PHPStan\Type\IntersectionType; |
150 | 148 | use PHPStan\Type\MixedType; |
151 | 149 | use PHPStan\Type\NeverType; |
152 | 150 | use PHPStan\Type\NullType; |
@@ -1381,35 +1379,22 @@ public function processStmtNode( |
1381 | 1379 | $keyTypeChanged = !$keyLoopType->equals($exprType->getIterableKeyType()); |
1382 | 1380 |
|
1383 | 1381 | if ($valueTypeChanged || $keyTypeChanged) { |
1384 | | - $newExprType = TypeTraverser::map($exprType, static function (Type $type, callable $traverse) use ($arrayDimFetchLoopType, $keyLoopType, $valueTypeChanged, $keyTypeChanged): Type { |
1385 | | - if ($type instanceof UnionType || $type instanceof IntersectionType) { |
1386 | | - return $traverse($type); |
1387 | | - } |
1388 | | - |
1389 | | - if (!$type instanceof ArrayType) { |
1390 | | - return $type; |
1391 | | - } |
| 1382 | + $newExprType = $exprType; |
| 1383 | + if ($valueTypeChanged) { |
| 1384 | + $newExprType = $newExprType->mapValueType(static fn (Type $type): Type => $arrayDimFetchLoopType); |
| 1385 | + } |
| 1386 | + if ($keyTypeChanged) { |
| 1387 | + $newExprType = $newExprType->mapKeyType(static fn (Type $type): Type => $keyLoopType); |
| 1388 | + } |
1392 | 1389 |
|
1393 | | - return new ArrayType( |
1394 | | - $keyTypeChanged ? $keyLoopType : $type->getKeyType(), |
1395 | | - $valueTypeChanged ? $arrayDimFetchLoopType : $type->getIterableValueType(), |
1396 | | - ); |
1397 | | - }); |
1398 | 1390 | $nativeExprType = $scope->getNativeType($stmt->expr); |
1399 | | - $newExprNativeType = TypeTraverser::map($nativeExprType, static function (Type $type, callable $traverse) use ($arrayDimFetchLoopNativeType, $keyLoopNativeType, $valueTypeChanged, $keyTypeChanged): Type { |
1400 | | - if ($type instanceof UnionType || $type instanceof IntersectionType) { |
1401 | | - return $traverse($type); |
1402 | | - } |
1403 | | - |
1404 | | - if (!$type instanceof ArrayType) { |
1405 | | - return $type; |
1406 | | - } |
1407 | | - |
1408 | | - return new ArrayType( |
1409 | | - $keyTypeChanged ? $keyLoopNativeType : $type->getKeyType(), |
1410 | | - $valueTypeChanged ? $arrayDimFetchLoopNativeType : $type->getIterableValueType(), |
1411 | | - ); |
1412 | | - }); |
| 1391 | + $newExprNativeType = $nativeExprType; |
| 1392 | + if ($valueTypeChanged) { |
| 1393 | + $newExprNativeType = $newExprNativeType->mapValueType(static fn (Type $type): Type => $arrayDimFetchLoopNativeType); |
| 1394 | + } |
| 1395 | + if ($keyTypeChanged) { |
| 1396 | + $newExprNativeType = $newExprNativeType->mapKeyType(static fn (Type $type): Type => $keyLoopNativeType); |
| 1397 | + } |
1413 | 1398 |
|
1414 | 1399 | if ($stmt->expr instanceof Variable && is_string($stmt->expr->name)) { |
1415 | 1400 | $finalScope = $finalScope->assignVariable( |
|
0 commit comments