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;