From c4aa54142f6e104a900d91a48e31c819f72e3755 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Wed, 31 Oct 2018 23:31:31 +0100 Subject: [PATCH] [Symfony] Add ArrayArgumentProcessRector --- config/level/symfony/symfony42.yml | 3 + .../StringToArrayArgumentProcessRector.php | 110 ++++++++++++++++++ .../Correct/correct.php.inc | 10 ++ .../Correct/correct2.php.inc | 9 ++ .../Source/Process.php | 8 ++ .../Source/ProcessHelper.php | 8 ++ ...StringToArrayArgumentProcessRectorTest.php | 31 +++++ .../Wrong/wrong.php.inc | 10 ++ .../Wrong/wrong2.php.inc | 9 ++ .../config.yml | 4 + src/Node/NodeFactory.php | 2 + 11 files changed, 204 insertions(+) create mode 100644 config/level/symfony/symfony42.yml create mode 100644 packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Correct/correct.php.inc create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Correct/correct2.php.inc create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Source/Process.php create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Source/ProcessHelper.php create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/StringToArrayArgumentProcessRectorTest.php create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Wrong/wrong.php.inc create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Wrong/wrong2.php.inc create mode 100644 packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/config.yml diff --git a/config/level/symfony/symfony42.yml b/config/level/symfony/symfony42.yml new file mode 100644 index 00000000000..41861c3e1a7 --- /dev/null +++ b/config/level/symfony/symfony42.yml @@ -0,0 +1,3 @@ +services: + # https://symfony.com/blog/new-in-symfony-4-2-important-deprecations + Rector\Symfony\Rector\New_\StringToArrayArgumentProcessRector: ~ diff --git a/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php b/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php new file mode 100644 index 00000000000..37f2312e503 --- /dev/null +++ b/packages/Symfony/src/Rector/New_/StringToArrayArgumentProcessRector.php @@ -0,0 +1,110 @@ +nodeFactory = $nodeFactory; + $this->processClass = $processClass; + $this->processHelperClass = $processHelperClass; + } + + public function getDefinition(): RectorDefinition + { + return new RectorDefinition('Changes Process string argument to an array', [ + new CodeSample( + <<<'CODE_SAMPLE' +use Symfony\Component\Process\Process; +$process = new Process('ls -l'); +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +use Symfony\Component\Process\Process; +$process = new Process(['ls', '-l']); +CODE_SAMPLE + ), + ]); + } + + /** + * @return string[] + */ + public function getNodeTypes(): array + { + return [New_::class, MethodCall::class]; + } + + /** + * @param New_ $node + */ + public function refactor(Node $node): ?Node + { + if ($this->isType($node, $this->processClass)) { + return $this->processArgumentPosition($node, 0); + } + + if ($this->isType($node, $this->processHelperClass)) { + return $this->processArgumentPosition($node, 1); + } + + return null; + } + + /** + * @param New_|MethodCall $node + */ + private function processArgumentPosition(Node $node, int $argumentPosition): ?Node + { + if (! isset($node->args[$argumentPosition])) { + return null; + } + + $firstArgument = $node->args[$argumentPosition]->value; + if ($firstArgument instanceof Array_) { + return null; + } + + if (! $firstArgument instanceof String_) { + return null; + } + + $parts = Strings::split($firstArgument->value, '# #'); + $node->args[$argumentPosition]->value = $this->nodeFactory->createArray(...$parts); + + return $node; + } +} diff --git a/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Correct/correct.php.inc b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Correct/correct.php.inc new file mode 100644 index 00000000000..38d04c0a04f --- /dev/null +++ b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Correct/correct.php.inc @@ -0,0 +1,10 @@ +run($output, ['ls', '-l']); diff --git a/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Source/Process.php b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Source/Process.php new file mode 100644 index 00000000000..7bde4a2325c --- /dev/null +++ b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Source/Process.php @@ -0,0 +1,8 @@ +doTestFileMatchesExpectedContent($wrong, $fixed); + } + + public function provideWrongToFixedFiles(): Iterator + { + yield [__DIR__ . '/Wrong/wrong.php.inc', __DIR__ . '/Correct/correct.php.inc']; + yield [__DIR__ . '/Wrong/wrong2.php.inc', __DIR__ . '/Correct/correct2.php.inc']; + } + + protected function provideConfig(): string + { + return __DIR__ . '/config.yml'; + } +} diff --git a/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Wrong/wrong.php.inc b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Wrong/wrong.php.inc new file mode 100644 index 00000000000..6ad4fedded6 --- /dev/null +++ b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/Wrong/wrong.php.inc @@ -0,0 +1,10 @@ +run($output, 'ls -l'); diff --git a/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/config.yml b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/config.yml new file mode 100644 index 00000000000..380314107df --- /dev/null +++ b/packages/Symfony/tests/Rector/New_/StringToArrayArgumentProcessRector/config.yml @@ -0,0 +1,4 @@ +services: + Rector\Symfony\Rector\New_\StringToArrayArgumentProcessRector: + $processClass: 'Rector\Symfony\Tests\Rector\New_\StringToArrayArgumentProcessRector\Source\Process' + $processHelperClass: 'Rector\Symfony\Tests\Rector\New_\StringToArrayArgumentProcessRector\Source\ProcessHelper' diff --git a/src/Node/NodeFactory.php b/src/Node/NodeFactory.php index 69cd61fbb7d..a446559e8f1 100644 --- a/src/Node/NodeFactory.php +++ b/src/Node/NodeFactory.php @@ -119,6 +119,8 @@ final class NodeFactory } elseif ($item instanceof Identifier) { $string = new String_($item->toString()); $arrayItems[] = new ArrayItem($string); + } elseif (is_scalar($item)) { + $arrayItems[] = new ArrayItem(BuilderHelpers::normalizeValue($item)); } else { throw new NotImplementedException(sprintf( 'Not implemented yet. Go to "%s()" and add check for "%s" node.',