add SymfonyContainerClassAnalyzer

This commit is contained in:
TomasVotruba 2017-09-03 14:37:36 +02:00
parent 3611715075
commit 57d57843a7
5 changed files with 67 additions and 31 deletions

View File

@ -28,7 +28,7 @@ checkers:
Symplify\CodingStandard\Sniffs\DependencyInjection\NoClassInstantiationSniff:
extraAllowedClasses:
# - 'PhpParser\Node\*'
- 'PhpParser\Node\*'
- 'PhpParser\Comment\Doc'
parameters:

View File

@ -0,0 +1,45 @@
<?php declare(strict_types=1);
namespace Rector\NodeAnalyzer;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Scalar\String_;
final class SymfonyContainerCallsAnalyzer
{
/**
* Finds $this->get(...);
*/
public function isThisCall(MethodCall $methodCall): bool
{
if ($methodCall->var->name !== 'this' || (string) $methodCall->name !== 'get') {
return false;
}
return $this->hasOneStringArgument($methodCall);
}
/**
* Finds $this->getContainer()->get(...);
*/
public function isGetContainerCall(MethodCall $methodCall): bool
{
if (! $methodCall->var instanceof MethodCall) {
return false;
}
if ((string) $methodCall->var->var->name !== 'this' || (string) $methodCall->name !== 'get') {
return false;
}
return $this->hasOneStringArgument($methodCall);
}
/**
* Finds ('some_service')
*/
private function hasOneStringArgument(MethodCall $methodCall): bool
{
return count($methodCall->args) === 1 && $methodCall->args[0]->value instanceof String_;
}
}

View File

@ -3,7 +3,7 @@
namespace Rector\Rector;
use PhpParser\Node;
use PhpParser\Node\Name;
use PhpParser\Node\Name\FullyQualified;
use PhpParser\Node\Stmt\Class_;
abstract class AbstractChangeParentClassRector extends AbstractRector
@ -22,7 +22,7 @@ abstract class AbstractChangeParentClassRector extends AbstractRector
*/
public function refactor(Node $node): ?Node
{
$node->extends = new Name\FullyQualified($this->getNewClassName());
$node->extends = new FullyQualified($this->getNewClassName());
return $node;
}

View File

@ -6,11 +6,11 @@ use Nette\Utils\Strings;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Name;
use PhpParser\Node\Scalar\String_;
use Rector\Builder\Class_\ClassPropertyCollector;
use Rector\Builder\Kernel\ServiceFromKernelResolver;
use Rector\Builder\Naming\NameResolver;
use Rector\Deprecation\SetNames;
use Rector\NodeAnalyzer\SymfonyContainerCallsAnalyzer;
use Rector\NodeFactory\NodeFactory;
use Rector\Rector\AbstractRector;
use Rector\Tests\Rector\Contrib\SymfonyExtra\GetterToPropertyRector\Source\LocalKernel;
@ -59,17 +59,23 @@ final class CommandToConstructorInjectionRector extends AbstractRector
* @var NodeFactory
*/
private $nodeFactory;
/**
* @var SymfonyContainerCallsAnalyzer
*/
private $symfonyContainerCallsAnalyzer;
public function __construct(
ServiceFromKernelResolver $serviceFromKernelResolver,
ClassPropertyCollector $classPropertyCollector,
NameResolver $nameResolver,
NodeFactory $nodeFactory
NodeFactory $nodeFactory,
SymfonyContainerCallsAnalyzer $symfonyContainerCallsAnalyzer
) {
$this->serviceFromKernelResolver = $serviceFromKernelResolver;
$this->classPropertyCollector = $classPropertyCollector;
$this->nameResolver = $nameResolver;
$this->nodeFactory = $nodeFactory;
$this->symfonyContainerCallsAnalyzer = $symfonyContainerCallsAnalyzer;
}
public function getSetName(): string
@ -88,22 +94,11 @@ final class CommandToConstructorInjectionRector extends AbstractRector
return false;
}
// finds **$this->getContainer()->get**('some_service');
if (! $node instanceof MethodCall || ! $node->var instanceof MethodCall) {
if (! $node instanceof MethodCall) {
return false;
}
// finds **$this**->getContainer()->**get**('some_service');
if ((string) $node->var->var->name !== 'this' || (string) $node->name !== 'get') {
return false;
}
// finds $this->getContainer()->get**('some_service')**;
if (count($node->args) !== 1 || ! $node->args[0]->value instanceof String_) {
return false;
}
return true;
return $this->symfonyContainerCallsAnalyzer->isGetContainerCall($node);
}
/**

View File

@ -4,11 +4,11 @@ namespace Rector\Rector\Contrib\SymfonyExtra;
use PhpParser\Node;
use PhpParser\Node\Expr\MethodCall;
use PhpParser\Node\Scalar\String_;
use Rector\Builder\Class_\ClassPropertyCollector;
use Rector\Builder\Kernel\ServiceFromKernelResolver;
use Rector\Builder\Naming\NameResolver;
use Rector\Deprecation\SetNames;
use Rector\NodeAnalyzer\SymfonyContainerCallsAnalyzer;
use Rector\NodeFactory\NodeFactory;
use Rector\Rector\AbstractRector;
use Rector\Tests\Rector\Contrib\SymfonyExtra\GetterToPropertyRector\Source\LocalKernel;
@ -41,17 +41,23 @@ final class GetterToPropertyRector extends AbstractRector
* @var NodeFactory
*/
private $nodeFactory;
/**
* @var SymfonyContainerCallsAnalyzer
*/
private $symfonyContainerCallsAnalyzer;
public function __construct(
NameResolver $nameResolver,
ServiceFromKernelResolver $serviceFromKernelResolver,
ClassPropertyCollector $classPropertyCollector,
NodeFactory $nodeFactory
NodeFactory $nodeFactory,
SymfonyContainerCallsAnalyzer $symfonyContainerCallsAnalyzer
) {
$this->nameResolver = $nameResolver;
$this->serviceFromKernelResolver = $serviceFromKernelResolver;
$this->classPropertyCollector = $classPropertyCollector;
$this->nodeFactory = $nodeFactory;
$this->symfonyContainerCallsAnalyzer = $symfonyContainerCallsAnalyzer;
}
public function isCandidate(Node $node): bool
@ -60,17 +66,7 @@ final class GetterToPropertyRector extends AbstractRector
return false;
}
// finds **$this->get**('string')
if ($node->var->name !== 'this' || (string) $node->name !== 'get') {
return false;
}
// finds $this->get(**'string'**)
if (count($node->args) !== 1 || ! $node->args[0]->value instanceof String_) {
return false;
}
return true;
return $this->symfonyContainerCallsAnalyzer->isThisCall($node);
}
/**