rector/packages/CodeQuality/src/Rector/Assign/CombinedAssignRector.php

68 lines
1.6 KiB
PHP
Raw Normal View History

2018-10-12 16:42:12 +00:00
<?php declare(strict_types=1);
namespace Rector\CodeQuality\Rector\Assign;
2018-10-12 16:42:12 +00:00
use PhpParser\Node;
use PhpParser\Node\Expr\Assign;
use PhpParser\Node\Expr\BinaryOp;
use Rector\PhpParser\Node\AssignAndBinaryMap;
2018-10-12 16:42:12 +00:00
use Rector\Rector\AbstractRector;
use Rector\RectorDefinition\CodeSample;
use Rector\RectorDefinition\RectorDefinition;
2019-09-03 09:11:45 +00:00
/**
* @see \Rector\CodeQuality\Tests\Rector\Assign\CombinedAssignRector\CombinedAssignRectorTest
*/
2018-10-12 16:42:12 +00:00
final class CombinedAssignRector extends AbstractRector
{
/**
* @var AssignAndBinaryMap
2018-10-12 16:42:12 +00:00
*/
private $assignAndBinaryMap;
public function __construct(AssignAndBinaryMap $assignAndBinaryMap)
{
$this->assignAndBinaryMap = $assignAndBinaryMap;
}
2018-10-12 16:42:12 +00:00
public function getDefinition(): RectorDefinition
{
return new RectorDefinition(
'Simplify $value = $value + 5; assignments to shorter ones',
[new CodeSample('$value = $value + 5;', '$value += 5;')]
);
}
/**
* @return string[]
*/
public function getNodeTypes(): array
{
return [Assign::class];
}
/**
* @param Assign $node
2018-10-12 16:42:12 +00:00
*/
public function refactor(Node $node): ?Node
2018-10-12 16:42:12 +00:00
{
if (! $node->expr instanceof BinaryOp) {
return null;
2018-10-12 16:42:12 +00:00
}
/** @var BinaryOp $binaryNode */
$binaryNode = $node->expr;
2018-10-12 16:42:12 +00:00
if (! $this->areNodesEqual($node->var, $binaryNode->left)) {
return null;
2018-10-12 16:42:12 +00:00
}
$assignClass = $this->assignAndBinaryMap->getAlternative($binaryNode);
if ($assignClass === null) {
return null;
2018-10-12 16:42:12 +00:00
}
return new $assignClass($node->var, $binaryNode->right);
2018-10-12 16:42:12 +00:00
}
}