diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 6a270518170..17a7e5e663f 100644 --- a/src/Application/VersionResolver.php +++ b/src/Application/VersionResolver.php @@ -19,12 +19,12 @@ final class VersionResolver * @api * @var string */ - public const PACKAGE_VERSION = '29562ce48e265fbd75bf13df5e6662af76a44846'; + public const PACKAGE_VERSION = '00876daa5dbda14d26b36b8c4365362b7e1cb7ac'; /** * @api * @var string */ - public const RELEASE_DATE = '2024-02-21 01:58:22'; + public const RELEASE_DATE = '2024-02-21 03:24:01'; /** * @var int */ diff --git a/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php b/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php index b02fc972f04..6b749da034e 100644 --- a/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php +++ b/src/PHPStan/NodeVisitor/UnreachableStatementNodeVisitor.php @@ -4,12 +4,14 @@ declare (strict_types=1); namespace Rector\PHPStan\NodeVisitor; use PhpParser\Node; +use PhpParser\Node\Expr; use PhpParser\Node\Expr\Exit_; use PhpParser\Node\Stmt\ClassLike; use PhpParser\Node\Stmt\Declare_; use PhpParser\Node\Stmt\Expression; use PhpParser\NodeVisitorAbstract; use PHPStan\Analyser\MutatingScope; +use PHPStan\Analyser\Scope; use Rector\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Scope\PHPStanNodeScopeResolver; @@ -46,11 +48,11 @@ final class UnreachableStatementNodeVisitor extends NodeVisitorAbstract return null; } $isPassedUnreachableStmt = \false; - $mutatingScope = $node->getAttribute(AttributeKey::SCOPE); - $mutatingScope = $mutatingScope instanceof MutatingScope ? $mutatingScope : $this->scopeFactory->createFromFile($this->filePath); + $mutatingScope = $this->resolveScope($node->getAttribute(AttributeKey::SCOPE)); foreach ($node->stmts as $stmt) { if ($stmt instanceof Expression && $stmt->expr instanceof Exit_) { $isPassedUnreachableStmt = \true; + $this->processExitScope($stmt->expr, $stmt, $mutatingScope); continue; } if ($stmt->getAttribute(AttributeKey::IS_UNREACHABLE) === \true) { @@ -65,4 +67,15 @@ final class UnreachableStatementNodeVisitor extends NodeVisitorAbstract } return null; } + private function processExitScope(Exit_ $exit, Expression $expression, MutatingScope $mutatingScope) : void + { + if ($exit->expr instanceof Expr && !$exit->expr->getAttribute(AttributeKey::SCOPE) instanceof MutatingScope) { + $expression->setAttribute(AttributeKey::SCOPE, $mutatingScope); + $this->phpStanNodeScopeResolver->processNodes([$expression], $this->filePath, $mutatingScope); + } + } + private function resolveScope(?Scope $mutatingScope) : MutatingScope + { + return $mutatingScope instanceof MutatingScope ? $mutatingScope : $this->scopeFactory->createFromFile($this->filePath); + } }