diff --git a/src/Type/TypeCombinator.php b/src/Type/TypeCombinator.php index 0d6ef1cb4c..f8f1f7e4ed 100644 --- a/src/Type/TypeCombinator.php +++ b/src/Type/TypeCombinator.php @@ -27,7 +27,6 @@ use PHPStan\Type\Generic\TemplateUnionType; use function array_key_exists; use function array_key_first; -use function array_map; use function array_merge; use function array_slice; use function array_splice; @@ -789,13 +788,9 @@ private static function processArrayTypes(array $arrayTypes): array /** @var int|float $nextConstantKeyTypeIndex */ $nextConstantKeyTypeIndex = 1; - $constantArraysMap = array_map( - static fn (Type $t) => $t->getConstantArrays(), - $arrayTypes, - ); - foreach ($arrayTypes as $arrayIdx => $arrayType) { - $constantArrays = $constantArraysMap[$arrayIdx]; + foreach ($arrayTypes as $arrayType) { + $constantArrays = $arrayType->getConstantArrays(); $isConstantArray = $constantArrays !== []; if (!$isConstantArray || !$arrayType->isIterableAtLeastOnce()->no()) { $filledArrays++; @@ -810,11 +805,11 @@ private static function processArrayTypes(array $arrayTypes): array continue; } - $constantArrays = $arrayType->getConstantArrays(); foreach ($constantArrays as $constantArray) { + $valueTypes = $constantArray->getValueTypes(); foreach ($constantArray->getKeyTypes() as $i => $keyType) { $keyTypesForGeneralArray[] = $keyType; - $valueTypesForGeneralArray[] = $constantArray->getValueTypes()[$i]; + $valueTypesForGeneralArray[] = $valueTypes[$i]; $keyTypeValue = $keyType->getValue(); if (array_key_exists($keyTypeValue, $constantKeyTypesNumbered)) { @@ -870,12 +865,11 @@ private static function processArrayTypes(array $arrayTypes): array ]; } - $reducedArrayTypes = self::reduceArrays($arrayTypes, true); - - return array_map( - static fn (Type $arrayType) => self::intersect($arrayType, ...$accessoryTypes), - self::optimizeConstantArrays($reducedArrayTypes), - ); + $reducedArrayTypes = self::optimizeConstantArrays(self::reduceArrays($arrayTypes, true)); + foreach ($reducedArrayTypes as $idx => $reducedArray) { + $reducedArrayTypes[$idx] = self::intersect($reducedArray, ...$accessoryTypes); + } + return $reducedArrayTypes; } /** @@ -909,6 +903,7 @@ private static function optimizeConstantArrays(array $types): array $valueTypes = []; $keyTypes = []; $nextAutoIndex = 0; + $innerValueTypes = $type->getValueTypes(); foreach ($type->getKeyTypes() as $i => $innerKeyType) { if (!$innerKeyType instanceof ConstantIntegerType) { $isList = false; @@ -922,8 +917,7 @@ private static function optimizeConstantArrays(array $types): array $generalizedKeyType = $innerKeyType->generalize(GeneralizePrecision::moreSpecific()); $keyTypes[$generalizedKeyType->describe(VerbosityLevel::precise())] = $generalizedKeyType; - $innerValueType = $type->getValueTypes()[$i]; - $generalizedValueType = TypeTraverser::map($innerValueType, static function (Type $type) use ($traverse): Type { + $generalizedValueType = TypeTraverser::map($innerValueTypes[$i], static function (Type $type) use ($traverse): Type { if ($type instanceof ArrayType || $type instanceof ConstantArrayType) { return TypeCombinator::intersect($type, new OversizedArrayType()); }