From dab448289eef1d79fe75e61f8fda1da1b7f9eaab Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 5 Jun 2023 16:50:29 +0700 Subject: [PATCH] [NodeTypeResolver] Handle crash after next exit() on no namespaced code after removal next attribute (#4074) --- .../Scope/PHPStanNodeScopeResolver.php | 13 ++++++++- .../Fixture/after_exit.php.inc | 29 +++++++++++++++++++ .../Fixture/after_exit_namespaced.php.inc | 29 +++++++++++++++++++ src/Kernel/RectorKernel.php | 2 +- 4 files changed, 71 insertions(+), 2 deletions(-) create mode 100644 rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit.php.inc create mode 100644 rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit_namespaced.php.inc diff --git a/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php b/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php index 7a1e60ae49d..46cbd921b40 100644 --- a/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php +++ b/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php @@ -48,6 +48,8 @@ use Rector\Core\Contract\PhpParser\Node\StmtsAwareInterface; use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\NodeAnalyzer\ClassAnalyzer; +use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; +use Rector\Core\PhpParser\NodeTraverser\FileWithoutNamespaceNodeTraverser; use Rector\Core\Util\Reflection\PrivatesAccessor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; @@ -79,7 +81,8 @@ public function __construct( private readonly ScopeFactory $scopeFactory, private readonly PrivatesAccessor $privatesAccessor, private readonly NodeNameResolver $nodeNameResolver, - private readonly ClassAnalyzer $classAnalyzer + private readonly ClassAnalyzer $classAnalyzer, + private readonly FileWithoutNamespaceNodeTraverser $fileWithoutNamespaceNodeTraverser ) { $this->nodeTraverser = new NodeTraverser(); @@ -107,6 +110,14 @@ public function processNodes( Assert::allIsInstanceOf($stmts, Stmt::class); $this->nodeTraverser->traverse($stmts); + if (! $isScopeRefreshing) { + $stmts = $this->fileWithoutNamespaceNodeTraverser->traverse($stmts); + + if (count($stmts) === 1 && $stmts[0] instanceof FileWithoutNamespace) { + $stmts = $stmts[0]->stmts; + } + } + $scope = $formerMutatingScope ?? $this->scopeFactory->createFromFile($filePath); // skip chain method calls, performance issue: https://github.com/phpstan/phpstan/issues/254 diff --git a/rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit.php.inc b/rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit.php.inc new file mode 100644 index 00000000000..7bbbda63b41 --- /dev/null +++ b/rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit.php.inc @@ -0,0 +1,29 @@ + +----- + diff --git a/rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit_namespaced.php.inc b/rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit_namespaced.php.inc new file mode 100644 index 00000000000..58ab4c04dff --- /dev/null +++ b/rules-tests/Php81/Rector/FuncCall/NullToStrictStringFuncCallArgRector/Fixture/after_exit_namespaced.php.inc @@ -0,0 +1,29 @@ + +----- + diff --git a/src/Kernel/RectorKernel.php b/src/Kernel/RectorKernel.php index 6606667f967..b4fedc0c050 100644 --- a/src/Kernel/RectorKernel.php +++ b/src/Kernel/RectorKernel.php @@ -17,7 +17,7 @@ final class RectorKernel /** * @var string */ - private const CACHE_KEY = 'v54'; + private const CACHE_KEY = 'v55'; private ContainerInterface|null $container = null;