@@ -24,6 +24,7 @@ abstract class DecodeHelper implements HelperCore {
24
24
CreateFactoryResult createFactory (
25
25
Map <String , FieldElement > accessibleFields,
26
26
Map <String , String > unavailableReasons,
27
+ List <FieldElement > extras,
27
28
) {
28
29
assert (config.createFactory);
29
30
final buffer = StringBuffer ();
@@ -46,16 +47,27 @@ abstract class DecodeHelper implements HelperCore {
46
47
}
47
48
}
48
49
50
+ if (extras.isNotEmpty) {
51
+ buffer.writeln (', {' );
52
+ for (final extra in extras) {
53
+ if (! extra.type.isNullableType) buffer.write ('required ' );
54
+ buffer.writeln (
55
+ '${extra .type .getDisplayString (withNullability : true )} ${extra .name },' );
56
+ }
57
+ buffer.write ('}' );
58
+ }
59
+
49
60
buffer.write (') {\n ' );
50
61
51
62
String deserializeFun (String paramOrFieldName,
52
63
{ParameterElement ctorParam}) =>
53
64
_deserializeForField (accessibleFields[paramOrFieldName],
54
65
ctorParam: ctorParam);
55
66
67
+ final extraNames = [for (final extra in extras) extra.name];
56
68
final data = _writeConstructorInvocation (
57
69
element,
58
- accessibleFields.keys,
70
+ [... accessibleFields.keys, ...extraNames] ,
59
71
accessibleFields.values
60
72
.where ((fe) =>
61
73
! fe.isFinal ||
@@ -66,6 +78,7 @@ abstract class DecodeHelper implements HelperCore {
66
78
.map ((fe) => fe.name)
67
79
.toList (),
68
80
unavailableReasons,
81
+ extraNames,
69
82
deserializeFun,
70
83
);
71
84
@@ -237,6 +250,7 @@ _ConstructorData _writeConstructorInvocation(
237
250
Iterable <String > availableConstructorParameters,
238
251
Iterable <String > writableFields,
239
252
Map <String , String > unavailableReasons,
253
+ List <String > extras,
240
254
String Function (String paramOrFieldName, {ParameterElement ctorParam})
241
255
deserializeForField,
242
256
) {
@@ -278,7 +292,7 @@ _ConstructorData _writeConstructorInvocation(
278
292
} else {
279
293
constructorArguments.add (arg);
280
294
}
281
- usedCtorParamsAndFields.add (arg.name);
295
+ if ( ! extras. contains (arg.name)) usedCtorParamsAndFields.add (arg.name);
282
296
}
283
297
284
298
// fields that aren't already set by the constructor and that aren't final
@@ -291,17 +305,19 @@ _ConstructorData _writeConstructorInvocation(
291
305
buffer
292
306
..writeln ()
293
307
..writeAll (constructorArguments.map ((paramElement) {
294
- final content =
295
- deserializeForField (paramElement.name, ctorParam: paramElement);
308
+ final content = extras.contains (paramElement.name)
309
+ ? paramElement.name
310
+ : deserializeForField (paramElement.name, ctorParam: paramElement);
296
311
return ' $content ,\n ' ;
297
312
}));
298
313
}
299
314
if (namedConstructorArguments.isNotEmpty) {
300
315
buffer
301
316
..writeln ()
302
317
..writeAll (namedConstructorArguments.map ((paramElement) {
303
- final value =
304
- deserializeForField (paramElement.name, ctorParam: paramElement);
318
+ final value = extras.contains (paramElement.name)
319
+ ? paramElement.name
320
+ : deserializeForField (paramElement.name, ctorParam: paramElement);
305
321
return ' ${paramElement .name }: $value ,\n ' ;
306
322
}));
307
323
}
0 commit comments