From 7c2a01a4e56233cfbd34740a9a33bf8d1cd0d2ca Mon Sep 17 00:00:00 2001 From: TomasVotruba Date: Sun, 16 Jul 2017 21:09:58 +0200 Subject: [PATCH] [Analyzer] decouple ClassAnalyzer --- src/Analyzer/ClassAnalyzer.php | 41 +++++++++++++++++++ ...amedServicesToConstructorReconstructor.php | 32 +++++++++++---- .../correct/correct.php.inc | 2 +- .../correct/correct2.php.inc | 2 +- .../wrong/wrong.php.inc | 2 +- .../wrong/wrong2.php.inc | 2 +- 6 files changed, 68 insertions(+), 13 deletions(-) create mode 100644 src/Analyzer/ClassAnalyzer.php diff --git a/src/Analyzer/ClassAnalyzer.php b/src/Analyzer/ClassAnalyzer.php new file mode 100644 index 00000000000..4bf0112c8db --- /dev/null +++ b/src/Analyzer/ClassAnalyzer.php @@ -0,0 +1,41 @@ +extends instanceof Name) { + return Strings::endsWith($node->extends->getLast(), 'Controller'); + } + + return false; + } + + public function isContainerAwareClassNode(Node $node): bool + { + if (! $node instanceof Class_) { + return false; + } + + if (is_array($node->implements)) { + foreach ($node->implements as $nameNode) { + if (Strings::endsWith($nameNode->getLast(), 'ContainerAwareInterface')) { + return true; + } + } + } + + return false; + } +} diff --git a/src/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor.php b/src/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor.php index 835aae7d63c..d69ffd6c28a 100644 --- a/src/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor.php +++ b/src/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor.php @@ -11,6 +11,7 @@ use PhpParser\Node\Expr\Variable; use PhpParser\Node\Scalar\String_; use PhpParser\Node\Stmt\Class_; use PhpParser\Node\Stmt\ClassMethod; +use Rector\Analyzer\ClassAnalyzer; use Rector\Builder\ConstructorMethodBuilder; use Rector\Builder\Naming\NameResolver; use Rector\Builder\PropertyBuilder; @@ -36,24 +37,36 @@ final class NamedServicesToConstructorReconstructor implements ReconstructorInte */ private $nameResolver; + /** + * @var ClassAnalyzer + */ + private $classAnalyzer; + public function __construct( ConstructorMethodBuilder $constructorMethodBuilder, PropertyBuilder $propertyBuilder, - NameResolver $nameResolver + NameResolver $nameResolver, + ClassAnalyzer $classAnalyzer ) { $this->constructorMethodBuilder = $constructorMethodBuilder; $this->propertyBuilder = $propertyBuilder; $this->nameResolver = $nameResolver; + $this->classAnalyzer = $classAnalyzer; } public function isCandidate(Node $node): bool { - // @todo: limit to only 2 cases: - // - SomeClass extends Controller - // - SomeClass implements ContainerAwareInterface - // OR? Maybe listen on MethodCall... $this-> +get('...') - return $node instanceof Class_; + + if ($this->classAnalyzer->isControllerClassNode($node)) { + return true; + } + + if ($this->classAnalyzer->isContainerAwareClassNode($node)) { + return true; + } + + return false; } /** @@ -171,21 +184,22 @@ final class NamedServicesToConstructorReconstructor implements ReconstructorInte private function processMethodCallNode(Class_ $classNode, MethodCall $methodCall): ?PropertyFetch { - // 1. Get service type + // Get service type $serviceType = $this->resolveServiceTypeFromMethodCall($methodCall); if ($serviceType === null) { return null; } - // 2. Property name + // Get property name $propertyName = $this->nameResolver->resolvePropertyNameFromType($serviceType); - // 4. Add property assignment to constructor + // Add property assignment to constructor $this->constructorMethodBuilder->addPropertyAssignToClass($classNode, $serviceType, $propertyName); // 5. Add property to class $this->propertyBuilder->addPropertyToClass($classNode, $serviceType, $propertyName); + // creates "$this->propertyName" return new PropertyFetch( new Variable('this', [ 'name' => $propertyName diff --git a/tests/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor/correct/correct.php.inc b/tests/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor/correct/correct.php.inc index 3bf83711c3a..8ed69885a8a 100644 --- a/tests/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor/correct/correct.php.inc +++ b/tests/Reconstructor/DependencyInjection/NamedServicesToConstructorReconstructor/correct/correct.php.inc @@ -1,5 +1,5 @@