Skip to content

Commit ce49036

Browse files
committed
Allow multidimensional collection in property info
1 parent 18edda3 commit ce49036

File tree

4 files changed

+31
-13
lines changed

4 files changed

+31
-13
lines changed

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,8 @@ public function typesProvider()
8787
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
8888
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
8989
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),
90+
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),
91+
array('mixedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, null, null)), null, null),
9092
array('a', array(new Type(Type::BUILTIN_TYPE_INT)), 'A.', null),
9193
array('b', array(new Type(Type::BUILTIN_TYPE_OBJECT, true, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), 'B.', null),
9294
array('c', array(new Type(Type::BUILTIN_TYPE_BOOL, true)), null, null),
@@ -126,6 +128,8 @@ public function typesWithCustomPrefixesProvider()
126128
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
127129
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
128130
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),
131+
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),
132+
array('mixedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, null, null)), null, null),
129133
array('a', null, 'A.', null),
130134
array('b', null, 'B.', null),
131135
array('c', array(new Type(Type::BUILTIN_TYPE_BOOL, true)), null, null),
@@ -164,6 +168,8 @@ public function typesWithNoPrefixesProvider()
164168
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
165169
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
166170
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),
171+
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),
172+
array('mixedCollection', array(new Type(Type::BUILTIN_TYPE_ARRAY, false, null, true, null, null)), null, null),
167173
array('a', null, 'A.', null),
168174
array('b', null, 'B.', null),
169175
array('c', null, null, null),

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ public function testGetProperties()
3838
'bal',
3939
'parent',
4040
'collection',
41+
'nestedCollection',
42+
'mixedCollection',
4143
'B',
4244
'Guid',
4345
'g',
@@ -77,6 +79,8 @@ public function testGetPropertiesWithCustomPrefixes()
7779
'bal',
7880
'parent',
7981
'collection',
82+
'nestedCollection',
83+
'mixedCollection',
8084
'B',
8185
'Guid',
8286
'g',
@@ -108,6 +112,8 @@ public function testGetPropertiesWithNoPrefixes()
108112
'bal',
109113
'parent',
110114
'collection',
115+
'nestedCollection',
116+
'mixedCollection',
111117
'B',
112118
'Guid',
113119
'g',

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@ class Dummy extends ParentDummy
4545
* @Groups({"a", "b"})
4646
*/
4747
public $collection;
48+
/**
49+
* @var string[][]
50+
*/
51+
public $nestedCollection;
52+
/**
53+
* @var mixed[]
54+
*/
55+
public $mixedCollection;
4856

4957
/**
5058
* @var ParentDummy

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

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -89,30 +89,28 @@ private function createType($docType, $nullable)
8989
{
9090
// Cannot guess
9191
if (!$docType || 'mixed' === $docType) {
92-
return;
92+
return null;
9393
}
9494

95-
if ($collection = '[]' === substr($docType, -2)) {
96-
$docType = substr($docType, 0, -2);
97-
}
98-
99-
$docType = $this->normalizeType($docType);
100-
list($phpType, $class) = $this->getPhpTypeAndClass($docType);
101-
102-
$array = 'array' === $docType;
103-
104-
if ($collection || $array) {
105-
if ($array || 'mixed' === $docType) {
95+
if ('[]' === substr($docType, -2)) {
96+
if ('mixed[]' === $docType) {
10697
$collectionKeyType = null;
10798
$collectionValueType = null;
10899
} else {
109100
$collectionKeyType = new Type(Type::BUILTIN_TYPE_INT);
110-
$collectionValueType = new Type($phpType, $nullable, $class);
101+
$collectionValueType = $this->createType(substr($docType, 0, -2), $nullable);
111102
}
112103

113104
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, $collectionKeyType, $collectionValueType);
114105
}
115106

107+
$docType = $this->normalizeType($docType);
108+
list($phpType, $class) = $this->getPhpTypeAndClass($docType);
109+
110+
if ('array' === $docType) {
111+
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, null, null);
112+
}
113+
116114
return new Type($phpType, $nullable, $class);
117115
}
118116

0 commit comments

Comments
 (0)