From ea766a68408da0b776df4e63b12f3187f2504f1b Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Fri, 7 Mar 2025 10:57:18 +0100 Subject: [PATCH] Faster MutatingScope->mergeWith(Scope) --- src/Analyser/ExpressionTypeHolder.php | 4 ++++ src/Analyser/MutatingScope.php | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/Analyser/ExpressionTypeHolder.php b/src/Analyser/ExpressionTypeHolder.php index f343ffe6ca..bb598d8fb1 100644 --- a/src/Analyser/ExpressionTypeHolder.php +++ b/src/Analyser/ExpressionTypeHolder.php @@ -36,6 +36,10 @@ public function equals(self $other): bool public function and(self $other): self { if ($this->type->equals($other->type)) { + if ($this->certainty->equals($other->certainty)) { + return $this; + } + $type = $this->type; } else { $type = TypeCombinator::union($this->type, $other->type); diff --git a/src/Analyser/MutatingScope.php b/src/Analyser/MutatingScope.php index fd0404dc46..8369ac2430 100644 --- a/src/Analyser/MutatingScope.php +++ b/src/Analyser/MutatingScope.php @@ -4773,6 +4773,11 @@ private function mergeVariableHolders(array $ourVariableTypeHolders, array $thei $intersectedVariableTypeHolders = []; foreach ($ourVariableTypeHolders as $exprString => $variableTypeHolder) { if (isset($theirVariableTypeHolders[$exprString])) { + if ($variableTypeHolder === $theirVariableTypeHolders[$exprString]) { + $intersectedVariableTypeHolders[$exprString] = $variableTypeHolder; + continue; + } + $intersectedVariableTypeHolders[$exprString] = $variableTypeHolder->and($theirVariableTypeHolders[$exprString]); } else { $intersectedVariableTypeHolders[$exprString] = ExpressionTypeHolder::createMaybe($variableTypeHolder->getExpr(), $variableTypeHolder->getType());