@@ -25,6 +25,7 @@ abstract class DecodeHelper implements HelperCore {
2525 CreateFactoryResult createFactory (
2626 Map <String , FieldElement > accessibleFields,
2727 Map <String , String > unavailableReasons,
28+ List <FieldElement > extras,
2829 ) {
2930 assert (config.createFactory);
3031 final buffer = StringBuffer ();
@@ -47,6 +48,16 @@ abstract class DecodeHelper implements HelperCore {
4748 }
4849 }
4950
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+
5061 buffer.write (')' );
5162
5263 final fromJsonLines = < String > [];
@@ -56,15 +67,17 @@ abstract class DecodeHelper implements HelperCore {
5667 _deserializeForField (accessibleFields[paramOrFieldName]! ,
5768 ctorParam: ctorParam);
5869
70+ final extraNames = [for (final extra in extras) extra.name];
5971 final data = _writeConstructorInvocation (
6072 element,
6173 config.constructor,
62- accessibleFields.keys,
74+ [... accessibleFields.keys, ...extraNames] ,
6375 accessibleFields.values
6476 .where ((fe) => element.lookUpSetter (fe.name, element.library) != null )
6577 .map ((fe) => fe.name)
6678 .toList (),
6779 unavailableReasons,
80+ extraNames,
6881 deserializeFun,
6982 );
7083
@@ -265,6 +278,7 @@ _ConstructorData _writeConstructorInvocation(
265278 Iterable <String > availableConstructorParameters,
266279 Iterable <String > writableFields,
267280 Map <String , String > unavailableReasons,
281+ List <String > extras,
268282 String Function (String paramOrFieldName, {ParameterElement ctorParam})
269283 deserializeForField,
270284) {
@@ -301,7 +315,7 @@ _ConstructorData _writeConstructorInvocation(
301315 } else {
302316 constructorArguments.add (arg);
303317 }
304- usedCtorParamsAndFields.add (arg.name);
318+ if ( ! extras. contains (arg.name)) usedCtorParamsAndFields.add (arg.name);
305319 }
306320
307321 // fields that aren't already set by the constructor and that aren't final
@@ -320,17 +334,19 @@ _ConstructorData _writeConstructorInvocation(
320334 buffer
321335 ..writeln ()
322336 ..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);
325340 return ' $content ,\n ' ;
326341 }));
327342 }
328343 if (namedConstructorArguments.isNotEmpty) {
329344 buffer
330345 ..writeln ()
331346 ..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);
334350 return ' ${paramElement .name }: $value ,\n ' ;
335351 }));
336352 }
0 commit comments