|
168 | 168 | use function strlen; |
169 | 169 | use function strtolower; |
170 | 170 | use function substr; |
| 171 | +use function uksort; |
171 | 172 | use function usort; |
172 | 173 | use const PHP_INT_MAX; |
173 | 174 | use const PHP_INT_MIN; |
@@ -5296,19 +5297,37 @@ private function generalizeVariableTypeHolders( |
5296 | 5297 | array $otherVariableTypeHolders, |
5297 | 5298 | ): array |
5298 | 5299 | { |
| 5300 | + uksort($variableTypeHolders, static fn (string $exprA, string $exprB): int => strlen($exprA) <=> strlen($exprB)); |
| 5301 | + |
| 5302 | + $generalizedExpressions = []; |
| 5303 | + $newVariableTypeHolders = []; |
5299 | 5304 | foreach ($variableTypeHolders as $variableExprString => $variableTypeHolder) { |
| 5305 | + foreach ($generalizedExpressions as $generalizedExprString => $generalizedExpr) { |
| 5306 | + if (!$this->shouldInvalidateExpression($generalizedExprString, $generalizedExpr, $variableTypeHolder->getExpr())) { |
| 5307 | + continue; |
| 5308 | + } |
| 5309 | + |
| 5310 | + continue 2; |
| 5311 | + } |
5300 | 5312 | if (!isset($otherVariableTypeHolders[$variableExprString])) { |
| 5313 | + $newVariableTypeHolders[$variableExprString] = $variableTypeHolder; |
5301 | 5314 | continue; |
5302 | 5315 | } |
5303 | 5316 |
|
5304 | | - $variableTypeHolders[$variableExprString] = new ExpressionTypeHolder( |
| 5317 | + $generalizedType = $this->generalizeType($variableTypeHolder->getType(), $otherVariableTypeHolders[$variableExprString]->getType(), 0); |
| 5318 | + if ( |
| 5319 | + !$generalizedType->equals($variableTypeHolder->getType()) |
| 5320 | + ) { |
| 5321 | + $generalizedExpressions[$variableExprString] = $variableTypeHolder->getExpr(); |
| 5322 | + } |
| 5323 | + $newVariableTypeHolders[$variableExprString] = new ExpressionTypeHolder( |
5305 | 5324 | $variableTypeHolder->getExpr(), |
5306 | | - $this->generalizeType($variableTypeHolder->getType(), $otherVariableTypeHolders[$variableExprString]->getType(), 0), |
| 5325 | + $generalizedType, |
5307 | 5326 | $variableTypeHolder->getCertainty(), |
5308 | 5327 | ); |
5309 | 5328 | } |
5310 | 5329 |
|
5311 | | - return $variableTypeHolders; |
| 5330 | + return $newVariableTypeHolders; |
5312 | 5331 | } |
5313 | 5332 |
|
5314 | 5333 | private function generalizeType(Type $a, Type $b, int $depth): Type |
|
0 commit comments