From 92e4acb0cdc63a5c2266e66623975ec1b43299c0 Mon Sep 17 00:00:00 2001 From: johan Date: Wed, 22 Feb 2023 16:06:58 +0100 Subject: [PATCH 01/27] [CleanupUnneededNullsafeOperatorRector] Wip adding new rule fix #7781 --- .../docs/rector_rules_overview.md | 29 ++++- config/set/code-quality.php | 3 +- config/set/php80.php | 1 - ...anupUnneededNullsafeOperatorRectorTest.php | 28 +++++ .../Fixture/replace.php.inc | 41 +++++++ .../Fixture/replace_with_invalid_doc.php.inc | 47 ++++++++ .../Fixture/skip.php.inc | 20 ++++ .../config/configured_rule.php | 10 ++ .../CleanupUnneededNullsafeOperatorRector.php | 105 ++++++++++++++++++ .../TypeAnalyzer/ReturnStrictTypeAnalyzer.php | 2 +- src/ValueObject/PhpVersionFeature.php | 5 + 11 files changed, 286 insertions(+), 5 deletions(-) create mode 100644 rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php create mode 100644 rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc create mode 100644 rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc create mode 100644 rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc create mode 100644 rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php create mode 100644 rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php diff --git a/build/target-repository/docs/rector_rules_overview.md b/build/target-repository/docs/rector_rules_overview.md index 8915de87d35..52768d7dae9 100644 --- a/build/target-repository/docs/rector_rules_overview.md +++ b/build/target-repository/docs/rector_rules_overview.md @@ -1,4 +1,4 @@ -# 414 Rules Overview +# 415 Rules Overview
@@ -8,7 +8,7 @@ - [CodeQuality](#codequality) (78) -- [CodingStyle](#codingstyle) (39) +- [CodingStyle](#codingstyle) (40) - [Compatibility](#compatibility) (1) @@ -1946,6 +1946,31 @@ Type and name of catch exception should match
+### CleanupUnneededNullsafeOperatorRector + +Cleanup unneeded nullsafe operator + +- class: [`Rector\CodingStyle\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector`](../rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php) + +```diff + class HelloWorld { + public function getString(): string + { + return 'hello world'; + } + } + + public function get(): HelloWorld + { + return new HelloWorld(); + } + +-echo $this->get()?->getHelloWorld(); ++echo $this->get()->getHelloWorld(); +``` + +
+ ### ConsistentImplodeRector Changes various implode forms to consistent one diff --git a/config/set/code-quality.php b/config/set/code-quality.php index 0dbeb96a60e..7d43cd8518f 100644 --- a/config/set/code-quality.php +++ b/config/set/code-quality.php @@ -3,7 +3,6 @@ declare(strict_types=1); use Rector\CodeQuality\Rector\Array_\CallableThisArrayToAnonymousFunctionRector; - use Rector\CodeQuality\Rector\Assign\CombinedAssignRector; use Rector\CodeQuality\Rector\Assign\SplitListAssignToSeparateLineRector; use Rector\CodeQuality\Rector\BooleanAnd\SimplifyEmptyArrayCheckRector; @@ -83,6 +82,7 @@ use Rector\CodingStyle\Rector\ClassMethod\FuncGetArgsToVariadicParamRector; use Rector\CodingStyle\Rector\FuncCall\CallUserFuncToMethodCallRector; use Rector\CodingStyle\Rector\FuncCall\CountArrayToEmptyArrayComparisonRector; +use Rector\CodingStyle\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector; use Rector\Config\RectorConfig; use Rector\Php52\Rector\Property\VarToPublicPropertyRector; use Rector\Php71\Rector\FuncCall\RemoveExtraParametersRector; @@ -199,5 +199,6 @@ TernaryEmptyArrayArrayDimFetchToCoalesceRector::class, OptionalParametersAfterRequiredRector::class, SimplifyEmptyCheckOnEmptyArrayRector::class, + CleanupUnneededNullsafeOperatorRector::class, ]); }; diff --git a/config/set/php80.php b/config/set/php80.php index 7f8de75376f..a7fe67c20f8 100644 --- a/config/set/php80.php +++ b/config/set/php80.php @@ -3,7 +3,6 @@ declare(strict_types=1); use Rector\Arguments\Rector\ClassMethod\ArgumentAdderRector; - use Rector\Arguments\Rector\FuncCall\FunctionArgumentDefaultValueReplacerRector; use Rector\Arguments\ValueObject\ArgumentAdder; use Rector\Arguments\ValueObject\ReplaceFuncCallArgumentDefaultValue; diff --git a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php new file mode 100644 index 00000000000..406af628540 --- /dev/null +++ b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php @@ -0,0 +1,28 @@ +doTestFile($filePath); + } + + public static function provideData(): Iterator + { + return self::yieldFilesFromDirectory(__DIR__ . '/Fixture'); + } + + public function provideConfigFilePath(): string + { + return __DIR__ . '/config/configured_rule.php'; + } +} diff --git a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc new file mode 100644 index 00000000000..b881aa514bb --- /dev/null +++ b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc @@ -0,0 +1,41 @@ +get()?->getReplace(); + +?> +----- +get()->getReplace(); + +?> diff --git a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc new file mode 100644 index 00000000000..1e49058b1c2 --- /dev/null +++ b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc @@ -0,0 +1,47 @@ +get()?->getReplaceWithInvalidDoc(); + +?> +----- +get()->getReplaceWithInvalidDoc(); + +?> diff --git a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc new file mode 100644 index 00000000000..2910e3a9699 --- /dev/null +++ b/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc @@ -0,0 +1,20 @@ +get()?->getReplace(); + +?> diff --git a/rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php b/rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php new file mode 100644 index 00000000000..7b273257dd5 --- /dev/null +++ b/rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php @@ -0,0 +1,10 @@ +rule(CleanupUnneededNullsafeOperatorRector::class); +}; diff --git a/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php new file mode 100644 index 00000000000..c1059dc7020 --- /dev/null +++ b/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -0,0 +1,105 @@ +get()?->getHelloWorld(); +CODE_SAMPLE + , + <<<'CODE_SAMPLE' +class HelloWorld { + public function getString(): string + { + return 'hello world'; + } +} + +public function get(): HelloWorld +{ + return new HelloWorld(); +} + +echo $this->get()->getHelloWorld(); +CODE_SAMPLE + ), + ] + ); + } + + /** + * @return array> + */ + public function getNodeTypes(): array + { + return [NullsafeMethodCall::class]; + } + + /** + * @param NullsafeMethodCall $node + */ + public function refactor(Node $node): ?Node + { + if (!$node->var instanceof MethodCall) { + return null; + } + + $returnNode = $this->returnStrictTypeAnalyzer->resolveMethodCallReturnNode($node->var); + + if (null === $returnNode) { + return null; + } + + // Remove not needed Nullsafe for method call. + $node = $node->var; + + return $node; + } + + public function provideMinPhpVersion(): int + { + return PhpVersionFeature::NULLSAFE_OPERATOR; + } +} diff --git a/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php b/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php index 7346885c0f8..2bcb5e49579 100644 --- a/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php +++ b/rules/TypeDeclaration/TypeAnalyzer/ReturnStrictTypeAnalyzer.php @@ -59,7 +59,7 @@ public function collectStrictReturnTypes(array $returns): array return $this->typeNodeUnwrapper->uniquateNodes($returnedStrictTypeNodes); } - private function resolveMethodCallReturnNode(MethodCall | StaticCall | FuncCall $call): ?Node + public function resolveMethodCallReturnNode(MethodCall | StaticCall | FuncCall $call): ?Node { $methodReflection = $this->reflectionResolver->resolveFunctionLikeReflectionFromCall($call); if ($methodReflection === null) { diff --git a/src/ValueObject/PhpVersionFeature.php b/src/ValueObject/PhpVersionFeature.php index d0e71f75b5d..b8d4f356704 100644 --- a/src/ValueObject/PhpVersionFeature.php +++ b/src/ValueObject/PhpVersionFeature.php @@ -433,6 +433,11 @@ final class PhpVersionFeature */ public const STATIC_VISIBILITY_SET_STATE = PhpVersion::PHP_80; + /** + * @var int + */ + public const NULLSAFE_OPERATOR = PhpVersion::PHP_80; + /** * @var int */ From 5def683f2761b2e506ab7abb53743eae7c7e381e Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 8 May 2023 05:06:06 +0000 Subject: [PATCH 02/27] [ci-review] Rector Rectify --- .../CleanupUnneededNullsafeOperatorRector.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index c1059dc7020..2964ad93e94 100644 --- a/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -88,7 +88,7 @@ public function refactor(Node $node): ?Node $returnNode = $this->returnStrictTypeAnalyzer->resolveMethodCallReturnNode($node->var); - if (null === $returnNode) { + if (!$returnNode instanceof Node) { return null; } From 8464f3177ebb7e5bc366173893b16ea127176fbc Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 12:23:52 +0700 Subject: [PATCH 03/27] move ot CodeQuality namespace --- config/set/code-quality.php | 2 +- .../CleanupUnneededNullsafeOperatorRectorTest.php | 2 +- .../Fixture/replace.php.inc | 4 ++-- .../Fixture/replace_with_invalid_doc.php.inc | 2 +- .../Fixture/skip.php.inc | 2 +- .../config/configured_rule.php | 10 ++++++++++ .../CleanupUnneededNullsafeOperatorRector.php | 4 ++-- 7 files changed, 18 insertions(+), 8 deletions(-) rename rules-tests/{CodingStyle => CodeQuality}/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php (91%) rename rules-tests/{CodingStyle => CodeQuality}/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc (79%) rename rules-tests/{CodingStyle => CodeQuality}/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc (92%) rename rules-tests/{CodingStyle => CodeQuality}/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc (79%) create mode 100644 rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php rename rules/{CodingStyle => CodeQuality}/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php (95%) diff --git a/config/set/code-quality.php b/config/set/code-quality.php index 402dc945770..80a38211a52 100644 --- a/config/set/code-quality.php +++ b/config/set/code-quality.php @@ -81,7 +81,7 @@ use Rector\CodingStyle\Rector\ClassMethod\FuncGetArgsToVariadicParamRector; use Rector\CodingStyle\Rector\FuncCall\CallUserFuncToMethodCallRector; use Rector\CodingStyle\Rector\FuncCall\CountArrayToEmptyArrayComparisonRector; -use Rector\CodingStyle\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector; +use Rector\CodeQuality\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector; use Rector\Config\RectorConfig; use Rector\Php52\Rector\Property\VarToPublicPropertyRector; use Rector\Php71\Rector\FuncCall\RemoveExtraParametersRector; diff --git a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php similarity index 91% rename from rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php rename to rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php index 406af628540..ff96658dabd 100644 --- a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/CleanupUnneededNullsafeOperatorRectorTest.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rector\Tests\CodingStyle\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector; +namespace Rector\Tests\CodeQuality\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector; use Iterator; use PHPUnit\Framework\Attributes\DataProvider; diff --git a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc similarity index 79% rename from rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc rename to rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc index b881aa514bb..a21792f6263 100644 --- a/rules-tests/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc @@ -1,6 +1,6 @@ get()?->getReplace(); ----- rule(CleanupUnneededNullsafeOperatorRector::class); +}; diff --git a/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php similarity index 95% rename from rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php rename to rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 2964ad93e94..2f437e13df1 100644 --- a/rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -2,7 +2,7 @@ declare(strict_types=1); -namespace Rector\CodingStyle\Rector\NullsafeMethodCall; +namespace Rector\CodeQuality\Rector\NullsafeMethodCall; use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; @@ -17,7 +17,7 @@ /** * @see https://wiki.php.net/rfc/nullsafe_operator * - * @see \Rector\Tests\CodingStyle\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector\CleanupUnneededNullsafeOperatorRectorTest + * @see \Rector\Tests\CodeQuality\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector\CleanupUnneededNullsafeOperatorRectorTest */ final class CleanupUnneededNullsafeOperatorRector extends AbstractRector implements MinPhpVersionInterface { From d0b1443721c68f59135b6e53f0cdfd48bb381450 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 12:24:36 +0700 Subject: [PATCH 04/27] regenerate docs --- .../docs/rector_rules_overview.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) diff --git a/build/target-repository/docs/rector_rules_overview.md b/build/target-repository/docs/rector_rules_overview.md index 98b85fb8d1e..14d953f526c 100644 --- a/build/target-repository/docs/rector_rules_overview.md +++ b/build/target-repository/docs/rector_rules_overview.md @@ -6,9 +6,9 @@ - [Arguments](#arguments) (6) -- [CodeQuality](#codequality) (77) +- [CodeQuality](#codequality) (78) -- [CodingStyle](#codingstyle) (38) +- [CodingStyle](#codingstyle) (37) - [Compatibility](#compatibility) (1) @@ -528,6 +528,31 @@ Change `array_push()` to direct variable assign
+### CleanupUnneededNullsafeOperatorRector + +Cleanup unneeded nullsafe operator + +- class: [`Rector\CodeQuality\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector`](../rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php) + +```diff + class HelloWorld { + public function getString(): string + { + return 'hello world'; + } + } + + public function get(): HelloWorld + { + return new HelloWorld(); + } + +-echo $this->get()?->getHelloWorld(); ++echo $this->get()->getHelloWorld(); +``` + +
+ ### CombineIfRector Merges nested if statements @@ -1985,31 +2010,6 @@ Type and name of catch exception should match
-### CleanupUnneededNullsafeOperatorRector - -Cleanup unneeded nullsafe operator - -- class: [`Rector\CodingStyle\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector`](../rules/CodingStyle/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php) - -```diff - class HelloWorld { - public function getString(): string - { - return 'hello world'; - } - } - - public function get(): HelloWorld - { - return new HelloWorld(); - } - --echo $this->get()?->getHelloWorld(); -+echo $this->get()->getHelloWorld(); -``` - -
- ### ConsistentImplodeRector Changes various implode forms to consistent one From d81b056699384cfca0ab1658405088a4533ffd1c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 12:30:22 +0700 Subject: [PATCH 05/27] clean up config --- .../config/configured_rule.php | 10 ---------- 1 file changed, 10 deletions(-) delete mode 100644 rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php diff --git a/rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php b/rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php deleted file mode 100644 index 7b273257dd5..00000000000 --- a/rules-tests/Php80/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/config/configured_rule.php +++ /dev/null @@ -1,10 +0,0 @@ -rule(CleanupUnneededNullsafeOperatorRector::class); -}; From c726cd8472c5f13e7e952ed57f4e72b219635817 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 12:31:20 +0700 Subject: [PATCH 06/27] revert unrelated change --- config/set/php80.php | 1 + 1 file changed, 1 insertion(+) diff --git a/config/set/php80.php b/config/set/php80.php index a7fe67c20f8..7f8de75376f 100644 --- a/config/set/php80.php +++ b/config/set/php80.php @@ -3,6 +3,7 @@ declare(strict_types=1); use Rector\Arguments\Rector\ClassMethod\ArgumentAdderRector; + use Rector\Arguments\Rector\FuncCall\FunctionArgumentDefaultValueReplacerRector; use Rector\Arguments\ValueObject\ArgumentAdder; use Rector\Arguments\ValueObject\ReplaceFuncCallArgumentDefaultValue; From 376666f8310e937dbdc0aeccd1e887b1036ca8e9 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 13:27:37 +0700 Subject: [PATCH 07/27] fix namespace --- .../Fixture/replace_with_invalid_doc.php.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc index 208136412b0..3b0901fca8b 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc @@ -24,7 +24,7 @@ echo $this->get()?->getReplaceWithInvalidDoc(); ----- Date: Mon, 8 May 2023 13:29:21 +0700 Subject: [PATCH 08/27] CS fix --- .../CleanupUnneededNullsafeOperatorRector.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 2f437e13df1..818d8faeb0f 100644 --- a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -23,8 +23,7 @@ final class CleanupUnneededNullsafeOperatorRector extends AbstractRector impleme { public function __construct( private readonly ReturnStrictTypeAnalyzer $returnStrictTypeAnalyzer, - ) - { + ) { } public function getRuleDefinition(): RuleDefinition @@ -82,13 +81,13 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if (!$node->var instanceof MethodCall) { + if (! $node->var instanceof MethodCall) { return null; } $returnNode = $this->returnStrictTypeAnalyzer->resolveMethodCallReturnNode($node->var); - if (!$returnNode instanceof Node) { + if (! $returnNode instanceof Node) { return null; } From 653e30ace16e5a7aa9ffbfc015cd80b7afb650c6 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:36:01 +0700 Subject: [PATCH 09/27] debugging --- .../NodeTypeResolver/VariableTypeResolver.php | 36 +++++++++++++++++-- 1 file changed, 34 insertions(+), 2 deletions(-) diff --git a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php index 1d5b4843d48..80fcad32e70 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php @@ -6,13 +6,19 @@ use PhpParser\Node; use PhpParser\Node\Expr\Variable; +use PhpParser\Node\Stmt\Class_; use PHPStan\Analyser\Scope; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; +use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; use Rector\NodeTypeResolver\Node\AttributeKey; +use PHPStan\Reflection\ReflectionProvider; +use Rector\Core\Reflection\ReflectionResolver; +use PHPStan\Reflection\ClassReflection; +use Symfony\Contracts\Service\Attribute\Required; /** * @see \Rector\Tests\NodeTypeResolver\PerNodeTypeResolver\VariableTypeResolver\VariableTypeResolverTest @@ -21,12 +27,21 @@ */ final class VariableTypeResolver implements NodeTypeResolverInterface { + private readonly ReflectionResolver $reflectionResolver; + public function __construct( private readonly NodeNameResolver $nodeNameResolver, - private readonly PhpDocInfoFactory $phpDocInfoFactory + private readonly PhpDocInfoFactory $phpDocInfoFactory, ) { } + #[Required] + public function autowire( + ReflectionResolver $reflectionResolver, + ): void { + $this->reflectionResolver = $reflectionResolver; + } + /** * @return array> */ @@ -52,7 +67,24 @@ public function resolve(Node $node): Type // get from annotation $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); - return $phpDocInfo->getVarType(); + $varType = $phpDocInfo->getVarType(); + + if (! $varType instanceof MixedType) { + return $varType; + } + + if ($variableName === 'this') { + $classReflection = $this->reflectionResolver->resolveClassReflection($node); + dump($classReflection); + if (! $classReflection instanceof ClassReflection) { + dump('here'); + return $varType; + } + + return new \PHPStan\Type\ThisType($classReflection); + } + + return $varType; } private function resolveTypesFromScope(Variable $variable, string $variableName): Type From 2734dee8847f0e9229ffabe4f1f3f8d4e1830b1a Mon Sep 17 00:00:00 2001 From: GitHub Action Date: Mon, 8 May 2023 08:38:26 +0000 Subject: [PATCH 10/27] [ci-review] Rector Rectify --- .../NodeTypeResolver/VariableTypeResolver.php | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php index 80fcad32e70..40f269abc6c 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php @@ -4,18 +4,16 @@ namespace Rector\NodeTypeResolver\NodeTypeResolver; +use PHPStan\Type\ThisType; use PhpParser\Node; use PhpParser\Node\Expr\Variable; -use PhpParser\Node\Stmt\Class_; use PHPStan\Analyser\Scope; use PHPStan\Type\MixedType; use PHPStan\Type\Type; use Rector\BetterPhpDocParser\PhpDocInfo\PhpDocInfoFactory; -use Rector\Core\PhpParser\Node\BetterNodeFinder; use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; use Rector\NodeTypeResolver\Node\AttributeKey; -use PHPStan\Reflection\ReflectionProvider; use Rector\Core\Reflection\ReflectionResolver; use PHPStan\Reflection\ClassReflection; use Symfony\Contracts\Service\Attribute\Required; @@ -81,7 +79,7 @@ public function resolve(Node $node): Type return $varType; } - return new \PHPStan\Type\ThisType($classReflection); + return new ThisType($classReflection); } return $varType; From bef9ae579ec7bdf86fb4804e56bf8d1fdb3fbafb Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:41:55 +0700 Subject: [PATCH 11/27] use direct on function --- .../NodeTypeResolver/VariableTypeResolver.php | 34 ++----------------- .../Fixture/replace.php.inc | 4 +-- .../Fixture/replace_with_invalid_doc.php.inc | 4 +-- 3 files changed, 6 insertions(+), 36 deletions(-) diff --git a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php index 40f269abc6c..1d5b4843d48 100644 --- a/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php +++ b/packages/NodeTypeResolver/NodeTypeResolver/VariableTypeResolver.php @@ -4,7 +4,6 @@ namespace Rector\NodeTypeResolver\NodeTypeResolver; -use PHPStan\Type\ThisType; use PhpParser\Node; use PhpParser\Node\Expr\Variable; use PHPStan\Analyser\Scope; @@ -14,9 +13,6 @@ use Rector\NodeNameResolver\NodeNameResolver; use Rector\NodeTypeResolver\Contract\NodeTypeResolverInterface; use Rector\NodeTypeResolver\Node\AttributeKey; -use Rector\Core\Reflection\ReflectionResolver; -use PHPStan\Reflection\ClassReflection; -use Symfony\Contracts\Service\Attribute\Required; /** * @see \Rector\Tests\NodeTypeResolver\PerNodeTypeResolver\VariableTypeResolver\VariableTypeResolverTest @@ -25,21 +21,12 @@ */ final class VariableTypeResolver implements NodeTypeResolverInterface { - private readonly ReflectionResolver $reflectionResolver; - public function __construct( private readonly NodeNameResolver $nodeNameResolver, - private readonly PhpDocInfoFactory $phpDocInfoFactory, + private readonly PhpDocInfoFactory $phpDocInfoFactory ) { } - #[Required] - public function autowire( - ReflectionResolver $reflectionResolver, - ): void { - $this->reflectionResolver = $reflectionResolver; - } - /** * @return array> */ @@ -65,24 +52,7 @@ public function resolve(Node $node): Type // get from annotation $phpDocInfo = $this->phpDocInfoFactory->createFromNodeOrEmpty($node); - $varType = $phpDocInfo->getVarType(); - - if (! $varType instanceof MixedType) { - return $varType; - } - - if ($variableName === 'this') { - $classReflection = $this->reflectionResolver->resolveClassReflection($node); - dump($classReflection); - if (! $classReflection instanceof ClassReflection) { - dump('here'); - return $varType; - } - - return new ThisType($classReflection); - } - - return $varType; + return $phpDocInfo->getVarType(); } private function resolveTypesFromScope(Variable $variable, string $variableName): Type diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc index a21792f6263..4ccded4ed63 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc @@ -15,7 +15,7 @@ function get(): Replace return new Replace(); } -echo $this->get()?->getReplace(); +echo get()?->getReplace(); ?> ----- @@ -36,6 +36,6 @@ function get(): Replace return new Replace(); } -echo $this->get()->getReplace(); +echo get()->getReplace(); ?> diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc index 3b0901fca8b..e9b63e06a78 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc @@ -18,7 +18,7 @@ function get(): ReplaceWithInvalidDoc return new ReplaceWithInvalidDoc(); } -echo $this->get()?->getReplaceWithInvalidDoc(); +echo get()?->getReplaceWithInvalidDoc(); ?> ----- @@ -42,6 +42,6 @@ function get(): ReplaceWithInvalidDoc return new ReplaceWithInvalidDoc(); } -echo $this->get()->getReplaceWithInvalidDoc(); +echo get()->getReplaceWithInvalidDoc(); ?> From c1d3d2f62adcfb3ca3f45857555d5b7653082de4 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:43:13 +0700 Subject: [PATCH 12/27] use direct on function --- .../CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc index 526b1004577..80fe5f715ff 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc @@ -15,6 +15,6 @@ function get(): ?Replace return new Replace(); } -echo $this->get()?->getReplace(); +echo get()?->getReplace(); ?> From 0b91bbe3ed257a4e555f9173a86c871e02d0c776 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:44:19 +0700 Subject: [PATCH 13/27] use direct on function --- .../CleanupUnneededNullsafeOperatorRector.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 818d8faeb0f..7d3302187ec 100644 --- a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -45,7 +45,7 @@ public function get(): HelloWorld return new HelloWorld(); } -echo $this->get()?->getHelloWorld(); +echo get()?->getHelloWorld(); CODE_SAMPLE , <<<'CODE_SAMPLE' @@ -61,7 +61,7 @@ public function get(): HelloWorld return new HelloWorld(); } -echo $this->get()->getHelloWorld(); +echo get()->getHelloWorld(); CODE_SAMPLE ), ] From 6be77c8da1cbfa8265b3bda6a5353285d8681239 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:44:26 +0700 Subject: [PATCH 14/27] use direct on function --- build/target-repository/docs/rector_rules_overview.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/build/target-repository/docs/rector_rules_overview.md b/build/target-repository/docs/rector_rules_overview.md index 14d953f526c..2da79c9540f 100644 --- a/build/target-repository/docs/rector_rules_overview.md +++ b/build/target-repository/docs/rector_rules_overview.md @@ -547,8 +547,8 @@ Cleanup unneeded nullsafe operator return new HelloWorld(); } --echo $this->get()?->getHelloWorld(); -+echo $this->get()->getHelloWorld(); +-echo get()?->getHelloWorld(); ++echo get()->getHelloWorld(); ```
From 69e4dad5c583704acff0a51562f0a5c751d4f12a Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:45:36 +0700 Subject: [PATCH 15/27] use direct on function --- build/target-repository/docs/rector_rules_overview.md | 2 +- .../CleanupUnneededNullsafeOperatorRector.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/build/target-repository/docs/rector_rules_overview.md b/build/target-repository/docs/rector_rules_overview.md index 2da79c9540f..355ece0ab6f 100644 --- a/build/target-repository/docs/rector_rules_overview.md +++ b/build/target-repository/docs/rector_rules_overview.md @@ -542,7 +542,7 @@ Cleanup unneeded nullsafe operator } } - public function get(): HelloWorld + function get(): HelloWorld { return new HelloWorld(); } diff --git a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 7d3302187ec..7830c6afa3d 100644 --- a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -40,7 +40,7 @@ public function getString(): string } } -public function get(): HelloWorld +function get(): HelloWorld { return new HelloWorld(); } @@ -56,7 +56,7 @@ public function getString(): string } } -public function get(): HelloWorld +function get(): HelloWorld { return new HelloWorld(); } From 8a0cd1b66e88d425231ac9ba9cc35bf0517e390f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:48:48 +0700 Subject: [PATCH 16/27] fixing fixutre --- .../Fixture/replace.php.inc | 4 ++-- .../Fixture/replace_with_invalid_doc.php.inc | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc index 4ccded4ed63..01a7155b5e6 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace.php.inc @@ -15,7 +15,7 @@ function get(): Replace return new Replace(); } -echo get()?->getReplace(); +echo get()?->getString(); ?> ----- @@ -36,6 +36,6 @@ function get(): Replace return new Replace(); } -echo get()->getReplace(); +echo get()->getString(); ?> diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc index e9b63e06a78..dc5aaef5838 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_with_invalid_doc.php.inc @@ -18,7 +18,7 @@ function get(): ReplaceWithInvalidDoc return new ReplaceWithInvalidDoc(); } -echo get()?->getReplaceWithInvalidDoc(); +echo get()?->getString(); ?> ----- @@ -42,6 +42,6 @@ function get(): ReplaceWithInvalidDoc return new ReplaceWithInvalidDoc(); } -echo get()->getReplaceWithInvalidDoc(); +echo get()->getString(); ?> From e4cd73022c4ff6570d5bef2f2bd05dc413c3b66c Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:53:48 +0700 Subject: [PATCH 17/27] fixing --- .../Fixture/skip.php.inc | 4 ++-- .../CleanupUnneededNullsafeOperatorRector.php | 8 +++----- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc index 80fe5f715ff..c1f1ffa6075 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc @@ -12,9 +12,9 @@ class Skip function get(): ?Replace { - return new Replace(); + return (rand(0, 1)) ? new Replace() : null; } -echo get()?->getReplace(); +echo get()?->getString(); ?> diff --git a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 7830c6afa3d..1c78982be51 100644 --- a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -7,6 +7,7 @@ use PhpParser\Node; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\NullsafeMethodCall; +use PhpParser\Node\Identifier; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; use Rector\TypeDeclaration\TypeAnalyzer\ReturnStrictTypeAnalyzer; @@ -81,7 +82,7 @@ public function getNodeTypes(): array */ public function refactor(Node $node): ?Node { - if (! $node->var instanceof MethodCall) { + if (! $node->name instanceof Identifier) { return null; } @@ -91,10 +92,7 @@ public function refactor(Node $node): ?Node return null; } - // Remove not needed Nullsafe for method call. - $node = $node->var; - - return $node; + return new MethodCall($node->var, $node->name, $node->args); } public function provideMinPhpVersion(): int From 3d96710d297b8354b8689d68e1bb2fd60bda9c1f Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 15:56:59 +0700 Subject: [PATCH 18/27] skip nullable --- .../Fixture/skip.php.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc index c1f1ffa6075..3faf89a876c 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc @@ -2,7 +2,7 @@ namespace Rector\Tests\CodeQuality\Rector\NullsafeMethodCall\CleanupUnneededNullsafeOperatorRector\Fixture; -class Skip +class SkipNullable { public function getString(): string { @@ -10,11 +10,11 @@ class Skip } } -function get(): ?Replace +function run(): ?SkipNullable { - return (rand(0, 1)) ? new Replace() : null; + return (rand(0, 1)) ? new SkipNullable() : null; } -echo get()?->getString(); +echo run()?->getString(); ?> From 1b30f72ae265c39bf1dd4069ed6b9e5ec5e3aa98 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:00:09 +0700 Subject: [PATCH 19/27] Fix --- .../CleanupUnneededNullsafeOperatorRector.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 1c78982be51..53556553c55 100644 --- a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -10,6 +10,7 @@ use PhpParser\Node\Identifier; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; +use Rector\StaticTypeMapper\ValueObject\Type\FullyQualifiedObjectType; use Rector\TypeDeclaration\TypeAnalyzer\ReturnStrictTypeAnalyzer; use Rector\VersionBonding\Contract\MinPhpVersionInterface; use Symplify\RuleDocGenerator\ValueObject\CodeSample\CodeSample; @@ -92,6 +93,11 @@ public function refactor(Node $node): ?Node return null; } + $type = $this->getType($returnNode); + if (! $type instanceof FullyQualifiedObjectType) { + return null; + } + return new MethodCall($node->var, $node->name, $node->args); } From f11a7fb65c97f2549fc775b92806b76001711734 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:01:15 +0700 Subject: [PATCH 20/27] Fix --- build/target-repository/docs/rector_rules_overview.md | 4 ++-- .../CleanupUnneededNullsafeOperatorRector.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build/target-repository/docs/rector_rules_overview.md b/build/target-repository/docs/rector_rules_overview.md index 355ece0ab6f..e29b393904e 100644 --- a/build/target-repository/docs/rector_rules_overview.md +++ b/build/target-repository/docs/rector_rules_overview.md @@ -547,8 +547,8 @@ Cleanup unneeded nullsafe operator return new HelloWorld(); } --echo get()?->getHelloWorld(); -+echo get()->getHelloWorld(); +-echo get()?->getString(); ++echo get()->getString(); ```
diff --git a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 53556553c55..8e90e43cc3c 100644 --- a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -47,7 +47,7 @@ function get(): HelloWorld return new HelloWorld(); } -echo get()?->getHelloWorld(); +echo get()?->getString(); CODE_SAMPLE , <<<'CODE_SAMPLE' @@ -63,7 +63,7 @@ function get(): HelloWorld return new HelloWorld(); } -echo get()->getHelloWorld(); +echo get()->getString(); CODE_SAMPLE ), ] From f9c730e368a349712bb7042df308ba694be35936 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:02:32 +0700 Subject: [PATCH 21/27] rename fixture --- .../Fixture/{skip.php.inc => skip_nullable.php.inc} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/{skip.php.inc => skip_nullable.php.inc} (100%) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip_nullable.php.inc similarity index 100% rename from rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip.php.inc rename to rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/skip_nullable.php.inc From b27719257b5799c73d721f0e3d74815c8c5dbac0 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:04:18 +0700 Subject: [PATCH 22/27] more fixture --- .../Fixture/replace_on_method_call.php.inc | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) create mode 100644 rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc new file mode 100644 index 00000000000..c4a4a338864 --- /dev/null +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc @@ -0,0 +1,41 @@ +get()?->getString(); + +?> +----- +get()->getString(); + +?> From 0633db3876bff0d135c4b9be69be3d4e884a2153 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:04:54 +0700 Subject: [PATCH 23/27] fix --- .../Fixture/replace_on_method_call.php.inc | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc index c4a4a338864..013d004ec3c 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc @@ -9,6 +9,9 @@ class ReplaceOnMethodCall return 'hello world'; } + /** + * @return InvalidReturn + */ public function get(): Replace { return new Replace(); @@ -30,6 +33,9 @@ class ReplaceOnMethodCall return 'hello world'; } + /** + * @return InvalidReturn + */ public function get(): Replace { return new Replace(); From e5426cb83265e50e45d174d59a609bfd3fb132c2 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:06:17 +0700 Subject: [PATCH 24/27] rename fixture --- .../Fixture/replace_on_method_call.php.inc | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc index 013d004ec3c..c66da0405c8 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc @@ -4,7 +4,7 @@ namespace Rector\Tests\CodeQuality\Rector\NullsafeMethodCall\CleanupUnneededNull class ReplaceOnMethodCall { - public function getString(): string + public function getString2(): string { return 'hello world'; } @@ -12,13 +12,13 @@ class ReplaceOnMethodCall /** * @return InvalidReturn */ - public function get(): Replace + public function get2(): Replace { return new Replace(); } } -(new ReplaceOnMethodCall())->get()?->getString(); +(new ReplaceOnMethodCall())->get2()?->getString2(); ?> ----- @@ -28,7 +28,7 @@ namespace Rector\Tests\CodeQuality\Rector\NullsafeMethodCall\CleanupUnneededNull class ReplaceOnMethodCall { - public function getString(): string + public function getString2(): string { return 'hello world'; } @@ -36,12 +36,12 @@ class ReplaceOnMethodCall /** * @return InvalidReturn */ - public function get(): Replace + public function get2(): Replace { return new Replace(); } } -(new ReplaceOnMethodCall())->get()->getString(); +(new ReplaceOnMethodCall())->get2()?->getString2(); ?> From 0ee92a2a3efe19513411be8c5806373a32d6eba7 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:06:33 +0700 Subject: [PATCH 25/27] rename fixture --- .../Fixture/replace_on_method_call.php.inc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc index c66da0405c8..706a762a937 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc @@ -42,6 +42,6 @@ class ReplaceOnMethodCall } } -(new ReplaceOnMethodCall())->get2()?->getString2(); +(new ReplaceOnMethodCall())->get2()->getString2(); ?> From e8bd8adde14470ae8a8a090be94f3ed7eecde033 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:08:06 +0700 Subject: [PATCH 26/27] fix --- .../Fixture/replace_on_method_call.php.inc | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc index 706a762a937..ed0e4088803 100644 --- a/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc +++ b/rules-tests/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector/Fixture/replace_on_method_call.php.inc @@ -12,9 +12,9 @@ class ReplaceOnMethodCall /** * @return InvalidReturn */ - public function get2(): Replace + public function get2(): ReplaceOnMethodCall { - return new Replace(); + return new ReplaceOnMethodCall(); } } @@ -36,9 +36,9 @@ class ReplaceOnMethodCall /** * @return InvalidReturn */ - public function get2(): Replace + public function get2(): ReplaceOnMethodCall { - return new Replace(); + return new ReplaceOnMethodCall(); } } From b2788956ff741cd016c1fd9590f07f843370e352 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Mon, 8 May 2023 16:11:05 +0700 Subject: [PATCH 27/27] Fix --- .../CleanupUnneededNullsafeOperatorRector.php | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php index 8e90e43cc3c..146a73a86e2 100644 --- a/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php +++ b/rules/CodeQuality/Rector/NullsafeMethodCall/CleanupUnneededNullsafeOperatorRector.php @@ -5,8 +5,10 @@ namespace Rector\CodeQuality\Rector\NullsafeMethodCall; use PhpParser\Node; +use PhpParser\Node\Expr\FuncCall; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\NullsafeMethodCall; +use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Identifier; use Rector\Core\Rector\AbstractRector; use Rector\Core\ValueObject\PhpVersionFeature; @@ -87,6 +89,10 @@ public function refactor(Node $node): ?Node return null; } + if (! $node->var instanceof FuncCall && ! $node->var instanceof MethodCall && ! $node->var instanceof StaticCall) { + return null; + } + $returnNode = $this->returnStrictTypeAnalyzer->resolveMethodCallReturnNode($node->var); if (! $returnNode instanceof Node) {