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
-------
5e394c40f0
[PropertyInfo] Fixed type extraction for nullable collections of non-nullable elements
This commit is contained in:
commit
142bdddece
@ -90,6 +90,7 @@ class PhpDocExtractorTest extends TestCase
|
||||
['h', [new Type(Type::BUILTIN_TYPE_STRING, true)], null, null],
|
||||
['i', [new Type(Type::BUILTIN_TYPE_STRING, true), new Type(Type::BUILTIN_TYPE_INT, true)], null, null],
|
||||
['j', [new Type(Type::BUILTIN_TYPE_OBJECT, true, 'DateTime')], null, null],
|
||||
['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],
|
||||
['donotexist', null, null, null],
|
||||
['staticGetter', null, null, null],
|
||||
['staticSetter', null, null, null],
|
||||
@ -174,6 +175,7 @@ class PhpDocExtractorTest extends TestCase
|
||||
['h', [new Type(Type::BUILTIN_TYPE_STRING, true)], null, null],
|
||||
['i', [new Type(Type::BUILTIN_TYPE_STRING, true), new Type(Type::BUILTIN_TYPE_INT, true)], null, null],
|
||||
['j', [new Type(Type::BUILTIN_TYPE_OBJECT, true, 'DateTime')], null, null],
|
||||
['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],
|
||||
['donotexist', null, null, null],
|
||||
['staticGetter', null, null, null],
|
||||
['staticSetter', null, null, null],
|
||||
@ -214,6 +216,7 @@ class PhpDocExtractorTest extends TestCase
|
||||
['h', [new Type(Type::BUILTIN_TYPE_STRING, true)], null, null],
|
||||
['i', [new Type(Type::BUILTIN_TYPE_STRING, true), new Type(Type::BUILTIN_TYPE_INT, true)], null, null],
|
||||
['j', [new Type(Type::BUILTIN_TYPE_OBJECT, true, 'DateTime')], null, null],
|
||||
['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],
|
||||
['donotexist', null, null, null],
|
||||
['staticGetter', null, null, null],
|
||||
['staticSetter', null, null, null],
|
||||
|
@ -51,6 +51,7 @@ class ReflectionExtractorTest extends TestCase
|
||||
'h',
|
||||
'i',
|
||||
'j',
|
||||
'nullableCollectionOfNonNullableElements',
|
||||
'emptyVar',
|
||||
'iteratorCollection',
|
||||
'iteratorCollectionWithKey',
|
||||
@ -97,6 +98,7 @@ class ReflectionExtractorTest extends TestCase
|
||||
'h',
|
||||
'i',
|
||||
'j',
|
||||
'nullableCollectionOfNonNullableElements',
|
||||
'emptyVar',
|
||||
'iteratorCollection',
|
||||
'iteratorCollectionWithKey',
|
||||
@ -133,6 +135,7 @@ class ReflectionExtractorTest extends TestCase
|
||||
'h',
|
||||
'i',
|
||||
'j',
|
||||
'nullableCollectionOfNonNullableElements',
|
||||
'emptyVar',
|
||||
'iteratorCollection',
|
||||
'iteratorCollectionWithKey',
|
||||
|
@ -93,6 +93,11 @@ class Dummy extends ParentDummy
|
||||
*/
|
||||
public $j;
|
||||
|
||||
/**
|
||||
* @var int[]|null
|
||||
*/
|
||||
public $nullableCollectionOfNonNullableElements;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
|
@ -114,7 +114,7 @@ final class PhpDocTypeHelper
|
||||
$collectionValueType = null;
|
||||
} else {
|
||||
$collectionKeyType = new Type(Type::BUILTIN_TYPE_INT);
|
||||
$collectionValueType = $this->createType($type, $nullable, substr($docType, 0, -2));
|
||||
$collectionValueType = $this->createType($type, false, substr($docType, 0, -2));
|
||||
}
|
||||
|
||||
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, $collectionKeyType, $collectionValueType);
|
||||
|
Reference in New Issue
Block a user