From 3e5ecbc2510f756ac0ef9c5b6f0526c451ae5a98 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Tue, 31 Aug 2021 16:31:40 +0700 Subject: [PATCH] [CodeQuality][EarlyReturn] Handle ChangeOrIfReturnToEarlyReturnRector + ChangeAndIfToEarlyReturnRector + DateTimeToDateTimeInterfaceRector (#794) --- phpstan.neon | 5 ++ .../DateTimeToDateTimeInterfaceRector.php | 5 +- .../Fixture/and_next_or.php.inc | 59 +++++++++++++++++++ .../IssueEarlyReturnAndOrDatetimeTest.php | 33 +++++++++++ .../config/configured_rule.php | 15 +++++ 5 files changed, 116 insertions(+), 1 deletion(-) create mode 100644 tests/Issues/IssueEarlyReturnAndOrDatetime/Fixture/and_next_or.php.inc create mode 100644 tests/Issues/IssueEarlyReturnAndOrDatetime/IssueEarlyReturnAndOrDatetimeTest.php create mode 100644 tests/Issues/IssueEarlyReturnAndOrDatetime/config/configured_rule.php diff --git a/phpstan.neon b/phpstan.neon index 56a27fd48e9..4e11774a0ed 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -552,3 +552,8 @@ parameters: - rules/Php74/Rector/LNumber/AddLiteralSeparatorToNumberRector.php - '#^Cognitive complexity for "Rector\\CodingStyle\\Naming\\NameRenamer\:\:renameNameNode\(\)" is 13, keep it under 9$#' + + - + message: '#The string value "" is repeated 6 times\. Refactor to enum to avoid typos and make clear allowed value#' + paths: + - packages/BetterPhpDocParser/PhpDocManipulator/PhpDocTagRemover.php #45 diff --git a/rules/CodeQuality/Rector/ClassMethod/DateTimeToDateTimeInterfaceRector.php b/rules/CodeQuality/Rector/ClassMethod/DateTimeToDateTimeInterfaceRector.php index 9db07b6ed32..5390d9cabcc 100644 --- a/rules/CodeQuality/Rector/ClassMethod/DateTimeToDateTimeInterfaceRector.php +++ b/rules/CodeQuality/Rector/ClassMethod/DateTimeToDateTimeInterfaceRector.php @@ -97,7 +97,10 @@ public function refactor(Node $node): ?Node { if ($node instanceof ClassMethod) { $this->refactorClassMethod($node); - return $node; + + // @see https://github.com/rectorphp/rector-src/pull/794 + // avoid duplicated ifs and returns when combined with ChangeOrIfReturnToEarlyReturnRector and ChangeAndIfToEarlyReturnRector + return null; } return $this->refactorProperty($node); diff --git a/tests/Issues/IssueEarlyReturnAndOrDatetime/Fixture/and_next_or.php.inc b/tests/Issues/IssueEarlyReturnAndOrDatetime/Fixture/and_next_or.php.inc new file mode 100644 index 00000000000..a4830d5fe18 --- /dev/null +++ b/tests/Issues/IssueEarlyReturnAndOrDatetime/Fixture/and_next_or.php.inc @@ -0,0 +1,59 @@ + $a) { + return null; + } + + $d = 1; + + return; + } +} + +?> +----- + $a) { + return null; + } + + $d = 1; + + return; + } +} + +?> diff --git a/tests/Issues/IssueEarlyReturnAndOrDatetime/IssueEarlyReturnAndOrDatetimeTest.php b/tests/Issues/IssueEarlyReturnAndOrDatetime/IssueEarlyReturnAndOrDatetimeTest.php new file mode 100644 index 00000000000..43e4d1c1786 --- /dev/null +++ b/tests/Issues/IssueEarlyReturnAndOrDatetime/IssueEarlyReturnAndOrDatetimeTest.php @@ -0,0 +1,33 @@ +doTestFileInfo($fileInfo); + } + + /** + * @return Iterator + */ + public function provideData(): Iterator + { + return $this->yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/tests/Issues/IssueEarlyReturnAndOrDatetime/config/configured_rule.php b/tests/Issues/IssueEarlyReturnAndOrDatetime/config/configured_rule.php new file mode 100644 index 00000000000..a108024bd1b --- /dev/null +++ b/tests/Issues/IssueEarlyReturnAndOrDatetime/config/configured_rule.php @@ -0,0 +1,15 @@ +services(); + $services->set(ChangeOrIfReturnToEarlyReturnRector::class); + $services->set(ChangeAndIfToEarlyReturnRector::class); + $services->set(DateTimeToDateTimeInterfaceRector::class); +};