Skip to content

Commit e693459

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

File tree

5 files changed

+20
-16
lines changed

5 files changed

+20
-16
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,7 @@ 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('deepCollection', 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),
9091
array('a', array(new Type(Type::BUILTIN_TYPE_INT)), 'A.', null),
9192
array('b', array(new Type(Type::BUILTIN_TYPE_OBJECT, true, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), 'B.', null),
9293
array('c', array(new Type(Type::BUILTIN_TYPE_BOOL, true)), null, null),
@@ -126,6 +127,7 @@ public function typesWithCustomPrefixesProvider()
126127
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
127128
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
128129
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),
130+
array('deepCollection', 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),
129131
array('a', null, 'A.', null),
130132
array('b', null, 'B.', null),
131133
array('c', array(new Type(Type::BUILTIN_TYPE_BOOL, true)), null, null),
@@ -164,6 +166,7 @@ public function typesWithNoPrefixesProvider()
164166
array('bal', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'DateTime')), null, null),
165167
array('parent', array(new Type(Type::BUILTIN_TYPE_OBJECT, false, 'Symfony\Component\PropertyInfo\Tests\Fixtures\ParentDummy')), null, null),
166168
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),
169+
array('deepCollection', 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),
167170
array('a', null, 'A.', null),
168171
array('b', null, 'B.', null),
169172
array('c', 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
@@ -38,6 +38,7 @@ public function testGetProperties()
3838
'bal',
3939
'parent',
4040
'collection',
41+
'deepCollection',
4142
'B',
4243
'Guid',
4344
'g',
@@ -77,6 +78,7 @@ public function testGetPropertiesWithCustomPrefixes()
7778
'bal',
7879
'parent',
7980
'collection',
81+
'deepCollection',
8082
'B',
8183
'Guid',
8284
'g',
@@ -108,6 +110,7 @@ public function testGetPropertiesWithNoPrefixes()
108110
'bal',
109111
'parent',
110112
'collection',
113+
'deepCollection',
111114
'B',
112115
'Guid',
113116
'g',

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protected function setUp()
3636
public function testGetProperties()
3737
{
3838
$this->assertEquals(
39-
array('collection'),
39+
array('collection', 'deepCollection'),
4040
$this->extractor->getProperties('Symfony\Component\PropertyInfo\Tests\Fixtures\Dummy', array('serializer_groups' => array('a')))
4141
);
4242
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,11 @@ class Dummy extends ParentDummy
4545
* @Groups({"a", "b"})
4646
*/
4747
public $collection;
48+
/**
49+
* @var string[][]
50+
* @Groups({"a", "b"})
51+
*/
52+
public $deepCollection;
4853

4954
/**
5055
* @var ParentDummy

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

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -89,28 +89,21 @@ 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);
95+
if ('[]' === substr($docType, -2)) {
96+
$collectionKeyType = new Type(Type::BUILTIN_TYPE_INT);
97+
$collectionValueType = $this->createType(substr($docType, 0, -2), $nullable);
98+
99+
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, $collectionKeyType, $collectionValueType);
97100
}
98101

99102
$docType = $this->normalizeType($docType);
100103
list($phpType, $class) = $this->getPhpTypeAndClass($docType);
101104

102-
$array = 'array' === $docType;
103-
104-
if ($collection || $array) {
105-
if ($array || 'mixed' === $docType) {
106-
$collectionKeyType = null;
107-
$collectionValueType = null;
108-
} else {
109-
$collectionKeyType = new Type(Type::BUILTIN_TYPE_INT);
110-
$collectionValueType = new Type($phpType, $nullable, $class);
111-
}
112-
113-
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, $collectionKeyType, $collectionValueType);
105+
if ('array' === $docType) {
106+
return new Type(Type::BUILTIN_TYPE_ARRAY, $nullable, null, true, null, null);
114107
}
115108

116109
return new Type($phpType, $nullable, $class);

0 commit comments

Comments
 (0)