mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-11 13:42:22 +00:00
[DeprecationExtractor] add ClassDeprecation, improve regexp
This commit is contained in:
parent
594422ccb3
commit
e952b5a0cd
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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'] ?? '';
|
||||
}
|
||||
}
|
||||
|
|
|
@ -5,4 +5,4 @@ services:
|
|||
# PSR-4 autodiscovery
|
||||
Rector\DeprecationExtractor\:
|
||||
resource: '../../src'
|
||||
exclude: '../../src/{Deprecation/ClassMethodDeprecation.php}'
|
||||
exclude: '../../src/{Deprecation/*Deprecation.php}'
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue
Block a user