mirror of
https://github.com/rectorphp/rector.git
synced 2024-06-01 00:40:52 +00:00
decouple ServiceFromKernelResolver
This commit is contained in:
parent
222557c122
commit
94daf88807
29
src/Builder/Kernel/ServiceFromKernelResolver.php
Normal file
29
src/Builder/Kernel/ServiceFromKernelResolver.php
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?php declare(strict_types=1);
|
||||||
|
|
||||||
|
namespace Rector\Builder\Kernel;
|
||||||
|
|
||||||
|
use Symfony\Component\HttpKernel\Kernel;
|
||||||
|
|
||||||
|
final class ServiceFromKernelResolver
|
||||||
|
{
|
||||||
|
public function resolveServiceClassByNameFromKernel(string $serviceName, string $kernelClass): ?string
|
||||||
|
{
|
||||||
|
/** @var Kernel $kernel */
|
||||||
|
$kernel = new $kernelClass('dev', true);
|
||||||
|
$kernel->boot();
|
||||||
|
|
||||||
|
// @todo: cache
|
||||||
|
// @todo: initialize without creating cache or log directory
|
||||||
|
// @todo: call only loadBundles() and initializeContainer() methods
|
||||||
|
|
||||||
|
$container = $kernel->getContainer();
|
||||||
|
if (! $container->has($serviceName)) {
|
||||||
|
// service name could not be found
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
$service = $container->get($serviceName);
|
||||||
|
|
||||||
|
return get_class($service);
|
||||||
|
}
|
||||||
|
}
|
|
@ -13,11 +13,10 @@ use PhpParser\Node\Stmt\Class_;
|
||||||
use PhpParser\Node\Stmt\ClassMethod;
|
use PhpParser\Node\Stmt\ClassMethod;
|
||||||
use PhpParser\NodeVisitorAbstract;
|
use PhpParser\NodeVisitorAbstract;
|
||||||
use Rector\Builder\ConstructorMethodBuilder;
|
use Rector\Builder\ConstructorMethodBuilder;
|
||||||
|
use Rector\Builder\Kernel\ServiceFromKernelResolver;
|
||||||
use Rector\Builder\Naming\NameResolver;
|
use Rector\Builder\Naming\NameResolver;
|
||||||
use Rector\Builder\PropertyBuilder;
|
use Rector\Builder\PropertyBuilder;
|
||||||
use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel;
|
use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel;
|
||||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
|
||||||
use Symfony\Component\HttpKernel\Kernel;
|
|
||||||
|
|
||||||
final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
|
final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
|
||||||
{
|
{
|
||||||
|
@ -36,14 +35,21 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
|
||||||
*/
|
*/
|
||||||
private $nameResolver;
|
private $nameResolver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ServiceFromKernelResolver
|
||||||
|
*/
|
||||||
|
private $serviceFromKernelResolver;
|
||||||
|
|
||||||
public function __construct(
|
public function __construct(
|
||||||
ConstructorMethodBuilder $constructorMethodBuilder,
|
ConstructorMethodBuilder $constructorMethodBuilder,
|
||||||
PropertyBuilder $propertyBuilder,
|
PropertyBuilder $propertyBuilder,
|
||||||
NameResolver $nameResolver
|
NameResolver $nameResolver,
|
||||||
|
ServiceFromKernelResolver $serviceFromKernelResolver
|
||||||
) {
|
) {
|
||||||
$this->constructorMethodBuilder = $constructorMethodBuilder;
|
$this->constructorMethodBuilder = $constructorMethodBuilder;
|
||||||
$this->propertyBuilder = $propertyBuilder;
|
$this->propertyBuilder = $propertyBuilder;
|
||||||
$this->nameResolver = $nameResolver;
|
$this->nameResolver = $nameResolver;
|
||||||
|
$this->serviceFromKernelResolver = $serviceFromKernelResolver;
|
||||||
}
|
}
|
||||||
|
|
||||||
private function isCandidate(Node $node): bool
|
private function isCandidate(Node $node): bool
|
||||||
|
@ -103,21 +109,6 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
|
||||||
// }
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo extract to helper service, LocalKernelProvider::get...()
|
|
||||||
*/
|
|
||||||
private function getContainerFromKernelClass(): ContainerInterface
|
|
||||||
{
|
|
||||||
/** @var Kernel $kernel */
|
|
||||||
$kernel = new LocalKernel('dev', true);
|
|
||||||
$kernel->boot();
|
|
||||||
|
|
||||||
// @todo: initialize without creating cache or log directory
|
|
||||||
// @todo: call only loadBundles() and initializeContainer() methods
|
|
||||||
|
|
||||||
return $kernel->getContainer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Accept only "$this->get('string')" statements.
|
* Accept only "$this->get('string')" statements.
|
||||||
*/
|
*/
|
||||||
|
@ -155,15 +146,9 @@ final class NamedServicesToConstructorNodeVisitor extends NodeVisitorAbstract
|
||||||
$argument = $methodCallNode->args[0]->value;
|
$argument = $methodCallNode->args[0]->value;
|
||||||
$serviceName = $argument->value;
|
$serviceName = $argument->value;
|
||||||
|
|
||||||
$container = $this->getContainerFromKernelClass();
|
return $this->serviceFromKernelResolver->resolveServiceClassByNameFromKernel(
|
||||||
if (! $container->has($serviceName)) {
|
$serviceName, LocalKernel::class
|
||||||
// service name could not be found
|
);
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$service = $container->get($serviceName);
|
|
||||||
|
|
||||||
return get_class($service);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function processMethodCallNode(Class_ $classNode, MethodCall $methodCall): ?PropertyFetch
|
private function processMethodCallNode(Class_ $classNode, MethodCall $methodCall): ?PropertyFetch
|
||||||
|
|
|
@ -11,6 +11,7 @@ use PhpParser\Node\Expr\Variable;
|
||||||
use PhpParser\Node\Scalar\String_;
|
use PhpParser\Node\Scalar\String_;
|
||||||
use PhpParser\Node\Stmt\Class_;
|
use PhpParser\Node\Stmt\Class_;
|
||||||
use PhpParser\NodeVisitorAbstract;
|
use PhpParser\NodeVisitorAbstract;
|
||||||
|
use Rector\Builder\Kernel\ServiceFromKernelResolver;
|
||||||
use Rector\Builder\Naming\NameResolver;
|
use Rector\Builder\Naming\NameResolver;
|
||||||
use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel;
|
use Rector\Tests\NodeVisitor\DependencyInjection\NamedServicesToConstructorReconstructor\Source\LocalKernel;
|
||||||
use Symfony\Component\DependencyInjection\ContainerInterface;
|
use Symfony\Component\DependencyInjection\ContainerInterface;
|
||||||
|
@ -25,6 +26,22 @@ use Symfony\Component\HttpKernel\Kernel;
|
||||||
*/
|
*/
|
||||||
final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
|
final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
|
||||||
{
|
{
|
||||||
|
/**
|
||||||
|
* @var NameResolver
|
||||||
|
*/
|
||||||
|
private $nameResolver;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var ServiceFromKernelResolver
|
||||||
|
*/
|
||||||
|
private $serviceFromKernelResolver;
|
||||||
|
|
||||||
|
public function __construct(NameResolver $nameResolver, ServiceFromKernelResolver $serviceFromKernelResolver)
|
||||||
|
{
|
||||||
|
$this->nameResolver = $nameResolver;
|
||||||
|
$this->serviceFromKernelResolver = $serviceFromKernelResolver;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return value semantics:
|
* Return value semantics:
|
||||||
* * null
|
* * null
|
||||||
|
@ -48,13 +65,13 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var NameResolver
|
* @param Assign|MethodCall $assignOrMethodCallNode
|
||||||
*/
|
*/
|
||||||
private $nameResolver;
|
public function reconstruct(Node $assignOrMethodCallNode): void
|
||||||
|
|
||||||
public function __construct(NameResolver $nameResolver)
|
|
||||||
{
|
{
|
||||||
$this->nameResolver = $nameResolver;
|
if ($assignOrMethodCallNode instanceof Assign) {
|
||||||
|
$this->processAssignment($assignOrMethodCallNode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private function isCandidate(Node $node): bool
|
private function isCandidate(Node $node): bool
|
||||||
|
@ -79,16 +96,6 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param Assign|MethodCall $assignOrMethodCallNode
|
|
||||||
*/
|
|
||||||
public function reconstruct(Node $assignOrMethodCallNode): void
|
|
||||||
{
|
|
||||||
if ($assignOrMethodCallNode instanceof Assign) {
|
|
||||||
$this->processAssignment($assignOrMethodCallNode);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private function processAssignment(Assign $assignNode): void
|
private function processAssignment(Assign $assignNode): void
|
||||||
{
|
{
|
||||||
$refactoredMethodCall = $this->processMethodCallNode($assignNode->expr);
|
$refactoredMethodCall = $this->processMethodCallNode($assignNode->expr);
|
||||||
|
@ -97,21 +104,6 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @todo extract to helper service, LocalKernelProvider::get...()
|
|
||||||
*/
|
|
||||||
private function getContainerFromKernelClass(): ContainerInterface
|
|
||||||
{
|
|
||||||
/** @var Kernel $kernel */
|
|
||||||
$kernel = new LocalKernel('dev', true);
|
|
||||||
$kernel->boot();
|
|
||||||
|
|
||||||
// @todo: initialize without creating cache or log directory
|
|
||||||
// @todo: call only loadBundles() and initializeContainer() methods
|
|
||||||
|
|
||||||
return $kernel->getContainer();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Is "$this->get('string')" statements?
|
* Is "$this->get('string')" statements?
|
||||||
*/
|
*/
|
||||||
|
@ -141,15 +133,9 @@ final class GetterToPropertyNodeVisitor extends NodeVisitorAbstract
|
||||||
$argument = $methodCallNode->args[0]->value;
|
$argument = $methodCallNode->args[0]->value;
|
||||||
$serviceName = $argument->value;
|
$serviceName = $argument->value;
|
||||||
|
|
||||||
$container = $this->getContainerFromKernelClass();
|
return $this->serviceFromKernelResolver->resolveServiceClassByNameFromKernel(
|
||||||
if (! $container->has($serviceName)) {
|
$serviceName, LocalKernel::class
|
||||||
// service name could not be found
|
);
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
$service = $container->get($serviceName);
|
|
||||||
|
|
||||||
return get_class($service);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private function processMethodCallNode(MethodCall $methodCall): ?PropertyFetch
|
private function processMethodCallNode(MethodCall $methodCall): ?PropertyFetch
|
||||||
|
|
Loading…
Reference in New Issue
Block a user