Allow multidimensional collection in property info

This commit is contained in:
Jérémy Derussé 2018-07-20 11:22:01 +02:00
parent 18edda3716
commit ce49036790
No known key found for this signature in database
GPG Key ID: 2083FA5758C473D2
4 changed files with 33 additions and 15 deletions

View File

@ -87,6 +87,8 @@ class PhpDocExtractorTest extends TestCase
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
array('collection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime'))), null, null),
array('nestedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_STRING, false)))), null, null),
array('mixedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, null, null)), null, null),
array('a', array(new Type(Type::BUILTIN_TYPE_INT)), 'A.', null),
array('b', array(new Type(Type::BUILTIN_TYPE_OBJECT, true, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), 'B.', null),
array('c', array(new Type(Type::BUILTIN_TYPE_BOOL, true)), null, null),
@ -126,6 +128,8 @@ class PhpDocExtractorTest extends TestCase
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
array('collection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime'))), null, null),
array('nestedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_STRING, false)))), null, null),
array('mixedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, null, null)), null, null),
array('a', null, 'A.', null),
array('b', null, 'B.', null),
array('c', array(new Type(Type::BUILTIN_TYPE_BOOL, true)), null, null),
@ -164,6 +168,8 @@ class PhpDocExtractorTest extends TestCase
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
array('collection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime'))), null, null),
array('nestedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, new Type(Type::BUILTIN_TYPE_INT), new Type(Type::BUILTIN_TYPE_STRING, false)))), null, null),
array('mixedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, null, null)), null, null),
array('a', null, 'A.', null),
array('b', null, 'B.', null),
array('c', null, null, null),

View File

@ -38,6 +38,8 @@ class ReflectionExtractorTest extends TestCase
'bal',
'parent',
'collection',
'nestedCollection',
'mixedCollection',
'B',
'Guid',
'g',
@ -77,6 +79,8 @@ class ReflectionExtractorTest extends TestCase
'bal',
'parent',
'collection',
'nestedCollection',
'mixedCollection',
'B',
'Guid',
'g',
@ -108,6 +112,8 @@ class ReflectionExtractorTest extends TestCase
'bal',
'parent',
'collection',
'nestedCollection',
'mixedCollection',
'B',
'Guid',
'g',

View File

@ -45,6 +45,14 @@ class Dummy extends ParentDummy
* @Groups({"a", "b"})
*/
public $collection;
/**
* @var string[][]
*/
public $nestedCollection;
/**
* @var mixed[]
*/
public $mixedCollection;
/**
* @var ParentDummy

View File

@ -89,28 +89,26 @@ final class PhpDocTypeHelper
{
// Cannot guess
if (!$docType || 'mixed' === $docType) {
return;
return null;
}
if ($collection = '[]' === substr($docType, -2)) {
$docType = substr($docType, 0, -2);
if ('[]' === substr($docType, -2)) {
if ('mixed[]' === $docType) {
$collectionKeyType = null;
$collectionValueType = null;
} else {
$collectionKeyType = new Type(Type::BUILTIN_TYPE_INT);
$collectionValueType = $this->createType(substr($docType, 0, -2), $nullable);
}
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, $collectionKeyType, $collectionValueType);
}
$docType = $this->normalizeType($docType);
list($phpType, $class) = $this->getPhpTypeAndClass($docType);
$array = 'array' === $docType;
if ($collection || $array) {
if ($array || 'mixed' === $docType) {
$collectionKeyType = null;
$collectionValueType = null;
} else {
$collectionKeyType = new Type(Type::BUILTIN_TYPE_INT);
$collectionValueType = new Type($phpType, $nullable, $class);
}
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, $collectionKeyType, $collectionValueType);
if ('array' === $docType) {
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, null, null);
}
return new Type($phpType, $nullable, $class);