|
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