From 1ac38092294e78983d5747c56eac36ee4a47cea3 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 22 Dec 2025 10:07:11 +0700 Subject: [PATCH] Immediate unwrap AlwaysRememberedExpr after used on NodeScopeResolver --- src/Analyser/NodeScopeResolver.php | 6 +++++ src/Analyser/RuleErrorTransformer.php | 2 -- src/Fixable/UnwrapVirtualNodesVisitor.php | 29 ----------------------- 3 files changed, 6 insertions(+), 31 deletions(-) delete mode 100644 src/Fixable/UnwrapVirtualNodesVisitor.php diff --git a/src/Analyser/NodeScopeResolver.php b/src/Analyser/NodeScopeResolver.php index 14bb1b7c40..7b1ff02612 100644 --- a/src/Analyser/NodeScopeResolver.php +++ b/src/Analyser/NodeScopeResolver.php @@ -4367,6 +4367,10 @@ function (MutatingScope $scope) use ($stmt, $expr, $nodeCallback, $context, $sto ksort($armNodes, SORT_NUMERIC); $this->callNodeCallback($nodeCallback, new MatchExpressionNode($expr->cond, array_values($armNodes), $expr, $matchScope), $scope, $storage); + + if ($expr->cond instanceof AlwaysRememberedExpr) { + $expr->cond = $expr->cond->getExpr(); + } } elseif ($expr instanceof AlwaysRememberedExpr) { $result = $this->processExprNode($stmt, $expr->getExpr(), $scope, $storage, $nodeCallback, $context); $hasYield = $result->hasYield(); @@ -4374,6 +4378,8 @@ function (MutatingScope $scope) use ($stmt, $expr, $nodeCallback, $context, $sto $impurePoints = $result->getImpurePoints(); $isAlwaysTerminating = $result->isAlwaysTerminating(); $scope = $result->getScope(); + + $expr = $expr->getExpr(); } elseif ($expr instanceof Expr\Throw_) { $hasYield = false; $result = $this->processExprNode($stmt, $expr->expr, $scope, $storage, $nodeCallback, ExpressionContext::createDeep()); diff --git a/src/Analyser/RuleErrorTransformer.php b/src/Analyser/RuleErrorTransformer.php index ebbc7679e9..2cbdc7db26 100644 --- a/src/Analyser/RuleErrorTransformer.php +++ b/src/Analyser/RuleErrorTransformer.php @@ -14,7 +14,6 @@ use PHPStan\Fixable\PhpPrinter; use PHPStan\Fixable\PhpPrinterIndentationDetectorVisitor; use PHPStan\Fixable\ReplacingNodeVisitor; -use PHPStan\Fixable\UnwrapVirtualNodesVisitor; use PHPStan\Node\VirtualNode; use PHPStan\Rules\FileRuleError; use PHPStan\Rules\FixableNodeRuleError; @@ -124,7 +123,6 @@ public function transform( $indentTraverser->traverse($fileNodes); $cloningTraverser = new NodeTraverser(); - $cloningTraverser->addVisitor(new UnwrapVirtualNodesVisitor()); $cloningTraverser->addVisitor(new CloningVisitor()); /** @var Stmt[] $newStmts */ diff --git a/src/Fixable/UnwrapVirtualNodesVisitor.php b/src/Fixable/UnwrapVirtualNodesVisitor.php deleted file mode 100644 index 76e5371e67..0000000000 --- a/src/Fixable/UnwrapVirtualNodesVisitor.php +++ /dev/null @@ -1,29 +0,0 @@ -cond instanceof AlwaysRememberedExpr) { - return null; - } - - $node->cond = $node->cond->expr; - - return $node; - } - -}