[TriggerExtractor] use ClassResolver NodeVisitor over standalone service

This commit is contained in:
TomasVotruba 2017-09-06 18:13:48 +02:00
parent e67a11b587
commit 3f146d3cd1
6 changed files with 107 additions and 3 deletions

View File

@ -0,0 +1,43 @@
<?php declare(strict_types=1);
namespace Rector\NodeTypeResolver\NodeVisitor;
use PhpParser\Node;
use PhpParser\Node\Stmt\Property;
use PhpParser\NodeVisitorAbstract;
/**
* Add attribute 'class' with current class name.
*/
final class ClassResolver extends NodeVisitorAbstract
{
/**
* @var string
*/
private const CLASS_ATTRIBUTE = 'class';
/**
* @var string|null
*/
private $className;
/**
* @param Node[] $nodes
*/
public function beforeTraverse(array $nodes): void
{
$this->className = null;
}
public function enterNode(Node $node): void
{
// detect only first "class" to prevent anonymous classes interference
if ($this->className === null && $node instanceof Node\Stmt\Class_) {
$this->className = $node->namespacedName->toString();
}
if ($this->className) {
$node->setAttribute(self::CLASS_ATTRIBUTE, $this->className);
}
}
}

View File

@ -11,7 +11,7 @@ use PhpParser\NodeVisitorAbstract;
use Rector\TriggerExtractor\Deprecation\DeprecationCollector;
use Rector\TriggerExtractor\TriggerMessageResolver;
final class DeprecationDetector extends NodeVisitorAbstract // @todo use : class aware node visitor
final class DeprecationDetector extends NodeVisitorAbstract
{
/**
* @var DeprecationCollector

View File

@ -27,7 +27,7 @@ final class TriggerMessageResolver
if ($node instanceof Method) {
$classMethodNode = $this->findParentOfType($node, ClassMethod::class);
return $classMethodNode->name->name;
return $node->getAttribute('class') . '::' . $classMethodNode->name->name;
}
if ($node instanceof String_) {

View File

@ -0,0 +1,52 @@
<?php declare(strict_types=1);
namespace Rector\NodeAnalyzer;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
final class ClassResolver
{
/**
* @var Class_|null
*/
private $classNode;
/**
* @param Node[] $nodes
*/
public function resolveFromNodes(array $nodes): void
{
$this->classNode = null;
foreach ($nodes as $node) {
if ($node instanceof Class_) {
$this->classNode = $node;
break;
}
}
}
public function getClassName(): string
{
if ($this->classNode === null) {
return '';
}
return $this->classNode->namespacedName->toString();
}
public function getParentClassName(): string
{
if ($this->classNode === null) {
return '';
}
$parentClass = $this->classNode->extends;
/** @var Node\Name\FullyQualified $fqnParentClassName */
$fqnParentClassName = $parentClass->getAttribute('resolvedName');
return $fqnParentClassName->toString();
}
}

View File

@ -5,6 +5,10 @@ namespace Rector\Rector;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
/**
* Refactor to use @see \Rector\NodeAnalyzer\ClassResolver after
* https://github.com/symfony/symfony/issues/24111 is resolved
*/
abstract class AbstractClassAwareRector extends AbstractRector
{
/**

View File

@ -10,7 +10,11 @@ parameters:
services:
_defaults:
autowire: true
autoconfigure: true
# _instanceof:
# Rector\Rector\AbstractClassAwareRector:
# calls:
# - ['setClassResolver', ['@Rector\NodeAnalyzer\ClassResolver']]
# PSR-4 autodiscovery
Rector\:
@ -25,6 +29,7 @@ services:
- ['addNodeVisitor', ['@PhpParser\NodeVisitor\NameResolver']]
- ['addNodeVisitor', ['@Rector\NodeVisitor\NodeConnector']]
- ['addNodeVisitor', ['@Rector\NodeTypeResolver\NodeVisitor\ClassLikeTypeResolver']]
- ['addNodeVisitor', ['@Rector\NodeTypeResolver\NodeVisitor\ClassResolver']]
# 3rd party services
Symfony\Component\Console\Application: