rector/rules/CodingStyle/Node/ConcatManipulator.php
Tomas Votruba 7f56f8ae35 Updated Rector to commit 66800f00f1ec158f96416b8e0b84c93f54abb1d5
66800f00f1 [Scoped] Fixing Scoped build bin rector.php (#1174)
2021-11-07 04:15:35 +00:00

54 lines
2.0 KiB
PHP

<?php
declare (strict_types=1);
namespace Rector\CodingStyle\Node;
use PhpParser\Node;
use PhpParser\Node\Expr;
use PhpParser\Node\Expr\BinaryOp\Concat;
use Rector\Core\PhpParser\Comparing\NodeComparator;
use RectorPrefix20211107\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser;
final class ConcatManipulator
{
/**
* @var \Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser
*/
private $simpleCallableNodeTraverser;
/**
* @var \Rector\Core\PhpParser\Comparing\NodeComparator
*/
private $nodeComparator;
public function __construct(\RectorPrefix20211107\Symplify\Astral\NodeTraverser\SimpleCallableNodeTraverser $simpleCallableNodeTraverser, \Rector\Core\PhpParser\Comparing\NodeComparator $nodeComparator)
{
$this->simpleCallableNodeTraverser = $simpleCallableNodeTraverser;
$this->nodeComparator = $nodeComparator;
}
public function getFirstConcatItem(\PhpParser\Node\Expr\BinaryOp\Concat $concat) : \PhpParser\Node\Expr
{
// go to the deep, until there is no concat
while ($concat->left instanceof \PhpParser\Node\Expr\BinaryOp\Concat) {
$concat = $concat->left;
}
return $concat->left;
}
public function removeFirstItemFromConcat(\PhpParser\Node\Expr\BinaryOp\Concat $concat) : \PhpParser\Node\Expr
{
// just 2 items, return right one
if (!$concat->left instanceof \PhpParser\Node\Expr\BinaryOp\Concat) {
return $concat->right;
}
$newConcat = clone $concat;
$firstConcatItem = $this->getFirstConcatItem($concat);
$this->simpleCallableNodeTraverser->traverseNodesWithCallable($newConcat, function (\PhpParser\Node $node) use($firstConcatItem) : ?Expr {
if (!$node instanceof \PhpParser\Node\Expr\BinaryOp\Concat) {
return null;
}
if (!$this->nodeComparator->areNodesEqual($node->left, $firstConcatItem)) {
return null;
}
return $node->right;
});
return $newConcat;
}
}