From 2847bf2b8fd8193fd0be0f6eebf63f8db1e13216 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Tue, 6 Aug 2019 14:23:41 +0200 Subject: [PATCH] skip serialized props --- .../Fixture/keep_serializable_object.php.inc | 19 ++++++++++ ...terOnlyPropertyAndMethodCallRectorTest.php | 1 + .../Node/Manipulator/ClassManipulator.php | 38 ++++++++++++++++++- 3 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/Fixture/keep_serializable_object.php.inc diff --git a/packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/Fixture/keep_serializable_object.php.inc b/packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/Fixture/keep_serializable_object.php.inc new file mode 100644 index 00000000000..9e5c1b084a4 --- /dev/null +++ b/packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/Fixture/keep_serializable_object.php.inc @@ -0,0 +1,19 @@ +id = $id; + } +} diff --git a/packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/RemoveSetterOnlyPropertyAndMethodCallRectorTest.php b/packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/RemoveSetterOnlyPropertyAndMethodCallRectorTest.php index 3d4984e608a..5227c5e45b4 100644 --- a/packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/RemoveSetterOnlyPropertyAndMethodCallRectorTest.php +++ b/packages/DeadCode/tests/Rector/Class_/RemoveSetterOnlyPropertyAndMethodCallRector/RemoveSetterOnlyPropertyAndMethodCallRectorTest.php @@ -14,6 +14,7 @@ final class RemoveSetterOnlyPropertyAndMethodCallRectorTest extends AbstractRect __DIR__ . '/Fixture/in_constructor.php.inc', __DIR__ . '/Fixture/keep_static_property.php.inc', __DIR__ . '/Fixture/keep_public_property.php.inc', + __DIR__ . '/Fixture/keep_serializable_object.php.inc', ]); } diff --git a/src/PhpParser/Node/Manipulator/ClassManipulator.php b/src/PhpParser/Node/Manipulator/ClassManipulator.php index 49f8ae4d26b..48d99da8417 100644 --- a/src/PhpParser/Node/Manipulator/ClassManipulator.php +++ b/src/PhpParser/Node/Manipulator/ClassManipulator.php @@ -19,6 +19,7 @@ use PhpParser\Node\Stmt\PropertyProperty; use PhpParser\Node\Stmt\Trait_; use PhpParser\Node\Stmt\TraitUse; use Rector\NodeTypeResolver\Node\AttributeKey; +use Rector\NodeTypeResolver\PhpDoc\NodeAnalyzer\DocBlockManipulator; use Rector\PhpParser\Node\BetterNodeFinder; use Rector\PhpParser\Node\Commander\NodeRemovingCommander; use Rector\PhpParser\Node\NodeFactory; @@ -58,13 +59,19 @@ final class ClassManipulator */ private $nodeRemovingCommander; + /** + * @var DocBlockManipulator + */ + private $docBlockManipulator; + public function __construct( NameResolver $nameResolver, NodeFactory $nodeFactory, ChildAndParentClassManipulator $childAndParentClassManipulator, BetterNodeFinder $betterNodeFinder, CallableNodeTraverser $callableNodeTraverser, - NodeRemovingCommander $nodeRemovingCommander + NodeRemovingCommander $nodeRemovingCommander, + DocBlockManipulator $docBlockManipulator ) { $this->nodeFactory = $nodeFactory; $this->nameResolver = $nameResolver; @@ -72,6 +79,7 @@ final class ClassManipulator $this->betterNodeFinder = $betterNodeFinder; $this->callableNodeTraverser = $callableNodeTraverser; $this->nodeRemovingCommander = $nodeRemovingCommander; + $this->docBlockManipulator = $docBlockManipulator; } public function addConstructorDependency(Class_ $classNode, VariableInfo $variableInfo): void @@ -367,7 +375,10 @@ final class ClassManipulator $propertyNonAssignNames[] = $this->nameResolver->getName($node); }); - return array_diff($privatePropertyNames, $propertyNonAssignNames); + // skip serializable properties, because they are probably used in serialization even though assign only + $serializablePropertyNames = $this->getSerializablePropertyNames($node); + + return array_diff($privatePropertyNames, $propertyNonAssignNames, $serializablePropertyNames); } /** @@ -526,4 +537,27 @@ final class ClassManipulator return $parentNode instanceof Assign && $parentNode->var === $node; } + + /** + * @return string[] + */ + private function getSerializablePropertyNames(Class_ $node): array + { + $serializablePropertyNames = []; + $this->callableNodeTraverser->traverseNodesWithCallable([$node], function (Node $node) use ( + &$serializablePropertyNames + ): void { + if (! $node instanceof Property) { + return; + } + + if (! $this->docBlockManipulator->hasTag($node, 'JMS\Serializer\Annotation\Type')) { + return; + } + + $serializablePropertyNames[] = $this->nameResolver->getName($node); + }); + + return $serializablePropertyNames; + } }