2019-10-13 05:59:52 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
2018-08-12 11:06:07 +00:00
|
|
|
|
2020-08-18 15:57:30 +00:00
|
|
|
namespace Rector\Renaming\Rector\FuncCall;
|
2018-08-12 11:06:07 +00:00
|
|
|
|
2019-02-19 15:56:41 +00:00
|
|
|
use Nette\Utils\Strings;
|
2018-08-12 11:06:07 +00:00
|
|
|
use PhpParser\Node;
|
|
|
|
use PhpParser\Node\Expr\FuncCall;
|
2019-02-19 15:56:41 +00:00
|
|
|
use PhpParser\Node\Name;
|
2018-08-12 11:06:07 +00:00
|
|
|
use PhpParser\Node\Name\FullyQualified;
|
2020-07-29 13:55:33 +00:00
|
|
|
use Rector\Core\Contract\Rector\ConfigurableRectorInterface;
|
2020-02-06 21:48:18 +00:00
|
|
|
use Rector\Core\Rector\AbstractRector;
|
2020-11-16 17:50:38 +00:00
|
|
|
use Symplify\RuleDocGenerator\ValueObject\CodeSample\ConfiguredCodeSample;
|
|
|
|
use Symplify\RuleDocGenerator\ValueObject\RuleDefinition;
|
2018-08-12 11:06:07 +00:00
|
|
|
|
2019-09-03 09:11:45 +00:00
|
|
|
/**
|
2021-03-12 22:20:25 +00:00
|
|
|
* @see \Rector\Tests\Renaming\Rector\FuncCall\RenameFunctionRector\RenameFunctionRectorTest
|
2019-09-03 09:11:45 +00:00
|
|
|
*/
|
2020-07-29 13:55:33 +00:00
|
|
|
final class RenameFunctionRector extends AbstractRector implements ConfigurableRectorInterface
|
2018-08-12 11:06:07 +00:00
|
|
|
{
|
|
|
|
/**
|
2020-07-29 13:55:33 +00:00
|
|
|
* @var string
|
2018-08-12 11:06:07 +00:00
|
|
|
*/
|
2021-01-24 11:23:50 +00:00
|
|
|
public const OLD_FUNCTION_TO_NEW_FUNCTION = 'old_function_to_new_function';
|
2018-08-12 11:06:07 +00:00
|
|
|
|
|
|
|
/**
|
2020-08-26 10:54:53 +00:00
|
|
|
* @var array<string, string>
|
2018-08-12 11:06:07 +00:00
|
|
|
*/
|
2020-07-29 13:55:33 +00:00
|
|
|
private $oldFunctionToNewFunction = [];
|
2018-08-12 11:06:07 +00:00
|
|
|
|
2020-11-16 17:50:38 +00:00
|
|
|
public function getRuleDefinition(): RuleDefinition
|
2018-08-12 11:06:07 +00:00
|
|
|
{
|
2020-11-16 17:50:38 +00:00
|
|
|
return new RuleDefinition('Turns defined function call new one.', [
|
2018-08-12 11:06:07 +00:00
|
|
|
new ConfiguredCodeSample(
|
|
|
|
'view("...", []);',
|
|
|
|
'Laravel\Templating\render("...", []);',
|
|
|
|
[
|
2020-08-03 07:26:01 +00:00
|
|
|
self::OLD_FUNCTION_TO_NEW_FUNCTION => [
|
2019-12-26 10:21:09 +00:00
|
|
|
'view' => 'Laravel\Templating\render',
|
|
|
|
],
|
2018-08-12 11:06:07 +00:00
|
|
|
]
|
|
|
|
),
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
2021-02-27 00:06:15 +00:00
|
|
|
* @return array<class-string<Node>>
|
2018-08-12 11:06:07 +00:00
|
|
|
*/
|
2018-08-14 22:12:41 +00:00
|
|
|
public function getNodeTypes(): array
|
2018-08-12 11:06:07 +00:00
|
|
|
{
|
2018-08-14 22:12:41 +00:00
|
|
|
return [FuncCall::class];
|
2018-08-12 11:06:07 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param FuncCall $node
|
|
|
|
*/
|
|
|
|
public function refactor(Node $node): ?Node
|
|
|
|
{
|
2018-10-22 17:39:10 +00:00
|
|
|
foreach ($this->oldFunctionToNewFunction as $oldFunction => $newFunction) {
|
2019-08-25 10:37:56 +00:00
|
|
|
if (! $this->isName($node, $oldFunction)) {
|
2018-10-22 17:39:10 +00:00
|
|
|
continue;
|
|
|
|
}
|
2018-08-12 11:06:07 +00:00
|
|
|
|
2021-01-24 11:23:50 +00:00
|
|
|
$node->name = $this->createName($newFunction);
|
2021-03-02 13:43:36 +00:00
|
|
|
return $node;
|
2018-10-22 17:39:10 +00:00
|
|
|
}
|
2018-08-12 11:06:07 +00:00
|
|
|
|
2021-03-02 13:43:36 +00:00
|
|
|
return null;
|
2018-08-12 11:06:07 +00:00
|
|
|
}
|
2018-12-31 00:10:56 +00:00
|
|
|
|
2020-07-29 13:55:33 +00:00
|
|
|
/**
|
|
|
|
* @param mixed[] $configuration
|
|
|
|
*/
|
|
|
|
public function configure(array $configuration): void
|
|
|
|
{
|
|
|
|
$this->oldFunctionToNewFunction = $configuration[self::OLD_FUNCTION_TO_NEW_FUNCTION] ?? [];
|
|
|
|
}
|
2021-01-24 11:23:50 +00:00
|
|
|
|
|
|
|
private function createName(string $newFunction): Name
|
|
|
|
{
|
|
|
|
if (Strings::contains($newFunction, '\\')) {
|
|
|
|
return new FullyQualified($newFunction);
|
|
|
|
}
|
|
|
|
|
|
|
|
return new Name($newFunction);
|
|
|
|
}
|
2018-08-12 11:06:07 +00:00
|
|
|
}
|