From 97a55aa7502eb55113e72c4518fd0e4dbc5df852 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 11 Feb 2021 15:23:31 +0100 Subject: [PATCH 1/4] ExtensionTestCase > Allow multiple extensions --- .../Symfony/EnvelopeReturnTypeExtensionTest.php | 2 +- tests/Type/Symfony/ExtensionTestCase.php | 13 ++++++++++--- .../HeaderBagDynamicReturnTypeExtensionTest.php | 2 +- .../InputBagDynamicReturnTypeExtensionTest.php | 2 +- ...aceGetArgumentDynamicReturnTypeExtensionTest.php | 2 +- ...rfaceGetOptionDynamicReturnTypeExtensionTest.php | 2 +- ...ernelInterfaceDynamicReturnTypeExtensionTest.php | 2 +- .../RequestDynamicReturnTypeExtensionTest.php | 2 +- .../SerializerDynamicReturnTypeExtensionTest.php | 8 ++++---- .../ServiceDynamicReturnTypeExtensionTest.php | 4 ++-- 10 files changed, 23 insertions(+), 16 deletions(-) diff --git a/tests/Type/Symfony/EnvelopeReturnTypeExtensionTest.php b/tests/Type/Symfony/EnvelopeReturnTypeExtensionTest.php index 2e7d7266..ef59ccc4 100644 --- a/tests/Type/Symfony/EnvelopeReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/EnvelopeReturnTypeExtensionTest.php @@ -18,7 +18,7 @@ public function testAll(string $expression, string $type): void __DIR__ . '/envelope_all.php', $expression, $type, - new EnvelopeReturnTypeExtension() + [new EnvelopeReturnTypeExtension()] ); } diff --git a/tests/Type/Symfony/ExtensionTestCase.php b/tests/Type/Symfony/ExtensionTestCase.php index 49c4b0fa..26a805a6 100644 --- a/tests/Type/Symfony/ExtensionTestCase.php +++ b/tests/Type/Symfony/ExtensionTestCase.php @@ -17,21 +17,28 @@ use PHPStan\PhpDoc\PhpDocStringResolver; use PHPStan\Reflection\ReflectionProvider\DirectReflectionProviderProvider; use PHPStan\Testing\TestCase; -use PHPStan\Type\DynamicMethodReturnTypeExtension; use PHPStan\Type\FileTypeMapper; use PHPStan\Type\VerbosityLevel; abstract class ExtensionTestCase extends TestCase { + /** + * @param string $file + * @param string $expression + * @param string $type + * @param \PHPStan\Type\DynamicMethodReturnTypeExtension[] $dynamicMethodReturnTypeExtensions + * @param \PHPStan\Type\DynamicStaticMethodReturnTypeExtension[] $dynamicStaticMethodReturnTypeExtensions + */ protected function processFile( string $file, string $expression, string $type, - DynamicMethodReturnTypeExtension $extension + array $dynamicMethodReturnTypeExtensions = [], + array $dynamicStaticMethodReturnTypeExtensions = [] ): void { - $broker = $this->createBroker([$extension]); + $broker = $this->createBroker($dynamicMethodReturnTypeExtensions, $dynamicStaticMethodReturnTypeExtensions); $parser = $this->getParser(); $currentWorkingDirectory = $this->getCurrentWorkingDirectory(); $fileHelper = new FileHelper($currentWorkingDirectory); diff --git a/tests/Type/Symfony/HeaderBagDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/HeaderBagDynamicReturnTypeExtensionTest.php index f4b7d4cb..f84f3032 100644 --- a/tests/Type/Symfony/HeaderBagDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/HeaderBagDynamicReturnTypeExtensionTest.php @@ -16,7 +16,7 @@ public function testGet(string $expression, string $type): void __DIR__ . '/header_bag_get.php', $expression, $type, - new HeaderBagDynamicReturnTypeExtension() + [new HeaderBagDynamicReturnTypeExtension()] ); } diff --git a/tests/Type/Symfony/InputBagDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/InputBagDynamicReturnTypeExtensionTest.php index 7e8f1d2a..b80b02ad 100644 --- a/tests/Type/Symfony/InputBagDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/InputBagDynamicReturnTypeExtensionTest.php @@ -20,7 +20,7 @@ public function testGet(string $expression, string $type): void __DIR__ . '/input_bag_get.php', $expression, $type, - new InputBagDynamicReturnTypeExtension() + [new InputBagDynamicReturnTypeExtension()] ); } diff --git a/tests/Type/Symfony/InputInterfaceGetArgumentDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/InputInterfaceGetArgumentDynamicReturnTypeExtensionTest.php index 9689018e..00d85e00 100644 --- a/tests/Type/Symfony/InputInterfaceGetArgumentDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/InputInterfaceGetArgumentDynamicReturnTypeExtensionTest.php @@ -17,7 +17,7 @@ public function testArgumentTypes(string $expression, string $type): void __DIR__ . '/ExampleBaseCommand.php', $expression, $type, - new InputInterfaceGetArgumentDynamicReturnTypeExtension(new ConsoleApplicationResolver(__DiR__ . '/console_application_loader.php')) + [new InputInterfaceGetArgumentDynamicReturnTypeExtension(new ConsoleApplicationResolver(__DiR__ . '/console_application_loader.php'))] ); } diff --git a/tests/Type/Symfony/InputInterfaceGetOptionDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/InputInterfaceGetOptionDynamicReturnTypeExtensionTest.php index affb0c62..ede5f68d 100644 --- a/tests/Type/Symfony/InputInterfaceGetOptionDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/InputInterfaceGetOptionDynamicReturnTypeExtensionTest.php @@ -17,7 +17,7 @@ public function testArgumentTypes(string $expression, string $type): void __DIR__ . '/ExampleOptionCommand.php', $expression, $type, - new InputInterfaceGetOptionDynamicReturnTypeExtension(new ConsoleApplicationResolver(__DiR__ . '/console_application_loader.php')) + [new InputInterfaceGetOptionDynamicReturnTypeExtension(new ConsoleApplicationResolver(__DiR__ . '/console_application_loader.php'))] ); } diff --git a/tests/Type/Symfony/KernelInterfaceDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/KernelInterfaceDynamicReturnTypeExtensionTest.php index a5178a51..40bef996 100644 --- a/tests/Type/Symfony/KernelInterfaceDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/KernelInterfaceDynamicReturnTypeExtensionTest.php @@ -16,7 +16,7 @@ public function testGet(string $expression, string $type): void __DIR__ . '/kernel_interface.php', $expression, $type, - new KernelInterfaceDynamicReturnTypeExtension() + [new KernelInterfaceDynamicReturnTypeExtension()] ); } diff --git a/tests/Type/Symfony/RequestDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/RequestDynamicReturnTypeExtensionTest.php index 22572808..f0834674 100644 --- a/tests/Type/Symfony/RequestDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/RequestDynamicReturnTypeExtensionTest.php @@ -16,7 +16,7 @@ public function testGetContent(string $expression, string $type): void __DIR__ . '/request_get_content.php', $expression, $type, - new RequestDynamicReturnTypeExtension() + [new RequestDynamicReturnTypeExtension()] ); } diff --git a/tests/Type/Symfony/SerializerDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/SerializerDynamicReturnTypeExtensionTest.php index 8b60042c..0857127f 100644 --- a/tests/Type/Symfony/SerializerDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/SerializerDynamicReturnTypeExtensionTest.php @@ -16,10 +16,10 @@ public function testSerializerInterface(string $expression, string $type): void __DIR__ . '/serializer.php', $expression, $type, - new SerializerDynamicReturnTypeExtension( + [new SerializerDynamicReturnTypeExtension( 'Symfony\Component\Serializer\SerializerInterface', 'deserialize' - ) + )] ); } @@ -32,10 +32,10 @@ public function testDenormalizerInterface(string $expression, string $type): voi __DIR__ . '/denormalizer.php', $expression, $type, - new SerializerDynamicReturnTypeExtension( + [new SerializerDynamicReturnTypeExtension( 'Symfony\Component\Serializer\Normalizer\DenormalizerInterface', 'denormalize' - ) + )] ); } diff --git a/tests/Type/Symfony/ServiceDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/ServiceDynamicReturnTypeExtensionTest.php index 9580bf91..8cfaa65d 100644 --- a/tests/Type/Symfony/ServiceDynamicReturnTypeExtensionTest.php +++ b/tests/Type/Symfony/ServiceDynamicReturnTypeExtensionTest.php @@ -18,7 +18,7 @@ public function testServices(string $expression, string $type, ?string $containe __DIR__ . '/ExampleController.php', $expression, $type, - new ServiceDynamicReturnTypeExtension(Controller::class, true, (new XmlServiceMapFactory($container))->create()) + [new ServiceDynamicReturnTypeExtension(Controller::class, true, (new XmlServiceMapFactory($container))->create())] ); } @@ -55,7 +55,7 @@ public function testConstantHassersOff(string $expression, string $type, ?string __DIR__ . '/ExampleController.php', $expression, $type, - new ServiceDynamicReturnTypeExtension(Controller::class, false, (new XmlServiceMapFactory($container))->create()) + [new ServiceDynamicReturnTypeExtension(Controller::class, false, (new XmlServiceMapFactory($container))->create())] ); } From a0c1c7be94d09bd50dad8b1406fd30585a5de143 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 11 Feb 2021 15:24:33 +0100 Subject: [PATCH 2/4] Support TreeBuilder::getRootNode() --- composer.json | 1 + extension.neon | 10 +++ .../TreeBuilderDynamicReturnTypeExtension.php | 68 +++++++++++++++++++ ...rGetRootNodeDynamicReturnTypeExtension.php | 40 +++++++++++ src/Type/Symfony/TreeBuilderType.php | 26 +++++++ ...eBuilderDynamicReturnTypeExtensionTest.php | 39 +++++++++++ tests/Type/Symfony/tree_builder.php | 29 ++++++++ 7 files changed, 213 insertions(+) create mode 100644 src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php create mode 100644 src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php create mode 100644 src/Type/Symfony/TreeBuilderType.php create mode 100644 tests/Type/Symfony/TreeBuilderDynamicReturnTypeExtensionTest.php create mode 100644 tests/Type/Symfony/tree_builder.php diff --git a/composer.json b/composer.json index 484ea046..79e67f8e 100644 --- a/composer.json +++ b/composer.json @@ -27,6 +27,7 @@ "phpstan/phpstan-strict-rules": "^0.12.5", "phpunit/phpunit": "^7.5.20", "symfony/console": "^4.0", + "symfony/config": "^4.2", "symfony/framework-bundle": "^4.0", "symfony/http-foundation": "^4.0", "symfony/messenger": "^4.2", diff --git a/extension.neon b/extension.neon index 4209bc61..819442f3 100644 --- a/extension.neon +++ b/extension.neon @@ -145,3 +145,13 @@ services: - factory: PHPStan\Type\Symfony\InputInterfaceHasOptionDynamicReturnTypeExtension tags: [phpstan.broker.dynamicMethodReturnTypeExtension] + + # new TreeBuilder() return type + - + factory: PHPStan\Type\Symfony\TreeBuilderDynamicReturnTypeExtension + tags: [phpstan.broker.dynamicStaticMethodReturnTypeExtension] + + # TreeBuilder::getRootNode() return type + - + factory: PHPStan\Type\Symfony\TreeBuilderGetRootNodeDynamicReturnTypeExtension + tags: [phpstan.broker.dynamicMethodReturnTypeExtension] diff --git a/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php b/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php new file mode 100644 index 00000000..e5825d25 --- /dev/null +++ b/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php @@ -0,0 +1,68 @@ +broker = $broker; + } + + public function getClass(): string + { + return 'Symfony\Component\Config\Definition\Builder\TreeBuilder'; + } + + public function isStaticMethodSupported(MethodReflection $methodReflection): bool + { + return $methodReflection->getName() === '__construct'; + } + + public function getTypeFromStaticMethodCall(MethodReflection $methodReflection, StaticCall $methodCall, Scope $scope): Type + { + if (!$methodCall->class instanceof Name) { + throw new \PHPStan\ShouldNotHappenException(); + } + + $className = $scope->resolveName($methodCall->class); + if (!$this->broker->hasClass($className)) { + return ParametersAcceptorSelector::selectSingle( + $methodReflection->getVariants() + )->getReturnType(); + } + + $args = []; + foreach ($methodCall->args as $arg) { + $value = $scope->getType($arg->value); + + if (!$value instanceof ConstantScalarType) { + throw new \LogicException(); + } + + $args[] = $value->getValue(); + } + + $treeBuilder = new $className( + ...$args + ); + + return new TreeBuilderType($className, $treeBuilder->getRootNode()); + } + +} diff --git a/src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php b/src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php new file mode 100644 index 00000000..ee63d41a --- /dev/null +++ b/src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php @@ -0,0 +1,40 @@ +getName() === 'getRootNode'; + } + + public function getTypeFromMethodCall( + MethodReflection $methodReflection, + MethodCall $methodCall, + Scope $scope + ): Type + { + $calledOnType = $scope->getType($methodCall->var); + if ($calledOnType instanceof TreeBuilderType) { + $nodeDefinition = $calledOnType->getNodeDefinition(); + + return new \PHPStan\Type\ObjectType(get_class($nodeDefinition)); + } + + return new \PHPStan\Type\ObjectType('Symfony\Component\Config\Definition\Builder\NodeDefinition'); + } + +} diff --git a/src/Type/Symfony/TreeBuilderType.php b/src/Type/Symfony/TreeBuilderType.php new file mode 100644 index 00000000..7b4d3177 --- /dev/null +++ b/src/Type/Symfony/TreeBuilderType.php @@ -0,0 +1,26 @@ +nodeDefinition = $nodeDefinition; + } + + public function getNodeDefinition(): NodeDefinition + { + return $this->nodeDefinition; + } + +} diff --git a/tests/Type/Symfony/TreeBuilderDynamicReturnTypeExtensionTest.php b/tests/Type/Symfony/TreeBuilderDynamicReturnTypeExtensionTest.php new file mode 100644 index 00000000..bbb90af6 --- /dev/null +++ b/tests/Type/Symfony/TreeBuilderDynamicReturnTypeExtensionTest.php @@ -0,0 +1,39 @@ +processFile( + __DIR__ . '/tree_builder.php', + $expression, + $type, + [new TreeBuilderGetRootNodeDynamicReturnTypeExtension()], + [new TreeBuilderDynamicReturnTypeExtension()] + ); + } + + /** + * @return \Iterator + */ + public function getProvider(): Iterator + { + yield ['$treeRootNode', 'Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition']; + yield ['$variableRootNode', 'Symfony\Component\Config\Definition\Builder\VariableNodeDefinition']; + yield ['$scalarRootNode', 'Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition']; + yield ['$booleanRootNode', 'Symfony\Component\Config\Definition\Builder\BooleanNodeDefinition']; + yield ['$integerRootNode', 'Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition']; + yield ['$floatRootNode', 'Symfony\Component\Config\Definition\Builder\FloatNodeDefinition']; + yield ['$arrayRootNode', 'Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition']; + yield ['$enumRootNode', 'Symfony\Component\Config\Definition\Builder\EnumNodeDefinition']; + } + +} diff --git a/tests/Type/Symfony/tree_builder.php b/tests/Type/Symfony/tree_builder.php new file mode 100644 index 00000000..24d60d71 --- /dev/null +++ b/tests/Type/Symfony/tree_builder.php @@ -0,0 +1,29 @@ +getRootNode(); + +$variableTreeBuilder = new TreeBuilder('my_tree', 'variable'); +$variableRootNode = $variableTreeBuilder->getRootNode(); + +$scalarTreeBuilder = new TreeBuilder('my_tree', 'scalar'); +$scalarRootNode = $scalarTreeBuilder->getRootNode(); + +$booleanTreeBuilder = new TreeBuilder('my_tree', 'boolean'); +$booleanRootNode = $booleanTreeBuilder->getRootNode(); + +$integerTreeBuilder = new TreeBuilder('my_tree', 'integer'); +$integerRootNode = $integerTreeBuilder->getRootNode(); + +$floatTreeBuilder = new TreeBuilder('my_tree', 'float'); +$floatRootNode = $floatTreeBuilder->getRootNode(); + +$arrayTreeBuilder = new TreeBuilder('my_tree', 'array'); +$arrayRootNode = $arrayTreeBuilder->getRootNode(); + +$enumTreeBuilder = new TreeBuilder('my_tree', 'enum'); +$enumRootNode = $enumTreeBuilder->getRootNode(); + +die; From 877ed3d81f044cdca3302c8f49d100da06e98e5e Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 11 Feb 2021 16:32:02 +0100 Subject: [PATCH 3/4] Apply feedback --- .../TreeBuilderDynamicReturnTypeExtension.php | 55 +++++++++---------- ...rGetRootNodeDynamicReturnTypeExtension.php | 7 +-- src/Type/Symfony/TreeBuilderType.php | 13 ++--- 3 files changed, 34 insertions(+), 41 deletions(-) diff --git a/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php b/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php index e5825d25..27d74b63 100644 --- a/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php +++ b/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php @@ -5,24 +5,30 @@ use PhpParser\Node\Expr\StaticCall; use PhpParser\Node\Name; use PHPStan\Analyser\Scope; -use PHPStan\Broker\Broker; -use PHPStan\Reflection\BrokerAwareExtension; use PHPStan\Reflection\MethodReflection; -use PHPStan\Reflection\ParametersAcceptorSelector; -use PHPStan\Type\ConstantScalarType; use PHPStan\Type\DynamicStaticMethodReturnTypeExtension; use PHPStan\Type\Type; - -final class TreeBuilderDynamicReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension, BrokerAwareExtension +use PHPStan\Type\TypeUtils; +use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; +use Symfony\Component\Config\Definition\Builder\BooleanNodeDefinition; +use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition; +use Symfony\Component\Config\Definition\Builder\FloatNodeDefinition; +use Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition; +use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition; +use Symfony\Component\Config\Definition\Builder\VariableNodeDefinition; + +final class TreeBuilderDynamicReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension { - /** @var Broker */ - private $broker; - - public function setBroker(Broker $broker): void - { - $this->broker = $broker; - } + private const MAPPING = [ + 'variable' => VariableNodeDefinition::class, + 'scalar' => ScalarNodeDefinition::class, + 'boolean' => BooleanNodeDefinition::class, + 'integer' => IntegerNodeDefinition::class, + 'float' => FloatNodeDefinition::class, + 'array' => ArrayNodeDefinition::class, + 'enum' => EnumNodeDefinition::class, + ]; public function getClass(): string { @@ -41,28 +47,17 @@ public function getTypeFromStaticMethodCall(MethodReflection $methodReflection, } $className = $scope->resolveName($methodCall->class); - if (!$this->broker->hasClass($className)) { - return ParametersAcceptorSelector::selectSingle( - $methodReflection->getVariants() - )->getReturnType(); - } - $args = []; - foreach ($methodCall->args as $arg) { - $value = $scope->getType($arg->value); + $type = 'array'; - if (!$value instanceof ConstantScalarType) { - throw new \LogicException(); + if (isset($methodCall->args[1])) { + $argStrings = TypeUtils::getConstantStrings($scope->getType($methodCall->args[1]->value)); + if (count($argStrings) === 1 && isset(self::MAPPING[$argStrings[0]->getValue()])) { + $type = $argStrings[0]->getValue(); } - - $args[] = $value->getValue(); } - $treeBuilder = new $className( - ...$args - ); - - return new TreeBuilderType($className, $treeBuilder->getRootNode()); + return new TreeBuilderType($className, self::MAPPING[$type]); } } diff --git a/src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php b/src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php index ee63d41a..b8b00aba 100644 --- a/src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php +++ b/src/Type/Symfony/TreeBuilderGetRootNodeDynamicReturnTypeExtension.php @@ -6,6 +6,7 @@ use PHPStan\Analyser\Scope; use PHPStan\Reflection\MethodReflection; use PHPStan\Type\DynamicMethodReturnTypeExtension; +use PHPStan\Type\ObjectType; use PHPStan\Type\Type; final class TreeBuilderGetRootNodeDynamicReturnTypeExtension implements DynamicMethodReturnTypeExtension @@ -29,12 +30,10 @@ public function getTypeFromMethodCall( { $calledOnType = $scope->getType($methodCall->var); if ($calledOnType instanceof TreeBuilderType) { - $nodeDefinition = $calledOnType->getNodeDefinition(); - - return new \PHPStan\Type\ObjectType(get_class($nodeDefinition)); + return new ObjectType($calledOnType->getRootNodeClassName()); } - return new \PHPStan\Type\ObjectType('Symfony\Component\Config\Definition\Builder\NodeDefinition'); + return $methodReflection->getVariants()[0]->getReturnType(); } } diff --git a/src/Type/Symfony/TreeBuilderType.php b/src/Type/Symfony/TreeBuilderType.php index 7b4d3177..faf26c6a 100644 --- a/src/Type/Symfony/TreeBuilderType.php +++ b/src/Type/Symfony/TreeBuilderType.php @@ -3,24 +3,23 @@ namespace PHPStan\Type\Symfony; use PHPStan\Type\ObjectType; -use Symfony\Component\Config\Definition\Builder\NodeDefinition; class TreeBuilderType extends ObjectType { - /** @var NodeDefinition */ - private $nodeDefinition; + /** @var string */ + private $rootNodeClassName; - public function __construct(string $className, NodeDefinition $nodeDefinition) + public function __construct(string $className, string $rootNodeClassName) { parent::__construct($className); - $this->nodeDefinition = $nodeDefinition; + $this->rootNodeClassName = $rootNodeClassName; } - public function getNodeDefinition(): NodeDefinition + public function getRootNodeClassName(): string { - return $this->nodeDefinition; + return $this->rootNodeClassName; } } From 588273db878d7579a62415171defd19c6cdbda36 Mon Sep 17 00:00:00 2001 From: Ruud Kamphuis Date: Thu, 11 Feb 2021 16:34:11 +0100 Subject: [PATCH 4/4] Use class strings I think this is how it's done everywhere. --- .../TreeBuilderDynamicReturnTypeExtension.php | 21 +++++++------------ 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php b/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php index 27d74b63..56f29d35 100644 --- a/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php +++ b/src/Type/Symfony/TreeBuilderDynamicReturnTypeExtension.php @@ -9,25 +9,18 @@ use PHPStan\Type\DynamicStaticMethodReturnTypeExtension; use PHPStan\Type\Type; use PHPStan\Type\TypeUtils; -use Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition; -use Symfony\Component\Config\Definition\Builder\BooleanNodeDefinition; -use Symfony\Component\Config\Definition\Builder\EnumNodeDefinition; -use Symfony\Component\Config\Definition\Builder\FloatNodeDefinition; -use Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition; -use Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition; -use Symfony\Component\Config\Definition\Builder\VariableNodeDefinition; final class TreeBuilderDynamicReturnTypeExtension implements DynamicStaticMethodReturnTypeExtension { private const MAPPING = [ - 'variable' => VariableNodeDefinition::class, - 'scalar' => ScalarNodeDefinition::class, - 'boolean' => BooleanNodeDefinition::class, - 'integer' => IntegerNodeDefinition::class, - 'float' => FloatNodeDefinition::class, - 'array' => ArrayNodeDefinition::class, - 'enum' => EnumNodeDefinition::class, + 'variable' => 'Symfony\Component\Config\Definition\Builder\VariableNodeDefinition', + 'scalar' => 'Symfony\Component\Config\Definition\Builder\ScalarNodeDefinition', + 'boolean' => 'Symfony\Component\Config\Definition\Builder\BooleanNodeDefinition', + 'integer' => 'Symfony\Component\Config\Definition\Builder\IntegerNodeDefinition', + 'float' => 'Symfony\Component\Config\Definition\Builder\FloatNodeDefinition', + 'array' => 'Symfony\Component\Config\Definition\Builder\ArrayNodeDefinition', + 'enum' => 'Symfony\Component\Config\Definition\Builder\EnumNodeDefinition', ]; public function getClass(): string