DocBlockAnalyzer init

This commit is contained in:
TomasVotruba 2017-09-07 19:54:24 +02:00
parent 2dd5ef5f7b
commit a6644b78bf
3 changed files with 76 additions and 31 deletions

View File

@ -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;
}
}
}

View 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());
}
}

View File

@ -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];