diff --git a/src/Rector/Contrib/PhpParser/SetLineRector.php b/src/Rector/Contrib/PhpParser/SetLineRector.php new file mode 100644 index 00000000000..d8bb504fe28 --- /dev/null +++ b/src/Rector/Contrib/PhpParser/SetLineRector.php @@ -0,0 +1,48 @@ +setLine(5); + * + * After: + * - $node->setAttribute('line', 5); + */ +final class SetLineRector extends AbstractRector +{ + /** + * @var MethodCallAnalyzer + */ + private $methodCallAnalyzer; + + public function __construct(MethodCallAnalyzer $methodCallAnalyzer) + { + $this->methodCallAnalyzer = $methodCallAnalyzer; + } + + public function isCandidate(Node $node): bool + { + return $this->methodCallAnalyzer->isTypeAndMethod($node, 'PhpParser\Node', 'setLine'); + } + + /** + * @param MethodCall $methodCallNode + */ + public function refactor(Node $methodCallNode): ?Node + { + $methodCallNode->name = 'setAttribute'; + + $methodCallNode->args[1] = $methodCallNode->args[0]; + $methodCallNode->args[0] = new Arg(new String_('line')); + + return $methodCallNode; + } +} diff --git a/src/config/level/nikic/php-parser40.yml b/src/config/level/nikic/php-parser40.yml index 9e26782efb0..23d0e517bcb 100644 --- a/src/config/level/nikic/php-parser40.yml +++ b/src/config/level/nikic/php-parser40.yml @@ -1,6 +1,7 @@ rectors: Rector\Rector\Contrib\PhpParser\IdentifierRector: ~ Rector\Rector\Contrib\PhpParser\ParamAndStaticVarNameRector: ~ + Rector\Rector\Contrib\PhpParser\SetLineRector: ~ Rector\Rector\Dynamic\ClassConstantReplacerRector: 'PhpParser\Node\Stmt\Class_': diff --git a/tests/Rector/Contrib/PhpParser/SetLineRector/Correct/correct.php.inc b/tests/Rector/Contrib/PhpParser/SetLineRector/Correct/correct.php.inc new file mode 100644 index 00000000000..eb613825c94 --- /dev/null +++ b/tests/Rector/Contrib/PhpParser/SetLineRector/Correct/correct.php.inc @@ -0,0 +1,4 @@ +setAttribute('line', 5); diff --git a/tests/Rector/Contrib/PhpParser/SetLineRector/Test.php b/tests/Rector/Contrib/PhpParser/SetLineRector/Test.php new file mode 100644 index 00000000000..9a0bcaf728a --- /dev/null +++ b/tests/Rector/Contrib/PhpParser/SetLineRector/Test.php @@ -0,0 +1,25 @@ +doTestFileMatchesExpectedContent( + __DIR__ . '/Wrong/wrong.php.inc', + __DIR__ . '/Correct/correct.php.inc' + ); + } + + /** + * @return string[] + */ + protected function getRectorClasses(): array + { + return [SetLineRector::class]; + } +} diff --git a/tests/Rector/Contrib/PhpParser/SetLineRector/Wrong/wrong.php.inc b/tests/Rector/Contrib/PhpParser/SetLineRector/Wrong/wrong.php.inc new file mode 100644 index 00000000000..83499508568 --- /dev/null +++ b/tests/Rector/Contrib/PhpParser/SetLineRector/Wrong/wrong.php.inc @@ -0,0 +1,4 @@ +setLine(5);