[Nette 3.0] Set update (#4381)

This commit is contained in:
Tomas Votruba 2020-10-09 22:01:37 +02:00 committed by GitHub
parent 65fe80a682
commit 3808d1b941
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 311 additions and 92 deletions

View 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);
};

View File

@ -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);
};

View File

@ -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)

View File

@ -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
*/

View File

@ -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);
}
}

View File

@ -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';
}
}
?>

View File

@ -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');
}
}

View File

@ -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;
}
}