diff --git a/rules-tests/DeadCode/Rector/Expression/RemoveDeadStmtRector/Fixture/skip_clone_has_clone.php.inc b/rules-tests/DeadCode/Rector/Expression/RemoveDeadStmtRector/Fixture/skip_clone_has_clone.php.inc new file mode 100644 index 00000000000..2fe3ee83ed2 --- /dev/null +++ b/rules-tests/DeadCode/Rector/Expression/RemoveDeadStmtRector/Fixture/skip_clone_has_clone.php.inc @@ -0,0 +1,14 @@ +hasCloneMagicMethod($expr)) { + return [$expr]; + } + if ($this->isNestedExpr($expr)) { return $this->keepLivingCodeFromExpr($expr->expr); } @@ -110,6 +117,23 @@ private function isNestedExpr(Expr $expr): bool $expr instanceof Clone_; } + private function hasCloneMagicMethod(Clone_ $clone): bool + { + $cloneObjectType = $this->nodeTypeResolver->getType($clone->expr); + + foreach ($cloneObjectType->getObjectClassNames() as $className) { + if (! $this->reflectionProvider->hasClass($className)) { + continue; + } + + if ($this->reflectionProvider->getClass($className)->hasNativeMethod(MethodName::CLONE)) { + return true; + } + } + + return false; + } + private function isBinaryOpWithoutChange(Expr $expr): bool { if (! $expr instanceof BinaryOp) {