mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-05 02:40:50 +00:00
DocBlockAnalyzer init
This commit is contained in:
parent
2dd5ef5f7b
commit
a6644b78bf
|
@ -34,9 +34,17 @@ final class DeprecationDetector extends NodeVisitorAbstract
|
|||
|
||||
public function enterNode(Node $node): void
|
||||
{
|
||||
// @todo: add @deprecate annotations as well,
|
||||
// @see https://github.com/sensiolabs-de/deprecation-detector/blob/master/src/Visitor/Deprecation/FindDeprecatedTagsVisitor.php
|
||||
if (! $this->isTriggerErrorUserDeprecated($node)) {
|
||||
// if (! $this->isTriggerErrorUserDeprecated($node)) {
|
||||
// return;
|
||||
// }
|
||||
|
||||
if (! $this->hasTriggerErrorUserDeprecatedInside($node)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
if (! $this->hasDeprecatedDocComment($node)) {
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -86,4 +94,21 @@ final class DeprecationDetector extends NodeVisitorAbstract
|
|||
|
||||
return $node->name->toString() === $name;
|
||||
}
|
||||
|
||||
/**
|
||||
* @todo extract to docblock analyzer
|
||||
* use deprecated annotation check
|
||||
* @param Node $node
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
protected function hasDeprecatedDocComment(Node $node)
|
||||
{
|
||||
try {
|
||||
$docBlock = new DocBlock((string) $node->getDocComment());
|
||||
return count($docBlock->getTagsByName('deprecated')) > 0;
|
||||
} catch (\Exception $e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
36
src/NodeAnalyzer/DocBlockAnalyzer.php
Normal file
36
src/NodeAnalyzer/DocBlockAnalyzer.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php declare(strict_types=1);
|
||||
|
||||
namespace Rector\NodeAnalyzer;
|
||||
|
||||
use PhpCsFixer\DocBlock\DocBlock;
|
||||
use PhpParser\Comment\Doc;
|
||||
use PhpParser\Node;
|
||||
|
||||
final class DocBlockAnalyzer
|
||||
{
|
||||
public function hasAnnotation(Node $node, string $annotation): bool
|
||||
{
|
||||
$docBlock = $this->createDocBlockFromNode($node);
|
||||
|
||||
return (bool) $docBlock->getAnnotationsOfType($annotation);
|
||||
}
|
||||
|
||||
public function removeAnnotationFromNode(Node $node, string $annotation): Node
|
||||
{
|
||||
$docBlock = $this->createDocBlockFromNode($node);
|
||||
|
||||
$annotations = $docBlock->getAnnotationsOfType($annotation);
|
||||
foreach ($annotations as $injectAnnotation) {
|
||||
$injectAnnotation->remove();
|
||||
}
|
||||
|
||||
$node->setDocComment(new Doc($docBlock->getContent()));
|
||||
|
||||
return $node;
|
||||
}
|
||||
|
||||
private function createDocBlockFromNode(Node $node): DocBlock
|
||||
{
|
||||
return new DocBlock($node->getDocComment());
|
||||
}
|
||||
}
|
|
@ -8,6 +8,7 @@ use PhpParser\Node;
|
|||
use PhpParser\Node\Stmt\Class_;
|
||||
use PhpParser\Node\Stmt\Property;
|
||||
use Rector\Builder\Class_\ClassPropertyCollector;
|
||||
use Rector\NodeAnalyzer\DocBlockAnalyzer;
|
||||
use Rector\Rector\Set\SetNames;
|
||||
use Rector\Node\Attribute;
|
||||
use Rector\Rector\AbstractRector;
|
||||
|
@ -24,9 +25,15 @@ final class InjectPropertyRector extends AbstractRector
|
|||
*/
|
||||
private $classPropertyCollector;
|
||||
|
||||
public function __construct(ClassPropertyCollector $classPropertyCollector)
|
||||
/**
|
||||
* @var DocBlockAnalyzer
|
||||
*/
|
||||
private $docBlockAnalyzer;
|
||||
|
||||
public function __construct(ClassPropertyCollector $classPropertyCollector, DocBlockAnalyzer $docBlockAnalyzer)
|
||||
{
|
||||
$this->classPropertyCollector = $classPropertyCollector;
|
||||
$this->docBlockAnalyzer = $docBlockAnalyzer;
|
||||
}
|
||||
|
||||
public function isCandidate(Node $node): bool
|
||||
|
@ -35,7 +42,7 @@ final class InjectPropertyRector extends AbstractRector
|
|||
return false;
|
||||
}
|
||||
|
||||
if (! $this->hasInjectAnnotation($node)) {
|
||||
if (! $this->docBlockAnalyzer->hasAnnotation($node, 'inject')) {
|
||||
return false;
|
||||
}
|
||||
|
||||
|
@ -47,12 +54,11 @@ final class InjectPropertyRector extends AbstractRector
|
|||
*/
|
||||
public function refactor(Node $propertyNode): Node
|
||||
{
|
||||
$propertyDocBlock = $this->createDocBlockFromNode($propertyNode);
|
||||
$propertyNode = $this->removeInjectAnnotationFromProperty($propertyNode, $propertyDocBlock);
|
||||
$propertyNode = $this->docBlockAnalyzer->removeAnnotationFromNode($propertyNode, 'inject');
|
||||
|
||||
$propertyNode->flags = Class_::MODIFIER_PRIVATE;
|
||||
|
||||
$this->addPropertyToCollector($propertyNode, $propertyDocBlock);
|
||||
$this->addPropertyToCollector($propertyNode);
|
||||
|
||||
return $propertyNode;
|
||||
}
|
||||
|
@ -67,32 +73,10 @@ final class InjectPropertyRector extends AbstractRector
|
|||
return 2.1;
|
||||
}
|
||||
|
||||
private function hasInjectAnnotation(Property $propertyNode): bool
|
||||
private function addPropertyToCollector(Property $propertyNode): void
|
||||
{
|
||||
$propertyDocBlock = $this->createDocBlockFromNode($propertyNode);
|
||||
$propertyDocBlock = new DocBlock($propertyNode->getDocComment());
|
||||
|
||||
return (bool) $propertyDocBlock->getAnnotationsOfType(self::ANNOTATION_INJECT);
|
||||
}
|
||||
|
||||
private function createDocBlockFromNode(Node $node): DocBlock
|
||||
{
|
||||
return new DocBlock($node->getDocComment());
|
||||
}
|
||||
|
||||
private function removeInjectAnnotationFromProperty(Property $propertyNode, DocBlock $propertyDocBlock): Property
|
||||
{
|
||||
$injectAnnotations = $propertyDocBlock->getAnnotationsOfType(self::ANNOTATION_INJECT);
|
||||
foreach ($injectAnnotations as $injectAnnotation) {
|
||||
$injectAnnotation->remove();
|
||||
}
|
||||
|
||||
$propertyNode->setDocComment(new Doc($propertyDocBlock->getContent()));
|
||||
|
||||
return $propertyNode;
|
||||
}
|
||||
|
||||
private function addPropertyToCollector(Property $propertyNode, DocBlock $propertyDocBlock): void
|
||||
{
|
||||
$propertyType = $propertyDocBlock->getAnnotationsOfType('var')[0]
|
||||
->getTypes()[0];
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user