Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 142bddd

Browse files
committed
bug #34165 [PropertyInfo] Fixed type extraction for nullable collections of non-nullable elements (happyproff)
This PR was squashed before being merged into the 4.3 branch (closes #34165). Discussion ---------- [PropertyInfo] Fixed type extraction for nullable collections of non-nullable elements | Q | A | ------------- | --- | Branch? | 4.3 | Bug fix? | yes | New feature? | no | Deprecations? | no | Tickets | | License | MIT | Doc PR | When an annotation is declared as `int[]|null`, it is handled like `(int|null)[]|null`. So array values are also nullable. Now this behavior is fixed that `int[]|null` is either a collection of integers only or null. How to reproduce: ```php class Dummy { /** @var int[]|null */ public $nullableCollectionOfNonNullableElements; } /** @var Type[] $types */ $types = (new PhpDocExtractor())->getTypes(Dummy::class, 'nullableCollectionOfNonNullableElements'); $collectionType = $types[0]; assert($collectionType->isCollection() === true); // OK assert($collectionType->isNullable() === true); // OK assert($collectionType->getCollectionValueType()->getBuiltinType() === Type::BUILTIN_TYPE_INT); // OK assert($collectionType->getCollectionValueType()->isNullable() === false); // FAILED ``` Commits ------- 5e394c4 [PropertyInfo] Fixed type extraction for nullable collections of non-nullable elements
2 parents 22976d0 + 5e394c4 commit 142bddd

File tree

4 files changed

+12
-1
lines changed

4 files changed

+12
-1
lines changed

src/Symfony/Component/PropertyInfo/Tests/Extractor/PhpDocExtractorTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public function typesProvider()
9090
['h', [new Type(Type::BUILTIN_TYPE_STRING, true)], null, null],
9191
['i', [new Type(Type::BUILTIN_TYPE_STRING, true), new Type(Type::BUILTIN_TYPE_INT, true)], null, null],
9292
['j', [new Type(Type::BUILTIN_TYPE_OBJECT, true, 'DateTime')], null, null],
93+
['nullableCollectionOfNonNullableElements', [new Type(Type::BUILTIN_TYPE_ARRAY, true, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_INT, false))], null, null],
9394
['donotexist', null, null, null],
9495
['staticGetter', null, null, null],
9596
['staticSetter', null, null, null],
@@ -174,6 +175,7 @@ public function typesWithCustomPrefixesProvider()
174175
['h', [new Type(Type::BUILTIN_TYPE_STRING, true)], null, null],
175176
['i', [new Type(Type::BUILTIN_TYPE_STRING, true), new Type(Type::BUILTIN_TYPE_INT, true)], null, null],
176177
['j', [new Type(Type::BUILTIN_TYPE_OBJECT, true, 'DateTime')], null, null],
178+
['nullableCollectionOfNonNullableElements', [new Type(Type::BUILTIN_TYPE_ARRAY, true, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_INT, false))], null, null],
177179
['donotexist', null, null, null],
178180
['staticGetter', null, null, null],
179181
['staticSetter', null, null, null],
@@ -214,6 +216,7 @@ public function typesWithNoPrefixesProvider()
214216
['h', [new Type(Type::BUILTIN_TYPE_STRING, true)], null, null],
215217
['i', [new Type(Type::BUILTIN_TYPE_STRING, true), new Type(Type::BUILTIN_TYPE_INT, true)], null, null],
216218
['j', [new Type(Type::BUILTIN_TYPE_OBJECT, true, 'DateTime')], null, null],
219+
['nullableCollectionOfNonNullableElements', [new Type(Type::BUILTIN_TYPE_ARRAY, true, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_INT, false))], null, null],
217220
['donotexist', null, null, null],
218221
['staticGetter', null, null, null],
219222
['staticSetter', null, null, null],

src/Symfony/Component/PropertyInfo/Tests/Extractor/ReflectionExtractorTest.php

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ public function testGetProperties()
5151
'h',
5252
'i',
5353
'j',
54+
'nullableCollectionOfNonNullableElements',
5455
'emptyVar',
5556
'iteratorCollection',
5657
'iteratorCollectionWithKey',
@@ -97,6 +98,7 @@ public function testGetPropertiesWithCustomPrefixes()
9798
'h',
9899
'i',
99100
'j',
101+
'nullableCollectionOfNonNullableElements',
100102
'emptyVar',
101103
'iteratorCollection',
102104
'iteratorCollectionWithKey',
@@ -133,6 +135,7 @@ public function testGetPropertiesWithNoPrefixes()
133135
'h',
134136
'i',
135137
'j',
138+
'nullableCollectionOfNonNullableElements',
136139
'emptyVar',
137140
'iteratorCollection',
138141
'iteratorCollectionWithKey',

src/Symfony/Component/PropertyInfo/Tests/Fixtures/Dummy.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,11 @@ class Dummy extends ParentDummy
9393
*/
9494
public $j;
9595

96+
/**
97+
* @var int[]|null
98+
*/
99+
public $nullableCollectionOfNonNullableElements;
100+
96101
/**
97102
* @var array
98103
*/

src/Symfony/Component/PropertyInfo/Util/PhpDocTypeHelper.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ private function createType(DocType $type, bool $nullable, string $docType = nul
114114
$collectionValueType = null;
115115
} else {
116116
$collectionKeyType = new Type(Type::BUILTIN_TYPE_INT);
117-
$collectionValueType = $this->createType($type, $nullable, substr($docType, 0, -2));
117+
$collectionValueType = $this->createType($type, false, substr($docType, 0, -2));
118118
}
119119

120120
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, $collectionKeyType, $collectionValueType);

0 commit comments

Comments
 (0)