ClassReplacerRector - respect use statments import

This commit is contained in:
TomasVotruba 2017-10-26 12:42:56 +02:00
parent 6517150502
commit 2ee2049cf1
4 changed files with 84 additions and 10 deletions

View File

@ -38,9 +38,9 @@ final class ClassReplacerRector extends AbstractRector
return false;
}
$name = $this->resolveNameFromNode($node);
$nameNode = $this->resolveNameNodeFromNode($node);
return isset($this->oldToNewClasses[$name]);
return isset($this->oldToNewClasses[$nameNode->toString()]);
}
/**
@ -50,8 +50,9 @@ final class ClassReplacerRector extends AbstractRector
{
if ($node instanceof Name) {
$newName = $this->resolveNewNameFromNode($node);
$newNameNode = new Name($newName);
return new FullyQualified($newName);
return new Name($newNameNode->getLast());
}
if ($node instanceof Use_) {
@ -60,6 +61,10 @@ final class ClassReplacerRector extends AbstractRector
if ($this->namespaceAnalyzer->isUseStatmenetAlreadyPresent($node, $newName)) {
$this->shouldRemoveNode = true;
}
$node->uses[0]->name = new Name($newName);
return $node;
}
return null;
@ -67,27 +72,27 @@ final class ClassReplacerRector extends AbstractRector
private function resolveNewNameFromNode(Node $node): string
{
$name = $this->resolveNameFromNode($node);
$nameNode = $this->resolveNameNodeFromNode($node);
return $this->oldToNewClasses[$name];
return $this->oldToNewClasses[$nameNode->toString()];
}
private function resolveNameFromNode(Node $node): string
private function resolveNameNodeFromNode(Node $node): ?Name
{
if ($node instanceof Name) {
// resolved name has priority, as it is FQN
$resolvedName = $node->getAttribute(Attribute::RESOLVED_NAME);
if ($resolvedName instanceof FullyQualified) {
return $resolvedName->toString();
return $resolvedName;
}
return $node->toString();
return $node;
}
if ($node instanceof Use_) {
return $node->uses[0]->name->toString();
return $node->uses[0]->name;
}
return '';
return null;
}
}

View File

@ -1,3 +1,4 @@
rectors:
Rector\Rector\Dynamic\ClassReplacerRector:
OldClass: NewClass
'PhpParser\BuilderAbstract': 'PhpParser\Builder\Declaration'

View File

@ -0,0 +1,34 @@
<?php
namespace Roave\BetterReflection\SourceLocator\Reflection;
use PhpParser\Builder\Class_;
use PhpParser\Builder\Interface_;
use PhpParser\Builder\Method;
use PhpParser\Builder\Property;
use PhpParser\Builder\Trait_;
use PhpParser\Builder\Declaration;
use PhpParser\Comment\Doc;
use ReflectionClass as CoreReflectionClass;
use ReflectionMethod as CoreReflectionMethod;
use ReflectionProperty as CoreReflectionProperty;
use Reflector as CoreReflector;
/**
* Function that generates a stub source from a given reflection instance.
*
* @internal
*/
final class SourceStubber
{
/**
* @param Class_|Interface_|Trait_|Method|Property $node
* @param CoreReflectionClass|CoreReflectionMethod|CoreReflectionProperty $reflection
*/
private function addDocComment(Declaration $node, CoreReflector $reflection): void
{
if (false !== $reflection->getDocComment()) {
$node->setDocComment(new Doc($reflection->getDocComment()));
}
}
}

View File

@ -0,0 +1,34 @@
<?php
namespace Roave\BetterReflection\SourceLocator\Reflection;
use PhpParser\Builder\Class_;
use PhpParser\Builder\Interface_;
use PhpParser\Builder\Method;
use PhpParser\Builder\Property;
use PhpParser\Builder\Trait_;
use PhpParser\BuilderAbstract;
use PhpParser\Comment\Doc;
use ReflectionClass as CoreReflectionClass;
use ReflectionMethod as CoreReflectionMethod;
use ReflectionProperty as CoreReflectionProperty;
use Reflector as CoreReflector;
/**
* Function that generates a stub source from a given reflection instance.
*
* @internal
*/
final class SourceStubber
{
/**
* @param Class_|Interface_|Trait_|Method|Property $node
* @param CoreReflectionClass|CoreReflectionMethod|CoreReflectionProperty $reflection
*/
private function addDocComment(BuilderAbstract $node, CoreReflector $reflection): void
{
if (false !== $reflection->getDocComment()) {
$node->setDocComment(new Doc($reflection->getDocComment()));
}
}
}