From 24c6cc3d9f5c1247b04acb1bd23960660d4eb08b Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 11:14:35 +0200 Subject: [PATCH 1/9] [FrameworkBundle] Let GetToConstructorInjectionRector work with trait as well --- .../GetToConstructorInjectionRector.php | 18 +++++++++++++--- .../Correct/correct3.php.inc | 21 +++++++++++++++++++ .../GetToConstructorInjectionRectorTest.php | 1 + .../Source/GetTrait.php | 13 ++++++++++++ .../Wrong/wrong3.php.inc | 13 ++++++++++++ .../config.yml | 1 + 6 files changed, 64 insertions(+), 3 deletions(-) create mode 100644 packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct3.php.inc create mode 100644 packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/GetTrait.php create mode 100644 packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Wrong/wrong3.php.inc diff --git a/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php b/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php index ee476ad5c48..8faa9abbf6f 100644 --- a/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php +++ b/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php @@ -14,9 +14,17 @@ final class GetToConstructorInjectionRector extends AbstractToConstructorInjecti */ private $controllerClass; - public function __construct(string $controllerClass = 'Symfony\Bundle\FrameworkBundle\Controller\Controller') - { + /** + * @var string + */ + private $traitClass; + + public function __construct( + string $controllerClass = 'Symfony\Bundle\FrameworkBundle\Controller\Controller', + string $traitClass = 'Symfony\Bundle\FrameworkBundle\Controller\ControllerTrait' + ) { $this->controllerClass = $controllerClass; + $this->traitClass = $traitClass; } public function getDefinition(): RectorDefinition @@ -61,6 +69,10 @@ CODE_SAMPLE return false; } - return $this->methodCallAnalyzer->isTypeAndMethod($node, $this->controllerClass, 'get'); + if ($this->methodCallAnalyzer->isTypeAndMethod($node, $this->controllerClass, 'get')) { + return true; + } + + return $this->methodCallAnalyzer->isTypeAndMethod($node, $this->traitClass, 'get'); } } diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct3.php.inc b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct3.php.inc new file mode 100644 index 00000000000..69de8198e59 --- /dev/null +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct3.php.inc @@ -0,0 +1,21 @@ +someTranslator = $someTranslator; + } + + public function render() + { + $this->someTranslator; + } +} diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php index f06ac6e4f82..f9fcca9f4f1 100644 --- a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php @@ -29,6 +29,7 @@ final class GetToConstructorInjectionRectorTest extends AbstractRectorTestCase { yield [__DIR__ . '/Wrong/wrong.php.inc', __DIR__ . '/Correct/correct.php.inc']; yield [__DIR__ . '/Wrong/wrong2.php.inc', __DIR__ . '/Correct/correct2.php.inc']; + yield [__DIR__ . '/Wrong/wrong3.php.inc', __DIR__ . '/Correct/correct3.php.inc']; } protected function provideConfig(): string diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/GetTrait.php b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/GetTrait.php new file mode 100644 index 00000000000..537f7b266a5 --- /dev/null +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/GetTrait.php @@ -0,0 +1,13 @@ +get('translator'); + } +} diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/config.yml b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/config.yml index b97090fb8cb..54b7c462082 100644 --- a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/config.yml +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/config.yml @@ -4,3 +4,4 @@ parameters: services: Rector\Symfony\Rector\FrameworkBundle\GetToConstructorInjectionRector: $controllerClass: 'Rector\Symfony\Tests\Rector\Source\SymfonyController' + $traitClass: 'Rector\Symfony\Tests\Rector\FrameworkBundle\GetToConstructorInjectionRector\Source\GetTrait' From f3348c84d816c0714b3b58909e01a0aa7056ff90 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 11:23:57 +0200 Subject: [PATCH 2/9] [NodeTypeResolver] Fix missing parent traits in class reflection types --- .../ClassReflectionTypesResolver.php | 20 ++++++++ .../ClassAndInterfaceTypeResolverTest.php | 50 +++++++++++++++++++ .../Source/AnonymousClass.php | 8 +++ .../Source/AnotherTrait.php | 8 +++ .../Source/ClassWithParentClass.php | 8 +++ .../Source/ClassWithParentInterface.php | 8 +++ .../Source/ClassWithParentTrait.php | 7 +++ .../Source/ClassWithTrait.php | 8 +++ .../Source/ParentClass.php | 8 +++ .../Source/SomeInterface.php | 8 +++ .../ClassTypeResolverTest.php | 48 ------------------ .../Correct/correct4.php.inc | 20 ++++++++ .../Wrong/wrong4.php.inc | 11 ++++ 13 files changed, 164 insertions(+), 48 deletions(-) create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/AnonymousClass.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/AnotherTrait.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/ClassWithParentClass.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/ClassWithParentInterface.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/ClassWithParentTrait.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/ClassWithTrait.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/ParentClass.php create mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/SomeInterface.php delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/ClassTypeResolverTest.php create mode 100644 packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct4.php.inc create mode 100644 packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Wrong/wrong4.php.inc diff --git a/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php b/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php index 02f7718ea71..0f28626c0a0 100644 --- a/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php +++ b/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php @@ -2,10 +2,21 @@ namespace Rector\NodeTypeResolver\Reflection; +use PHPStan\Broker\Broker; use PHPStan\Reflection\ClassReflection; final class ClassReflectionTypesResolver { + /** + * @var Broker + */ + private $broker; + + public function __construct(Broker $broker) + { + $this->broker = $broker; + } + /** * @return string[] */ @@ -30,6 +41,15 @@ final class ClassReflectionTypesResolver $types[] = $classReflection->getName(); } + // to cover traits of parent classes + foreach ($classReflection->getParentClassesNames() as $parentClassName) { + $parentClassReflection = $this->broker->getClass($parentClassName); + + foreach ($parentClassReflection->getTraits() as $parentClassTrait) { + $types[] = $parentClassTrait->getName(); + } + } + return $types; } } diff --git a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php new file mode 100644 index 00000000000..859da9789d8 --- /dev/null +++ b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php @@ -0,0 +1,50 @@ +getNodesForFileOfType($file, Class_::class); + + $this->assertSame($expectedTypes, $this->nodeTypeResolver->resolve($variableNodes[$nodePosition])); + } + + public function dataProvider(): Iterator + { +// yield [__DIR__ . '/Source/ClassWithParentInterface.php', 0, [ +// ClassWithParentInterface::class, +// SomeInterface::class, +// ]]; +// +// yield [__DIR__ . '/Source/ClassWithParentClass.php', 0, [ +// ClassWithParentClass::class, +// ParentClass::class, +// ]]; + +// yield [__DIR__ . '/Source/ClassWithTrait.php', 0, [ClassWithTrait::class, AnotherTrait::class]]; + + yield [__DIR__ . '/Source/ClassWithParentTrait.php', 0, [ClassWithParentTrait::class, ClassWithTrait::class, AnotherTrait::class]]; + +// yield [__DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class]]; + } +} diff --git a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/AnonymousClass.php b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/AnonymousClass.php new file mode 100644 index 00000000000..ca915ae9ccd --- /dev/null +++ b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/Source/AnonymousClass.php @@ -0,0 +1,8 @@ +getNodesForFileOfType($file, Class_::class); - - $this->assertSame($expectedTypes, $this->nodeTypeResolver->resolve($variableNodes[$nodePosition])); - } - - public function dataProvider(): Iterator - { - yield [__DIR__ . '/Source/ClassWithParentInterface.php', 0, [ - ClassWithParentInterface::class, - SomeInterface::class, - ]]; - - yield [__DIR__ . '/Source/ClassWithParentClass.php', 0, [ - ClassWithParentClass::class, - ParentClass::class, - ]]; - - yield [__DIR__ . '/Source/ClassWithTrait.php', 0, [ClassWithTrait::class, AnotherTrait::class]]; - - // traits in anonymous classes are ignored in PHPStan - yield [__DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class]]; - } -} diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct4.php.inc b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct4.php.inc new file mode 100644 index 00000000000..7e01cfc628c --- /dev/null +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Correct/correct4.php.inc @@ -0,0 +1,20 @@ +someTranslator = $someTranslator; + } + + public function render() + { + $this->someTranslator; + } +} diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Wrong/wrong4.php.inc b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Wrong/wrong4.php.inc new file mode 100644 index 00000000000..1404a918731 --- /dev/null +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Wrong/wrong4.php.inc @@ -0,0 +1,11 @@ +get('translator'); + } +} From 6e931c857c5d8b60ae2a39c108cedbd171eb9a58 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 11:26:03 +0200 Subject: [PATCH 3/9] GetToConstructorInjectionRector - add test case for parent class with trait --- .../ClassAndInterfaceTypeResolverTest.php | 28 +++++++++++-------- .../Source/AnonymousClass.php | 8 ------ .../ClassTypeResolver/Source/AnotherTrait.php | 8 ------ .../Source/ClassWithParentClass.php | 8 ------ .../Source/ClassWithParentInterface.php | 8 ------ .../Source/ClassWithTrait.php | 8 ------ .../ClassTypeResolver/Source/ParentClass.php | 8 ------ .../Source/SomeInterface.php | 8 ------ .../Correct/correct4.php.inc | 1 - .../GetToConstructorInjectionRectorTest.php | 1 + .../Source/ParentClassWithGetTrait.php | 9 ++++++ 11 files changed, 26 insertions(+), 69 deletions(-) delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/AnonymousClass.php delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/AnotherTrait.php delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/ClassWithParentClass.php delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/ClassWithParentInterface.php delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/ClassWithTrait.php delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/ParentClass.php delete mode 100644 packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/SomeInterface.php create mode 100644 packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/ParentClassWithGetTrait.php diff --git a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php index 859da9789d8..4394a9fc5bf 100644 --- a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php +++ b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php @@ -31,20 +31,24 @@ final class ClassAndInterfaceTypeResolverTest extends AbstractNodeTypeResolverTe public function dataProvider(): Iterator { -// yield [__DIR__ . '/Source/ClassWithParentInterface.php', 0, [ -// ClassWithParentInterface::class, -// SomeInterface::class, -// ]]; -// -// yield [__DIR__ . '/Source/ClassWithParentClass.php', 0, [ -// ClassWithParentClass::class, -// ParentClass::class, -// ]]; + yield [__DIR__ . '/Source/ClassWithParentInterface.php', 0, [ + ClassWithParentInterface::class, + SomeInterface::class, + ]]; -// yield [__DIR__ . '/Source/ClassWithTrait.php', 0, [ClassWithTrait::class, AnotherTrait::class]]; + yield [__DIR__ . '/Source/ClassWithParentClass.php', 0, [ + ClassWithParentClass::class, + ParentClass::class, + ]]; - yield [__DIR__ . '/Source/ClassWithParentTrait.php', 0, [ClassWithParentTrait::class, ClassWithTrait::class, AnotherTrait::class]]; + yield [__DIR__ . '/Source/ClassWithTrait.php', 0, [ClassWithTrait::class, AnotherTrait::class]]; -// yield [__DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class]]; + yield [ + __DIR__ . '/Source/ClassWithParentTrait.php', + 0, + [ClassWithParentTrait::class, ClassWithTrait::class, AnotherTrait::class], + ]; + + yield [__DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class]]; } } diff --git a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/AnonymousClass.php b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/AnonymousClass.php deleted file mode 100644 index aa481ca23aa..00000000000 --- a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassTypeResolver/Source/AnonymousClass.php +++ /dev/null @@ -1,8 +0,0 @@ -someTranslator = $someTranslator; } - public function render() { $this->someTranslator; diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php index f9fcca9f4f1..a11b9b05063 100644 --- a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/GetToConstructorInjectionRectorTest.php @@ -30,6 +30,7 @@ final class GetToConstructorInjectionRectorTest extends AbstractRectorTestCase yield [__DIR__ . '/Wrong/wrong.php.inc', __DIR__ . '/Correct/correct.php.inc']; yield [__DIR__ . '/Wrong/wrong2.php.inc', __DIR__ . '/Correct/correct2.php.inc']; yield [__DIR__ . '/Wrong/wrong3.php.inc', __DIR__ . '/Correct/correct3.php.inc']; + yield [__DIR__ . '/Wrong/wrong4.php.inc', __DIR__ . '/Correct/correct4.php.inc']; } protected function provideConfig(): string diff --git a/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/ParentClassWithGetTrait.php b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/ParentClassWithGetTrait.php new file mode 100644 index 00000000000..1402c67c439 --- /dev/null +++ b/packages/Symfony/tests/Rector/FrameworkBundle/GetToConstructorInjectionRector/Source/ParentClassWithGetTrait.php @@ -0,0 +1,9 @@ + Date: Thu, 9 Aug 2018 11:35:47 +0200 Subject: [PATCH 4/9] Add isTypesAndMethod() to MethodCallAnalyzer --- .../GetToConstructorInjectionRector.php | 6 +-- src/NodeAnalyzer/MethodCallAnalyzer.php | 49 +++++++++++++------ 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php b/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php index 8faa9abbf6f..40285a2a8bf 100644 --- a/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php +++ b/packages/Symfony/src/Rector/FrameworkBundle/GetToConstructorInjectionRector.php @@ -69,10 +69,6 @@ CODE_SAMPLE return false; } - if ($this->methodCallAnalyzer->isTypeAndMethod($node, $this->controllerClass, 'get')) { - return true; - } - - return $this->methodCallAnalyzer->isTypeAndMethod($node, $this->traitClass, 'get'); + return $this->methodCallAnalyzer->isTypesAndMethod($node, [$this->controllerClass, $this->traitClass], 'get'); } } diff --git a/src/NodeAnalyzer/MethodCallAnalyzer.php b/src/NodeAnalyzer/MethodCallAnalyzer.php index 8c5021e5ccb..8802e1885a3 100644 --- a/src/NodeAnalyzer/MethodCallAnalyzer.php +++ b/src/NodeAnalyzer/MethodCallAnalyzer.php @@ -30,7 +30,7 @@ final class MethodCallAnalyzer */ public function isTypeAndMethods(Node $node, string $type, array $methods): bool { - if (! $this->isType($node, $type)) { + if (! $this->isTypes($node, [$type])) { return false; } @@ -45,7 +45,24 @@ final class MethodCallAnalyzer */ public function isTypeAndMethod(Node $node, string $type, string $method): bool { - if (! $this->isType($node, $type)) { + if (! $this->isTypes($node, [$type])) { + return false; + } + + /** @var Identifier $methodName */ + $methodName = $node->name; + + return $methodName->toString() === $method; + } + + /** + * Checks "$this->classOfSpecificType->specificMethodName()" + * + * @param string[] $types + */ + public function isTypesAndMethod(Node $node, array $types, string $method): bool + { + if (! $this->isTypes($node, $types)) { return false; } @@ -87,20 +104,6 @@ final class MethodCallAnalyzer return in_array($node->name->name, $methods, true); } - /** - * Checks "$this->methodCall()" - */ - public function isType(Node $node, string $type): bool - { - if (! $node instanceof MethodCall) { - return false; - } - - $calledNodeTypes = $this->nodeTypeResolver->resolve($node->var); - - return in_array($type, $calledNodeTypes, true); - } - /** * @param string[] $types * @return string[] @@ -115,4 +118,18 @@ final class MethodCallAnalyzer return array_intersect($nodeTypes, $types) ? $nodeTypes : null; } + + /** + * @param string[] $types + */ + private function isTypes(Node $node, array $types): bool + { + if (! $node instanceof MethodCall) { + return false; + } + + $calledNodeTypes = $this->nodeTypeResolver->resolve($node->var); + + return (bool) array_intersect($types, $calledNodeTypes); + } } From 98281b8b8ed22cacb7312d6a5335cfe51b27b597 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 12:05:05 +0200 Subject: [PATCH 5/9] fix variable override --- .../src/Reflection/ClassReflectionTypesResolver.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php b/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php index 0f28626c0a0..365af017932 100644 --- a/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php +++ b/packages/NodeTypeResolver/src/Reflection/ClassReflectionTypesResolver.php @@ -32,13 +32,13 @@ final class ClassReflectionTypesResolver $types = array_merge($types, $classReflection->getParentClassesNames()); // interfaces - foreach ($classReflection->getInterfaces() as $classReflection) { - $types[] = $classReflection->getName(); + foreach ($classReflection->getInterfaces() as $interfaceReflection) { + $types[] = $interfaceReflection->getName(); } // traits - foreach ($classReflection->getTraits() as $classReflection) { - $types[] = $classReflection->getName(); + foreach ($classReflection->getTraits() as $traitReflection) { + $types[] = $traitReflection->getName(); } // to cover traits of parent classes From 4f9f86900c889a79de19eb806d880aa7d5a11b01 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 12:06:50 +0200 Subject: [PATCH 6/9] fixup! fix variable override --- .../ClassAndInterfaceTypeResolverTest.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php index 4394a9fc5bf..5f126008601 100644 --- a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php +++ b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php @@ -48,7 +48,7 @@ final class ClassAndInterfaceTypeResolverTest extends AbstractNodeTypeResolverTe 0, [ClassWithParentTrait::class, ClassWithTrait::class, AnotherTrait::class], ]; - - yield [__DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class]]; +// + yield [__DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class, AnotherTrait::class]]; } } From 847fe92738e6eec90b7f7e304015aaeec3e57ca1 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 12:15:50 +0200 Subject: [PATCH 7/9] Fix Symfony ContainerFactory --- .../DependencyInjection/ContainerFactory.php | 17 +++-------------- 1 file changed, 3 insertions(+), 14 deletions(-) diff --git a/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php b/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php index 32dbe39b495..64e816f2b9b 100644 --- a/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php +++ b/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php @@ -25,7 +25,7 @@ final class ContainerFactory } /** - * Mimics https://github.com/symfony/symfony/blob/226e2f3949c5843b67826aca4839c2c6b95743cf/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php#L200-L203 + * Mimics https://github.com/symfony/symfony/blob/f834c9262b411aa5793fcea23694e3ad3b5acbb4/src/Symfony/Bundle/FrameworkBundle/Command/ContainerDebugCommand.php#L200-L203 */ private function createContainerFromKernelClass(string $kernelClass): Container { @@ -35,19 +35,8 @@ final class ContainerFactory /** @var ContainerBuilder $containerBuilder */ $containerBuilder = (new PrivatesCaller())->callPrivateMethod($kernel, 'buildContainer'); - - // anonymous class on intention, since this depends on Symfony\DependencyInjection in rector-prefixed - $containerBuilder->getCompilerPassConfig()->addPass(new class() implements CompilerPassInterface { - public function process(ContainerBuilder $containerBuilder): void - { - foreach ($containerBuilder->getDefinitions() as $definition) { - $definition->setPublic(true); - } - foreach ($containerBuilder->getAliases() as $definition) { - $definition->setPublic(true); - } - } - }); + $containerBuilder->getCompilerPassConfig()->setRemovingPasses([]); + $containerBuilder->compile(); return $containerBuilder; } From 9ba461f98c9b17e1f3db7fc8db1080697176b435 Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 12:15:55 +0200 Subject: [PATCH 8/9] fixup! Fix Symfony ContainerFactory --- .../ClassAndInterfaceTypeResolverTest.php | 7 +++++-- .../src/Bridge/DependencyInjection/ContainerFactory.php | 1 - 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php index 5f126008601..a3ca5a0723e 100644 --- a/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php +++ b/packages/NodeTypeResolver/tests/PerNodeTypeResolver/ClassAndInterfaceTypeResolver/ClassAndInterfaceTypeResolverTest.php @@ -48,7 +48,10 @@ final class ClassAndInterfaceTypeResolverTest extends AbstractNodeTypeResolverTe 0, [ClassWithParentTrait::class, ClassWithTrait::class, AnotherTrait::class], ]; -// - yield [__DIR__ . '/Source/AnonymousClass.php', 0, [ParentClass::class, SomeInterface::class, AnotherTrait::class]]; + yield [ + __DIR__ . '/Source/AnonymousClass.php', + 0, + [ParentClass::class, SomeInterface::class, AnotherTrait::class], + ]; } } diff --git a/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php b/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php index 64e816f2b9b..e2c8c01dde0 100644 --- a/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php +++ b/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php @@ -2,7 +2,6 @@ namespace Rector\Symfony\Bridge\DependencyInjection; -use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel; From 4b9750b399636171d199f321b6be49e5ee34e1ea Mon Sep 17 00:00:00 2001 From: Tomas Votruba Date: Thu, 9 Aug 2018 12:17:26 +0200 Subject: [PATCH 9/9] Keep publish CompilerPass --- .../DependencyInjection/ContainerFactory.php | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php b/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php index e2c8c01dde0..64743d00cc7 100644 --- a/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php +++ b/packages/Symfony/src/Bridge/DependencyInjection/ContainerFactory.php @@ -2,6 +2,7 @@ namespace Rector\Symfony\Bridge\DependencyInjection; +use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface; use Symfony\Component\DependencyInjection\Container; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\HttpKernel\Kernel; @@ -35,6 +36,20 @@ final class ContainerFactory /** @var ContainerBuilder $containerBuilder */ $containerBuilder = (new PrivatesCaller())->callPrivateMethod($kernel, 'buildContainer'); $containerBuilder->getCompilerPassConfig()->setRemovingPasses([]); + + // anonymous class on intention, since this depends on Symfony\DependencyInjection in rector-prefixed + $containerBuilder->getCompilerPassConfig()->addPass(new class() implements CompilerPassInterface { + public function process(ContainerBuilder $containerBuilder): void + { + foreach ($containerBuilder->getDefinitions() as $definition) { + $definition->setPublic(true); + } + foreach ($containerBuilder->getAliases() as $definition) { + $definition->setPublic(true); + } + } + }); + $containerBuilder->compile(); return $containerBuilder;