From d8500c13598e17381ce499b9332aa5157912fd36 Mon Sep 17 00:00:00 2001 From: Wouter de Jong Date: Sat, 4 Jun 2022 17:36:17 +0200 Subject: [PATCH] [Config] Add conditional types to conditional builders This allows static analysis tools to understand what type is returned. --- .../Config/Builder/ConfigBuilderGenerator.php | 12 ++++++++++++ .../Config/ScalarNormalizedTypes/NestedConfig.php | 10 +++++++++- .../Symfony/Config/ScalarNormalizedTypesConfig.php | 12 ++++++++++++ 3 files changed, 33 insertions(+), 1 deletion(-) diff --git a/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php b/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php index c63917bcb0eaa..5b2b9a5815b2c 100644 --- a/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php +++ b/src/Symfony/Component/Config/Builder/ConfigBuilderGenerator.php @@ -143,7 +143,11 @@ private function handleArrayNode(ArrayNode $node, ClassBuilder $class, string $n ); $body = $hasNormalizationClosures ? ' /** + * @template T + * @psalm-param T $value + * * @return CLASS|$this + * @psalm-return (T is array ? CLASS : static) */ public function NAME($value = []) { @@ -262,7 +266,11 @@ public function NAME(string $VAR, $VALUE): self if (null === $key = $node->getKeyAttribute()) { $body = $hasNormalizationClosures ? ' /** + * @template T + * @psalm-param T $value + * * @return CLASS|$this + * @psalm-return (T is array ? CLASS : static) */ public function NAME($value = []) { @@ -285,7 +293,11 @@ public function NAME(array $value = []): CLASS } else { $body = $hasNormalizationClosures ? ' /** + * @template T + * @psalm-param T $value + * * @return CLASS|$this + * @psalm-return (T is array ? CLASS : static) */ public function NAME(string $VAR, $VALUE = []) { diff --git a/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypes/NestedConfig.php b/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypes/NestedConfig.php index 5774fdbb83821..8551c56a0e137 100644 --- a/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypes/NestedConfig.php +++ b/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypes/NestedConfig.php @@ -10,14 +10,18 @@ /** * This class is automatically generated to help in creating a config. */ -class NestedConfig +class NestedConfig { private $nestedObject; private $nestedListObject; private $_usedProperties = []; /** + * @template T + * @psalm-param T $value + * * @return \Symfony\Config\ScalarNormalizedTypes\Nested\NestedObjectConfig|$this + * @psalm-return (T is array ? \Symfony\Config\ScalarNormalizedTypes\Nested\NestedObjectConfig : static) */ public function nestedObject($value = []) { @@ -39,7 +43,11 @@ public function nestedObject($value = []) } /** + * @template T + * @psalm-param T $value + * * @return \Symfony\Config\ScalarNormalizedTypes\Nested\NestedListObjectConfig|$this + * @psalm-return (T is array ? \Symfony\Config\ScalarNormalizedTypes\Nested\NestedListObjectConfig : static) */ public function nestedListObject($value = []) { diff --git a/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypesConfig.php b/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypesConfig.php index 5ba2f1112ba10..2388452d5a548 100644 --- a/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypesConfig.php +++ b/src/Symfony/Component/Config/Tests/Builder/Fixtures/ScalarNormalizedTypes/Symfony/Config/ScalarNormalizedTypesConfig.php @@ -48,7 +48,11 @@ public function keyedArray(string $name, $value): self } /** + * @template T + * @psalm-param T $value + * * @return \Symfony\Config\ScalarNormalizedTypes\ObjectConfig|$this + * @psalm-return (T is array ? \Symfony\Config\ScalarNormalizedTypes\ObjectConfig : static) */ public function object($value = []) { @@ -70,7 +74,11 @@ public function object($value = []) } /** + * @template T + * @psalm-param T $value + * * @return \Symfony\Config\ScalarNormalizedTypes\ListObjectConfig|$this + * @psalm-return (T is array ? \Symfony\Config\ScalarNormalizedTypes\ListObjectConfig : static) */ public function listObject($value = []) { @@ -85,7 +93,11 @@ public function listObject($value = []) } /** + * @template T + * @psalm-param T $value + * * @return \Symfony\Config\ScalarNormalizedTypes\KeyedListObjectConfig|$this + * @psalm-return (T is array ? \Symfony\Config\ScalarNormalizedTypes\KeyedListObjectConfig : static) */ public function keyedListObject(string $class, $value = []) {