Skip to content

Commit 6307f06

Browse files
committed
deserializer tests
1 parent bb46a2e commit 6307f06

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+1277
-1029
lines changed

src/Symfony/Component/Serializer/Deserialize/Config/DeserializeConfig.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ public function forceGenerateTemplate(): bool
6363
return $this->forceGenerateTemplate;
6464
}
6565

66-
public function withForceGenerateTemplate(bool $forceGenerateTemplate): static
66+
public function withForceGenerateTemplate(bool $forceGenerateTemplate = true): static
6767
{
6868
$clone = clone $this;
6969
$clone->forceGenerateTemplate = $forceGenerateTemplate;

src/Symfony/Component/Serializer/Deserialize/Mapping/TypePropertyMetadataLoader.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ public function load(string $className, DeserializeConfig $config, array $contex
4242

4343
if (isset($genericTypes[(string) $type])) {
4444
$metadata = $metadata->withType($this->typeGenericsHelper->replaceGenericTypes($type, $genericTypes));
45+
$type = $metadata->type();
4546
}
4647

4748
if ($type->isObject() && $type->hasClass() && is_a($type->className(), \DateTimeInterface::class, true)) {

src/Symfony/Component/Serializer/Deserialize/Splitter/JsonLexer.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ public function tokens(mixed $resource, int $offset, int $length): \Iterator
4949
$toReadLength = $length;
5050

5151
while (!feof($resource) && ($infiniteLength || $toReadLength > 0)) {
52-
if (false === $buffer = @stream_get_contents($resource, $infiniteLength ? -1 : min($chunkLength, $toReadLength), $offset)) {
52+
if (!$buffer = @stream_get_contents($resource, $infiniteLength ? -1 : min($chunkLength, $toReadLength), $offset)) {
5353
throw new InvalidResourceException($resource);
5454
}
5555

src/Symfony/Component/Serializer/Deserialize/Template/EagerTemplateGenerator.php

Lines changed: 35 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -78,11 +78,11 @@ protected function returnDataNodes(DataModelNodeInterface $node, array &$context
7878
*/
7979
protected function collectionNodes(CollectionNode $node, array &$context): array
8080
{
81-
$returnNullNodes = [
81+
$returnNullNodes = $node->type->isNullable() ? [
8282
new IfNode(new BinaryNode('===', new PhpScalarNode(null), new VariableNode('data')), [
8383
new ExpressionNode(new ReturnNode(new PhpScalarNode(null))),
8484
]),
85-
];
85+
] : [];
8686

8787
$iterableClosureNodes = [
8888
new ExpressionNode(new AssignNode(
@@ -117,11 +117,15 @@ protected function collectionNodes(CollectionNode $node, array &$context): array
117117
new ExpressionNode(new AssignNode(
118118
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($node->identifier())),
119119
new ClosureNode(
120-
new ArgumentsNode(['data' => '?iterable']),
120+
new ParametersNode(['data' => '?iterable']),
121121
($node->type->isNullable() ? '?' : '').$node->type->name(),
122122
true,
123123
[...$returnNullNodes, ...$iterableClosureNodes, ...$returnNodes],
124-
new ArgumentsNode(['config' => null, 'instantiator' => null, '&providers' => null]),
124+
new ArgumentsNode([
125+
new VariableNode('config'),
126+
new VariableNode('instantiator'),
127+
new VariableNode('providers', byReference: true),
128+
]),
125129
),
126130
)),
127131
...$this->providerNodes($node->item, $context),
@@ -135,11 +139,11 @@ protected function collectionNodes(CollectionNode $node, array &$context): array
135139
*/
136140
protected function objectNodes(ObjectNode $node, array &$context): array
137141
{
138-
$returnNullNodes = [
142+
$returnNullNodes = $node->type->isNullable() ? [
139143
new IfNode(new BinaryNode('===', new PhpScalarNode(null), new VariableNode('data')), [
140144
new ExpressionNode(new ReturnNode(new PhpScalarNode(null))),
141145
]),
142-
];
146+
] : [];
143147

144148
$propertyValueProvidersNodes = [];
145149
$fillPropertiesArrayNodes = [
@@ -155,12 +159,17 @@ protected function objectNodes(ObjectNode $node, array &$context): array
155159
), [
156160
new ExpressionNode(new AssignNode(
157161
new ArrayAccessNode(new VariableNode('properties'), new PhpScalarNode($property['name'])),
158-
new ClosureNode(new ArgumentsNode([]), 'mixed', true, [
162+
new ClosureNode(new ParametersNode([]), 'mixed', true, [
159163
new ExpressionNode(new ReturnNode(($property['formatter'])(new FunctionCallNode(
160164
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($property['value']->identifier())),
161165
new ArgumentsNode([new ArrayAccessNode(new VariableNode('data'), new PhpScalarNode($serializedName))]),
162166
)))),
163-
], new ArgumentsNode(['data' => null, 'config' => null, 'instantiator' => null, '&providers' => null])),
167+
], new ArgumentsNode([
168+
new VariableNode('data'),
169+
new VariableNode('config'),
170+
new VariableNode('instantiator'),
171+
new VariableNode('providers', byReference: true),
172+
])),
164173
)),
165174
]);
166175
}
@@ -177,11 +186,15 @@ protected function objectNodes(ObjectNode $node, array &$context): array
177186
new ExpressionNode(new AssignNode(
178187
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($node->identifier())),
179188
new ClosureNode(
180-
new ArgumentsNode(['data' => '?array']),
189+
new ParametersNode(['data' => '?array']),
181190
($node->type->isNullable() ? '?' : '').$node->type->className(),
182191
true,
183192
[...$returnNullNodes, ...$fillPropertiesArrayNodes, ...$instantiateNodes],
184-
new ArgumentsNode(['config' => null, 'instantiator' => null, '&providers' => null]),
193+
new ArgumentsNode([
194+
new VariableNode('config'),
195+
new VariableNode('instantiator'),
196+
new VariableNode('providers', byReference: true),
197+
]),
185198
),
186199
)),
187200
...$propertyValueProvidersNodes,
@@ -195,22 +208,22 @@ protected function objectNodes(ObjectNode $node, array &$context): array
195208
*/
196209
protected function scalarNodes(ScalarNode $node, array &$context): array
197210
{
198-
$returnNullNodes = [
211+
$returnNullNodes = $node->type->isNullable() ? [
199212
new IfNode(new BinaryNode('===', new PhpScalarNode(null), new VariableNode('data')), [
200213
new ExpressionNode(new ReturnNode(new PhpScalarNode(null))),
201214
]),
202-
];
215+
] : [];
203216

204217
$formatDataNodes = match (true) {
205-
\in_array($node->type->name(), ['int', 'string', 'float', 'bool', 'object'], true) => [
218+
\in_array($node->type->name(), ['int', 'string', 'float', 'bool', 'object', 'array'], true) => [
206219
new TryCatchNode([new ExpressionNode(new ReturnNode(new CastNode($node->type->name(), new VariableNode('data'))))], [
207220
new ExpressionNode(new ThrowNode(new NewNode('\\'.UnexpectedValueException::class, new ArgumentsNode([
208221
new FunctionCallNode('sprintf', new ArgumentsNode([
209222
new PhpScalarNode(sprintf('Cannot cast "%%s" to "%s"', $node->type->name())),
210223
new FunctionCallNode('get_debug_type', new ArgumentsNode([new VariableNode('data')])),
211224
])),
212225
])))),
213-
], new ArgumentsNode(['e' => '\\Throwable'])),
226+
], new ParametersNode(['e' => '\\Throwable'])),
214227
],
215228
$node->type->isBackedEnum() => [
216229
new TryCatchNode([
@@ -227,7 +240,7 @@ protected function scalarNodes(ScalarNode $node, array &$context): array
227240
new VariableNode('data'),
228241
])),
229242
])))),
230-
], new ArgumentsNode(['e' => '\\ValueError'])),
243+
], new ParametersNode(['e' => '\\ValueError'])),
231244
],
232245
default => [
233246
new ExpressionNode(new ReturnNode(new VariableNode('data'))),
@@ -238,11 +251,15 @@ protected function scalarNodes(ScalarNode $node, array &$context): array
238251
new ExpressionNode(new AssignNode(
239252
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($node->identifier())),
240253
new ClosureNode(
241-
new ArgumentsNode(['data' => 'mixed']),
242-
(string) $node->type,
254+
new ParametersNode(['data' => 'mixed']),
255+
'mixed',
243256
true,
244257
[...$returnNullNodes, ...$formatDataNodes],
245-
new ArgumentsNode(['config' => null, 'instantiator' => null, '&providers' => null]),
258+
new ArgumentsNode([
259+
new VariableNode('config'),
260+
new VariableNode('instantiator'),
261+
new VariableNode('providers', byReference: true),
262+
]),
246263
),
247264
)),
248265
];

src/Symfony/Component/Serializer/Deserialize/Template/LazyTemplateGenerator.php

Lines changed: 43 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
use Symfony\Component\Serializer\Php\IfNode;
3333
use Symfony\Component\Serializer\Php\MethodCallNode;
3434
use Symfony\Component\Serializer\Php\NewNode;
35+
use Symfony\Component\Serializer\Php\ParametersNode;
3536
use Symfony\Component\Serializer\Php\PhpNodeInterface;
3637
use Symfony\Component\Serializer\Php\ReturnNode;
3738
use Symfony\Component\Serializer\Php\ScalarNode as PhpScalarNode;
@@ -92,7 +93,7 @@ protected function collectionNodes(CollectionNode $node, array &$context): array
9293
$iterableClosureNodes = [
9394
new ExpressionNode(new AssignNode(
9495
new VariableNode('iterable'),
95-
new ClosureNode(new ArgumentsNode(['resource' => 'mixed', 'boundaries' => 'iterable']), 'iterable', true, [
96+
new ClosureNode(new ParametersNode(['resource' => 'mixed', 'boundaries' => 'iterable']), 'iterable', true, [
9697
new ForEachNode(new VariableNode('boundaries'), new VariableNode('k'), new VariableNode('b'), [
9798
new ExpressionNode(new YieldNode(
9899
new FunctionCallNode(
@@ -106,7 +107,11 @@ protected function collectionNodes(CollectionNode $node, array &$context): array
106107
new VariableNode('k'),
107108
)),
108109
]),
109-
], new ArgumentsNode(['config' => null, 'instantiator' => null, '&providers' => null])),
110+
], new ArgumentsNode([
111+
new VariableNode('config'),
112+
new VariableNode('instantiator'),
113+
new VariableNode('providers', byReference: true),
114+
])),
110115
)),
111116
];
112117

@@ -125,11 +130,15 @@ protected function collectionNodes(CollectionNode $node, array &$context): array
125130
new ExpressionNode(new AssignNode(
126131
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($node->identifier())),
127132
new ClosureNode(
128-
new ArgumentsNode(['resource' => 'mixed', 'offset' => 'int', 'length' => 'int']),
133+
new ParametersNode(['resource' => 'mixed', 'offset' => 'int', 'length' => 'int']),
129134
($node->type->isNullable() ? '?' : '').$node->type->name(),
130135
true,
131136
[...$getBoundariesNodes, ...$iterableClosureNodes, ...$returnNodes],
132-
new ArgumentsNode(['config' => null, 'instantiator' => null, '&providers' => null]),
137+
new ArgumentsNode([
138+
new VariableNode('config'),
139+
new VariableNode('instantiator'),
140+
new VariableNode('providers', byReference: true),
141+
]),
133142
),
134143
)),
135144
...$this->providerNodes($node->item, $context),
@@ -167,7 +176,7 @@ protected function objectNodes(ObjectNode $node, array &$context): array
167176
$propertiesClosuresNodes[] = new IfNode(new BinaryNode('===', new PhpScalarNode($serializedName), new VariableNode('k')), [
168177
new ExpressionNode(new AssignNode(
169178
new ArrayAccessNode(new VariableNode('properties'), new PhpScalarNode($property['name'])),
170-
new ClosureNode(new ArgumentsNode([]), 'mixed', true, [
179+
new ClosureNode(new ParametersNode([]), 'mixed', true, [
171180
new ExpressionNode(new ReturnNode(($property['formatter'])(new FunctionCallNode(
172181
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($property['value']->identifier())),
173182
new ArgumentsNode([
@@ -176,7 +185,13 @@ protected function objectNodes(ObjectNode $node, array &$context): array
176185
new ArrayAccessNode(new VariableNode('b'), new PhpScalarNode(1)),
177186
]),
178187
)))),
179-
], new ArgumentsNode(['resource' => null, 'b' => null, 'config' => null, 'instantiator' => null, '&providers' => null])),
188+
], new ArgumentsNode([
189+
new VariableNode('resource'),
190+
new VariableNode('b'),
191+
new VariableNode('config'),
192+
new VariableNode('instantiator'),
193+
new VariableNode('providers', byReference: true),
194+
])),
180195
)),
181196
new ExpressionNode(new ContinueNode()),
182197
]);
@@ -199,11 +214,15 @@ protected function objectNodes(ObjectNode $node, array &$context): array
199214
new ExpressionNode(new AssignNode(
200215
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($node->identifier())),
201216
new ClosureNode(
202-
new ArgumentsNode(['resource' => 'mixed', 'offset' => 'int', 'length' => 'int']),
217+
new ParametersNode(['resource' => 'mixed', 'offset' => 'int', 'length' => 'int']),
203218
($node->type->isNullable() ? '?' : '').$node->type->className(),
204219
true,
205220
[...$getBoundariesNodes, ...$fillPropertiesArrayNodes, ...$instantiateNodes],
206-
new ArgumentsNode(['config' => null, 'instantiator' => null, '&providers' => null]),
221+
new ArgumentsNode([
222+
new VariableNode('config'),
223+
new VariableNode('instantiator'),
224+
new VariableNode('providers', byReference: true),
225+
]),
207226
),
208227
)),
209228
...$propertyValueProvidersNodes,
@@ -236,15 +255,15 @@ protected function scalarNodes(ScalarNode $node, array &$context): array
236255
}
237256

238257
$formatDataNodes = match (true) {
239-
\in_array($node->type->name(), ['int', 'string', 'float', 'bool', 'object'], true) => [
258+
\in_array($node->type->name(), ['int', 'string', 'float', 'bool', 'object', 'array'], true) => [
240259
new TryCatchNode([new ExpressionNode(new ReturnNode(new CastNode($node->type->name(), new VariableNode('data'))))], [
241260
new ExpressionNode(new ThrowNode(new NewNode('\\'.UnexpectedValueException::class, new ArgumentsNode([
242261
new FunctionCallNode('sprintf', new ArgumentsNode([
243262
new PhpScalarNode(sprintf('Cannot cast "%%s" to "%s"', $node->type->name())),
244263
new FunctionCallNode('get_debug_type', new ArgumentsNode([new VariableNode('data')])),
245264
])),
246265
])))),
247-
], new ArgumentsNode(['e' => '\\Throwable'])),
266+
], new ParametersNode(['e' => '\\Throwable'])),
248267
],
249268
$node->type->isEnum() => [
250269
new TryCatchNode([
@@ -255,13 +274,13 @@ protected function scalarNodes(ScalarNode $node, array &$context): array
255274
static: true,
256275
))),
257276
], [
258-
new ExpressionNode(new ThrowNode(new NewNode('\\'.UnexpectedValueException::class, new ArgumentsNode([
259-
new FunctionCallNode('sprintf', new ArgumentsNode([
260-
new PhpScalarNode(sprintf('Unexpected "%%s" value for "%s" backed enumeration.', $node->type)),
261-
new VariableNode('data'),
262-
])),
263-
])))),
264-
], new ArgumentsNode(['e' => '\\ValueError'])),
277+
new ExpressionNode(new ThrowNode(new NewNode('\\'.UnexpectedValueException::class, new ArgumentsNode([
278+
new FunctionCallNode('sprintf', new ArgumentsNode([
279+
new PhpScalarNode(sprintf('Unexpected "%%s" value for "%s" backed enumeration.', $node->type)),
280+
new VariableNode('data'),
281+
])),
282+
])))),
283+
], new ParametersNode(['e' => '\\ValueError'])),
265284
],
266285
default => [
267286
new ExpressionNode(new ReturnNode(new VariableNode('data'))),
@@ -272,11 +291,15 @@ protected function scalarNodes(ScalarNode $node, array &$context): array
272291
new ExpressionNode(new AssignNode(
273292
new ArrayAccessNode(new VariableNode('providers'), new PhpScalarNode($node->identifier())),
274293
new ClosureNode(
275-
new ArgumentsNode(['resource' => 'mixed', 'offset' => 'int', 'length' => 'int']),
276-
(string) $node->type,
294+
new ParametersNode(['resource' => 'mixed', 'offset' => 'int', 'length' => 'int']),
295+
'mixed',
277296
true,
278297
[...$getDataNodes, ...$formatDataNodes],
279-
new ArgumentsNode(['config' => null, 'instantiator' => null, '&providers' => null]),
298+
new ArgumentsNode([
299+
new VariableNode('config'),
300+
new VariableNode('instantiator'),
301+
new VariableNode('providers', byReference: true),
302+
]),
280303
),
281304
)),
282305
];

0 commit comments

Comments
 (0)