[Order] Add abstract class, check for changed order and move category to Class_, to prevent minus types (#4069)

* [Order] report applied rule only on change

* add AbstractConstantPropertyMethodOrderRector, use explicit Class_ and Trait_ over minus

* update docs

* add PropertyNameRankAndPosition value object

* static fixes

* add ClassMethodRankeable and RankeableInterface, to get rid of arrays

* add PropertyRankeable

* add ClassConstRankeable

* add sortByRanksAndGetNames()

* [rector] add sortByRanksAndGetNames()

* [cs] add sortByRanksAndGetNames()

Co-authored-by: rector-bot <tomas@getrector.org>
This commit is contained in:
Tomas Votruba 2020-08-30 14:45:03 +02:00 committed by GitHub
parent 55c45b8c2b
commit ff6d6571e6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
49 changed files with 704 additions and 523 deletions

View File

@ -4,11 +4,11 @@ declare(strict_types=1);
use Rector\Order\Rector\Class_\OrderClassConstantsByIntegerValueRector;
use Rector\Order\Rector\Class_\OrderConstantsByVisibilityRector;
use Rector\Order\Rector\Class_\OrderMethodsByVisibilityRector;
use Rector\Order\Rector\Class_\OrderPrivateMethodsByUseRector;
use Rector\Order\Rector\Class_\OrderPropertiesByVisibilityRector;
use Rector\Order\Rector\Class_\OrderPropertyByComplexityRector;
use Rector\Order\Rector\Class_\OrderPublicInterfaceMethodRector;
use Rector\Order\Rector\ClassLike\OrderMethodsByVisibilityRector;
use Rector\Order\Rector\ClassLike\OrderPrivateMethodsByUseRector;
use Rector\Order\Rector\ClassLike\OrderPropertiesByVisibilityRector;
use Rector\Order\Rector\ClassLike\OrderPropertyByComplexityRector;
use Rector\Order\Rector\ClassMethod\OrderConstructorDependenciesByTypeAlphabeticallyRector;
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;

View File

@ -1,4 +1,4 @@
# All 566 Rectors Overview
# All 567 Rectors Overview
- [Projects](#projects)
---
@ -39,7 +39,7 @@
- [Order](#order) (9)
- [PHPOffice](#phpoffice) (14)
- [PHPStan](#phpstan) (3)
- [PHPUnit](#phpunit) (37)
- [PHPUnit](#phpunit) (38)
- [PHPUnitSymfony](#phpunitsymfony) (1)
- [PSR4](#psr4) (3)
- [Performance](#performance) (1)
@ -293,6 +293,24 @@ Change `App::uses()` to use imports
Moves array options to fluent setter method calls.
```php
<?php
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Rector\CakePHP\Rector\MethodCall\ArrayToFluentCallRector;
return function (ContainerConfigurator $containerConfigurator) : void {
$services = $containerConfigurator->services();
$services->set(ArrayToFluentCallRector::class)
->call('configure', [[
ArrayToFluentCallRector::ARRAYS_TO_FLUENT_CALLS => [
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\CakePHP\ValueObject\ArrayToFluentCall('ArticlesTable', ['foreignKey' => 'setForeignKey', 'propertyName' => 'setProperty']))]
]]);
};
```
```diff
use Cake\ORM\Table;
@ -328,7 +346,7 @@ Changes `$fixtues` style from snake_case to PascalCase.
- 'some_plugin.posts/special_posts',
+ 'app.Posts',
+ 'app.Users',
+ 'some_plugin.Posts/SpeectialPosts',
+ 'some_plugin.Posts/SpecialPosts',
];
```
@ -359,6 +377,24 @@ Collect implicit class names and add imports
Changes combined set/get `value()` to specific `getValue()` or `setValue(x)`.
```php
<?php
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Rector\CakePHP\Rector\MethodCall\ModalToGetSetRector;
return function (ContainerConfigurator $containerConfigurator) : void {
$services = $containerConfigurator->services();
$services->set(ModalToGetSetRector::class)
->call('configure', [[
ModalToGetSetRector::UNPREFIXED_METHODS_TO_GET_SET => [
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\CakePHP\ValueObject\UnprefixedMethodToGetSet('InstanceConfigTrait', 'config', 'getConfig', 'setConfig', 1, null))]
]]);
};
```
```diff
$object = new InstanceConfigTrait;
@ -393,9 +429,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(RenameMethodCallBasedOnParameterRector::class)
->call('configure', [[
RenameMethodCallBasedOnParameterRector::CALLS_WITH_PARAM_RENAMES => [
'getParam' => [
'match_parameter' => 'paging', 'replace_with' => 'getAttribute'], 'withParam' => [
'match_parameter' => 'paging', 'replace_with' => 'withAttribute']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\CakePHP\ValueObject\CallWithParamRename('getParam', 'paging', 'getAttribute', 'ServerRequest')), \Rector\SymfonyPhpConfig\inline_value_object(new Rector\CakePHP\ValueObject\CallWithParamRename('withParam', 'paging', 'withAttribute', 'ServerRequest'))]
]]);
};
```
@ -2079,8 +2113,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ReturnArrayClassMethodToYieldRector::class)
->call('configure', [[
ReturnArrayClassMethodToYieldRector::METHODS_TO_YIELDS => [
'EventSubscriberInterface' => [
'getSubscribedEvents']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\CodingStyle\ValueObject\MethodToYield('EventSubscriberInterface', 'getSubscribedEvents'))]
]]);
};
```
@ -4637,6 +4670,24 @@ return function (ContainerConfigurator $containerConfigurator) : void {
Add method parent call, in case new parent method is added
```php
<?php
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Rector\Generic\Rector\ClassMethod\AddMethodParentCallRector;
return function (ContainerConfigurator $containerConfigurator) : void {
$services = $containerConfigurator->services();
$services->set(AddMethodParentCallRector::class)
->call('configure', [[
AddMethodParentCallRector::METHODS_BY_PARENT_TYPES => [
'ParentClassWithNewConstructor' => '__construct']
]]);
};
```
```diff
class SunshineCommand extends ParentClassWithNewConstructor
{
@ -4712,8 +4763,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(AddReturnTypeDeclarationRector::class)
->call('configure', [[
AddReturnTypeDeclarationRector::METHOD_RETURN_TYPES => [
'SomeClass' => [
'getData' => 'array']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\MethodReturnType('SomeClass', 'getData', 'array'))]
]]);
};
```
@ -4773,10 +4823,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ArgumentAdderRector::class)
->call('configure', [[
ArgumentAdderRector::ADDED_ARGUMENTS => [
'SomeExampleClass' => [
'someMethod' => [
[
'name' => 'someArgument', 'default_value' => 'true', 'type' => 'SomeType']]]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\AddedArgument('SomeExampleClass', 'someMethod', 0, 'someArgument', 'true', 'SomeType', null))]
]]);
};
```
@ -4800,10 +4847,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ArgumentAdderRector::class)
->call('configure', [[
ArgumentAdderRector::ADDED_ARGUMENTS => [
'SomeExampleClass' => [
'someMethod' => [
[
'name' => 'someArgument', 'default_value' => 'true', 'type' => 'SomeType']]]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\AddedArgument('SomeExampleClass', 'someMethod', 0, 'someArgument', 'true', 'SomeType', null))]
]]);
};
```
@ -4840,10 +4884,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ArgumentDefaultValueReplacerRector::class)
->call('configure', [[
ArgumentDefaultValueReplacerRector::REPLACED_ARGUMENTS => [
'SomeExampleClass' => [
'someMethod' => [
[
['before' => 'SomeClass::OLD_CONSTANT', 'after' => 'false']]]]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\ReplacedArgument('SomeExampleClass', 'someMethod', 0, 'SomeClass::OLD_CONSTANT', 'false'))]
]]);
};
```
@ -4876,10 +4917,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ArgumentRemoverRector::class)
->call('configure', [[
ArgumentRemoverRector::REMOVED_ARGUMENTS => [
'ExampleClass' => [
'someMethod' => [
[
'value' => 'true']]]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\RemovedArgument('ExampleClass', 'someMethod', 0, 'true'))]
]]);
};
```
@ -4912,8 +4950,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ChangeConstantVisibilityRector::class)
->call('configure', [[
ChangeConstantVisibilityRector::CLASS_CONSTANT_VISIBILITY_CHANGES => [
'ParentObject' => [
'SOME_CONSTANT' => 'protected']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\ClassConstantVisibilityChange('ParentObject', 'SOME_CONSTANT', 'protected'))]
]]);
};
```
@ -4996,8 +5033,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ChangeMethodVisibilityRector::class)
->call('configure', [[
ChangeMethodVisibilityRector::METHOD_VISIBILITIES => [
'FrameworkClass' => [
'someMethod' => 'protected']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\MethodVisibility('FrameworkClass', 'someMethod', 'protected'))]
]]);
};
```
@ -5319,10 +5355,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(MethodCallToAnotherMethodCallWithArgumentsRector::class)
->call('configure', [[
MethodCallToAnotherMethodCallWithArgumentsRector::METHOD_CALL_RENAMES_WITH_ADDED_ARGUMENTS => [
'Nette\DI\ServiceDefinition' => [
'setInject' => [
[
'addTag', ['inject']]]]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Renaming\ValueObject\MethodCallRenameWithArrayKey('Nette\DI\ServiceDefinition', 'setInject', 'addTag', 'inject'))]
]]);
};
```
@ -5437,9 +5470,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(MethodCallToStaticCallRector::class)
->call('configure', [[
MethodCallToStaticCallRector::METHOD_CALLS_TO_STATIC_CALLS => [
'AnotherDependency' => [
'process' => [
'StaticCaller', 'anotherMethod']]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\MethodCallToStaticCall('AnotherDependency', 'process', 'StaticCaller', 'anotherMethod'))]
]]);
};
```
@ -5527,8 +5558,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(NewToStaticCallRector::class)
->call('configure', [[
NewToStaticCallRector::TYPE_TO_STATIC_CALLS => [
'Cookie' => [
'Cookie', 'create']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\TypeToStaticCall('Cookie', 'Cookie', 'create'))]
]]);
};
```
@ -5566,8 +5596,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(NormalToFluentRector::class)
->call('configure', [[
NormalToFluentRector::CALLS_TO_FLUENT => [
'SomeClass' => [
'someFunction', 'otherFunction']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\CallToFluent('SomeClass', ['someFunction', 'otherFunction']))]
]]);
};
```
@ -5672,9 +5701,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(PropertyToMethodRector::class)
->call('configure', [[
PropertyToMethodRector::PROPERTIES_TO_METHOD_CALLS => [
'SomeObject' => [
'property' => [
'get' => 'getProperty', 'set' => 'setProperty']]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\PropertyToMethodCall('SomeObject', 'property', 'getProperty', [], 'setProperty'))]
]]);
};
```
@ -5699,11 +5726,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(PropertyToMethodRector::class)
->call('configure', [[
PropertyToMethodRector::PROPERTIES_TO_METHOD_CALLS => [
'SomeObject' => [
'property' => [
'get' => [
'method' => 'getConfig', 'arguments' => [
'someArg']]]]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\PropertyToMethodCall('SomeObject', 'property', 'getConfig', ['someArg'], null))]
]]);
};
```
@ -5735,8 +5758,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(PseudoNamespaceToNamespaceRector::class)
->call('configure', [[
PseudoNamespaceToNamespaceRector::NAMESPACE_PREFIXES_WITH_EXCLUDED_CLASSES => [
'Some_' => [
'Some_Class_To_Keep']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\NamespacePrefixWithExcludedClasses('Some_', ['Some_Class_To_Keep']))]
]]);
};
```
@ -5807,8 +5829,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(RemoveFuncCallArgRector::class)
->call('configure', [[
RemoveFuncCallArgRector::REMOVED_FUNCTION_ARGUMENTS => [
'remove_last_arg' => [
1]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\RemovedFunctionArgument('remove_last_arg', 1))]
]]);
};
```
@ -5989,8 +6010,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(RenamePropertyRector::class)
->call('configure', [[
RenamePropertyRector::RENAMED_PROPERTIES => [
'SomeClass' => [
'someOldProperty' => 'someNewProperty']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\RenamedProperty('SomeClass', 'someOldProperty', 'someNewProperty'))]
]]);
};
```
@ -6022,8 +6042,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ReplaceParentCallByPropertyCallRector::class)
->call('configure', [[
ReplaceParentCallByPropertyCallRector::PARENT_CALLS_TO_PROPERTIES => [
'SomeTypeToReplace' => [
'someMethodCall' => 'someProperty']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\ParentCallToProperty('SomeTypeToReplace', 'someMethodCall', 'someProperty'))]
]]);
};
```
@ -6090,8 +6109,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(ServiceGetterToConstructorInjectionRector::class)
->call('configure', [[
ServiceGetterToConstructorInjectionRector::METHOD_CALL_TO_SERVICES => [
'FirstService' => [
'getAnotherService' => 'AnotherService']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\MethodCallToService('FirstService', 'getAnotherService', 'AnotherService'))]
]]);
};
```
@ -6162,8 +6180,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(StaticCallToFunctionRector::class)
->call('configure', [[
StaticCallToFunctionRector::STATIC_CALLS_TO_FUNCTIONS => [
'OldClass' => [
'oldMethod' => 'new_function']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\StaticCallToFunction('OldClass', 'oldMethod', 'new_function'))]
]]);
};
```
@ -6195,8 +6212,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(StringToClassConstantRector::class)
->call('configure', [[
StringToClassConstantRector::STRINGS_TO_CLASS_CONSTANTS => [
'compiler.post_dump' => [
'Yet\AnotherClass', 'CONSTANT']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\StringToClassConstant('compiler.post_dump', 'Yet\AnotherClass', 'CONSTANT'))]
]]);
};
```
@ -6234,9 +6250,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(SwapClassMethodArgumentsRector::class)
->call('configure', [[
SwapClassMethodArgumentsRector::ARGUMENT_SWAPS => [
'SomeClass' => [
'run' => [
1, 0]]]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\ArgumentSwap('SomeClass', 'run', [1, 0]))]
]]);
};
```
@ -6264,6 +6278,24 @@ return function (ContainerConfigurator $containerConfigurator) : void {
Swap arguments in function calls
```php
<?php
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
use Rector\Generic\Rector\FuncCall\SwapFuncCallArgumentsRector;
return function (ContainerConfigurator $containerConfigurator) : void {
$services = $containerConfigurator->services();
$services->set(SwapFuncCallArgumentsRector::class)
->call('configure', [[
SwapFuncCallArgumentsRector::FUNCTION_ARGUMENT_SWAPS => [
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\FunctionArgumentSwap('some_function', [1, 0]))]
]]);
};
```
```diff
final class SomeClass
{
@ -6295,8 +6327,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(WrapReturnRector::class)
->call('configure', [[
WrapReturnRector::TYPE_METHOD_WRAPS => [
'SomeClass' => [
'getItem' => 'array']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Generic\ValueObject\TypeMethodWrap('SomeClass', 'getItem', true))]
]]);
};
```
@ -6898,8 +6929,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(UnsetAndIssetToMethodCallRector::class)
->call('configure', [[
UnsetAndIssetToMethodCallRector::ISSET_UNSET_TO_METHOD_CALL => [
'SomeContainer' => [
'isset' => 'hasService']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\MagicDisclosure\ValueObject\IssetUnsetToMethodCall('SomeContainer', 'hasService', 'removeService'))]
]]);
};
```
@ -6923,8 +6953,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(UnsetAndIssetToMethodCallRector::class)
->call('configure', [[
UnsetAndIssetToMethodCallRector::ISSET_UNSET_TO_METHOD_CALL => [
'SomeContainer' => [
'unset' => 'removeService']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\MagicDisclosure\ValueObject\IssetUnsetToMethodCall('SomeContainer', 'hasService', 'removeService'))]
]]);
};
```
@ -8361,8 +8390,8 @@ Order __constructor dependencies by type A-Z
### `OrderFirstLevelClassStatementsRector`
- class: [`Rector\Order\Rector\ClassLike\OrderFirstLevelClassStatementsRector`](/../master/rules/order/src/Rector/ClassLike/OrderFirstLevelClassStatementsRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/ClassLike/OrderFirstLevelClassStatementsRector/Fixture)
- class: [`Rector\Order\Rector\Class_\OrderFirstLevelClassStatementsRector`](/../master/rules/order/src/Rector/Class_/OrderFirstLevelClassStatementsRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/Class_/OrderFirstLevelClassStatementsRector/Fixture)
Orders first level Class statements
@ -8383,8 +8412,8 @@ Orders first level Class statements
### `OrderMethodsByVisibilityRector`
- class: [`Rector\Order\Rector\ClassLike\OrderMethodsByVisibilityRector`](/../master/rules/order/src/Rector/ClassLike/OrderMethodsByVisibilityRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/ClassLike/OrderMethodsByVisibilityRector/Fixture)
- class: [`Rector\Order\Rector\Class_\OrderMethodsByVisibilityRector`](/../master/rules/order/src/Rector/Class_/OrderMethodsByVisibilityRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/Class_/OrderMethodsByVisibilityRector/Fixture)
Orders method by visibility
@ -8402,8 +8431,8 @@ Orders method by visibility
### `OrderPrivateMethodsByUseRector`
- class: [`Rector\Order\Rector\ClassLike\OrderPrivateMethodsByUseRector`](/../master/rules/order/src/Rector/ClassLike/OrderPrivateMethodsByUseRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/ClassLike/OrderPrivateMethodsByUseRector/Fixture)
- class: [`Rector\Order\Rector\Class_\OrderPrivateMethodsByUseRector`](/../master/rules/order/src/Rector/Class_/OrderPrivateMethodsByUseRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/Class_/OrderPrivateMethodsByUseRector/Fixture)
Order private methods in order of their use
@ -8432,8 +8461,8 @@ Order private methods in order of their use
### `OrderPropertiesByVisibilityRector`
- class: [`Rector\Order\Rector\ClassLike\OrderPropertiesByVisibilityRector`](/../master/rules/order/src/Rector/ClassLike/OrderPropertiesByVisibilityRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/ClassLike/OrderPropertiesByVisibilityRector/Fixture)
- class: [`Rector\Order\Rector\Class_\OrderPropertiesByVisibilityRector`](/../master/rules/order/src/Rector/Class_/OrderPropertiesByVisibilityRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/Class_/OrderPropertiesByVisibilityRector/Fixture)
Orders properties by visibility
@ -8451,8 +8480,8 @@ Orders properties by visibility
### `OrderPropertyByComplexityRector`
- class: [`Rector\Order\Rector\ClassLike\OrderPropertyByComplexityRector`](/../master/rules/order/src/Rector/ClassLike/OrderPropertyByComplexityRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/ClassLike/OrderPropertyByComplexityRector/Fixture)
- class: [`Rector\Order\Rector\Class_\OrderPropertyByComplexityRector`](/../master/rules/order/src/Rector/Class_/OrderPropertyByComplexityRector.php)
- [test fixtures](/../master/rules/order/tests/Rector/Class_/OrderPropertyByComplexityRector/Fixture)
Order properties by complexity, from the simplest like scalars to the most complex, like union or collections
@ -9199,6 +9228,20 @@ Turns `preg_match` comparisons to their method name alternatives in PHPUnit Test
<br><br>
### `AssertResourceToClosedResourceRector`
- class: [`Rector\PHPUnit\Rector\MethodCall\AssertResourceToClosedResourceRector`](/../master/rules/phpunit/src/Rector/MethodCall/AssertResourceToClosedResourceRector.php)
- [test fixtures](/../master/rules/phpunit/tests/Rector/MethodCall/AssertResourceToClosedResourceRector/Fixture)
Turns `assertIsNotResource()` into stricter `assertIsClosedResource()` for resource values in PHPUnit TestCase
```diff
-$this->assertIsNotResource($aResource, "message");
+$this->assertIsClosedResource($aResource, "message");
```
<br><br>
### `AssertSameBoolNullToSpecificMethodRector`
- class: [`Rector\PHPUnit\Rector\MethodCall\AssertSameBoolNullToSpecificMethodRector`](/../master/rules/phpunit/src/Rector/MethodCall/AssertSameBoolNullToSpecificMethodRector.php)
@ -9538,7 +9581,10 @@ Change `$container->get()` calls in PHPUnit to @inject properties autowired by j
+ $someService = $this->someService;
}
}
class SomeService { }
class SomeService
{
}
```
<br><br>
@ -12447,8 +12493,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(RenameAnnotationRector::class)
->call('configure', [[
RenameAnnotationRector::RENAMED_ANNOTATIONS_IN_TYPES => [
'PHPUnit\Framework\TestCase' => [
'test' => 'scenario']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Renaming\ValueObject\RenamedAnnotationInType('PHPUnit\Framework\TestCase', 'test', 'scenario'))]
]]);
};
```
@ -12488,8 +12533,7 @@ return function (ContainerConfigurator $containerConfigurator) : void {
$services->set(RenameClassConstantRector::class)
->call('configure', [[
RenameClassConstantRector::CLASS_CONSTANT_RENAME => [
'SomeClass' => [
'OLD_CONSTANT' => 'NEW_CONSTANT', 'OTHER_OLD_CONSTANT' => 'DifferentClass::NEW_CONSTANT']]
\Rector\SymfonyPhpConfig\inline_value_object(new Rector\Renaming\ValueObject\ClassConstantRename('SomeClass', 'OLD_CONSTANT', 'NEW_CONSTANT')), \Rector\SymfonyPhpConfig\inline_value_object(new Rector\Renaming\ValueObject\ClassConstantRename('SomeClass', 'OTHER_OLD_CONSTANT', 'DifferentClass::NEW_CONSTANT'))]
]]);
};
```

View File

@ -208,7 +208,6 @@ parameters:
- '#Offset 0 does not exist on array<PhpParser\\Node\\Stmt>\|null#'
- '#Parameter \#1 \$left of class PhpParser\\Node\\Expr\\BinaryOp\\Spaceship constructor expects PhpParser\\Node\\Expr, PhpParser\\Node\\Expr\|null given#'
- '#Parameter \#2 \$right of class PhpParser\\Node\\Expr\\BinaryOp\\Spaceship constructor expects PhpParser\\Node\\Expr, PhpParser\\Node\\Expr\|null given#'
- '#Parameter \#3 \$nodeCallback of method PHPStan\\Analyser\\NodeScopeResolver::processNodes\(\) expects Closure\(PhpParser\\Node, PHPStan\\Analyser\\Scope\): void, Closure\(PhpParser\\Node, PHPStan\\Analyser\\MutatingScope\): void given#'
# false positive
- '#Comparison operation "<" between 0 and 2 is always true#'
@ -221,9 +220,6 @@ parameters:
# fix Symplify 7.2 later
- '#Method (.*?) returns bool type, so the name should start with is/has/was#'
# known value
- '#Cannot cast \(array<string\>\)\|string\|true to string#'
- '#In method "Rector\\BetterPhpDocParser\\AnnotationReader\\NodeAnnotationReader\:\:createPropertyReflectionFromPropertyNode", caught "Throwable" must be rethrown\. Either catch a more specific exception or add a "throw" clause in the "catch" block to propagate the exception\. More info\: http\://bit\.ly/failloud#'
# doc is not enough
- '#Result of \|\| is always true#'
@ -237,7 +233,6 @@ parameters:
- '#Property PhpParser\\Node\\Stmt\\Expression\:\:\$expr \(PhpParser\\Node\\Expr\) does not accept PhpParser\\Node\\Expr\|null#'
- '#Call to an undefined method PHPStan\\Type\\Type\:\:getClassName\(\)#'
- '#Parameter \#1 \$typeNode of method Rector\\StaticTypeMapper\\StaticTypeMapper\:\:mapPHPStanPhpDocTypeNodeToPHPStanType\(\) expects PHPStan\\PhpDocParser\\Ast\\Type\\TypeNode, PHPStan\\PhpDocParser\\Ast\\Node given#'
- '#Parameter \#1 \$str of function preg_quote expects string, int\|string given#'
- '#Parameter \#1 \$sprintfFuncCall of method Rector\\Core\\PhpParser\\NodeTransformer\:\:transformSprintfToArray\(\) expects PhpParser\\Node\\Expr\\FuncCall, PhpParser\\Node given#'
- '#Parameter \#1 \$nodes of method Rector\\Core\\PhpParser\\Node\\BetterNodeFinder\:\:find\(\) expects array<PhpParser\\Node\>\|PhpParser\\Node, array<PhpParser\\Node\\Stmt\>\|null given#'
@ -274,7 +269,6 @@ parameters:
# mostly strings in tests
- '#Class (.*?) should be written with \:\:class notation, string found#'
- '#Parameter \#2 \$key of method Rector\\BetterPhpDocParser\\PhpDocNode\\AbstractTagValueNode\:\:printArrayItem\(\) expects string\|null, int\|string given#'
- '#Method Rector\\Naming\\Naming\\PropertyNaming\:\:resolveShortClassName\(\) should return string but returns string\|null#'
-
@ -347,7 +341,6 @@ parameters:
message: '#Class "Rector\\RectorGenerator\\Rector\\Closure\\AddNewServiceToSymfonyPhpConfigRector" is missing @see annotation with test case class reference#'
path: 'packages/rector-generator/src/Rector/Closure/AddNewServiceToSymfonyPhpConfigRector.php'
- '#Call to an undefined method PhpParser\\Node\\Expr\\Error\|PhpParser\\Node\\Identifier\:\:toString\(\)#'
- '#Class Rector\\Renaming\\Tests\\Rector\\MethodCall\\RenameMethodRector\\Fixture\\SkipSelfMethodRename not found#'
# fixed in symplfiy dev
@ -389,8 +382,6 @@ parameters:
paths:
# working with cvs file
# 3rd party package
- utils/project-validator/src/Command/ValidateFixtureContentCommand.php
- src/Testing/PHPUnit/AbstractRectorTestCase.php
- rules/php70/src/EregToPcreTransformer.php
# output format
- packages/changes-reporting/src/Output/JsonOutputFormatter.php
@ -412,7 +403,6 @@ parameters:
- '#Cannot access property \$key on PhpParser\\Node\\Expr\\ArrayItem\|null#'
- '#Class Nette\\DI\\CompilerExtension not found#'
- '#Class Latte\\Macros\\MacroSet not found#'
- '#Method Rector\\Generic\\Rector\\ClassMethod\\ArgumentDefaultValueReplacerRector\:\:processArrayReplacement\(\) never returns array<PhpParser\\Node\\Arg\> so it can be removed from the return typehint#'
# symfony/console
-

View File

@ -0,0 +1,12 @@
<?php
declare(strict_types=1);
namespace Rector\Order\Contract;
interface RankeableInterface
{
public function getName(): string;
public function getRanks(): array;
}

View File

@ -0,0 +1,41 @@
<?php
declare(strict_types=1);
namespace Rector\Order\Rector;
use Rector\Core\Rector\AbstractRector;
use Rector\Order\StmtOrder;
use Rector\Order\StmtVisibilitySorter;
abstract class AbstractConstantPropertyMethodOrderRector extends AbstractRector
{
/**
* @var StmtOrder
*/
protected $stmtOrder;
/**
* @var StmtVisibilitySorter
*/
protected $stmtVisibilitySorter;
/**
* @required
*/
public function autowireAbstractConstantPropertyMethodOrderRector(
StmtOrder $stmtOrder,
StmtVisibilitySorter $stmtVisibilitySorter
): void {
$this->stmtOrder = $stmtOrder;
$this->stmtVisibilitySorter = $stmtVisibilitySorter;
}
/**
* @param array<int, int> $oldToNewKeys
*/
public function hasOrderChanged(array $oldToNewKeys): bool
{
return array_keys($oldToNewKeys) !== array_values($oldToNewKeys);
}
}

View File

@ -8,28 +8,17 @@ use PhpParser\Node;
use PhpParser\Node\Scalar\LNumber;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\RectorDefinition\CodeSample;
use Rector\Core\RectorDefinition\RectorDefinition;
use Rector\Order\StmtOrder;
use Rector\Order\Rector\AbstractConstantPropertyMethodOrderRector;
/**
* @sponsor Thanks https://amateri.com for sponsoring this rule - visit them on https://www.startupjobs.cz/startup/scrumworks-s-r-o
*
* @see \Rector\Order\Tests\Rector\Class_\OrderClassConstantsByIntegerValueRector\OrderClassConstantsByIntegerValueRectorTest
*/
final class OrderClassConstantsByIntegerValueRector extends AbstractRector
final class OrderClassConstantsByIntegerValueRector extends AbstractConstantPropertyMethodOrderRector
{
/**
* @var StmtOrder
*/
private $stmtOrder;
public function __construct(StmtOrder $stmtOrder)
{
$this->stmtOrder = $stmtOrder;
}
public function getDefinition(): RectorDefinition
{
return new RectorDefinition('Order class constant order by their integer value', [
@ -83,6 +72,9 @@ PHP
asort($sortedClassConstConstsByValue);
$oldToNewKeys = $this->stmtOrder->createOldToNewKeys($sortedClassConstConstsByValue, $classConstConstsByValue);
if (! $this->hasOrderChanged($oldToNewKeys)) {
return null;
}
$this->stmtOrder->reorderClassStmtsByOldToNewKeys($node, $oldToNewKeys);

View File

@ -7,33 +7,15 @@ namespace Rector\Order\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\RectorDefinition\CodeSample;
use Rector\Core\RectorDefinition\RectorDefinition;
use Rector\Order\StmtOrder;
use Rector\Order\StmtVisibilitySorter;
use Rector\Order\Rector\AbstractConstantPropertyMethodOrderRector;
/**
* @see \Rector\Order\Tests\Rector\Class_\OrderConstantsByVisibilityRector\OrderConstantsByVisibilityRectorTest
*/
final class OrderConstantsByVisibilityRector extends AbstractRector
final class OrderConstantsByVisibilityRector extends AbstractConstantPropertyMethodOrderRector
{
/**
* @var StmtOrder
*/
private $stmtOrder;
/**
* @var StmtVisibilitySorter
*/
private $stmtVisibilitySorter;
public function __construct(StmtOrder $stmtOrder, StmtVisibilitySorter $stmtVisibilitySorter)
{
$this->stmtOrder = $stmtOrder;
$this->stmtVisibilitySorter = $stmtVisibilitySorter;
}
public function getDefinition(): RectorDefinition
{
return new RectorDefinition('Orders constants by visibility', [
@ -75,20 +57,14 @@ PHP
public function refactor(Node $node): ?Node
{
$currentPropertiesOrder = $this->stmtOrder->getStmtsOfTypeOrder($node, ClassConst::class);
$propertiesInDesiredOrder = $this->getPropertiesInDesiredPosition($node);
$propertiesInDesiredOrder = $this->stmtVisibilitySorter->sortConstants($node);
$oldToNewKeys = $this->stmtOrder->createOldToNewKeys($propertiesInDesiredOrder, $currentPropertiesOrder);
if (! $this->hasOrderChanged($oldToNewKeys)) {
return null;
}
return $this->stmtOrder->reorderClassStmtsByOldToNewKeys($node, $oldToNewKeys);
}
/**
* @return string[]
*/
private function getPropertiesInDesiredPosition(Class_ $class): array
{
$constants = $this->stmtVisibilitySorter->sortConstants($class);
return array_keys($constants);
}
}

View File

@ -2,21 +2,21 @@
declare(strict_types=1);
namespace Rector\Order\Rector\ClassLike;
namespace Rector\Order\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Stmt\Trait_;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\RectorDefinition\CodeSample;
use Rector\Core\RectorDefinition\RectorDefinition;
/**
* @see \Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\OrderFirstLevelClassStatementsRectorTest
* @see \Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\OrderFirstLevelClassStatementsRectorTest
*/
final class OrderFirstLevelClassStatementsRector extends AbstractRector
{
@ -54,18 +54,14 @@ PHP
*/
public function getNodeTypes(): array
{
return [ClassLike::class];
return [Class_::class, Trait_::class];
}
/**
* @param ClassLike $node
* @param Class_|Trait_ $node
*/
public function refactor(Node $node): ?Node
{
if ($node instanceof Interface_) {
return null;
}
$node->stmts = $this->getStmtsInDesiredPosition($node->stmts);
return $node;
@ -80,17 +76,15 @@ PHP
uasort(
$stmts,
function (Stmt $firstStmt, Stmt $secondStmt): int {
return [
$this->getOrder($firstStmt),
$firstStmt->getLine(),
] <=> [$this->getOrder($secondStmt), $secondStmt->getLine()];
return [$this->resolveClassElementRank($firstStmt), $firstStmt->getLine()]
<=> [$this->resolveClassElementRank($secondStmt), $secondStmt->getLine()];
}
);
return $stmts;
}
private function getOrder(Stmt $stmt): int
private function resolveClassElementRank(Stmt $stmt): int
{
if ($stmt instanceof ClassMethod) {
return 3;

View File

@ -2,23 +2,25 @@
declare(strict_types=1);
namespace Rector\Order\Rector\ClassLike;
namespace Rector\Order\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Interface_;
use Rector\Core\Rector\AbstractRector;
use PhpParser\Node\Stmt\Trait_;
use Rector\Core\RectorDefinition\CodeSample;
use Rector\Core\RectorDefinition\RectorDefinition;
use Rector\Order\StmtOrder;
use Rector\Order\StmtVisibilitySorter;
use Rector\Order\Rector\AbstractConstantPropertyMethodOrderRector;
/**
* @see \Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector\OrderMethodsByVisibilityRectorTest
* @see \Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector\OrderMethodsByVisibilityRectorTest
*/
final class OrderMethodsByVisibilityRector extends AbstractRector
final class OrderMethodsByVisibilityRector extends AbstractConstantPropertyMethodOrderRector
{
/**
* @var string[]
*/
private const PREFERRED_ORDER = [
'__construct',
'__destruct',
@ -42,22 +44,6 @@ final class OrderMethodsByVisibilityRector extends AbstractRector
'tearDown',
];
/**
* @var StmtOrder
*/
private $stmtOrder;
/**
* @var StmtVisibilitySorter
*/
private $stmtVisibilitySorter;
public function __construct(StmtOrder $stmtOrder, StmtVisibilitySorter $stmtVisibilitySorter)
{
$this->stmtOrder = $stmtOrder;
$this->stmtVisibilitySorter = $stmtVisibilitySorter;
}
public function getDefinition(): RectorDefinition
{
return new RectorDefinition('Orders method by visibility', [
@ -90,23 +76,24 @@ PHP
*/
public function getNodeTypes(): array
{
return [ClassLike::class];
return [Class_::class, Trait_::class];
}
/**
* @param ClassLike $node
* @param Class_|Trait_ $node
*/
public function refactor(Node $node): ?Node
{
if ($node instanceof Interface_) {
return null;
}
$currentMethodsOrder = $this->stmtOrder->getStmtsOfTypeOrder($node, ClassMethod::class);
$methodsInDesiredOrder = $this->getMethodsInDesiredOrder($node);
$oldToNewKeys = $this->stmtOrder->createOldToNewKeys($methodsInDesiredOrder, $currentMethodsOrder);
// nothing to re-order
if (! $this->hasOrderChanged($oldToNewKeys)) {
return null;
}
return $this->stmtOrder->reorderClassStmtsByOldToNewKeys($node, $oldToNewKeys);
}
@ -115,10 +102,8 @@ PHP
*/
private function getMethodsInDesiredOrder(ClassLike $classLike): array
{
$classMethods = $this->stmtVisibilitySorter->sortMethods($classLike);
$classMethods = array_keys($classMethods);
return $this->applyPreferredPosition($classMethods);
$classMethodNames = $this->stmtVisibilitySorter->sortMethods($classLike);
return $this->applyPreferredPosition($classMethodNames);
}
/**

View File

@ -2,40 +2,29 @@
declare(strict_types=1);
namespace Rector\Order\Rector\ClassLike;
namespace Rector\Order\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Trait_;
use Rector\Core\Exception\ShouldNotHappenException;
use Rector\Core\Rector\AbstractRector;
use Rector\Core\RectorDefinition\CodeSample;
use Rector\Core\RectorDefinition\RectorDefinition;
use Rector\Order\StmtOrder;
use Rector\Order\Rector\AbstractConstantPropertyMethodOrderRector;
use Rector\Order\ValueObject\SortedClassMethodsAndOriginalClassMethods;
/**
* @see \Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\OrderPrivateMethodsByUseRectorTest
* @see \Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\OrderPrivateMethodsByUseRectorTest
*/
final class OrderPrivateMethodsByUseRector extends AbstractRector
final class OrderPrivateMethodsByUseRector extends AbstractConstantPropertyMethodOrderRector
{
/**
* @var int
*/
private const MAX_ATTEMTPS = 5;
/**
* @var StmtOrder
*/
private $stmtOrder;
public function __construct(StmtOrder $stmtOrder)
{
$this->stmtOrder = $stmtOrder;
}
private const MAX_ATTEMPTS = 5;
public function getDefinition(): RectorDefinition
{
@ -87,18 +76,14 @@ PHP
*/
public function getNodeTypes(): array
{
return [ClassLike::class];
return [Class_::class, Trait_::class];
}
/**
* @param ClassLike $node
* @param Class_|Trait_ $node
*/
public function refactor(Node $node): ?Node
{
if ($node instanceof Interface_) {
return null;
}
$sortedClassMethodsAndOriginalClassMethods = $this->getPrivateMethodCallOrderAndClassMethods($node);
// order is correct, nothing to change
@ -114,7 +99,7 @@ PHP
$attempt = 0;
while (! $sortedClassMethodsAndOriginalClassMethods->hasOrderSame()) {
$attempt++;
if ($attempt >= self::MAX_ATTEMTPS) {
if ($attempt >= self::MAX_ATTEMPTS) {
throw new ShouldNotHappenException('Number of attempts to reorder the methods exceeded');
}
@ -132,6 +117,9 @@ PHP
return $node;
}
/**
* @param Class_|Trait_ $classLike
*/
private function getPrivateMethodCallOrderAndClassMethods(
ClassLike $classLike
): SortedClassMethodsAndOriginalClassMethods {

View File

@ -2,39 +2,21 @@
declare(strict_types=1);
namespace Rector\Order\Rector\ClassLike;
namespace Rector\Order\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Property;
use Rector\Core\Rector\AbstractRector;
use PhpParser\Node\Stmt\Trait_;
use Rector\Core\RectorDefinition\CodeSample;
use Rector\Core\RectorDefinition\RectorDefinition;
use Rector\Order\StmtOrder;
use Rector\Order\StmtVisibilitySorter;
use Rector\Order\Rector\AbstractConstantPropertyMethodOrderRector;
/**
* @see \Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector\OrderPropertiesByVisibilityRectorTest
* @see \Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector\OrderPropertiesByVisibilityRectorTest
*/
final class OrderPropertiesByVisibilityRector extends AbstractRector
final class OrderPropertiesByVisibilityRector extends AbstractConstantPropertyMethodOrderRector
{
/**
* @var StmtOrder
*/
private $stmtOrder;
/**
* @var StmtVisibilitySorter
*/
private $stmtVisibilitySorter;
public function __construct(StmtOrder $stmtOrder, StmtVisibilitySorter $stmtVisibilitySorter)
{
$this->stmtOrder = $stmtOrder;
$this->stmtVisibilitySorter = $stmtVisibilitySorter;
}
public function getDefinition(): RectorDefinition
{
return new RectorDefinition('Orders properties by visibility', [
@ -67,33 +49,24 @@ PHP
*/
public function getNodeTypes(): array
{
return [ClassLike::class];
return [Class_::class, Trait_::class];
}
/**
* @param ClassLike $node
* @param Class_|Trait_ $node
*/
public function refactor(Node $node): ?Node
{
if ($node instanceof Interface_) {
return null;
}
$currentPropertiesOrder = $this->stmtOrder->getStmtsOfTypeOrder($node, Property::class);
$propertiesInDesiredOrder = $this->getPropertiesInDesiredPosition($node);
$propertiesInDesiredOrder = $this->stmtVisibilitySorter->sortProperties($node);
$oldToNewKeys = $this->stmtOrder->createOldToNewKeys($propertiesInDesiredOrder, $currentPropertiesOrder);
// nothing to re-order
if (! $this->hasOrderChanged($oldToNewKeys)) {
return null;
}
return $this->stmtOrder->reorderClassStmtsByOldToNewKeys($node, $oldToNewKeys);
}
/**
* @return string[]
*/
private function getPropertiesInDesiredPosition(ClassLike $classLike): array
{
$properties = $this->stmtVisibilitySorter->sortProperties($classLike);
return array_keys($properties);
}
}

View File

@ -2,46 +2,31 @@
declare(strict_types=1);
namespace Rector\Order\Rector\ClassLike;
namespace Rector\Order\Rector\Class_;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Property;
use Rector\Core\Rector\AbstractRector;
use PhpParser\Node\Stmt\Trait_;
use Rector\Core\RectorDefinition\CodeSample;
use Rector\Core\RectorDefinition\RectorDefinition;
use Rector\Order\PropertyRanker;
use Rector\Order\StmtOrder;
use Rector\Order\Rector\AbstractConstantPropertyMethodOrderRector;
use Rector\Order\ValueObject\PropertyNameRankAndPosition;
/**
* @see \Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\OrderPropertyByComplexityRectorTest
* @see \Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\OrderPropertyByComplexityRectorTest
*/
final class OrderPropertyByComplexityRector extends AbstractRector
final class OrderPropertyByComplexityRector extends AbstractConstantPropertyMethodOrderRector
{
/**
* @var string
*/
private const RANK = 'rank';
/**
* @var string
*/
private const POSITION = 'position';
/**
* @var StmtOrder
*/
private $stmtOrder;
/**
* @var PropertyRanker
*/
private $propertyRanker;
public function __construct(PropertyRanker $propertyRanker, StmtOrder $stmtOrder)
public function __construct(PropertyRanker $propertyRanker)
{
$this->stmtOrder = $stmtOrder;
$this->propertyRanker = $propertyRanker;
}
@ -100,37 +85,43 @@ PHP
*/
public function getNodeTypes(): array
{
return [ClassLike::class];
return [Class_::class, Trait_::class];
}
/**
* @param ClassLike $node
* @param Class_|Trait_ $node
*/
public function refactor(Node $node): ?Node
{
if ($node instanceof Interface_) {
return null;
}
$propertyByVisibilityByPosition = $this->resolvePropertyByVisibilityByPosition($node);
foreach ($propertyByVisibilityByPosition as $propertyByPosition) {
$propertyNameToRank = [];
$propertyPositionByName = [];
$propertyNamesRanksAndPositions = [];
foreach ($propertyByPosition as $position => $property) {
/** @var string $propertyName */
$propertyName = $this->getName($property);
$propertyPositionByName[$position] = $propertyName;
$propertyNameToRank[$propertyName][self::RANK] = $this->propertyRanker->rank($property);
$propertyNameToRank[$propertyName][self::POSITION] = $position;
$rank = $this->propertyRanker->rank($property);
$propertyNamesRanksAndPositions[] = new PropertyNameRankAndPosition(
$propertyName,
$rank,
$position
);
}
$sortedPropertyByRank = $this->getSortedPropertiesByRankAndPosition($propertyNameToRank);
$sortedPropertyByRank = $this->getSortedPropertiesByRankAndPosition($propertyNamesRanksAndPositions);
$oldToNewKeys = $this->stmtOrder->createOldToNewKeys($sortedPropertyByRank, $propertyPositionByName);
// nothing to re-order
if (! $this->hasOrderChanged($oldToNewKeys)) {
continue;
}
$this->stmtOrder->reorderClassStmtsByOldToNewKeys($node, $oldToNewKeys);
}
@ -138,12 +129,13 @@ PHP
}
/**
* @return Property[][]
* @param Class_|Trait_ $classLike
* @return array<string, array<int, Property>>
*/
private function resolvePropertyByVisibilityByPosition(ClassLike $classLike): array
{
$propertyByVisibilityByPosition = [];
foreach ($classLike->stmts as $position => $classStmt) {
foreach ((array) $classLike->stmts as $position => $classStmt) {
if (! $classStmt instanceof Property) {
continue;
}
@ -156,22 +148,26 @@ PHP
}
/**
* @param array<string,array<string, mixed>> $propertyNameToRank
* @param PropertyNameRankAndPosition[] $propertyNamesRanksAndPositions
* @return string[]
*/
private function getSortedPropertiesByRankAndPosition(array $propertyNameToRank): array
private function getSortedPropertiesByRankAndPosition(array $propertyNamesRanksAndPositions): array
{
uasort(
$propertyNameToRank,
function (array $firstArray, array $secondArray): int {
return [$firstArray[self::RANK], $firstArray[self::POSITION]] <=> [
$secondArray[self::RANK],
$secondArray[self::POSITION],
];
$propertyNamesRanksAndPositions,
function (PropertyNameRankAndPosition $firstArray, PropertyNameRankAndPosition $secondArray): int {
return [$firstArray->getRank(), $firstArray->getPosition()]
<=>
[$secondArray->getRank(), $secondArray->getPosition()];
}
);
return array_keys($propertyNameToRank);
$propertyNames = [];
foreach ($propertyNamesRanksAndPositions as $propertyNameRankAndPosition) {
$propertyNames[] = $propertyNameRankAndPosition->getName();
}
return $propertyNames;
}
private function getVisibilityAsString(Property $property): string

View File

@ -22,7 +22,7 @@ final class OrderPublicInterfaceMethodRector extends AbstractRector implements C
/**
* @var string
*/
public const METHOD_ORDER_BY_INTERFACES = '$methodOrderByInterfaces';
public const METHOD_ORDER_BY_INTERFACES = 'method_order_by_interfaces';
/**
* @var string[][]
@ -77,8 +77,7 @@ PHP
self::METHOD_ORDER_BY_INTERFACES => [
'FoodRecipeInterface' => ['getDescription', 'process'],
],
]
),
]),
]);
}
@ -96,6 +95,10 @@ PHP
public function refactor(Node $node): ?Node
{
$implementedInterfaces = $this->classManipulator->getImplementedInterfaceNames($node);
if ($implementedInterfaces === []) {
return null;
}
$publicMethodOrderByKey = $this->collectPublicMethods($node);
foreach ($implementedInterfaces as $implementedInterface) {
@ -105,6 +108,12 @@ PHP
}
$oldToNewKeys = $this->stmtOrder->createOldToNewKeys($publicMethodOrderByKey, $methodOrder);
// nothing to re-order
if (array_keys($oldToNewKeys) === array_values($oldToNewKeys)) {
return null;
}
$this->stmtOrder->reorderClassStmtsByOldToNewKeys($node, $oldToNewKeys);
break;

View File

@ -5,29 +5,21 @@ declare(strict_types=1);
namespace Rector\Order;
use PhpParser\Node\Stmt;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassConst;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\Node\Stmt\ClassMethod;
use PhpParser\Node\Stmt\Interface_;
use PhpParser\Node\Stmt\Property;
use PhpParser\Node\Stmt\Trait_;
use Rector\NodeNameResolver\NodeNameResolver;
use Rector\Order\Contract\RankeableInterface;
use Rector\Order\ValueObject\ClassConstRankeable;
use Rector\Order\ValueObject\ClassMethodRankeable;
use Rector\Order\ValueObject\PropertyRankeable;
final class StmtVisibilitySorter
{
/**
* @var string
*/
private const VISIBILITY = 'visibility';
/**
* @var string
*/
private const POSITION = 'position';
/**
* @var string
*/
private const NAME = 'name';
/**
* @var NodeNameResolver
*/
@ -39,11 +31,13 @@ final class StmtVisibilitySorter
}
/**
* @return array<string,array<string, mixed>>
* @param Class_|Trait_ $classLike
* @return string[]
*/
public function sortProperties(ClassLike $classLike): array
{
$properties = [];
$propertyRankeables = [];
foreach ($classLike->stmts as $position => $propertyStmt) {
if (! $propertyStmt instanceof Property) {
continue;
@ -52,32 +46,24 @@ final class StmtVisibilitySorter
/** @var string $propertyName */
$propertyName = $this->nodeNameResolver->getName($propertyStmt);
$properties[$propertyName][self::NAME] = $propertyName;
$properties[$propertyName][self::VISIBILITY] = $this->getVisibilityLevelOrder($propertyStmt);
$properties[$propertyName]['static'] = $propertyStmt->isStatic();
$properties[$propertyName][self::POSITION] = $position;
$propertyRankeables[] = new PropertyRankeable(
$propertyName,
$this->getVisibilityLevelOrder($propertyStmt),
$propertyStmt,
$position
);
}
uasort(
$properties,
function (array $firstArray, array $secondArray): int {
return [
$firstArray[self::VISIBILITY],
$firstArray['static'],
$firstArray[self::POSITION],
] <=> [$secondArray[self::VISIBILITY], $secondArray['static'], $secondArray[self::POSITION]];
}
);
return $properties;
return $this->sortByRanksAndGetNames($propertyRankeables);
}
/**
* @return array<string,array<string, mixed>>
* @return string[]
*/
public function sortMethods(ClassLike $classLike): array
{
$classMethods = [];
$classMethodsRankeables = [];
foreach ($classLike->stmts as $position => $classStmt) {
if (! $classStmt instanceof ClassMethod) {
continue;
@ -86,42 +72,24 @@ final class StmtVisibilitySorter
/** @var string $classMethodName */
$classMethodName = $this->nodeNameResolver->getName($classStmt);
$classMethods[$classMethodName][self::NAME] = $classMethodName;
$classMethods[$classMethodName][self::VISIBILITY] = $this->getVisibilityLevelOrder($classStmt);
$classMethods[$classMethodName]['abstract'] = $classStmt->isAbstract();
$classMethods[$classMethodName]['final'] = $classStmt->isFinal();
$classMethods[$classMethodName]['static'] = $classStmt->isStatic();
$classMethods[$classMethodName][self::POSITION] = $position;
$classMethodsRankeables[] = new ClassMethodRankeable(
$classMethodName,
$this->getVisibilityLevelOrder($classStmt),
$position,
$classStmt
);
}
uasort(
$classMethods,
function (array $firstArray, array $secondArray): int {
return [
$firstArray[self::VISIBILITY],
$firstArray['static'],
$secondArray['abstract'],
$firstArray['final'],
$firstArray[self::POSITION],
] <=> [
$secondArray[self::VISIBILITY],
$secondArray['static'],
$firstArray['abstract'],
$secondArray['final'],
$secondArray[self::POSITION],
];
}
);
return $classMethods;
return $this->sortByRanksAndGetNames($classMethodsRankeables);
}
/**
* @return array<string,array<string, mixed>>
* @param Class_|Interface_ $classLike
* @return string[]
*/
public function sortConstants(ClassLike $classLike): array
{
$constants = [];
$classConstsRankeables = [];
foreach ($classLike->stmts as $position => $constantStmt) {
if (! $constantStmt instanceof ClassConst) {
continue;
@ -130,22 +98,14 @@ final class StmtVisibilitySorter
/** @var string $constantName */
$constantName = $this->nodeNameResolver->getName($constantStmt);
$constants[$constantName][self::NAME] = $constantName;
$constants[$constantName][self::VISIBILITY] = $this->getVisibilityLevelOrder($constantStmt);
$constants[$constantName][self::POSITION] = $position;
$classConstsRankeables[] = new ClassConstRankeable(
$constantName,
$this->getVisibilityLevelOrder($constantStmt),
$position
);
}
uasort(
$constants,
function (array $firstArray, array $secondArray): int {
return [
$firstArray[self::VISIBILITY],
$firstArray[self::POSITION],
] <=> [$secondArray[self::VISIBILITY], $secondArray[self::POSITION]];
}
);
return $constants;
return $this->sortByRanksAndGetNames($classConstsRankeables);
}
/**
@ -163,4 +123,25 @@ final class StmtVisibilitySorter
return 0;
}
/**
* @param RankeableInterface[] $rankeables
* @return string[]
*/
private function sortByRanksAndGetNames(array $rankeables): array
{
uasort(
$rankeables,
function (RankeableInterface $firstRankeable, RankeableInterface $secondRankeable): int {
return $firstRankeable->getRanks() <=> $secondRankeable->getRanks();
}
);
$names = [];
foreach ($rankeables as $rankeable) {
$names[] = $rankeable->getName();
}
return $names;
}
}

View File

@ -0,0 +1,46 @@
<?php
declare(strict_types=1);
namespace Rector\Order\ValueObject;
use Rector\Order\Contract\RankeableInterface;
final class ClassConstRankeable implements RankeableInterface
{
/**
* @var string
*/
private $name;
/**
* @var int
*/
private $visibility;
/**
* @var int
*/
private $position;
public function __construct(string $name, int $visibility, int $position)
{
$this->name = $name;
$this->visibility = $visibility;
$this->position = $position;
}
public function getName(): string
{
return $this->name;
}
/**
* An array to sort the element order by
* @return int[]
*/
public function getRanks(): array
{
return [$this->visibility, $this->position];
}
}

View File

@ -0,0 +1,60 @@
<?php
declare(strict_types=1);
namespace Rector\Order\ValueObject;
use PhpParser\Node\Stmt\ClassMethod;
use Rector\Order\Contract\RankeableInterface;
final class ClassMethodRankeable implements RankeableInterface
{
/**
* @var string
*/
private $name;
/**
* @var int
*/
private $visibility;
/**
* @var int
*/
private $position;
/**
* @var ClassMethod
*/
private $classMethod;
public function __construct(string $name, int $visibility, int $position, ClassMethod $classMethod)
{
$this->name = $name;
$this->visibility = $visibility;
$this->position = $position;
$this->classMethod = $classMethod;
}
public function getName(): string
{
return $this->name;
}
/**
* An array to sort the element order by
* @return array<string|int|bool>
*/
public function getRanks(): array
{
return [
$this->visibility,
$this->classMethod->isStatic(),
// negated on purpose, to put abstract later
! $this->classMethod->isAbstract(),
$this->classMethod->isFinal(),
$this->position,
];
}
}

View File

@ -0,0 +1,45 @@
<?php
declare(strict_types=1);
namespace Rector\Order\ValueObject;
final class PropertyNameRankAndPosition
{
/**
* @var string
*/
private $name;
/**
* @var int
*/
private $rank;
/**
* @var int
*/
private $position;
public function __construct(string $name, int $rank, int $position)
{
$this->name = $name;
$this->rank = $rank;
$this->position = $position;
}
public function getName(): string
{
return $this->name;
}
public function getRank(): int
{
return $this->rank;
}
public function getPosition(): int
{
return $this->position;
}
}

View File

@ -0,0 +1,49 @@
<?php
declare(strict_types=1);
namespace Rector\Order\ValueObject;
use PhpParser\Node\Stmt\Property;
use Rector\Order\Contract\RankeableInterface;
final class PropertyRankeable implements RankeableInterface
{
/**
* @var string
*/
private $name;
/**
* @var int
*/
private $visibility;
/**
* @var int
*/
private $position;
/**
* @var Property
*/
private $property;
public function __construct(string $name, int $visibility, Property $property, int $position)
{
$this->name = $name;
$this->visibility = $visibility;
$this->property = $property;
$this->position = $position;
}
public function getName(): string
{
return $this->name;
}
public function getRanks(): array
{
return [$this->visibility, $this->property->isStatic(), $this->position];
}
}

View File

@ -1,39 +0,0 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Fixture;
use Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Source\TraitName;
use Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Source\TraitName2;
final class SomeClass
{
public function functionName()
{
}
protected $propertyName;
use TraitName;
private const CONST_NAME = 'constant_value';
use TraitName2;
}
?>
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Fixture;
use Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Source\TraitName;
use Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Source\TraitName2;
final class SomeClass
{
use TraitName;
use TraitName2;
private const CONST_NAME = 'constant_value';
protected $propertyName;
public function functionName()
{
}
}
?>

View File

@ -1,10 +0,0 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Source;
trait TraitName
{
}

View File

@ -1,10 +0,0 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Source;
trait TraitName2
{
}

View File

@ -1,18 +0,0 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Fixture;
use Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source\ComplexType;
class SkipCorrect
{
/**
* @var int
*/
private $startIndex;
/**
* @var \DateTime|null
*/
private $startBracketIndex;
}

View File

@ -1,10 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source;
final class AnotherSimpleType
{
}

View File

@ -1,10 +0,0 @@
<?php
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source;
final class ComplexType
{
}

View File

@ -0,0 +1,39 @@
<?php
namespace Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Fixture;
use Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Source\TraitName;
use Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Source\TraitName2;
final class SomeClass
{
public function functionName()
{
}
protected $propertyName;
use TraitName;
private const CONST_NAME = 'constant_value';
use TraitName2;
}
?>
-----
<?php
namespace Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Fixture;
use Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Source\TraitName;
use Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Source\TraitName2;
final class SomeClass
{
use TraitName;
use TraitName2;
private const CONST_NAME = 'constant_value';
protected $propertyName;
public function functionName()
{
}
}
?>

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Fixture;
final class SameNameClass
{
@ -15,7 +15,7 @@ final class SameNameClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Fixture;
final class SameNameClass
{

View File

@ -2,11 +2,11 @@
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\ClassLike\OrderFirstLevelClassStatementsRector;
namespace Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector;
use Iterator;
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
use Rector\Order\Rector\ClassLike\OrderFirstLevelClassStatementsRector;
use Rector\Order\Rector\Class_\OrderFirstLevelClassStatementsRector;
use Symplify\SmartFileSystem\SmartFileInfo;
final class OrderFirstLevelClassStatementsRectorTest extends AbstractRectorTestCase

View File

@ -0,0 +1,10 @@
<?php
namespace Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Source;
trait TraitName
{
}

View File

@ -0,0 +1,10 @@
<?php
namespace Rector\Order\Tests\Rector\Class_\OrderFirstLevelClassStatementsRector\Source;
trait TraitName2
{
}

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector\Fixture;
abstract class AbstractClass
{
@ -31,7 +31,7 @@ abstract class AbstractClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector\Fixture;
abstract class AbstractClass
{

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector\Fixture;
class SomeClass
{
@ -46,7 +46,7 @@ class SomeClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector\Fixture;
class SomeClass
{

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector\Fixture;
class MagicPhpUnitPreferredOrderClass
{
@ -30,7 +30,7 @@ class MagicPhpUnitPreferredOrderClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector\Fixture;
class MagicPhpUnitPreferredOrderClass
{

View File

@ -2,11 +2,11 @@
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\ClassLike\OrderMethodsByVisibilityRector;
namespace Rector\Order\Tests\Rector\Class_\OrderMethodsByVisibilityRector;
use Iterator;
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
use Rector\Order\Rector\ClassLike\OrderMethodsByVisibilityRector;
use Rector\Order\Rector\Class_\OrderMethodsByVisibilityRector;
use Symplify\SmartFileSystem\SmartFileInfo;
final class OrderMethodsByVisibilityRectorTest extends AbstractRectorTestCase

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\Fixture;
class DifferentAmountOfMethodsClass
{

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\Fixture;
class SomeClass
{
@ -23,7 +23,7 @@ class SomeClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\Fixture;
class SomeClass
{

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\Fixture;
class MultiCall
{
@ -28,7 +28,7 @@ class MultiCall
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\Fixture;
class MultiCall
{

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\Fixture;
use PhpParser\Node;
use PhpParser\Node\Param;
@ -84,7 +84,7 @@ class MultipleRunsClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector\Fixture;
use PhpParser\Node;
use PhpParser\Node\Param;

View File

@ -2,11 +2,11 @@
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\ClassLike\OrderPrivateMethodsByUseRector;
namespace Rector\Order\Tests\Rector\Class_\OrderPrivateMethodsByUseRector;
use Iterator;
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
use Rector\Order\Rector\ClassLike\OrderPrivateMethodsByUseRector;
use Rector\Order\Rector\Class_\OrderPrivateMethodsByUseRector;
use Symplify\SmartFileSystem\SmartFileInfo;
final class OrderPrivateMethodsByUseRectorTest extends AbstractRectorTestCase

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector\Fixture;
abstract class AbstractClass
{
@ -16,7 +16,7 @@ abstract class AbstractClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector\Fixture;
abstract class AbstractClass
{

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector\Fixture;
final class SomeClass
{
@ -16,7 +16,7 @@ final class SomeClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector\Fixture;
final class SomeClass
{

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector\Fixture;
trait TraitClass
{
@ -16,7 +16,7 @@ trait TraitClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector\Fixture;
trait TraitClass
{

View File

@ -2,11 +2,11 @@
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertiesByVisibilityRector;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertiesByVisibilityRector;
use Iterator;
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
use Rector\Order\Rector\ClassLike\OrderPropertiesByVisibilityRector;
use Rector\Order\Rector\Class_\OrderPropertiesByVisibilityRector;
use Symplify\SmartFileSystem\SmartFileInfo;
final class OrderPropertiesByVisibilityRectorTest extends AbstractRectorTestCase

View File

@ -1,9 +1,9 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Fixture;
use Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source\AnotherSimpleType;
use Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source\ComplexType;
use Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source\AnotherSimpleType;
use Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source\ComplexType;
class ComplexTypes
{
@ -64,10 +64,10 @@ class ComplexTypes
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Fixture;
use Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source\AnotherSimpleType;
use Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source\ComplexType;
use Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source\AnotherSimpleType;
use Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source\ComplexType;
class ComplexTypes
{

View File

@ -1,8 +1,8 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Fixture;
use Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source\ComplexType;
use Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source\ComplexType;
class SomeClass
{
@ -26,9 +26,9 @@ class SomeClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Fixture;
use Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Source\ComplexType;
use Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source\ComplexType;
class SomeClass
{

View File

@ -0,0 +1,18 @@
<?php
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Fixture;
use Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source\ComplexType;
class SkipCorrect
{
/**
* @var int
*/
private $startIndex;
/**
* @var \DateTime|null
*/
private $startBracketIndex;
}

View File

@ -1,6 +1,6 @@
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Fixture;
class VisibilityClass
{
@ -24,7 +24,7 @@ class VisibilityClass
-----
<?php
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector\Fixture;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Fixture;
class VisibilityClass
{

View File

@ -2,11 +2,11 @@
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\ClassLike\OrderPropertyByComplexityRector;
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector;
use Iterator;
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
use Rector\Order\Rector\ClassLike\OrderPropertyByComplexityRector;
use Rector\Order\Rector\Class_\OrderPropertyByComplexityRector;
use Symplify\SmartFileSystem\SmartFileInfo;
final class OrderPropertyByComplexityRectorTest extends AbstractRectorTestCase

View File

@ -0,0 +1,10 @@
<?php
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source;
final class AnotherSimpleType
{
}

View File

@ -0,0 +1,10 @@
<?php
declare(strict_types=1);
namespace Rector\Order\Tests\Rector\Class_\OrderPropertyByComplexityRector\Source;
final class ComplexType
{
}