From 42e4454b48e98d7aca93c2a3b21a1a8ce8d06393 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 17 Oct 2019 18:42:48 +0200 Subject: [PATCH 1/3] [CodeQuality] Add AddPregQuoteDelimiterRector --- config/set/code-quality/code-quality.yaml | 1 + .../FuncCall/AddPregQuoteDelimiterRector.php | 72 +++++++++++++++++++ .../AddPregQuoteDelimiterRectorTest.php | 31 ++++++++ .../Fixture/fixture.php.inc | 27 +++++++ .../Fixture/skip.php.inc | 11 +++ 5 files changed, 142 insertions(+) create mode 100644 packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php create mode 100644 packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/AddPregQuoteDelimiterRectorTest.php create mode 100644 packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/fixture.php.inc create mode 100644 packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/skip.php.inc diff --git a/config/set/code-quality/code-quality.yaml b/config/set/code-quality/code-quality.yaml index 120dddfc7346..49393bb36238 100644 --- a/config/set/code-quality/code-quality.yaml +++ b/config/set/code-quality/code-quality.yaml @@ -43,3 +43,4 @@ services: Rector\CodeQuality\Rector\FuncCall\RemoveSoleValueSprintfRector: ~ Rector\CodeQuality\Rector\If_\ShortenElseIfRector: ~ Rector\SOLID\Rector\ClassMethod\UseInterfaceOverImplementationInConstructorRector: ~ + Rector\CodeQuality\Rector\FuncCall\AddPregQuoteDelimiterRector: ~ diff --git a/packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php b/packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php new file mode 100644 index 000000000000..181e54bdfbce --- /dev/null +++ b/packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php @@ -0,0 +1,72 @@ +isName($node, 'preg_quote')) { + return null; + } + + // already completed + if (isset($node->args[1])) { + return null; + } + + $node->args[1] = new Node\Arg(new Node\Scalar\String_('#')); + + return $node; + } +} diff --git a/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/AddPregQuoteDelimiterRectorTest.php b/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/AddPregQuoteDelimiterRectorTest.php new file mode 100644 index 000000000000..303eb22c03ea --- /dev/null +++ b/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/AddPregQuoteDelimiterRectorTest.php @@ -0,0 +1,31 @@ +doTestFile($file); + } + + public function provideDataForTest(): Iterator + { + yield [__DIR__ . '/Fixture/fixture.php.inc']; + yield [__DIR__ . '/Fixture/skip.php.inc']; + } + + protected function getRectorClass(): string + { + return AddPregQuoteDelimiterRector::class; + } +} diff --git a/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/fixture.php.inc b/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/fixture.php.inc new file mode 100644 index 000000000000..1ea30f88248b --- /dev/null +++ b/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/fixture.php.inc @@ -0,0 +1,27 @@ + +----- + diff --git a/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/skip.php.inc b/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/skip.php.inc new file mode 100644 index 000000000000..33d9a654eab7 --- /dev/null +++ b/packages/CodeQuality/tests/Rector/FuncCall/AddPregQuoteDelimiterRector/Fixture/skip.php.inc @@ -0,0 +1,11 @@ + Date: Thu, 17 Oct 2019 18:46:23 +0200 Subject: [PATCH 2/3] apply on self --- .../FileSystem/MoveServicesBySuffixToDirectoryRector.php | 6 +++++- .../src/PhpDocParser/ClassAnnotationMatcher.php | 2 +- .../src/Rector/FuncCall/AddPregQuoteDelimiterRector.php | 4 +++- .../src/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php | 4 ++-- .../PHPUnit/src/Rector/TryCatchToExpectExceptionRector.php | 2 +- rector.yaml | 3 ++- 6 files changed, 14 insertions(+), 7 deletions(-) diff --git a/packages/Autodiscovery/src/Rector/FileSystem/MoveServicesBySuffixToDirectoryRector.php b/packages/Autodiscovery/src/Rector/FileSystem/MoveServicesBySuffixToDirectoryRector.php index 48a2898d6c3e..6693102b8f0c 100644 --- a/packages/Autodiscovery/src/Rector/FileSystem/MoveServicesBySuffixToDirectoryRector.php +++ b/packages/Autodiscovery/src/Rector/FileSystem/MoveServicesBySuffixToDirectoryRector.php @@ -94,7 +94,11 @@ private function processGroupNamesBySuffix( } // is suffix in the same category, e.g. "Exception/SomeException.php" - $expectedLocationFilePattern = sprintf('#\/%s\/.+%s#', preg_quote($groupName), preg_quote($suffixPattern)); + $expectedLocationFilePattern = sprintf( + '#\/%s\/.+%s#', + preg_quote($groupName, '#'), + preg_quote($suffixPattern, '#') + ); if (Strings::match($smartFileInfo->getRealPath(), $expectedLocationFilePattern)) { continue; } diff --git a/packages/BetterPhpDocParser/src/PhpDocParser/ClassAnnotationMatcher.php b/packages/BetterPhpDocParser/src/PhpDocParser/ClassAnnotationMatcher.php index f62a3ad7debf..5f20fce027d0 100644 --- a/packages/BetterPhpDocParser/src/PhpDocParser/ClassAnnotationMatcher.php +++ b/packages/BetterPhpDocParser/src/PhpDocParser/ClassAnnotationMatcher.php @@ -36,7 +36,7 @@ public function isTagMatchToNodeAndClass(string $tag, Node $node, string $matchi private function isUseMatchingName(string $tag, UseUse $useUse): bool { $shortName = $useUse->alias ? $useUse->alias->name : $useUse->name->getLast(); - $shortNamePattern = preg_quote($shortName); + $shortNamePattern = preg_quote($shortName, '#'); return (bool) Strings::match($tag, '#' . $shortNamePattern . '(\\\\[\w]+)?#i'); } diff --git a/packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php b/packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php index 181e54bdfbce..b523ca10ca4d 100644 --- a/packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php +++ b/packages/CodeQuality/src/Rector/FuncCall/AddPregQuoteDelimiterRector.php @@ -5,7 +5,9 @@ namespace Rector\CodeQuality\Rector\FuncCall; use PhpParser\Node; +use PhpParser\Node\Arg; use PhpParser\Node\Expr\FuncCall; +use PhpParser\Node\Scalar\String_; use Rector\Rector\AbstractRector; use Rector\RectorDefinition\CodeSample; use Rector\RectorDefinition\RectorDefinition; @@ -65,7 +67,7 @@ public function refactor(Node $node): ?Node return null; } - $node->args[1] = new Node\Arg(new Node\Scalar\String_('#')); + $node->args[1] = new Arg(new String_('#')); return $node; } diff --git a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php index 0cfed5da1a3d..701022707a2d 100644 --- a/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php +++ b/packages/NodeTypeResolver/src/PhpDoc/NodeAnalyzer/DocBlockNameImporter.php @@ -197,8 +197,8 @@ private function isCurrentNamespaceSameShortClassAlreadyUsed( // short with space " Type"| fqn $shortNameOrFullyQualifiedNamePattern = sprintf( '#(\s%s\b|\b%s\b)#', - preg_quote($shortenedObjectType->getShortName()), - preg_quote($fullyQualifiedName) + preg_quote($shortenedObjectType->getShortName(), '#'), + preg_quote($fullyQualifiedName, '#') ); $isShortClassUsed = (bool) Strings::match($printedClass, $shortNameOrFullyQualifiedNamePattern); diff --git a/packages/PHPUnit/src/Rector/TryCatchToExpectExceptionRector.php b/packages/PHPUnit/src/Rector/TryCatchToExpectExceptionRector.php index 639ed5b2176a..11614fb560fe 100644 --- a/packages/PHPUnit/src/Rector/TryCatchToExpectExceptionRector.php +++ b/packages/PHPUnit/src/Rector/TryCatchToExpectExceptionRector.php @@ -248,7 +248,7 @@ private function processExceptionMessageContains(MethodCall $methodCall, Variabl if ($methodCall->args[0]->value instanceof String_) { /** @var String_ $oldString */ $oldString = $methodCall->args[0]->value; - $methodCall->args[0]->value = new String_('#' . preg_quote($oldString->value) . '#'); + $methodCall->args[0]->value = new String_('#' . preg_quote($oldString->value, '#') . '#'); } $this->newExpressions[] = $expression; diff --git a/rector.yaml b/rector.yaml index 4db7b1ec053d..811830f47bb6 100644 --- a/rector.yaml +++ b/rector.yaml @@ -18,4 +18,5 @@ parameters: php_version_features: '7.1' services: - Rector\PHPUnit\Rector\ClassMethod\AddDoesNotPerformAssertionToNonAssertingTestRector: ~ + Rector\CodeQuality\Rector\FuncCall\AddPregQuoteDelimiterRector: ~ +# Rector\PHPUnit\Rector\ClassMethod\AddDoesNotPerformAssertionToNonAssertingTestRector: ~ From 160601c294f90094f8b4acd72d5c0a802780f953 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 17 Oct 2019 18:51:08 +0200 Subject: [PATCH 3/3] fix method case name [skip ci] --- .../Rector/Class_/ArrayArgumentInTestToDataProviderRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/PHPUnit/src/Rector/Class_/ArrayArgumentInTestToDataProviderRector.php b/packages/PHPUnit/src/Rector/Class_/ArrayArgumentInTestToDataProviderRector.php index d42579a06e7a..57fc10ce35b1 100644 --- a/packages/PHPUnit/src/Rector/Class_/ArrayArgumentInTestToDataProviderRector.php +++ b/packages/PHPUnit/src/Rector/Class_/ArrayArgumentInTestToDataProviderRector.php @@ -202,7 +202,7 @@ public function refactor(Node $node): ?Node $dataProviderClassMethods = $this->createDataProviderClassMethodsFromRecipes(); - $node->stmts = array_Merge($node->stmts, $dataProviderClassMethods); + $node->stmts = array_merge($node->stmts, $dataProviderClassMethods); return $node; }