mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-06 03:10:50 +00:00
[TriggerExtractor] use ClassResolver NodeVisitor over standalone service
This commit is contained in:
parent
e67a11b587
commit
3f146d3cd1
43
packages/NodeTypeResolver/src/NodeVisitor/ClassResolver.php
Normal file
43
packages/NodeTypeResolver/src/NodeVisitor/ClassResolver.php
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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
|
||||
|
|
|
@ -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_) {
|
||||
|
|
52
src/NodeAnalyzer/ClassResolver.php
Normal file
52
src/NodeAnalyzer/ClassResolver.php
Normal 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();
|
||||
}
|
||||
}
|
|
@ -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
|
||||
{
|
||||
/**
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Reference in New Issue
Block a user