This commit is contained in:
TomasVotruba 2017-09-07 04:43:25 +02:00
parent cce616b641
commit dc21104bf5
6 changed files with 22 additions and 42 deletions

View File

@ -4,7 +4,9 @@ namespace Rector\NodeTypeResolver\NodeVisitor;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\ClassLike;
use PhpParser\NodeVisitorAbstract;
use Rector\Node\Attribute;
/**
* Add attribute 'class' with current class name.
@ -12,17 +14,7 @@ use PhpParser\NodeVisitorAbstract;
final class ClassResolver extends NodeVisitorAbstract
{
/**
* @var string
*/
private const CLASS_ATTRIBUTE = 'class';
/**
* @var string
*/
private const CLASS_NODE_ATTRIBUTE = 'class_node';
/**
* @var Class_|null
* @var ClassLike|null
*/
private $classNode;
@ -36,14 +28,19 @@ final class ClassResolver extends NodeVisitorAbstract
public function enterNode(Node $node): void
{
// detect only first "class" to prevent anonymous classes interference
if ($this->classNode === null && $node instanceof Class_) {
// detect only first ClassLike elemetn
if ($this->classNode === null && $node instanceof ClassLike) {
// skip possible anonymous classes
if ($node instanceof Class_ && $node->isAnonymous()) {
return;
}
$this->classNode = $node;
}
if ($this->classNode) {
$node->setAttribute(self::CLASS_NODE_ATTRIBUTE, $this->classNode);
$node->setAttribute(self::CLASS_ATTRIBUTE, $this->classNode->namespacedName->toString());
$node->setAttribute(Attribute::CLASS_NODE, $this->classNode);
$node->setAttribute(Attribute::CLASS_NAME, $this->classNode->namespacedName->toString());
}
}
}

View File

@ -56,7 +56,7 @@ final class TypeContext
$this->classProperties = [];
$this->classLikeNode = $classLikeNode;
if ($classLikeNode instanceof Class_) {
if ($classLikeNode instanceof Class_ && ! $classLikeNode->isAnonymous()) {
$this->classProperties = $this->constructorPropertyTypesExtractor->extractFromClassNode($classLikeNode);
}
}

View File

@ -46,7 +46,7 @@ final class PropertyToClassAdder extends NodeVisitorAbstract
public function afterTraverse(array $nodes): array
{
foreach ($nodes as $key => $node) {
if ($node instanceof Class_) {
if ($node instanceof Class_ && ! $node->isAnonymous()) {
$nodes[$key] = $this->processClass($node, (string) $node->name);
break;
}

View File

@ -11,7 +11,7 @@ abstract class AbstractChangeParentClassRector extends AbstractRector
{
public function isCandidate(Node $node): bool
{
if (! $node instanceof Class_ || $node->extends === null) {
if (! $node instanceof Class_ || $node->extends === null || $node->isAnonymous()) {
return false;
}

View File

@ -9,6 +9,7 @@ use PhpParser\Node\Stmt\Class_;
use PhpParser\Node\Stmt\Property;
use Rector\Builder\Class_\ClassPropertyCollector;
use Rector\Deprecation\SetNames;
use Rector\Node\Attribute;
use Rector\Rector\AbstractRector;
final class InjectPropertyRector extends AbstractRector
@ -23,33 +24,11 @@ final class InjectPropertyRector extends AbstractRector
*/
private $classPropertyCollector;
/**
* @var string
*/
private $className;
public function __construct(ClassPropertyCollector $classPropertyCollector)
{
$this->classPropertyCollector = $classPropertyCollector;
}
/**
* @param Node[] $nodes
* @return null|Node[]
*/
public function beforeTraverse(array $nodes): ?array
{
$this->className = null;
foreach ($nodes as $node) {
if ($node instanceof Class_) {
$this->className = (string) $node->name;
}
}
return null;
}
public function isCandidate(Node $node): bool
{
if (! $node instanceof Property) {
@ -119,6 +98,10 @@ final class InjectPropertyRector extends AbstractRector
$propertyName = (string) $propertyNode->props[0]->name;
$this->classPropertyCollector->addPropertyForClass($this->className, $propertyType, $propertyName);
$this->classPropertyCollector->addPropertyForClass(
(string) $propertyNode->getAttribute(Attribute::CLASS_NAME),
$propertyType,
$propertyName
);
}
}

View File

@ -54,7 +54,7 @@ final class NetteObjectToSmartTraitRector extends AbstractRector
public function isCandidate(Node $node): bool
{
if (! $node instanceof Class_ || $node->extends === null) {
if (! $node instanceof Class_ || $node->extends === null || $node->isAnonymous()) {
return false;
}