diff --git a/src/DependencyInjection/CompilerPass/CollectorCompilerPass.php b/src/DependencyInjection/CompilerPass/CollectorCompilerPass.php index 889e2d4d734..04d7f89de5e 100644 --- a/src/DependencyInjection/CompilerPass/CollectorCompilerPass.php +++ b/src/DependencyInjection/CompilerPass/CollectorCompilerPass.php @@ -2,8 +2,8 @@ namespace Rector\DependencyInjection\CompilerPass; -use PhpParser\NodeTraverser; use PhpParser\NodeVisitor; +use Rector\NodeTraverser\NodeTraverserFactory; use Symfony\Component\Console\Application; use Symfony\Component\Console\Command\Command; use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; @@ -32,9 +32,9 @@ final class CollectorCompilerPass implements CompilerPassInterface { DefinitionCollector::loadCollectorWithType( $containerBuilder, - NodeTraverser::class, + NodeTraverserFactory::class, NodeVisitor::class, - 'addVisitor' + 'addNodeVisitor' ); } } diff --git a/src/NodeTraverser/NodeTraverserFactory.php b/src/NodeTraverser/NodeTraverserFactory.php new file mode 100644 index 00000000000..fcd2a082cf9 --- /dev/null +++ b/src/NodeTraverser/NodeTraverserFactory.php @@ -0,0 +1,34 @@ +nodeVisitors[] = $nodeVisitor; + } + + public function create(): NodeTraverser + { + $nodeTraverser = new NodeTraverser; + + // this one has priority + $nodeTraverser->addVisitor(new CloningVisitor); + + foreach ($this->nodeVisitors as $nodeVisitor) { + $nodeTraverser->addVisitor($nodeVisitor); + } + + return $nodeTraverser; + } +} diff --git a/src/NodeTraverser/TokenSwitcher.php b/src/NodeTraverser/TokenSwitcher.php index ecaa4395d10..a469125ed64 100644 --- a/src/NodeTraverser/TokenSwitcher.php +++ b/src/NodeTraverser/TokenSwitcher.php @@ -14,6 +14,11 @@ final class TokenSwitcher $this->isEnabled = true; } + public function disable(): void + { + $this->isEnabled = false; + } + public function isEnabled(): bool { return $this->isEnabled; diff --git a/src/NodeVisitor/DependencyInjection/AddPropertiesToClassNodeVisitor.php b/src/NodeVisitor/DependencyInjection/AddPropertiesToClassNodeVisitor.php index dbc9f534c88..c52b38091c1 100644 --- a/src/NodeVisitor/DependencyInjection/AddPropertiesToClassNodeVisitor.php +++ b/src/NodeVisitor/DependencyInjection/AddPropertiesToClassNodeVisitor.php @@ -8,6 +8,7 @@ use PhpParser\NodeVisitorAbstract; use Rector\Builder\Class_\ClassPropertyCollector; use Rector\Builder\ConstructorMethodBuilder; use Rector\Builder\PropertyBuilder; +use Rector\NodeTraverser\TokenSwitcher; /** * Add new propertis to class and to contructor. @@ -29,14 +30,21 @@ final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract */ private $newClassPropertyCollector; + /** + * @var TokenSwitcher + */ + private $tokenSwitcher; + public function __construct( ConstructorMethodBuilder $constructorMethodBuilder, PropertyBuilder $propertyBuilder, - ClassPropertyCollector $newClassPropertyCollector + ClassPropertyCollector $newClassPropertyCollector, + TokenSwitcher $tokenSwitcher ) { $this->constructorMethodBuilder = $constructorMethodBuilder; $this->propertyBuilder = $propertyBuilder; $this->newClassPropertyCollector = $newClassPropertyCollector; + $this->tokenSwitcher = $tokenSwitcher; } /** @@ -48,9 +56,13 @@ final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract foreach ($nodes as $key => $node) { if ($node instanceof Class_) { $nodes[$key] = $this->reconstruct($node, (string) $node->name); + break; } } + // this does! + $this->tokenSwitcher->disable(); + return $nodes; } @@ -58,6 +70,8 @@ final class AddPropertiesToClassNodeVisitor extends NodeVisitorAbstract { $propertiesForClass = $this->newClassPropertyCollector->getPropertiesforClass($className); + dump($propertiesForClass); + foreach ($propertiesForClass as $propertyType => $propertyName) { $this->constructorMethodBuilder->addPropertyAssignToClass($classNode, $propertyType, $propertyName); $this->propertyBuilder->addPropertyToClass($classNode, $propertyType, $propertyName); diff --git a/src/NodeVisitor/DependencyInjection/InjectAnnotationToConstructor/PropertyRector.php b/src/NodeVisitor/DependencyInjection/InjectAnnotationToConstructor/PropertyRector.php index c06c4f3eb2a..a8b6ed60b59 100644 --- a/src/NodeVisitor/DependencyInjection/InjectAnnotationToConstructor/PropertyRector.php +++ b/src/NodeVisitor/DependencyInjection/InjectAnnotationToConstructor/PropertyRector.php @@ -45,7 +45,6 @@ final class PropertyRector extends NodeVisitorAbstract */ public function beforeTraverse(array $nodes): ?array { - dump('1'); foreach ($nodes as $node) { if ($node instanceof Class_) { $this->className = (string) $node->name; @@ -61,8 +60,6 @@ final class PropertyRector extends NodeVisitorAbstract return null; } - dump('2'); - return $this->reconstructProperty($node); } diff --git a/src/config/services.yml b/src/config/services.yml index 9a8a0e4bbc6..d5d419ec9fc 100644 --- a/src/config/services.yml +++ b/src/config/services.yml @@ -20,9 +20,10 @@ services: factory: ['@Rector\Parser\LexerFactory', 'create'] PhpParser\BuilderFactory: ~ + PhpParser\NodeTraverser: + factory: ['@Rector\NodeTraverser\NodeTraverserFactory', 'create'] + # Traverser - PhpParser\NodeTraverser: ~ PhpParser\ParserFactory: ~ # Printer - PhpParser\NodeVisitor\CloningVisitor: ~ PhpParser\PrettyPrinter\Standard: ~ diff --git a/tests/NodeVisitor/DependencyInjection/InjectAnnotationToConstructorRector/correct/correct.php.inc b/tests/NodeVisitor/DependencyInjection/InjectAnnotationToConstructorRector/correct/correct.php.inc index 5154e980d9f..57ec4a63833 100644 --- a/tests/NodeVisitor/DependencyInjection/InjectAnnotationToConstructorRector/correct/correct.php.inc +++ b/tests/NodeVisitor/DependencyInjection/InjectAnnotationToConstructorRector/correct/correct.php.inc @@ -6,6 +6,7 @@ class ClassWithInjects * @var stdClass */ private $property; + /** * @var DateTimeInterface */