2019-10-13 05:59:52 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
2018-10-23 20:13:13 +00:00
|
|
|
|
2018-11-09 22:50:00 +00:00
|
|
|
namespace Rector\CodeQuality\Rector\BooleanAnd;
|
2018-10-23 20:13:13 +00:00
|
|
|
|
|
|
|
use PhpParser\Node;
|
|
|
|
use PhpParser\Node\Expr\Array_;
|
|
|
|
use PhpParser\Node\Expr\BinaryOp\BooleanAnd;
|
|
|
|
use PhpParser\Node\Expr\BinaryOp\Identical;
|
|
|
|
use PhpParser\Node\Expr\Empty_;
|
2020-02-06 21:48:18 +00:00
|
|
|
use Rector\Core\PhpParser\Node\Manipulator\BinaryOpManipulator;
|
|
|
|
use Rector\Core\Rector\AbstractRector;
|
|
|
|
use Rector\Core\RectorDefinition\CodeSample;
|
|
|
|
use Rector\Core\RectorDefinition\RectorDefinition;
|
2018-10-23 20:13:13 +00:00
|
|
|
|
2018-11-09 22:22:42 +00:00
|
|
|
/**
|
|
|
|
* @see https://3v4l.org/EZ2P4
|
|
|
|
* @see https://3v4l.org/egtb5
|
2019-09-03 09:11:45 +00:00
|
|
|
* @see \Rector\CodeQuality\Tests\Rector\BooleanAnd\SimplifyEmptyArrayCheckRector\SimplifyEmptyArrayCheckRectorTest
|
2018-11-09 22:22:42 +00:00
|
|
|
*/
|
2018-10-23 20:13:13 +00:00
|
|
|
final class SimplifyEmptyArrayCheckRector extends AbstractRector
|
|
|
|
{
|
2018-11-06 23:33:10 +00:00
|
|
|
/**
|
2019-02-27 21:54:39 +00:00
|
|
|
* @var BinaryOpManipulator
|
2018-11-06 23:33:10 +00:00
|
|
|
*/
|
2019-02-27 21:54:39 +00:00
|
|
|
private $binaryOpManipulator;
|
2018-11-06 23:33:10 +00:00
|
|
|
|
2019-02-27 21:54:39 +00:00
|
|
|
public function __construct(BinaryOpManipulator $binaryOpManipulator)
|
2018-11-06 23:33:10 +00:00
|
|
|
{
|
2019-02-27 21:54:39 +00:00
|
|
|
$this->binaryOpManipulator = $binaryOpManipulator;
|
2018-11-06 23:33:10 +00:00
|
|
|
}
|
|
|
|
|
2018-10-23 20:13:13 +00:00
|
|
|
public function getDefinition(): RectorDefinition
|
|
|
|
{
|
|
|
|
return new RectorDefinition(
|
|
|
|
'Simplify `is_array` and `empty` functions combination into a simple identical check for an empty array',
|
|
|
|
[new CodeSample('is_array($values) && empty($values)', '$values === []')]
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return string[]
|
|
|
|
*/
|
|
|
|
public function getNodeTypes(): array
|
|
|
|
{
|
|
|
|
return [BooleanAnd::class];
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2018-11-06 23:33:10 +00:00
|
|
|
* @param BooleanAnd $node
|
2018-10-23 20:13:13 +00:00
|
|
|
*/
|
2018-11-06 23:33:10 +00:00
|
|
|
public function refactor(Node $node): ?Node
|
2018-10-23 20:13:13 +00:00
|
|
|
{
|
2019-02-27 21:54:39 +00:00
|
|
|
$matchedNodes = $this->binaryOpManipulator->matchFirstAndSecondConditionNode(
|
2018-11-06 23:33:10 +00:00
|
|
|
$node,
|
|
|
|
// is_array(...)
|
2019-05-09 13:30:39 +00:00
|
|
|
function (Node $node): bool {
|
2020-02-29 23:06:45 +00:00
|
|
|
return $this->isFuncCallName($node, 'is_array');
|
2018-11-06 23:33:10 +00:00
|
|
|
},
|
2018-11-09 22:22:42 +00:00
|
|
|
Empty_::class
|
2018-11-06 23:33:10 +00:00
|
|
|
);
|
2018-10-23 20:13:13 +00:00
|
|
|
|
2018-11-06 23:33:10 +00:00
|
|
|
if ($matchedNodes === null) {
|
2018-10-23 20:13:13 +00:00
|
|
|
return null;
|
|
|
|
}
|
|
|
|
|
2018-11-09 22:22:42 +00:00
|
|
|
/** @var Empty_ $emptyOrNotIdenticalNode */
|
2018-11-06 23:33:10 +00:00
|
|
|
[, $emptyOrNotIdenticalNode] = $matchedNodes;
|
2018-11-05 08:08:27 +00:00
|
|
|
|
2018-11-09 22:22:42 +00:00
|
|
|
return new Identical($emptyOrNotIdenticalNode->expr, new Array_());
|
2018-10-23 20:13:13 +00:00
|
|
|
}
|
|
|
|
}
|