This commit is contained in:
TomasVotruba 2017-11-18 16:48:20 +01:00
parent 351be9264c
commit b641aa8039
2 changed files with 55 additions and 17 deletions

View File

@ -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]
);
}
}

View File

@ -1,4 +1,6 @@
rectors:
Rector\Rector\Dynamic\PropertyToMethodRector:
'Translator':
'locale': ['getLocale', 'setLocale']
'locale':
'get': 'getLocale'
'set': 'setLocale'