[DeprecationExtractor] add ClassDeprecation, improve regexp

This commit is contained in:
TomasVotruba 2017-09-11 15:07:38 +02:00
parent 594422ccb3
commit e952b5a0cd
6 changed files with 87 additions and 12 deletions

View File

@ -0,0 +1,36 @@
<?php declare(strict_types=1);
namespace Rector\DeprecationExtractor\Deprecation;
use Rector\DeprecationExtractor\Contract\Deprecation\DeprecationInterface;
final class ClassDeprecation implements DeprecationInterface
{
/**
* @var string
*/
private $oldClass;
/**
* @var string
*/
private $newClass;
public function __construct(string $oldClass, string $newClass)
{
$this->oldClass = $oldClass;
$this->newClass = $newClass;
}
public function getOldClass(): string
{
return $this->oldClass;
}
/**
* @return string
*/
public function getNewClass(): string
{
return $this->newClass;
}
}

View File

@ -2,12 +2,13 @@
namespace Rector\DeprecationExtractor\Deprecation;
use PhpParser\Node;
use PhpParser\Node\Arg;
final class DeprecationCollector
{
/**
* @var string[]
* @var string[]|Node[]
*/
private $deprecationMessages = [];
@ -16,9 +17,12 @@ final class DeprecationCollector
*/
private $deprecationArgNodes = [];
public function addDeprecationMessage(string $deprecationMessage): void
public function addDeprecationMessage(string $deprecationMessage, Node $node): void
{
$this->deprecationMessages[] = $deprecationMessage;
$this->deprecationMessages[] = [
'message' => $deprecationMessage,
'node' => $node
];
}
public function addDeprecationArgNode(Arg $argNode): void
@ -27,7 +31,7 @@ final class DeprecationCollector
}
/**
* @return string[]
* @return string[]|Node[]
*/
public function getDeprecationMessages(): array
{

View File

@ -60,6 +60,6 @@ final class DeprecationDetector extends NodeVisitorAbstract
private function processDocBlockDeprecation(Node $node): void
{
$deprecation = $this->docBlockAnalyzer->getAnnotationFromNode($node, 'deprecated');
$this->deprecationCollector->addDeprecationMessage($deprecation);
$this->deprecationCollector->addDeprecationMessage($deprecation, $node);
}
}

View File

@ -2,16 +2,35 @@
namespace Rector\DeprecationExtractor\Transformer;
use Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Stmt\Class_;
use Rector\DeprecationExtractor\Contract\Deprecation\DeprecationInterface;
use Rector\DeprecationExtractor\Deprecation\ClassDeprecation;
final class MessageToDeprecationTransformer
{
/**
* @todo require some context
*/
public function transform(string $message): DeprecationInterface
public function transform(string $message, Node $node): DeprecationInterface
{
dump($message);
die;
if ($node instanceof Class_) {
return new ClassDeprecation(
$node->namespacedName->toString(),
$this->determineNewClass($message)
);
}
}
/**
* Matches:
* - Use <class> instead
* - Use the <class> instead
* - Use the <class> class instead
* - use the <class> class instead
*/
private function determineNewClass(string $message): string
{
$matches = Strings::match($message, '#use( the)? (?<class>[A-Za-z\\\\]+)( class)? instead#i');
return $matches['class'] ?? '';
}
}

View File

@ -5,4 +5,4 @@ services:
# PSR-4 autodiscovery
Rector\DeprecationExtractor\:
resource: '../../src'
exclude: '../../src/{Deprecation/ClassMethodDeprecation.php}'
exclude: '../../src/{Deprecation/*Deprecation.php}'

View File

@ -2,6 +2,7 @@
namespace Rector\DeprecationExtractor\Tests\Tranformer;
use Rector\DeprecationExtractor\Deprecation\ClassDeprecation;
use Rector\DeprecationExtractor\Deprecation\DeprecationCollector;
use Rector\DeprecationExtractor\DeprecationExtractor;
use Rector\DeprecationExtractor\Transformer\MessageToDeprecationTransformer;
@ -39,5 +40,20 @@ final class MessageToDeprecationTransformerTest extends AbstractContainerAwareTe
$deprecationMessages = $this->deprecationCollector->getDeprecationMessages();
$this->assertCount(17, $deprecationMessages);
$deprecationMesssage = $deprecationMessages[0]['message'];
$relatedNode = $deprecationMessages[0]['node'];
// ↓ this will be something useful
$deprecation = $this->messageToDeprecationTransformer->transform(
$deprecationMesssage,
$relatedNode
);
/** @var ClassDeprecation $deprecation */
$this->assertInstanceOf(ClassDeprecation::class, $deprecation);
$this->assertSame('Symfony\Component\DependencyInjection\DefinitionDecorator', $deprecation->getOldClass());
$this->assertSame('Symfony\Component\DependencyInjection\ChildDefinition', $deprecation->getNewClass());
}
}