@@ -25,6 +25,7 @@ abstract class DecodeHelper implements HelperCore {
25
25
CreateFactoryResult createFactory (
26
26
Map <String , FieldElement > accessibleFields,
27
27
Map <String , String > unavailableReasons,
28
+ List <FieldElement > extras,
28
29
) {
29
30
assert (config.createFactory);
30
31
final buffer = StringBuffer ();
@@ -47,6 +48,16 @@ abstract class DecodeHelper implements HelperCore {
47
48
}
48
49
}
49
50
51
+ if (extras.isNotEmpty) {
52
+ buffer.writeln (', {' );
53
+ for (final extra in extras) {
54
+ if (! extra.type.isNullableType) buffer.write ('required ' );
55
+ buffer.writeln (
56
+ '${extra .type .getDisplayString (withNullability : true )} ${extra .name },' );
57
+ }
58
+ buffer.write ('}' );
59
+ }
60
+
50
61
buffer.write (')' );
51
62
52
63
final fromJsonLines = < String > [];
@@ -56,15 +67,17 @@ abstract class DecodeHelper implements HelperCore {
56
67
_deserializeForField (accessibleFields[paramOrFieldName]! ,
57
68
ctorParam: ctorParam);
58
69
70
+ final extraNames = [for (final extra in extras) extra.name];
59
71
final data = _writeConstructorInvocation (
60
72
element,
61
73
config.constructor,
62
- accessibleFields.keys,
74
+ [... accessibleFields.keys, ...extraNames] ,
63
75
accessibleFields.values
64
76
.where ((fe) => element.lookUpSetter (fe.name, element.library) != null )
65
77
.map ((fe) => fe.name)
66
78
.toList (),
67
79
unavailableReasons,
80
+ extraNames,
68
81
deserializeFun,
69
82
);
70
83
@@ -265,6 +278,7 @@ _ConstructorData _writeConstructorInvocation(
265
278
Iterable <String > availableConstructorParameters,
266
279
Iterable <String > writableFields,
267
280
Map <String , String > unavailableReasons,
281
+ List <String > extras,
268
282
String Function (String paramOrFieldName, {ParameterElement ctorParam})
269
283
deserializeForField,
270
284
) {
@@ -301,7 +315,7 @@ _ConstructorData _writeConstructorInvocation(
301
315
} else {
302
316
constructorArguments.add (arg);
303
317
}
304
- usedCtorParamsAndFields.add (arg.name);
318
+ if ( ! extras. contains (arg.name)) usedCtorParamsAndFields.add (arg.name);
305
319
}
306
320
307
321
// fields that aren't already set by the constructor and that aren't final
@@ -320,17 +334,19 @@ _ConstructorData _writeConstructorInvocation(
320
334
buffer
321
335
..writeln ()
322
336
..writeAll (constructorArguments.map ((paramElement) {
323
- final content =
324
- deserializeForField (paramElement.name, ctorParam: paramElement);
337
+ final content = extras.contains (paramElement.name)
338
+ ? paramElement.name
339
+ : deserializeForField (paramElement.name, ctorParam: paramElement);
325
340
return ' $content ,\n ' ;
326
341
}));
327
342
}
328
343
if (namedConstructorArguments.isNotEmpty) {
329
344
buffer
330
345
..writeln ()
331
346
..writeAll (namedConstructorArguments.map ((paramElement) {
332
- final value =
333
- deserializeForField (paramElement.name, ctorParam: paramElement);
347
+ final value = extras.contains (paramElement.name)
348
+ ? paramElement.name
349
+ : deserializeForField (paramElement.name, ctorParam: paramElement);
334
350
return ' ${paramElement .name }: $value ,\n ' ;
335
351
}));
336
352
}
0 commit comments