|
6 | 6 | use PHPStan\Type\Accessory\HasOffsetType; |
7 | 7 | use PHPStan\Type\Accessory\NonEmptyArrayType; |
8 | 8 | use PHPStan\Type\Constant\ConstantArrayType; |
9 | | -use PHPStan\Type\Constant\ConstantArrayTypeBuilder; |
10 | 9 | use PHPStan\Type\Constant\ConstantBooleanType; |
11 | 10 | use PHPStan\Type\Constant\ConstantFloatType; |
12 | 11 | use PHPStan\Type\Constant\ConstantIntegerType; |
|
18 | 17 | use PHPStan\Type\Generic\TemplateUnionType; |
19 | 18 | use function array_intersect_key; |
20 | 19 | use function array_key_exists; |
| 20 | +use function array_map; |
21 | 21 | use function array_merge; |
22 | 22 | use function array_slice; |
23 | 23 | use function array_splice; |
@@ -556,56 +556,10 @@ private static function processArrayTypes(array $arrayTypes, array $accessoryTyp |
556 | 556 | ]; |
557 | 557 | } |
558 | 558 |
|
559 | | - /** @var ConstantArrayType[] $arrayTypes */ |
560 | | - $arrayTypes = $arrayTypes; |
561 | | - |
562 | | - /** @var int[] $constantKeyTypesNumbered */ |
563 | | - $constantKeyTypesNumbered = $constantKeyTypesNumbered; |
564 | | - |
565 | | - $constantArraysBuckets = []; |
566 | | - foreach ($arrayTypes as $arrayTypeAgain) { |
567 | | - $arrayIndex = 0; |
568 | | - foreach ($arrayTypeAgain->getKeyTypes() as $keyType) { |
569 | | - $arrayIndex += $constantKeyTypesNumbered[$keyType->getValue()]; |
570 | | - } |
571 | | - |
572 | | - if (!array_key_exists($arrayIndex, $constantArraysBuckets)) { |
573 | | - $bucket = []; |
574 | | - foreach ($arrayTypeAgain->getKeyTypes() as $i => $keyType) { |
575 | | - $bucket[$keyType->getValue()] = [ |
576 | | - 'keyType' => $keyType, |
577 | | - 'valueType' => $arrayTypeAgain->getValueTypes()[$i], |
578 | | - 'optional' => $arrayTypeAgain->isOptionalKey($i), |
579 | | - ]; |
580 | | - } |
581 | | - $constantArraysBuckets[$arrayIndex] = $bucket; |
582 | | - continue; |
583 | | - } |
584 | | - |
585 | | - $bucket = $constantArraysBuckets[$arrayIndex]; |
586 | | - foreach ($arrayTypeAgain->getKeyTypes() as $i => $keyType) { |
587 | | - $bucket[$keyType->getValue()]['valueType'] = self::union( |
588 | | - $bucket[$keyType->getValue()]['valueType'], |
589 | | - $arrayTypeAgain->getValueTypes()[$i], |
590 | | - ); |
591 | | - $bucket[$keyType->getValue()]['optional'] = $bucket[$keyType->getValue()]['optional'] || $arrayTypeAgain->isOptionalKey($i); |
592 | | - } |
593 | | - |
594 | | - $constantArraysBuckets[$arrayIndex] = $bucket; |
595 | | - } |
596 | | - |
597 | | - $resultArrays = []; |
598 | | - foreach ($constantArraysBuckets as $bucket) { |
599 | | - $builder = ConstantArrayTypeBuilder::createEmpty(); |
600 | | - foreach ($bucket as $data) { |
601 | | - $builder->setOffsetValueType($data['keyType'], $data['valueType'], $data['optional']); |
602 | | - } |
603 | | - |
604 | | - $arr = self::intersect($builder->getArray(), ...$accessoryTypes); |
605 | | - $resultArrays[] = $arr; |
606 | | - } |
607 | | - |
608 | | - return self::reduceArrays($resultArrays); |
| 559 | + return array_map( |
| 560 | + static fn (Type $arrayType) => self::intersect($arrayType, ...$accessoryTypes), |
| 561 | + self::reduceArrays($arrayTypes), |
| 562 | + ); |
609 | 563 | } |
610 | 564 |
|
611 | 565 | /** |
|
0 commit comments