Updated Rector to commit 92d04a5547

92d04a5547 Deprecate RemovingStatic rules as very narrow use case in generic rules (#1819)
This commit is contained in:
Tomas Votruba 2022-02-15 22:46:36 +00:00
parent 7d7b002e7c
commit d0d361080e
14 changed files with 42 additions and 699 deletions

View File

@ -3,16 +3,13 @@
declare (strict_types=1);
namespace RectorPrefix20220215;
use Rector\Core\Configuration\Option;
use Rector\PSR4\Composer\PSR4NamespaceMatcher;
use Rector\PSR4\Contract\PSR4AutoloadNamespaceMatcherInterface;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
return static function (\Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator $containerConfigurator) : void {
$parameters = $containerConfigurator->parameters();
$parameters->set(\Rector\Core\Configuration\Option::TYPES_TO_REMOVE_STATIC_FROM, []);
$services = $containerConfigurator->services();
$services->defaults()->public()->autowire()->autoconfigure();
// psr-4
$services->alias(\Rector\PSR4\Contract\PSR4AutoloadNamespaceMatcherInterface::class, \Rector\PSR4\Composer\PSR4NamespaceMatcher::class);
$services->load('Rector\\', __DIR__ . '/../rules')->exclude([__DIR__ . '/../rules/*/{ValueObject,Rector,Contract,Exception,Enum}']);
$services->load('Rector\\', __DIR__ . '/../rules')->exclude([__DIR__ . '/../rules/*/ValueObject/*', __DIR__ . '/../rules/*/Rector/*', __DIR__ . '/../rules/*/Contract/*', __DIR__ . '/../rules/*/Exception/*', __DIR__ . '/../rules/*/Enum/*']);
};

View File

@ -1,4 +1,4 @@
# 524 Rules Overview
# 520 Rules Overview
<br>
@ -8,7 +8,7 @@
- [Autodiscovery](#autodiscovery) (4)
- [CodeQuality](#codequality) (70)
- [CodeQuality](#codequality) (71)
- [CodingStyle](#codingstyle) (35)
@ -76,7 +76,7 @@
- [Php74](#php74) (15)
- [Php80](#php80) (18)
- [Php80](#php80) (17)
- [Php81](#php81) (9)
@ -88,7 +88,7 @@
- [Removing](#removing) (6)
- [RemovingStatic](#removingstatic) (5)
- [RemovingStatic](#removingstatic) (1)
- [Renaming](#renaming) (11)
@ -1127,6 +1127,24 @@ Change unsafe new `static()` to new `self()`
<br>
### OptionalParametersAfterRequiredRector
Move required parameters after optional ones
- class: [`Rector\CodeQuality\Rector\ClassMethod\OptionalParametersAfterRequiredRector`](../rules/CodeQuality/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php)
```diff
class SomeObject
{
- public function run($optional = 1, $required)
+ public function run($required, $optional = 1)
{
}
}
```
<br>
### RemoveAlwaysTrueConditionSetInConstructorRector
If conditions is always true, perform the content right away
@ -8350,24 +8368,6 @@ Change ternary type resolve to `get_debug_type()`
<br>
### OptionalParametersAfterRequiredRector
Move required parameters after optional ones
- class: [`Rector\Php80\Rector\ClassMethod\OptionalParametersAfterRequiredRector`](../rules/Php80/Rector/ClassMethod/OptionalParametersAfterRequiredRector.php)
```diff
class SomeObject
{
- public function run($optional = 1, $required)
+ public function run($required, $optional = 1)
{
}
}
```
<br>
### Php8ResourceReturnToObjectRector
Change `is_resource()` to instanceof Object
@ -9566,108 +9566,6 @@ return static function (ContainerConfigurator $containerConfigurator): void {
## RemovingStatic
### DesiredClassTypeToDynamicRector
Change full static service, to dynamic one
- class: [`Rector\RemovingStatic\Rector\Class_\DesiredClassTypeToDynamicRector`](../rules/RemovingStatic/Rector/Class_/DesiredClassTypeToDynamicRector.php)
```diff
class AnotherClass
{
+ /**
+ * @var SomeClass
+ */
+ private $someClass;
+
+ public fuction __construct(SomeClass $someClass)
+ {
+ $this->someClass = $someClass;
+ }
+
public function run()
{
SomeClass::someStatic();
}
}
class SomeClass
{
- public static function run()
+ public function run()
{
- self::someStatic();
+ $this->someStatic();
}
- private static function someStatic()
+ private function someStatic()
{
}
}
```
<br>
### DesiredPropertyClassMethodTypeToDynamicRector
Change defined static properties and methods to dynamic
- class: [`Rector\RemovingStatic\Rector\Property\DesiredPropertyClassMethodTypeToDynamicRector`](../rules/RemovingStatic/Rector/Property/DesiredPropertyClassMethodTypeToDynamicRector.php)
```diff
final class SomeClass
{
- public static $name;
+ public $name;
- public static function go()
+ public function go()
{
}
}
```
<br>
### DesiredStaticCallTypeToDynamicRector
Change defined static service to dynamic one
- class: [`Rector\RemovingStatic\Rector\StaticCall\DesiredStaticCallTypeToDynamicRector`](../rules/RemovingStatic/Rector/StaticCall/DesiredStaticCallTypeToDynamicRector.php)
```diff
final class SomeClass
{
public function run()
{
- SomeStaticMethod::someStatic();
+ $this->someStaticMethod->someStatic();
}
}
```
<br>
### DesiredStaticPropertyFetchTypeToDynamicRector
Change defined static service to dynamic one
- class: [`Rector\RemovingStatic\Rector\StaticPropertyFetch\DesiredStaticPropertyFetchTypeToDynamicRector`](../rules/RemovingStatic/Rector/StaticPropertyFetch/DesiredStaticPropertyFetchTypeToDynamicRector.php)
```diff
final class SomeClass
{
public function run()
{
- SomeStaticMethod::$someStatic;
+ $this->someStaticMethod->someStatic;
}
}
```
<br>
### LocallyCalledStaticMethodToNonStaticRector
Change static method and local-only calls to non-static

View File

@ -1,53 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\RemovingStatic\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Type\ObjectType;
use Rector\Core\PhpParser\Node\BetterNodeFinder;
use Rector\Core\ValueObject\MethodName;
use Rector\NodeTypeResolver\NodeTypeResolver;
final class StaticCallPresenceAnalyzer
{
/**
* @readonly
* @var \Rector\Core\PhpParser\Node\BetterNodeFinder
*/
private $betterNodeFinder;
/**
* @readonly
* @var \Rector\NodeTypeResolver\NodeTypeResolver
*/
private $nodeTypeResolver;
public function __construct(\Rector\Core\PhpParser\Node\BetterNodeFinder $betterNodeFinder, \Rector\NodeTypeResolver\NodeTypeResolver $nodeTypeResolver)
{
$this->betterNodeFinder = $betterNodeFinder;
$this->nodeTypeResolver = $nodeTypeResolver;
}
public function hasMethodStaticCallOnType(\PhpParser\Node\Stmt\ClassMethod $classMethod, \PHPStan\Type\ObjectType $objectType) : bool
{
return (bool) $this->betterNodeFinder->findFirst((array) $classMethod->stmts, function (\PhpParser\Node $node) use($objectType) : bool {
if (!$node instanceof \PhpParser\Node\Expr\StaticCall) {
return \false;
}
return $this->nodeTypeResolver->isObjectType($node->class, $objectType);
});
}
public function hasClassAnyMethodWithStaticCallOnType(\PhpParser\Node\Stmt\Class_ $class, \PHPStan\Type\ObjectType $objectType) : bool
{
foreach ($class->getMethods() as $classMethod) {
// handled else where
if ((string) $classMethod->name === \Rector\Core\ValueObject\MethodName::CONSTRUCT) {
continue;
}
if ($this->hasMethodStaticCallOnType($classMethod, $objectType)) {
return \true;
}
}
return \false;
}
}

View File

@ -1,172 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\RemovingStatic\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Param;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Type\ObjectType;
use Rector\Core\Configuration\Option;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\ValueObject\MethodName;
use Rector\Naming\Naming\PropertyNaming;
use Rector\PostRector\Collector\PropertyToAddCollector;
use Rector\PostRector\ValueObject\PropertyMetadata;
use Rector\RemovingStatic\NodeAnalyzer\StaticCallPresenceAnalyzer;
use RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Tests\RemovingStatic\Rector\Class_\DesiredClassTypeToDynamicRector\DesiredClassTypeToDynamicRectorTest
*/
final class DesiredClassTypeToDynamicRector extends \Rector\Core\Rector\AbstractRector
{
/**
* @var ObjectType[]
*/
private $staticObjectTypes = [];
/**
* @readonly
* @var \Rector\Naming\Naming\PropertyNaming
*/
private $propertyNaming;
/**
* @readonly
* @var \Rector\RemovingStatic\NodeAnalyzer\StaticCallPresenceAnalyzer
*/
private $staticCallPresenceAnalyzer;
/**
* @readonly
* @var \Rector\PostRector\Collector\PropertyToAddCollector
*/
private $propertyToAddCollector;
public function __construct(\Rector\Naming\Naming\PropertyNaming $propertyNaming, \Rector\RemovingStatic\NodeAnalyzer\StaticCallPresenceAnalyzer $staticCallPresenceAnalyzer, \Rector\PostRector\Collector\PropertyToAddCollector $propertyToAddCollector, \RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider $parameterProvider)
{
$this->propertyNaming = $propertyNaming;
$this->staticCallPresenceAnalyzer = $staticCallPresenceAnalyzer;
$this->propertyToAddCollector = $propertyToAddCollector;
$typesToRemoveStaticFrom = $parameterProvider->provideArrayParameter(\Rector\Core\Configuration\Option::TYPES_TO_REMOVE_STATIC_FROM);
foreach ($typesToRemoveStaticFrom as $typeToRemoveStaticFrom) {
$this->staticObjectTypes[] = new \PHPStan\Type\ObjectType($typeToRemoveStaticFrom);
}
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Change full static service, to dynamic one', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE'
class AnotherClass
{
public function run()
{
SomeClass::someStatic();
}
}
class SomeClass
{
public static function run()
{
self::someStatic();
}
private static function someStatic()
{
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
class AnotherClass
{
/**
* @var SomeClass
*/
private $someClass;
public fuction __construct(SomeClass $someClass)
{
$this->someClass = $someClass;
}
public function run()
{
SomeClass::someStatic();
}
}
class SomeClass
{
public function run()
{
$this->someStatic();
}
private function someStatic()
{
}
}
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\Class_::class];
}
/**
* @param Class_ $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
foreach ($this->staticObjectTypes as $staticObjectType) {
// do not any dependencies to class itself
if ($this->isObjectType($node, $staticObjectType)) {
continue;
}
$this->completeDependencyToConstructorOnly($node, $staticObjectType);
if ($this->staticCallPresenceAnalyzer->hasClassAnyMethodWithStaticCallOnType($node, $staticObjectType)) {
$propertyExpectedName = $this->propertyNaming->fqnToVariableName($staticObjectType);
$propertyMetadata = new \Rector\PostRector\ValueObject\PropertyMetadata($propertyExpectedName, $staticObjectType, \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
$this->propertyToAddCollector->addPropertyToClass($node, $propertyMetadata);
return $node;
}
}
return null;
}
private function completeDependencyToConstructorOnly(\PhpParser\Node\Stmt\Class_ $class, \PHPStan\Type\ObjectType $objectType) : void
{
$constructClassMethod = $class->getMethod(\Rector\Core\ValueObject\MethodName::CONSTRUCT);
if (!$constructClassMethod instanceof \PhpParser\Node\Stmt\ClassMethod) {
return;
}
$hasStaticCall = $this->staticCallPresenceAnalyzer->hasMethodStaticCallOnType($constructClassMethod, $objectType);
if (!$hasStaticCall) {
return;
}
$propertyExpectedName = $this->propertyNaming->fqnToVariableName($objectType);
if ($this->isTypeAlreadyInParamMethod($constructClassMethod, $objectType)) {
return;
}
$constructClassMethod->params[] = $this->createParam($propertyExpectedName, $objectType);
}
private function isTypeAlreadyInParamMethod(\PhpParser\Node\Stmt\ClassMethod $classMethod, \PHPStan\Type\ObjectType $objectType) : bool
{
foreach ($classMethod->getParams() as $param) {
if ($param->type === null) {
continue;
}
if ($this->isName($param->type, $objectType->getClassName())) {
return \true;
}
}
return \false;
}
private function createParam(string $propertyName, \PHPStan\Type\ObjectType $objectType) : \PhpParser\Node\Param
{
return new \PhpParser\Node\Param(new \PhpParser\Node\Expr\Variable($propertyName), null, new \PhpParser\Node\Name\FullyQualified($objectType->getClassName()));
}
}

View File

@ -1,96 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\RemovingStatic\Rector\Property;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Property;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\ObjectType;
use Rector\Core\Configuration\Option;
use Rector\Core\Rector\AbstractRector;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\Privatization\NodeManipulator\VisibilityManipulator;
use RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Tests\RemovingStatic\Rector\Property\DesiredPropertyClassMethodTypeToDynamicRector\DesiredPropertyClassMethodTypeToDynamicRectorTest
*/
final class DesiredPropertyClassMethodTypeToDynamicRector extends \Rector\Core\Rector\AbstractRector
{
/**
* @var ObjectType[]
*/
private $staticObjectTypes = [];
/**
* @readonly
* @var \Rector\Privatization\NodeManipulator\VisibilityManipulator
*/
private $visibilityManipulator;
public function __construct(\RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider $parameterProvider, \Rector\Privatization\NodeManipulator\VisibilityManipulator $visibilityManipulator)
{
$this->visibilityManipulator = $visibilityManipulator;
$typesToRemoveStaticFrom = $parameterProvider->provideArrayParameter(\Rector\Core\Configuration\Option::TYPES_TO_REMOVE_STATIC_FROM);
foreach ($typesToRemoveStaticFrom as $typeToRemoveStaticFrom) {
$this->staticObjectTypes[] = new \PHPStan\Type\ObjectType($typeToRemoveStaticFrom);
}
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Change defined static properties and methods to dynamic', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE'
final class SomeClass
{
public static $name;
public static function go()
{
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
final class SomeClass
{
public $name;
public function go()
{
}
}
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Stmt\Property::class, \PhpParser\Node\Stmt\ClassMethod::class];
}
/**
* @param Property|ClassMethod $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
/** @var Scope $scope */
$scope = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::SCOPE);
$classReflection = $scope->getClassReflection();
if (!$classReflection instanceof \PHPStan\Reflection\ClassReflection) {
return null;
}
$classObjectType = new \PHPStan\Type\ObjectType($classReflection->getName());
foreach ($this->staticObjectTypes as $staticObjectType) {
if (!$staticObjectType->isSuperTypeOf($classObjectType)->yes()) {
continue;
}
if (!$node->isStatic()) {
return null;
}
$this->visibilityManipulator->makeNonStatic($node);
return $node;
}
return null;
}
}

View File

@ -1,103 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\RemovingStatic\Rector\StaticCall;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticCall;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\ClassMethod;
use PHPStan\Type\ObjectType;
use Rector\Core\Configuration\Option;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\ValueObject\MethodName;
use Rector\Naming\Naming\PropertyNaming;
use RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Tests\RemovingStatic\Rector\StaticCall\DesiredStaticCallTypeToDynamicRector\DesiredStaticCallTypeToDynamicRectorTest
*/
final class DesiredStaticCallTypeToDynamicRector extends \Rector\Core\Rector\AbstractRector
{
/**
* @var ObjectType[]
*/
private $staticObjectTypes = [];
/**
* @readonly
* @var \Rector\Naming\Naming\PropertyNaming
*/
private $propertyNaming;
public function __construct(\Rector\Naming\Naming\PropertyNaming $propertyNaming, \RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider $parameterProvider)
{
$this->propertyNaming = $propertyNaming;
$typesToRemoveStaticFrom = $parameterProvider->provideArrayParameter(\Rector\Core\Configuration\Option::TYPES_TO_REMOVE_STATIC_FROM);
foreach ($typesToRemoveStaticFrom as $typeToRemoveStaticFrom) {
$this->staticObjectTypes[] = new \PHPStan\Type\ObjectType($typeToRemoveStaticFrom);
}
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Change defined static service to dynamic one', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE'
final class SomeClass
{
public function run()
{
SomeStaticMethod::someStatic();
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
final class SomeClass
{
public function run()
{
$this->someStaticMethod->someStatic();
}
}
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Expr\StaticCall::class];
}
/**
* @param StaticCall $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
foreach ($this->staticObjectTypes as $staticObjectType) {
if (!$this->isObjectType($node->class, $staticObjectType)) {
continue;
}
// is the same class or external call?
$className = $this->getName($node->class);
if ($className === 'self') {
return $this->createFromSelf($node);
}
$propertyName = $this->propertyNaming->fqnToVariableName($staticObjectType);
$classMethod = $this->betterNodeFinder->findParentType($node, \PhpParser\Node\Stmt\ClassMethod::class);
if (!$classMethod instanceof \PhpParser\Node\Stmt\ClassMethod) {
return null;
}
if ($this->nodeNameResolver->isName($classMethod, \Rector\Core\ValueObject\MethodName::CONSTRUCT)) {
$propertyFetch = new \PhpParser\Node\Expr\Variable($propertyName);
} else {
$propertyFetch = new \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable('this'), $propertyName);
}
return new \PhpParser\Node\Expr\MethodCall($propertyFetch, $node->name, $node->args);
}
return null;
}
private function createFromSelf(\PhpParser\Node\Expr\StaticCall $staticCall) : \PhpParser\Node\Expr\MethodCall
{
return new \PhpParser\Node\Expr\MethodCall(new \PhpParser\Node\Expr\Variable('this'), $staticCall->name, $staticCall->args);
}
}

View File

@ -1,114 +0,0 @@
<?php
declare (strict_types=1);
namespace Rector\RemovingStatic\Rector\StaticPropertyFetch;
use PhpParser\Node;
use PhpParser\Node\Expr\PropertyFetch;
use PhpParser\Node\Expr\StaticPropertyFetch;
use PhpParser\Node\Expr\Variable;
use PhpParser\Node\Stmt\Class_;
use PHPStan\Analyser\Scope;
use PHPStan\Reflection\ClassReflection;
use PHPStan\Type\ObjectType;
use Rector\Core\Configuration\Option;
use Rector\Core\Rector\AbstractRector;
use Rector\Naming\Naming\PropertyNaming;
use Rector\NodeTypeResolver\Node\AttributeKey;
use Rector\PostRector\Collector\PropertyToAddCollector;
use Rector\PostRector\ValueObject\PropertyMetadata;
use RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider;
use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample;
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
/**
* @see \Rector\Tests\RemovingStatic\Rector\StaticPropertyFetch\DesiredStaticPropertyFetchTypeToDynamicRector\DesiredStaticPropertyFetchTypeToDynamicRectorTest
*/
final class DesiredStaticPropertyFetchTypeToDynamicRector extends \Rector\Core\Rector\AbstractRector
{
/**
* @var ObjectType[]
*/
private $staticObjectTypes = [];
/**
* @readonly
* @var \Rector\Naming\Naming\PropertyNaming
*/
private $propertyNaming;
/**
* @readonly
* @var \Rector\PostRector\Collector\PropertyToAddCollector
*/
private $propertyToAddCollector;
public function __construct(\Rector\Naming\Naming\PropertyNaming $propertyNaming, \Rector\PostRector\Collector\PropertyToAddCollector $propertyToAddCollector, \RectorPrefix20220215\Symplify\PackageBuilder\Parameter\ParameterProvider $parameterProvider)
{
$this->propertyNaming = $propertyNaming;
$this->propertyToAddCollector = $propertyToAddCollector;
$typesToRemoveStaticFrom = $parameterProvider->provideArrayParameter(\Rector\Core\Configuration\Option::TYPES_TO_REMOVE_STATIC_FROM);
foreach ($typesToRemoveStaticFrom as $typeToRemoveStaticFrom) {
$this->staticObjectTypes[] = new \PHPStan\Type\ObjectType($typeToRemoveStaticFrom);
}
}
public function getRuleDefinition() : \Symplify\RuleDocGenerator\ValueObject\RuleDefinition
{
return new \Symplify\RuleDocGenerator\ValueObject\RuleDefinition('Change defined static service to dynamic one', [new \Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample(<<<'CODE_SAMPLE'
final class SomeClass
{
public function run()
{
SomeStaticMethod::$someStatic;
}
}
CODE_SAMPLE
, <<<'CODE_SAMPLE'
final class SomeClass
{
public function run()
{
$this->someStaticMethod->someStatic;
}
}
CODE_SAMPLE
)]);
}
/**
* @return array<class-string<Node>>
*/
public function getNodeTypes() : array
{
return [\PhpParser\Node\Expr\StaticPropertyFetch::class];
}
/**
* @param StaticPropertyFetch $node
*/
public function refactor(\PhpParser\Node $node) : ?\PhpParser\Node
{
/** @var Scope $scope */
$scope = $node->getAttribute(\Rector\NodeTypeResolver\Node\AttributeKey::SCOPE);
$classReflection = $scope->getClassReflection();
if (!$classReflection instanceof \PHPStan\Reflection\ClassReflection) {
return null;
}
$classObjectType = new \PHPStan\Type\ObjectType($classReflection->getName());
// A. remove local fetch
foreach ($this->staticObjectTypes as $staticObjectType) {
if (!$staticObjectType->isSuperTypeOf($classObjectType)->yes()) {
continue;
}
return new \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable('this'), $node->name);
}
// B. external property fetch
foreach ($this->staticObjectTypes as $staticObjectType) {
if (!$this->isObjectType($node->class, $staticObjectType)) {
continue;
}
$propertyName = $this->propertyNaming->fqnToVariableName($staticObjectType);
/** @var Class_ $class */
$class = $this->betterNodeFinder->findParentType($node, \PhpParser\Node\Stmt\Class_::class);
$propertyMetadata = new \Rector\PostRector\ValueObject\PropertyMetadata($propertyName, $staticObjectType, \PhpParser\Node\Stmt\Class_::MODIFIER_PRIVATE);
$this->propertyToAddCollector->addPropertyToClass($class, $propertyMetadata);
$objectPropertyFetch = new \PhpParser\Node\Expr\PropertyFetch(new \PhpParser\Node\Expr\Variable('this'), $propertyName);
return new \PhpParser\Node\Expr\PropertyFetch($objectPropertyFetch, $node->name);
}
return null;
}
}

View File

@ -16,11 +16,11 @@ final class VersionResolver
/**
* @var string
*/
public const PACKAGE_VERSION = '9fe44263f906009ab96cae86c89a3ace6a941b41';
public const PACKAGE_VERSION = '92d04a5547b445a20ca9d578a385ba41be27e451';
/**
* @var string
*/
public const RELEASE_DATE = '2022-02-15 22:58:51';
public const RELEASE_DATE = '2022-02-15 23:38:07';
public static function resolvePackageVersion() : string
{
$process = new \RectorPrefix20220215\Symfony\Component\Process\Process(['git', 'log', '--pretty="%H"', '-n1', 'HEAD'], __DIR__);

View File

@ -114,10 +114,6 @@ final class Option
* @var string
*/
public const PHPSTAN_FOR_RECTOR_PATH = 'phpstan_for_rector_path';
/**
* @var string
*/
public const TYPES_TO_REMOVE_STATIC_FROM = 'types_to_remove_static_from';
/**
* @var string
*/

2
vendor/autoload.php vendored
View File

@ -4,4 +4,4 @@
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66::getLoader();
return ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d::getLoader();

View File

@ -2817,12 +2817,7 @@ return array(
'Rector\\RectorInstaller\\LocalFilesystem' => $vendorDir . '/rector/extension-installer/src/LocalFilesystem.php',
'Rector\\RectorInstaller\\Plugin' => $vendorDir . '/rector/extension-installer/src/Plugin.php',
'Rector\\RectorInstaller\\PluginInstaller' => $vendorDir . '/rector/extension-installer/src/PluginInstaller.php',
'Rector\\RemovingStatic\\NodeAnalyzer\\StaticCallPresenceAnalyzer' => $baseDir . '/rules/RemovingStatic/NodeAnalyzer/StaticCallPresenceAnalyzer.php',
'Rector\\RemovingStatic\\Rector\\ClassMethod\\LocallyCalledStaticMethodToNonStaticRector' => $baseDir . '/rules/RemovingStatic/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php',
'Rector\\RemovingStatic\\Rector\\Class_\\DesiredClassTypeToDynamicRector' => $baseDir . '/rules/RemovingStatic/Rector/Class_/DesiredClassTypeToDynamicRector.php',
'Rector\\RemovingStatic\\Rector\\Property\\DesiredPropertyClassMethodTypeToDynamicRector' => $baseDir . '/rules/RemovingStatic/Rector/Property/DesiredPropertyClassMethodTypeToDynamicRector.php',
'Rector\\RemovingStatic\\Rector\\StaticCall\\DesiredStaticCallTypeToDynamicRector' => $baseDir . '/rules/RemovingStatic/Rector/StaticCall/DesiredStaticCallTypeToDynamicRector.php',
'Rector\\RemovingStatic\\Rector\\StaticPropertyFetch\\DesiredStaticPropertyFetchTypeToDynamicRector' => $baseDir . '/rules/RemovingStatic/Rector/StaticPropertyFetch/DesiredStaticPropertyFetchTypeToDynamicRector.php',
'Rector\\Removing\\NodeAnalyzer\\ForbiddenPropertyRemovalAnalyzer' => $baseDir . '/rules/Removing/NodeAnalyzer/ForbiddenPropertyRemovalAnalyzer.php',
'Rector\\Removing\\NodeManipulator\\ComplexNodeRemover' => $baseDir . '/rules/Removing/NodeManipulator/ComplexNodeRemover.php',
'Rector\\Removing\\Rector\\ClassMethod\\ArgumentRemoverRector' => $baseDir . '/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php',

View File

@ -2,7 +2,7 @@
// autoload_real.php @generated by Composer
class ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66
class ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d
{
private static $loader;
@ -22,15 +22,15 @@ class ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66
return self::$loader;
}
spl_autoload_register(array('ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66', 'loadClassLoader'), true, true);
spl_autoload_register(array('ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d', 'loadClassLoader'), true, true);
self::$loader = $loader = new \Composer\Autoload\ClassLoader(\dirname(\dirname(__FILE__)));
spl_autoload_unregister(array('ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66', 'loadClassLoader'));
spl_autoload_unregister(array('ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d', 'loadClassLoader'));
$useStaticLoader = PHP_VERSION_ID >= 50600 && !defined('HHVM_VERSION') && (!function_exists('zend_loader_file_encoded') || !zend_loader_file_encoded());
if ($useStaticLoader) {
require __DIR__ . '/autoload_static.php';
call_user_func(\Composer\Autoload\ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66::getInitializer($loader));
call_user_func(\Composer\Autoload\ComposerStaticInit65cd69f55c342a0269910718ad2dfe0d::getInitializer($loader));
} else {
$classMap = require __DIR__ . '/autoload_classmap.php';
if ($classMap) {
@ -42,12 +42,12 @@ class ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66
$loader->register(true);
if ($useStaticLoader) {
$includeFiles = Composer\Autoload\ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66::$files;
$includeFiles = Composer\Autoload\ComposerStaticInit65cd69f55c342a0269910718ad2dfe0d::$files;
} else {
$includeFiles = require __DIR__ . '/autoload_files.php';
}
foreach ($includeFiles as $fileIdentifier => $file) {
composerRequire94e603ff37b4f42de2dd41e489cddf66($fileIdentifier, $file);
composerRequire65cd69f55c342a0269910718ad2dfe0d($fileIdentifier, $file);
}
return $loader;
@ -59,7 +59,7 @@ class ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66
* @param string $file
* @return void
*/
function composerRequire94e603ff37b4f42de2dd41e489cddf66($fileIdentifier, $file)
function composerRequire65cd69f55c342a0269910718ad2dfe0d($fileIdentifier, $file)
{
if (empty($GLOBALS['__composer_autoload_files'][$fileIdentifier])) {
$GLOBALS['__composer_autoload_files'][$fileIdentifier] = true;

View File

@ -4,7 +4,7 @@
namespace Composer\Autoload;
class ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66
class ComposerStaticInit65cd69f55c342a0269910718ad2dfe0d
{
public static $files = array (
'0e6d7bf4a5811bfa5cf40c5ccd6fae6a' => __DIR__ . '/..' . '/symfony/polyfill-mbstring/bootstrap.php',
@ -3206,12 +3206,7 @@ class ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66
'Rector\\RectorInstaller\\LocalFilesystem' => __DIR__ . '/..' . '/rector/extension-installer/src/LocalFilesystem.php',
'Rector\\RectorInstaller\\Plugin' => __DIR__ . '/..' . '/rector/extension-installer/src/Plugin.php',
'Rector\\RectorInstaller\\PluginInstaller' => __DIR__ . '/..' . '/rector/extension-installer/src/PluginInstaller.php',
'Rector\\RemovingStatic\\NodeAnalyzer\\StaticCallPresenceAnalyzer' => __DIR__ . '/../..' . '/rules/RemovingStatic/NodeAnalyzer/StaticCallPresenceAnalyzer.php',
'Rector\\RemovingStatic\\Rector\\ClassMethod\\LocallyCalledStaticMethodToNonStaticRector' => __DIR__ . '/../..' . '/rules/RemovingStatic/Rector/ClassMethod/LocallyCalledStaticMethodToNonStaticRector.php',
'Rector\\RemovingStatic\\Rector\\Class_\\DesiredClassTypeToDynamicRector' => __DIR__ . '/../..' . '/rules/RemovingStatic/Rector/Class_/DesiredClassTypeToDynamicRector.php',
'Rector\\RemovingStatic\\Rector\\Property\\DesiredPropertyClassMethodTypeToDynamicRector' => __DIR__ . '/../..' . '/rules/RemovingStatic/Rector/Property/DesiredPropertyClassMethodTypeToDynamicRector.php',
'Rector\\RemovingStatic\\Rector\\StaticCall\\DesiredStaticCallTypeToDynamicRector' => __DIR__ . '/../..' . '/rules/RemovingStatic/Rector/StaticCall/DesiredStaticCallTypeToDynamicRector.php',
'Rector\\RemovingStatic\\Rector\\StaticPropertyFetch\\DesiredStaticPropertyFetchTypeToDynamicRector' => __DIR__ . '/../..' . '/rules/RemovingStatic/Rector/StaticPropertyFetch/DesiredStaticPropertyFetchTypeToDynamicRector.php',
'Rector\\Removing\\NodeAnalyzer\\ForbiddenPropertyRemovalAnalyzer' => __DIR__ . '/../..' . '/rules/Removing/NodeAnalyzer/ForbiddenPropertyRemovalAnalyzer.php',
'Rector\\Removing\\NodeManipulator\\ComplexNodeRemover' => __DIR__ . '/../..' . '/rules/Removing/NodeManipulator/ComplexNodeRemover.php',
'Rector\\Removing\\Rector\\ClassMethod\\ArgumentRemoverRector' => __DIR__ . '/../..' . '/rules/Removing/Rector/ClassMethod/ArgumentRemoverRector.php',
@ -3881,9 +3876,9 @@ class ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66
public static function getInitializer(ClassLoader $loader)
{
return \Closure::bind(function () use ($loader) {
$loader->prefixLengthsPsr4 = ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit94e603ff37b4f42de2dd41e489cddf66::$classMap;
$loader->prefixLengthsPsr4 = ComposerStaticInit65cd69f55c342a0269910718ad2dfe0d::$prefixLengthsPsr4;
$loader->prefixDirsPsr4 = ComposerStaticInit65cd69f55c342a0269910718ad2dfe0d::$prefixDirsPsr4;
$loader->classMap = ComposerStaticInit65cd69f55c342a0269910718ad2dfe0d::$classMap;
}, null, ClassLoader::class);
}

View File

@ -9,8 +9,8 @@ $loader = require_once __DIR__.'/autoload.php';
if (!class_exists('AutoloadIncluder', false) && !interface_exists('AutoloadIncluder', false) && !trait_exists('AutoloadIncluder', false)) {
spl_autoload_call('RectorPrefix20220215\AutoloadIncluder');
}
if (!class_exists('ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66', false) && !interface_exists('ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66', false) && !trait_exists('ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66', false)) {
spl_autoload_call('RectorPrefix20220215\ComposerAutoloaderInit94e603ff37b4f42de2dd41e489cddf66');
if (!class_exists('ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d', false) && !interface_exists('ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d', false) && !trait_exists('ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d', false)) {
spl_autoload_call('RectorPrefix20220215\ComposerAutoloaderInit65cd69f55c342a0269910718ad2dfe0d');
}
if (!class_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !interface_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false) && !trait_exists('Helmich\TypoScriptParser\Parser\AST\Statement', false)) {
spl_autoload_call('RectorPrefix20220215\Helmich\TypoScriptParser\Parser\AST\Statement');
@ -59,9 +59,9 @@ if (!function_exists('print_node')) {
return \RectorPrefix20220215\print_node(...func_get_args());
}
}
if (!function_exists('composerRequire94e603ff37b4f42de2dd41e489cddf66')) {
function composerRequire94e603ff37b4f42de2dd41e489cddf66() {
return \RectorPrefix20220215\composerRequire94e603ff37b4f42de2dd41e489cddf66(...func_get_args());
if (!function_exists('composerRequire65cd69f55c342a0269910718ad2dfe0d')) {
function composerRequire65cd69f55c342a0269910718ad2dfe0d() {
return \RectorPrefix20220215\composerRequire65cd69f55c342a0269910718ad2dfe0d(...func_get_args());
}
}
if (!function_exists('scanPath')) {