diff --git a/packages/NodeTypeResolver/Node/AttributeKey.php b/packages/NodeTypeResolver/Node/AttributeKey.php index 3ca2ba2dc38..1b28c8f0ce7 100644 --- a/packages/NodeTypeResolver/Node/AttributeKey.php +++ b/packages/NodeTypeResolver/Node/AttributeKey.php @@ -170,4 +170,8 @@ final class AttributeKey * @var string */ public const ASSIGNED_TO = 'assigned_to'; + /** + * @var string + */ + public const IS_GLOBAL_VAR = 'is_global_var'; } diff --git a/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php b/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php new file mode 100644 index 00000000000..2de527fc157 --- /dev/null +++ b/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php @@ -0,0 +1,76 @@ +simpleCallableNodeTraverser = $simpleCallableNodeTraverser; + } + public function enterNode(Node $node) : ?Node + { + if (!$node instanceof StmtsAwareInterface) { + return null; + } + if ($node->stmts === null) { + return null; + } + /** @var string[] $globalVariableNames */ + $globalVariableNames = []; + foreach ($node->stmts as $stmt) { + if (!$stmt instanceof Global_) { + $this->setIsGlobalVarAttribute($stmt, $globalVariableNames); + continue; + } + foreach ($stmt->vars as $variable) { + if ($variable instanceof Variable && \is_string($variable->name)) { + $variable->setAttribute(AttributeKey::IS_GLOBAL_VAR, \true); + $globalVariableNames[] = $variable->name; + } + } + } + return null; + } + /** + * @param string[] $globalVariableNames + */ + private function setIsGlobalVarAttribute(Stmt $stmt, array $globalVariableNames) : void + { + if ($globalVariableNames === []) { + return; + } + $this->simpleCallableNodeTraverser->traverseNodesWithCallable($stmt, static function (Node $subNode) use($globalVariableNames) { + if ($subNode instanceof Class_) { + return NodeTraverser::DONT_TRAVERSE_CURRENT_AND_CHILDREN; + } + if (!$subNode instanceof Variable) { + return null; + } + if (!\is_string($subNode->name)) { + return null; + } + if (!\in_array($subNode->name, $globalVariableNames, \true)) { + return null; + } + $subNode->setAttribute(AttributeKey::IS_GLOBAL_VAR, \true); + return $subNode; + }); + } +} diff --git a/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php b/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php index f5653495465..d9871b1e5b6 100644 --- a/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php +++ b/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php @@ -50,6 +50,7 @@ use Rector\Core\Util\Reflection\PrivatesAccessor; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\AssignedToNodeVisitor; +use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\GlobalVariableNodeVisitor; use Rector\NodeTypeResolver\PHPStan\Scope\NodeVisitor\RemoveDeepChainMethodCallNodeVisitor; use RectorPrefix202305\Webmozart\Assert\Assert; /** @@ -112,7 +113,7 @@ final class PHPStanNodeScopeResolver * @var \Rector\Core\NodeAnalyzer\ClassAnalyzer */ private $classAnalyzer; - public function __construct(ChangedFilesDetector $changedFilesDetector, DependencyResolver $dependencyResolver, NodeScopeResolver $nodeScopeResolver, ReflectionProvider $reflectionProvider, RemoveDeepChainMethodCallNodeVisitor $removeDeepChainMethodCallNodeVisitor, AssignedToNodeVisitor $assignedToNodeVisitor, \Rector\NodeTypeResolver\PHPStan\Scope\ScopeFactory $scopeFactory, PrivatesAccessor $privatesAccessor, NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, ClassAnalyzer $classAnalyzer) + public function __construct(ChangedFilesDetector $changedFilesDetector, DependencyResolver $dependencyResolver, NodeScopeResolver $nodeScopeResolver, ReflectionProvider $reflectionProvider, RemoveDeepChainMethodCallNodeVisitor $removeDeepChainMethodCallNodeVisitor, AssignedToNodeVisitor $assignedToNodeVisitor, GlobalVariableNodeVisitor $globalVariableNodeVisitor, \Rector\NodeTypeResolver\PHPStan\Scope\ScopeFactory $scopeFactory, PrivatesAccessor $privatesAccessor, NodeNameResolver $nodeNameResolver, BetterNodeFinder $betterNodeFinder, ClassAnalyzer $classAnalyzer) { $this->changedFilesDetector = $changedFilesDetector; $this->dependencyResolver = $dependencyResolver; @@ -126,6 +127,7 @@ final class PHPStanNodeScopeResolver $this->nodeTraverser = new NodeTraverser(); $this->nodeTraverser->addVisitor($removeDeepChainMethodCallNodeVisitor); $this->nodeTraverser->addVisitor($assignedToNodeVisitor); + $this->nodeTraverser->addVisitor($globalVariableNodeVisitor); } /** * @param Stmt[] $stmts diff --git a/rules/DeadCode/Comparator/CurrentAndParentClassMethodComparator.php b/rules/DeadCode/Comparator/CurrentAndParentClassMethodComparator.php index b70ef3e74db..22623dc10bb 100644 --- a/rules/DeadCode/Comparator/CurrentAndParentClassMethodComparator.php +++ b/rules/DeadCode/Comparator/CurrentAndParentClassMethodComparator.php @@ -14,13 +14,11 @@ use PHPStan\Reflection\ExtendedMethodReflection; use PHPStan\Reflection\ParametersAcceptorSelector; use PHPStan\Type\Type; use Rector\Core\Enum\ObjectReference; -use Rector\Core\Exception\ShouldNotHappenException; use Rector\Core\PhpParser\Comparing\NodeComparator; use Rector\Core\Reflection\ReflectionResolver; use Rector\DeadCode\Comparator\Parameter\ParameterDefaultsComparator; use Rector\DeadCode\Comparator\Parameter\ParameterTypeComparator; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; final class CurrentAndParentClassMethodComparator { /** diff --git a/rules/PSR4/Rector/FileWithoutNamespace/NormalizeNamespaceByPSR4ComposerAutoloadRector.php b/rules/PSR4/Rector/FileWithoutNamespace/NormalizeNamespaceByPSR4ComposerAutoloadRector.php index dc319f937e6..605806bcd85 100644 --- a/rules/PSR4/Rector/FileWithoutNamespace/NormalizeNamespaceByPSR4ComposerAutoloadRector.php +++ b/rules/PSR4/Rector/FileWithoutNamespace/NormalizeNamespaceByPSR4ComposerAutoloadRector.php @@ -11,7 +11,6 @@ use PhpParser\Node\Stmt\Namespace_; use PHPStan\Analyser\Scope; use Rector\Core\NodeAnalyzer\InlineHTMLAnalyzer; use Rector\Core\PhpParser\Node\CustomNode\FileWithoutNamespace; -use Rector\Core\Rector\AbstractRector; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\PSR4\Contract\PSR4AutoloadNamespaceMatcherInterface; use Rector\PSR4\NodeManipulator\FullyQualifyStmtsAnalyzer; diff --git a/rules/Php71/NodeAnalyzer/CountableAnalyzer.php b/rules/Php71/NodeAnalyzer/CountableAnalyzer.php index 26284cb0ae6..e8e6768ab86 100644 --- a/rules/Php71/NodeAnalyzer/CountableAnalyzer.php +++ b/rules/Php71/NodeAnalyzer/CountableAnalyzer.php @@ -10,9 +10,7 @@ use PhpParser\Node\Expr\StaticPropertyFetch; use PhpParser\Node\Stmt; use PhpParser\Node\Stmt\ClassLike; use PHPStan\Analyser\Scope; -use PHPStan\Reflection\ClassReflection; use PHPStan\Reflection\Php\PhpPropertyReflection; -use PHPStan\Reflection\PropertyReflection; use PHPStan\Reflection\ReflectionProvider; use PHPStan\Type\ArrayType; use PHPStan\Type\Constant\ConstantArrayType; @@ -22,7 +20,6 @@ use PHPStan\Type\UnionType; use Rector\Core\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; use Rector\NodeTypeResolver\NodeTypeResolver; use Rector\TypeDeclaration\AlreadyAssignDetector\ConstructorAssignDetector; final class CountableAnalyzer diff --git a/rules/Php71/Rector/FuncCall/CountOnNullRector.php b/rules/Php71/Rector/FuncCall/CountOnNullRector.php index 1d7d656ac4a..3e699419c18 100644 --- a/rules/Php71/Rector/FuncCall/CountOnNullRector.php +++ b/rules/Php71/Rector/FuncCall/CountOnNullRector.php @@ -25,7 +25,6 @@ use PHPStan\Type\Type; use PHPStan\Type\UnionType; use Rector\Core\NodeAnalyzer\VariableAnalyzer; use Rector\Core\Php\PhpVersionProvider; -use Rector\Core\Rector\AbstractRector; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\NodeTypeResolver\Node\AttributeKey; diff --git a/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php b/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php index 868a9002442..aba3b1b8603 100644 --- a/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php +++ b/rules/Transform/NodeTypeAnalyzer/TypeProvidingExprFromClassResolver.php @@ -23,7 +23,6 @@ use PHPStan\Type\TypeWithClassName; use Rector\Core\ValueObject\MethodName; use Rector\Naming\Naming\PropertyNaming; use Rector\NodeNameResolver\NodeNameResolver; -use Rector\NodeTypeResolver\Node\AttributeKey; final class TypeProvidingExprFromClassResolver { /** diff --git a/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php b/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php index 147e7518f94..6cb50e9056c 100644 --- a/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php +++ b/rules/Transform/Rector/FuncCall/FuncCallToMethodCallRector.php @@ -9,7 +9,6 @@ use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Analyser\Scope; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; -use Rector\Core\Rector\AbstractRector; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Transform\NodeAnalyzer\FuncCallStaticCallToMethodCallAnalyzer; use Rector\Transform\ValueObject\FuncCallToMethodCall; diff --git a/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php b/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php index 13869abeb57..18337e051da 100644 --- a/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php +++ b/rules/Transform/Rector/StaticCall/StaticCallToMethodCallRector.php @@ -13,7 +13,6 @@ use PhpParser\Node\Stmt\ClassMethod; use PHPStan\Analyser\Scope; use Rector\Core\Contract\Rector\ConfigurableRectorInterface; use Rector\Core\Exception\ShouldNotHappenException; -use Rector\Core\Rector\AbstractRector; use Rector\Core\Rector\AbstractScopeAwareRector; use Rector\Transform\NodeAnalyzer\FuncCallStaticCallToMethodCallAnalyzer; use Rector\Transform\ValueObject\StaticCallToMethodCall; diff --git a/src/Application/VersionResolver.php b/src/Application/VersionResolver.php index 751eda53564..4e17d1d1105 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 = '849459b441b76b62a57dfe227232b22695a0b4c2'; + public const PACKAGE_VERSION = '0d3a9a263b6649548270dd503b8ac3bb0df107c4'; /** * @api * @var string */ - public const RELEASE_DATE = '2023-05-13 11:06:59'; + public const RELEASE_DATE = '2023-05-13 11:08:20'; /** * @var int */ diff --git a/src/NodeAnalyzer/VariableAnalyzer.php b/src/NodeAnalyzer/VariableAnalyzer.php index 263e37667a2..ca68f6565f9 100644 --- a/src/NodeAnalyzer/VariableAnalyzer.php +++ b/src/NodeAnalyzer/VariableAnalyzer.php @@ -8,7 +8,6 @@ use PhpParser\Node\Expr\AssignRef; use PhpParser\Node\Expr\ClosureUse; use PhpParser\Node\Expr\Variable; use PhpParser\Node\Param; -use PhpParser\Node\Stmt\Global_; use PhpParser\Node\Stmt\Static_; use PhpParser\Node\Stmt\StaticVar; use Rector\Core\PhpParser\Comparing\NodeComparator; @@ -33,21 +32,19 @@ final class VariableAnalyzer } public function isStaticOrGlobal(Variable $variable) : bool { - if ($this->isParentStaticOrGlobal($variable)) { + if ($variable->getAttribute(AttributeKey::IS_GLOBAL_VAR) === \true) { + return \true; + } + if ($this->isParentStatic($variable)) { return \true; } return (bool) $this->betterNodeFinder->findFirstPrevious($variable, function (Node $node) use($variable) : bool { - if (!\in_array(\get_class($node), [Static_::class, Global_::class], \true)) { + if (!$node instanceof Static_) { return \false; } - /** - * @var Static_|Global_ $node - * @var StaticVar[]|Variable[] $vars - */ $vars = $node->vars; foreach ($vars as $var) { - $staticVarVariable = $var instanceof StaticVar ? $var->var : $var; - if ($this->nodeComparator->areNodesEqual($staticVarVariable, $variable)) { + if ($this->nodeComparator->areNodesEqual($var->var, $variable)) { return \true; } } @@ -73,15 +70,12 @@ final class VariableAnalyzer return $parentNode instanceof AssignRef; }); } - private function isParentStaticOrGlobal(Variable $variable) : bool + private function isParentStatic(Variable $variable) : bool { $parentNode = $variable->getAttribute(AttributeKey::PARENT_NODE); if (!$parentNode instanceof Node) { return \false; } - if ($parentNode instanceof Global_) { - return \true; - } if (!$parentNode instanceof StaticVar) { return \false; } diff --git a/vendor/autoload.php b/vendor/autoload.php index 3ded74ac4c7..3db2eb8c4ef 100644 --- a/vendor/autoload.php +++ b/vendor/autoload.php @@ -22,4 +22,4 @@ if (PHP_VERSION_ID < 50600) { require_once __DIR__ . '/composer/autoload_real.php'; -return ComposerAutoloaderInit2a4aeebdd5f895f3a7e86e84c8968b46::getLoader(); +return ComposerAutoloaderInita09fd079de12a5cf614a61a3d29b3e0f::getLoader(); diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php index 9c702ee9257..c96cb6d3e11 100644 --- a/vendor/composer/autoload_classmap.php +++ b/vendor/composer/autoload_classmap.php @@ -1992,6 +1992,7 @@ return array( 'Rector\\NodeTypeResolver\\PHPStan\\ObjectWithoutClassTypeWithParentTypes' => $baseDir . '/packages/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.php', 'Rector\\NodeTypeResolver\\PHPStan\\ParametersAcceptorSelectorVariantsWrapper' => $baseDir . '/packages/NodeTypeResolver/PHPStan/ParametersAcceptorSelectorVariantsWrapper.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\AssignedToNodeVisitor' => $baseDir . '/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php', + 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\GlobalVariableNodeVisitor' => $baseDir . '/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\RemoveDeepChainMethodCallNodeVisitor' => $baseDir . '/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/RemoveDeepChainMethodCallNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\PHPStanNodeScopeResolver' => $baseDir . '/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\ScopeFactory' => $baseDir . '/packages/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php', diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php index 29b434f121a..4379f46ec37 100644 --- a/vendor/composer/autoload_real.php +++ b/vendor/composer/autoload_real.php @@ -2,7 +2,7 @@ // autoload_real.php @generated by Composer -class ComposerAutoloaderInit2a4aeebdd5f895f3a7e86e84c8968b46 +class ComposerAutoloaderInita09fd079de12a5cf614a61a3d29b3e0f { private static $loader; @@ -22,17 +22,17 @@ class ComposerAutoloaderInit2a4aeebdd5f895f3a7e86e84c8968b46 return self::$loader; } - spl_autoload_register(array('ComposerAutoloaderInit2a4aeebdd5f895f3a7e86e84c8968b46', 'loadClassLoader'), true, true); + spl_autoload_register(array('ComposerAutoloaderInita09fd079de12a5cf614a61a3d29b3e0f', 'loadClassLoader'), true, true); self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(__DIR__)); - spl_autoload_unregister(array('ComposerAutoloaderInit2a4aeebdd5f895f3a7e86e84c8968b46', 'loadClassLoader')); + spl_autoload_unregister(array('ComposerAutoloaderInita09fd079de12a5cf614a61a3d29b3e0f', 'loadClassLoader')); require __DIR__ . '/autoload_static.php'; - call_user_func(\Composer\Autoload\ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46::getInitializer($loader)); + call_user_func(\Composer\Autoload\ComposerStaticInita09fd079de12a5cf614a61a3d29b3e0f::getInitializer($loader)); $loader->setClassMapAuthoritative(true); $loader->register(true); - $filesToLoad = \Composer\Autoload\ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46::$files; + $filesToLoad = \Composer\Autoload\ComposerStaticInita09fd079de12a5cf614a61a3d29b3e0f::$files; $requireFile = \Closure::bind(static function ($fileIdentifier, $file) { if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) { $GLOBALS['__composer_autoload_files'][$fileIdentifier] = true; diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php index ffdd3efb860..91a1cee410f 100644 --- a/vendor/composer/autoload_static.php +++ b/vendor/composer/autoload_static.php @@ -4,7 +4,7 @@ namespace Composer\Autoload; -class ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46 +class ComposerStaticInita09fd079de12a5cf614a61a3d29b3e0f { public static $files = array ( 'ad155f8f1cf0d418fe49e248db8c661b' => __DIR__ . '/..' . '/react/promise/src/functions_include.php', @@ -2234,6 +2234,7 @@ class ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46 'Rector\\NodeTypeResolver\\PHPStan\\ObjectWithoutClassTypeWithParentTypes' => __DIR__ . '/../..' . '/packages/NodeTypeResolver/PHPStan/ObjectWithoutClassTypeWithParentTypes.php', 'Rector\\NodeTypeResolver\\PHPStan\\ParametersAcceptorSelectorVariantsWrapper' => __DIR__ . '/../..' . '/packages/NodeTypeResolver/PHPStan/ParametersAcceptorSelectorVariantsWrapper.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\AssignedToNodeVisitor' => __DIR__ . '/../..' . '/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/AssignedToNodeVisitor.php', + 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\GlobalVariableNodeVisitor' => __DIR__ . '/../..' . '/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/GlobalVariableNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\NodeVisitor\\RemoveDeepChainMethodCallNodeVisitor' => __DIR__ . '/../..' . '/packages/NodeTypeResolver/PHPStan/Scope/NodeVisitor/RemoveDeepChainMethodCallNodeVisitor.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\PHPStanNodeScopeResolver' => __DIR__ . '/../..' . '/packages/NodeTypeResolver/PHPStan/Scope/PHPStanNodeScopeResolver.php', 'Rector\\NodeTypeResolver\\PHPStan\\Scope\\ScopeFactory' => __DIR__ . '/../..' . '/packages/NodeTypeResolver/PHPStan/Scope/ScopeFactory.php', @@ -3109,9 +3110,9 @@ class ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46 public static function getInitializer(ClassLoader $loader) { return \Closure::bind(function () use ($loader) { - $loader->prefixLengthsPsr4 = ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46::$prefixLengthsPsr4; - $loader->prefixDirsPsr4 = ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46::$prefixDirsPsr4; - $loader->classMap = ComposerStaticInit2a4aeebdd5f895f3a7e86e84c8968b46::$classMap; + $loader->prefixLengthsPsr4 = ComposerStaticInita09fd079de12a5cf614a61a3d29b3e0f::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInita09fd079de12a5cf614a61a3d29b3e0f::$prefixDirsPsr4; + $loader->classMap = ComposerStaticInita09fd079de12a5cf614a61a3d29b3e0f::$classMap; }, null, ClassLoader::class); }