From b641aa8039dd407d5991b07bea0d56d4be3b7ace Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Sat, 18 Nov 2017 16:48:20 +0100 Subject: [PATCH] fixup --- src/Rector/Dynamic/PropertyToMethodRector.php | 68 ++++++++++++++----- .../PropertyToMethodRector/config/rector.yml | 4 +- 2 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/Rector/Dynamic/PropertyToMethodRector.php b/src/Rector/Dynamic/PropertyToMethodRector.php index a7e0a2c4ce9..6b21d8a5380 100644 --- a/src/Rector/Dynamic/PropertyToMethodRector.php +++ b/src/Rector/Dynamic/PropertyToMethodRector.php @@ -3,11 +3,22 @@ namespace Rector\Rector\Dynamic; use PhpParser\Node; +use PhpParser\Node\Arg; +use PhpParser\Node\Expr\Assign; use PhpParser\Node\Expr\MethodCall; use PhpParser\Node\Expr\PropertyFetch; use Rector\NodeAnalyzer\PropertyFetchAnalyzer; use Rector\Rector\AbstractRector; +/** + * Example - from: + * - $result = $object->property; + * - $object->property = $value; + * + * To + * - $result = $object->getProperty(); + * - $object->setProperty($value); + */ final class PropertyToMethodRector extends AbstractRector { /** @@ -20,9 +31,9 @@ final class PropertyToMethodRector extends AbstractRector private $perClassPropertyToMethods = []; /** - * @var string[] + * @var string */ - private $activeTypes = []; + private $activeMethod; /** * @var PropertyFetchAnalyzer @@ -40,13 +51,49 @@ final class PropertyToMethodRector extends AbstractRector public function isCandidate(Node $node): bool { - if (! $node instanceof PropertyFetch) { + if (! $node instanceof Assign) { return false; } + // setter + if ($node->var instanceof PropertyFetch) { + return $this->processPropertyFetchCandidate($node->var, 'set'); + } + + // getter + if ($node->expr instanceof PropertyFetch) { + return $this->processPropertyFetchCandidate($node->expr, 'get'); + } + + return false; + } + + /** + * @param Assign $assignNode + */ + public function refactor(Node $assignNode): ?Node + { + // setter + if ($assignNode->var instanceof PropertyFetch) { + $args = [new Arg($assignNode->expr)]; + + return new MethodCall($assignNode->var->var, $this->activeMethod, $args); + } + + // getter + if ($assignNode->expr instanceof PropertyFetch) { + $assignNode->expr = new MethodCall($assignNode->expr->var, $this->activeMethod); + } + + return null; + } + + private function processPropertyFetchCandidate(PropertyFetch $propertyFetchNode, string $type): bool + { foreach ($this->perClassPropertyToMethods as $class => $propertyToMethods) { - if ($this->propertyFetchAnalyzer->isTypeAndProperties($node, $class, array_keys($propertyToMethods))) { - $this->activeTypes = $propertyToMethods[$node->name->toString()]; + $properties = array_keys($propertyToMethods); + if ($this->propertyFetchAnalyzer->isTypeAndProperties($propertyFetchNode, $class, $properties)) { + $this->activeMethod = $propertyToMethods[$propertyFetchNode->name->toString()][$type]; return true; } @@ -54,15 +101,4 @@ final class PropertyToMethodRector extends AbstractRector return false; } - - /** - * @param PropertyFetch $propertyFetchNode - */ - public function refactor(Node $propertyFetchNode): ?Node - { - return new MethodCall( - $propertyFetchNode->var, - $this->activeTypes[0] - ); - } } diff --git a/tests/Rector/Dynamic/PropertyToMethodRector/config/rector.yml b/tests/Rector/Dynamic/PropertyToMethodRector/config/rector.yml index ef467c11130..4c7af8b4cd4 100644 --- a/tests/Rector/Dynamic/PropertyToMethodRector/config/rector.yml +++ b/tests/Rector/Dynamic/PropertyToMethodRector/config/rector.yml @@ -1,4 +1,6 @@ rectors: Rector\Rector\Dynamic\PropertyToMethodRector: 'Translator': - 'locale': ['getLocale', 'setLocale'] + 'locale': + 'get': 'getLocale' + 'set': 'setLocale'