|
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