From e1188e9bffd33b902b51de71a3c2cf06ce48b9e2 Mon Sep 17 00:00:00 2001 From: Abdul Malik Ikhsan Date: Sat, 11 Jun 2022 20:58:17 +0700 Subject: [PATCH] [DeadCode] Skip has return reassign Coalesce Op on RemoveUnusedPrivatePropertyRector (#2477) * [DeadCode] Skip has return reassign Coalesce Op on RemoveUnusedPrivatePropertyRector * Fixed :tada: --- ...kip_has_return_reassign_when_empty.php.inc | 20 +++++++++++++++++++ .../NodeManipulator/ComplexNodeRemover.php | 8 +++++--- 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_has_return_reassign_when_empty.php.inc diff --git a/rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_has_return_reassign_when_empty.php.inc b/rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_has_return_reassign_when_empty.php.inc new file mode 100644 index 00000000000..c5adbf354f9 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Property/RemoveUnusedPrivatePropertyRector/Fixture/skip_has_return_reassign_when_empty.php.inc @@ -0,0 +1,20 @@ +data[$key] = $stdClass; + } + + public function execute(string $key) + { + return $this->data[$key] ??= new stdClass(); + } +} diff --git a/rules/Removing/NodeManipulator/ComplexNodeRemover.php b/rules/Removing/NodeManipulator/ComplexNodeRemover.php index 6307ad66d8a..d103683beba 100644 --- a/rules/Removing/NodeManipulator/ComplexNodeRemover.php +++ b/rules/Removing/NodeManipulator/ComplexNodeRemover.php @@ -46,11 +46,13 @@ final class ComplexNodeRemover ): bool { $propertyName = $this->nodeNameResolver->getName($property); $totalPropertyFetch = $this->propertyFetchAnalyzer->countLocalPropertyFetchName($class, $propertyName); + $expressions = []; $this->simpleCallableNodeTraverser->traverseNodesWithCallable($class->stmts, function (Node $node) use ( $removeAssignSideEffect, $propertyName, - &$totalPropertyFetch + &$totalPropertyFetch, + &$expressions ): ?Node { // here should be checked all expr like stmts that can hold assign, e.f. if, foreach etc. etc. if (! $node instanceof Expression) { @@ -93,8 +95,7 @@ final class ComplexNodeRemover } if ($totalPropertyFetch < $currentTotalPropertyFetch) { - $this->nodeRemover->removeNode($node); - return $node; + $expressions[] = $node; } return null; @@ -107,6 +108,7 @@ final class ComplexNodeRemover $this->removeConstructorDependency($class, $propertyName); + $this->nodeRemover->removeNodes($expressions); $this->nodeRemover->removeNode($property); return true;