mirror of
https://github.com/rectorphp/rector.git
synced 2024-05-30 07:50:53 +00:00
[Nette 3.0] Set update (#4381)
This commit is contained in:
parent
65fe80a682
commit
3808d1b941
14
config/set/nette-30-dependency-injection.php
Normal file
14
config/set/nette-30-dependency-injection.php
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
use Rector\Nette\Rector\MethodCall\BuilderExpandToHelperExpandRector;
|
||||
use Rector\Nette\Rector\MethodCall\SetClassWithArgumentToSetFactoryRector;
|
||||
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
|
||||
|
||||
return static function (ContainerConfigurator $containerConfigurator): void {
|
||||
$services = $containerConfigurator->services();
|
||||
|
||||
$services->set(SetClassWithArgumentToSetFactoryRector::class);
|
||||
$services->set(BuilderExpandToHelperExpandRector::class);
|
||||
};
|
|
@ -3,15 +3,13 @@
|
|||
declare(strict_types=1);
|
||||
|
||||
use Rector\DeadCode\Rector\StaticCall\RemoveParentCallWithoutParentRector;
|
||||
|
||||
use Rector\Generic\Rector\ClassMethod\ArgumentDefaultValueReplacerRector;
|
||||
use Rector\Generic\Rector\MethodCall\FormerNullableArgumentToScalarTypedRector;
|
||||
use Rector\Generic\ValueObject\ArgumentDefaultValueReplacer;
|
||||
use Rector\Nette\Rector\MethodCall\AddDatePickerToDateControlRector;
|
||||
use Rector\Nette\Rector\MethodCall\BuilderExpandToHelperExpandRector;
|
||||
use Rector\Nette\Rector\MethodCall\GetConfigWithDefaultsArgumentToArrayMergeInCompilerExtensionRector;
|
||||
use Rector\Nette\Rector\MethodCall\MagicHtmlCallToAppendAttributeRector;
|
||||
use Rector\Nette\Rector\MethodCall\SetClassWithArgumentToSetFactoryRector;
|
||||
use Rector\Nette\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector;
|
||||
use Rector\NetteCodeQuality\Rector\ArrayDimFetch\ChangeFormArrayAccessToAnnotatedControlVariableRector;
|
||||
use Rector\Renaming\Rector\ClassConstFetch\RenameClassConstantRector;
|
||||
use Rector\Renaming\Rector\MethodCall\RenameMethodRector;
|
||||
|
@ -24,112 +22,94 @@ use Rector\Transform\ValueObject\StaticCallToMethodCall;
|
|||
use Symfony\Component\DependencyInjection\Loader\Configurator\ContainerConfigurator;
|
||||
|
||||
return static function (ContainerConfigurator $containerConfigurator): void {
|
||||
$containerConfigurator->import(__DIR__ . '/nette-30-dependency-injection.php');
|
||||
$containerConfigurator->import(__DIR__ . '/nette-30-return-types.php');
|
||||
|
||||
$containerConfigurator->import(__DIR__ . '/nette-30-param-types.php');
|
||||
|
||||
$services = $containerConfigurator->services();
|
||||
|
||||
$services->set(AddDatePickerToDateControlRector::class);
|
||||
|
||||
$services->set(SetClassWithArgumentToSetFactoryRector::class);
|
||||
|
||||
$services->set(ChangeFormArrayAccessToAnnotatedControlVariableRector::class);
|
||||
|
||||
$services->set(GetConfigWithDefaultsArgumentToArrayMergeInCompilerExtensionRector::class);
|
||||
|
||||
// Control class has remove __construct(), e.g. https://github.com/Pixidos/GPWebPay/pull/16/files#diff-fdc8251950f85c5467c63c249df05786
|
||||
$services->set(RemoveParentCallWithoutParentRector::class);
|
||||
|
||||
// https://github.com/nette/utils/commit/d0041ba59f5d8bf1f5b3795fd76d43fb13ea2e15
|
||||
$services->set(FormerNullableArgumentToScalarTypedRector::class);
|
||||
|
||||
$services->set(StaticCallToMethodCallRector::class)
|
||||
->call('configure', [[
|
||||
StaticCallToMethodCallRector::STATIC_CALLS_TO_METHOD_CALLS => inline_value_objects([
|
||||
new StaticCallToMethodCall('Nette\Security\Passwords', 'hash', 'Nette\Security\Passwords', 'hash'),
|
||||
new StaticCallToMethodCall(
|
||||
'Nette\Security\Passwords',
|
||||
'verify',
|
||||
'Nette\Security\Passwords',
|
||||
'verify'
|
||||
),
|
||||
new StaticCallToMethodCall(
|
||||
'Nette\Security\Passwords',
|
||||
'needsRehash',
|
||||
'Nette\Security\Passwords',
|
||||
'needsRehash'
|
||||
),
|
||||
]),
|
||||
]]);
|
||||
|
||||
$services->set(StaticCallToMethodCallRector::class)->call('configure', [[
|
||||
StaticCallToMethodCallRector::STATIC_CALLS_TO_METHOD_CALLS => inline_value_objects(
|
||||
[new StaticCallToMethodCall(
|
||||
'Nette\Security\Passwords',
|
||||
'hash',
|
||||
'Nette\Security\Passwords',
|
||||
'hash'
|
||||
), new StaticCallToMethodCall(
|
||||
'Nette\Security\Passwords',
|
||||
'verify',
|
||||
'Nette\Security\Passwords',
|
||||
'verify'
|
||||
), new StaticCallToMethodCall(
|
||||
'Nette\Security\Passwords',
|
||||
'needsRehash',
|
||||
'Nette\Security\Passwords',
|
||||
'needsRehash'
|
||||
)]
|
||||
),
|
||||
]]);
|
||||
// https://github.com/contributte/event-dispatcher-extra/tree/v0.4.3 and higher
|
||||
$services->set(RenameClassConstantRector::class)
|
||||
->call('configure', [[
|
||||
RenameClassConstantRector::CLASS_CONSTANT_RENAME => inline_value_objects([
|
||||
new RenameClassConstant('Contributte\Events\Extra\Event\Security\LoggedInEvent', 'NAME', 'class'),
|
||||
new RenameClassConstant('Contributte\Events\Extra\Event\Security\LoggedOutEvent', 'NAME', 'class'),
|
||||
new RenameClassConstant('Contributte\Events\Extra\Event\Application\ShutdownEvent', 'NAME', 'class'),
|
||||
]),
|
||||
]]);
|
||||
|
||||
$services->set(RenameClassRector::class)
|
||||
->call('configure', [[
|
||||
RenameClassRector::OLD_TO_NEW_CLASSES => [
|
||||
# nextras/forms was split into 2 packages
|
||||
'Nextras\FormComponents\Controls\DatePicker' => 'Nextras\FormComponents\Controls\DateControl',
|
||||
# @see https://github.com/nette/di/commit/a0d361192f8ac35f1d9f82aab7eb351e4be395ea
|
||||
'Nette\DI\ServiceDefinition' => 'Nette\DI\Definitions\ServiceDefinition',
|
||||
'Nette\DI\Statement' => 'Nette\DI\Definitions\Statement',
|
||||
],
|
||||
]]);
|
||||
|
||||
$services->set(BuilderExpandToHelperExpandRector::class);
|
||||
|
||||
$services->set(ArgumentDefaultValueReplacerRector::class)
|
||||
->call('configure', [[
|
||||
ArgumentDefaultValueReplacerRector::REPLACED_ARGUMENTS => inline_value_objects([
|
||||
// json 2nd argument is now int typed
|
||||
new ArgumentDefaultValueReplacer(
|
||||
'Nette\Utils\Json',
|
||||
'decode',
|
||||
1,
|
||||
true,
|
||||
'Nette\Utils\Json::FORCE_ARRAY'
|
||||
),
|
||||
// @see https://github.com/nette/forms/commit/574b97f9d5e7a902a224e57d7d584e7afc9fefec
|
||||
new ArgumentDefaultValueReplacer('Nette\Forms\Form', 'decode', 0, true, 'array'),
|
||||
]),
|
||||
]]
|
||||
);
|
||||
|
||||
$services->set(RenameMethodRector::class)
|
||||
// @see https://github.com/nette/forms/commit/b99385aa9d24d729a18f6397a414ea88eab6895a
|
||||
->call('configure', [[
|
||||
RenameMethodRector::METHOD_CALL_RENAMES => inline_value_objects([
|
||||
new MethodCallRename('Nette\Forms\Controls\BaseControl', 'setAttribute', 'setHtmlAttribute'),
|
||||
]),
|
||||
]]);
|
||||
|
||||
$services->set(RenameClassConstantRector::class)->call('configure', [[
|
||||
RenameClassConstantRector::CLASS_CONSTANT_RENAME => inline_value_objects(
|
||||
[new RenameClassConstant(
|
||||
'Contributte\Events\Extra\Event\Security\LoggedInEvent',
|
||||
'NAME',
|
||||
'class'
|
||||
), new RenameClassConstant(
|
||||
'Contributte\Events\Extra\Event\Security\LoggedOutEvent',
|
||||
'NAME',
|
||||
'class'
|
||||
), new RenameClassConstant('Contributte\Events\Extra\Event\Application\ShutdownEvent', 'NAME', 'class')]
|
||||
),
|
||||
]]);
|
||||
$services->set(RenameClassRector::class)->call('configure', [[
|
||||
RenameClassRector::OLD_TO_NEW_CLASSES => [
|
||||
# nextras/forms was split into 2 packages
|
||||
'Nextras\FormComponents\Controls\DatePicker' => 'Nextras\FormComponents\Controls\DateControl',
|
||||
# @see https://github.com/nette/di/commit/a0d361192f8ac35f1d9f82aab7eb351e4be395ea
|
||||
'Nette\DI\ServiceDefinition' => 'Nette\DI\Definitions\ServiceDefinition',
|
||||
'Nette\DI\Statement' => 'Nette\DI\Definitions\Statement',
|
||||
],
|
||||
]]);
|
||||
$services->set(ArgumentDefaultValueReplacerRector::class)->call('configure', [[
|
||||
ArgumentDefaultValueReplacerRector::REPLACED_ARGUMENTS => inline_value_objects([
|
||||
// json 2nd argument is now int typed
|
||||
new ArgumentDefaultValueReplacer('Nette\Utils\Json', 'decode', 1, true, 'Nette\Utils\Json::FORCE_ARRAY'),
|
||||
// @see https://github.com/nette/forms/commit/574b97f9d5e7a902a224e57d7d584e7afc9fefec
|
||||
new ArgumentDefaultValueReplacer('Nette\Forms\Form', 'decode', 0, true, 'array'),
|
||||
]),
|
||||
]]);
|
||||
$services->set(RenameMethodRector::class)->call('configure', [[
|
||||
RenameMethodRector::METHOD_CALL_RENAMES => inline_value_objects([
|
||||
new MethodCallRename(
|
||||
RenameMethodRector::METHOD_CALL_RENAMES => inline_value_objects(
|
||||
[new MethodCallRename('Nette\Forms\Controls\BaseControl', 'setAttribute', 'setHtmlAttribute')]
|
||||
),
|
||||
]]);
|
||||
$services->set(RenameMethodRector::class)->call('configure', [[
|
||||
RenameMethodRector::METHOD_CALL_RENAMES => inline_value_objects([new MethodCallRename(
|
||||
'Nette\Forms\Controls\BaseControl',
|
||||
# see https://github.com/nette/forms/commit/b99385aa9d24d729a18f6397a414ea88eab6895a
|
||||
'setType',
|
||||
'setHtmlType'
|
||||
),
|
||||
new MethodCallRename('Nette\Forms\Controls\BaseControl', 'setAttribute', 'setHtmlAttribute'),
|
||||
new MethodCallRename(
|
||||
), new MethodCallRename(
|
||||
'Nette\Forms\Controls\BaseControl',
|
||||
'setAttribute',
|
||||
'setHtmlAttribute'
|
||||
), new MethodCallRename(
|
||||
'Nette\DI\Definitions\ServiceDefinition',
|
||||
# see https://github.com/nette/di/commit/1705a5db431423fc610a6f339f88dead1b5dc4fb
|
||||
'setClass',
|
||||
'setType'
|
||||
),
|
||||
new MethodCallRename('Nette\DI\Definitions\ServiceDefinition', 'getClass', 'getType'),
|
||||
new MethodCallRename('Nette\DI\Definitions\Definition', 'isAutowired', 'getAutowired'),
|
||||
]),
|
||||
), new MethodCallRename(
|
||||
'Nette\DI\Definitions\ServiceDefinition',
|
||||
'getClass',
|
||||
'getType'
|
||||
), new MethodCallRename('Nette\DI\Definitions\Definition', 'isAutowired', 'getAutowired')]),
|
||||
]]);
|
||||
|
||||
$services->set(MagicHtmlCallToAppendAttributeRector::class);
|
||||
$services->set(RequestGetCookieDefaultArgumentToCoalesceRector::class);
|
||||
};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# All 586 Rectors Overview
|
||||
# All 588 Rectors Overview
|
||||
|
||||
- [Projects](#projects)
|
||||
---
|
||||
|
@ -18,7 +18,7 @@
|
|||
- [DowngradePhp71](#downgradephp71) (3)
|
||||
- [DowngradePhp72](#downgradephp72) (2)
|
||||
- [DowngradePhp73](#downgradephp73) (1)
|
||||
- [DowngradePhp74](#downgradephp74) (5)
|
||||
- [DowngradePhp74](#downgradephp74) (6)
|
||||
- [DowngradePhp80](#downgradephp80) (6)
|
||||
- [DynamicTypeAnalysis](#dynamictypeanalysis) (3)
|
||||
- [FileSystemRector](#filesystemrector) (1)
|
||||
|
@ -31,7 +31,7 @@
|
|||
- [MockistaToMockery](#mockistatomockery) (2)
|
||||
- [MysqlToMysqli](#mysqltomysqli) (4)
|
||||
- [Naming](#naming) (11)
|
||||
- [Nette](#nette) (16)
|
||||
- [Nette](#nette) (17)
|
||||
- [NetteCodeQuality](#nettecodequality) (6)
|
||||
- [NetteKdyby](#nettekdyby) (4)
|
||||
- [NetteTesterToPHPUnit](#nettetestertophpunit) (3)
|
||||
|
@ -4906,6 +4906,34 @@ Replace arrow functions with anonymous functions
|
|||
|
||||
<br><br>
|
||||
|
||||
### `DowngradeArraySpreadRector`
|
||||
|
||||
- class: [`Rector\DowngradePhp74\Rector\Array_\DowngradeArraySpreadRector`](/rules/downgrade-php74/src/Rector/Array_/DowngradeArraySpreadRector.php)
|
||||
- [test fixtures](/rules/downgrade-php74/tests/Rector/Array_/DowngradeArraySpreadRector/Fixture)
|
||||
|
||||
Replace array spread with `array_merge` function
|
||||
|
||||
```diff
|
||||
class SomeClass
|
||||
{
|
||||
public function run()
|
||||
{
|
||||
$parts = ['apple', 'pear'];
|
||||
- $fruits = ['banana', 'orange', ...$parts, 'watermelon'];
|
||||
+ $fruits = array_merge(['banana', 'orange'], $parts, ['watermelon']);
|
||||
}
|
||||
|
||||
public function runWithIterable()
|
||||
{
|
||||
- $fruits = ['banana', 'orange', ...new ArrayIterator(['durian', 'kiwi']), 'watermelon'];
|
||||
+ $item0Unpacked = new ArrayIterator(['durian', 'kiwi']);
|
||||
+ $fruits = array_merge(['banana', 'orange'], is_array($item0Unpacked) ? $item0Unpacked : iterator_to_array($item0Unpacked), ['watermelon']);
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<br><br>
|
||||
|
||||
### `DowngradeNullCoalescingOperatorRector`
|
||||
|
||||
- class: [`Rector\DowngradePhp74\Rector\Coalesce\DowngradeNullCoalescingOperatorRector`](/rules/downgrade-php74/src/Rector/Coalesce/DowngradeNullCoalescingOperatorRector.php)
|
||||
|
@ -8051,6 +8079,28 @@ Use `Nette\Utils\Strings` over bare `preg_match()` and `preg_match_all()` functi
|
|||
|
||||
<br><br>
|
||||
|
||||
### `RequestGetCookieDefaultArgumentToCoalesceRector`
|
||||
|
||||
- class: [`Rector\Nette\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector`](/rules/nette/src/Rector/MethodCall/RequestGetCookieDefaultArgumentToCoalesceRector.php)
|
||||
- [test fixtures](/rules/nette/tests/Rector/MethodCall/RequestGetCookieDefaultArgumentToCoalesceRector/Fixture)
|
||||
|
||||
Add removed `Nette\Http\Request::getCookies()` default value as coalesce
|
||||
|
||||
```diff
|
||||
use Nette\Http\Request;
|
||||
|
||||
class SomeClass
|
||||
{
|
||||
public function run(Request $request)
|
||||
{
|
||||
- return $request->getCookie('name', 'default');
|
||||
+ return $request->getCookie('name') ?? 'default';
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
<br><br>
|
||||
|
||||
### `SetClassWithArgumentToSetFactoryRector`
|
||||
|
||||
- class: [`Rector\Nette\Rector\MethodCall\SetClassWithArgumentToSetFactoryRector`](/rules/nette/src/Rector/MethodCall/SetClassWithArgumentToSetFactoryRector.php)
|
||||
|
|
|
@ -316,6 +316,21 @@ final class SetList
|
|||
*/
|
||||
public const NETTE_30 = __DIR__ . '/../../../../config/set/nette-30.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const NETTE_30_PARAM_TYPES = __DIR__ . '/../../../../config/set/nette-30-param-types.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const NETTE_30_RETURN_TYPES = __DIR__ . '/../../../../config/set/nette-30-return-types.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
public const NETTE_30_DEPENDENCY_INJECTION = __DIR__ . '/../../../../config/set/nette-30-dependency-injection.php';
|
||||
|
||||
/**
|
||||
* @var string
|
||||
*/
|
||||
|
|
|
@ -0,0 +1,85 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\Nette\Rector\MethodCall;
|
||||
|
||||
use PhpParser\Node;
|
||||
use PhpParser\Node\Expr\BinaryOp\Coalesce;
|
||||
use PhpParser\Node\Expr\MethodCall;
|
||||
use Rector\Core\Rector\AbstractRector;
|
||||
use Rector\Core\RectorDefinition\CodeSample;
|
||||
use Rector\Core\RectorDefinition\RectorDefinition;
|
||||
|
||||
/**
|
||||
* @sponsor Thanks https://amateri.com for sponsoring this rule - visit them on https://www.startupjobs.cz/startup/scrumworks-s-r-o
|
||||
*
|
||||
* @see \Rector\Nette\Tests\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector\RequestGetCookieDefaultArgumentToCoalesceRectorTest
|
||||
*/
|
||||
final class RequestGetCookieDefaultArgumentToCoalesceRector extends AbstractRector
|
||||
{
|
||||
public function getDefinition(): RectorDefinition
|
||||
{
|
||||
return new RectorDefinition('Add removed Nette\Http\Request::getCookies() default value as coalesce', [
|
||||
new CodeSample(
|
||||
<<<'CODE_SAMPLE'
|
||||
use Nette\Http\Request;
|
||||
|
||||
class SomeClass
|
||||
{
|
||||
public function run(Request $request)
|
||||
{
|
||||
return $request->getCookie('name', 'default');
|
||||
}
|
||||
}
|
||||
CODE_SAMPLE
|
||||
|
||||
,
|
||||
<<<'CODE_SAMPLE'
|
||||
use Nette\Http\Request;
|
||||
|
||||
class SomeClass
|
||||
{
|
||||
public function run(Request $request)
|
||||
{
|
||||
return $request->getCookie('name') ?? 'default';
|
||||
}
|
||||
}
|
||||
CODE_SAMPLE
|
||||
|
||||
),
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return string[]
|
||||
*/
|
||||
public function getNodeTypes(): array
|
||||
{
|
||||
return [MethodCall::class];
|
||||
}
|
||||
|
||||
/**
|
||||
* @param MethodCall $node
|
||||
*/
|
||||
public function refactor(Node $node): ?Node
|
||||
{
|
||||
if (! $this->isObjectType($node->var, 'Nette\Http\Request')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
if (! $this->isName($node->name, 'getCookie')) {
|
||||
return null;
|
||||
}
|
||||
|
||||
// no default value
|
||||
if (! isset($node->args[1])) {
|
||||
return null;
|
||||
}
|
||||
|
||||
$defaultValue = $node->args[1]->value;
|
||||
unset($node->args[1]);
|
||||
|
||||
return new Coalesce($node, $defaultValue);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
namespace Rector\Nette\Tests\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector\Fixture;
|
||||
|
||||
use Nette\Http\Request;
|
||||
|
||||
class SomeClass
|
||||
{
|
||||
public function run(Request $request)
|
||||
{
|
||||
return $request->getCookie('name', 'default');
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
||||
-----
|
||||
<?php
|
||||
|
||||
namespace Rector\Nette\Tests\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector\Fixture;
|
||||
|
||||
use Nette\Http\Request;
|
||||
|
||||
class SomeClass
|
||||
{
|
||||
public function run(Request $request)
|
||||
{
|
||||
return $request->getCookie('name') ?? 'default';
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
|
@ -0,0 +1,13 @@
|
|||
<?php
|
||||
|
||||
namespace Rector\Nette\Tests\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector\Fixture;
|
||||
|
||||
use Nette\Http\Request;
|
||||
|
||||
class SkipNon2ndArg
|
||||
{
|
||||
public function run(Request $request)
|
||||
{
|
||||
return $request->getCookie('name');
|
||||
}
|
||||
}
|
|
@ -0,0 +1,31 @@
|
|||
<?php
|
||||
|
||||
declare(strict_types=1);
|
||||
|
||||
namespace Rector\Nette\Tests\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector;
|
||||
|
||||
use Iterator;
|
||||
use Rector\Core\Testing\PHPUnit\AbstractRectorTestCase;
|
||||
use Rector\Nette\Rector\MethodCall\RequestGetCookieDefaultArgumentToCoalesceRector;
|
||||
use Symplify\SmartFileSystem\SmartFileInfo;
|
||||
|
||||
final class RequestGetCookieDefaultArgumentToCoalesceRectorTest extends AbstractRectorTestCase
|
||||
{
|
||||
/**
|
||||
* @dataProvider provideData()
|
||||
*/
|
||||
public function test(SmartFileInfo $fileInfo): void
|
||||
{
|
||||
$this->doTestFileInfo($fileInfo);
|
||||
}
|
||||
|
||||
public function provideData(): Iterator
|
||||
{
|
||||
return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture');
|
||||
}
|
||||
|
||||
protected function getRectorClass(): string
|
||||
{
|
||||
return RequestGetCookieDefaultArgumentToCoalesceRector::class;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user