From b154a57c0f021e6d3ac293c6e8e89b95aac1c13e Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 28 Dec 2025 11:03:10 +0100 Subject: [PATCH 1/3] Don't store scalar values in resolvedTypes --- src/Analyser/MutatingScope.php | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/src/Analyser/MutatingScope.php b/src/Analyser/MutatingScope.php index 0d7f29a5b4..38fe06df69 100644 --- a/src/Analyser/MutatingScope.php +++ b/src/Analyser/MutatingScope.php @@ -807,6 +807,19 @@ public function getAnonymousFunctionReturnType(): ?Type /** @api */ public function getType(Expr $node): Type { + if ($node instanceof Node\Scalar\Int_) { + return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); + } elseif ($node instanceof String_) { + return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); + } elseif ($node instanceof Node\Scalar\Float_) { + return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); + } elseif ($node instanceof ConstFetch) { + $loweredConstName = strtolower($node->name->toString()); + if (in_array($loweredConstName, ['true', 'false', 'null'], true)) { + return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); + } + } + if ($node instanceof GetIterableKeyTypeExpr) { return $this->getIterableKeyType($this->getType($node->getExpr())); } @@ -1245,11 +1258,7 @@ private function resolveType(string $exprString, Expr $node): Type }); } - if ($node instanceof Node\Scalar\Int_) { - return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); - } elseif ($node instanceof String_) { - return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); - } elseif ($node instanceof Node\Scalar\InterpolatedString) { + if ($node instanceof Node\Scalar\InterpolatedString) { $resultType = null; foreach ($node->parts as $part) { if ($part instanceof InterpolatedStringPart) { @@ -1266,8 +1275,6 @@ private function resolveType(string $exprString, Expr $node): Type } return $resultType ?? new ConstantStringType(''); - } elseif ($node instanceof Node\Scalar\Float_) { - return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); } elseif ($node instanceof Expr\CallLike && $node->isFirstClassCallable()) { return $this->getFirstClassCallableType($node); } elseif ($node instanceof Expr\Closure || $node instanceof Expr\ArrowFunction) { From b1b324a81aafb92660d9ffe3e9ae34328afb72b7 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 28 Dec 2025 11:23:47 +0100 Subject: [PATCH 2/3] Update MutatingScope.php --- src/Analyser/MutatingScope.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/Analyser/MutatingScope.php b/src/Analyser/MutatingScope.php index 38fe06df69..23e95b9db3 100644 --- a/src/Analyser/MutatingScope.php +++ b/src/Analyser/MutatingScope.php @@ -813,6 +813,8 @@ public function getType(Expr $node): Type return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); } elseif ($node instanceof Node\Scalar\Float_) { return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); + } elseif ($node instanceof Expr\UnaryMinus && $node->expr instanceof Node\Scalar) { + return $this->initializerExprTypeResolver->getType($node, InitializerExprContext::fromScope($this)); } elseif ($node instanceof ConstFetch) { $loweredConstName = strtolower($node->name->toString()); if (in_array($loweredConstName, ['true', 'false', 'null'], true)) { From 8f5481dbe4710fb36a0ea24564784474930f8345 Mon Sep 17 00:00:00 2001 From: Markus Staab Date: Sun, 28 Dec 2025 11:26:03 +0100 Subject: [PATCH 3/3] Update MutatingScope.php --- src/Analyser/MutatingScope.php | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/Analyser/MutatingScope.php b/src/Analyser/MutatingScope.php index 23e95b9db3..105a2f46ae 100644 --- a/src/Analyser/MutatingScope.php +++ b/src/Analyser/MutatingScope.php @@ -1369,16 +1369,6 @@ private function resolveType(string $exprString, Expr $node): Type } if ($node instanceof ConstFetch) { - $constName = (string) $node->name; - $loweredConstName = strtolower($constName); - if ($loweredConstName === 'true') { - return new ConstantBooleanType(true); - } elseif ($loweredConstName === 'false') { - return new ConstantBooleanType(false); - } elseif ($loweredConstName === 'null') { - return new NullType(); - } - $namespacedName = null; if (!$node->name->isFullyQualified() && $this->getNamespace() !== null) { $namespacedName = new FullyQualified([$this->getNamespace(), $node->name->toString()]);