@@ -24,6 +24,7 @@ abstract class DecodeHelper implements HelperCore {
2424 CreateFactoryResult createFactory (
2525 Map <String , FieldElement > accessibleFields,
2626 Map <String , String > unavailableReasons,
27+ List <FieldElement > extras,
2728 ) {
2829 assert (config.createFactory);
2930 final buffer = StringBuffer ();
@@ -46,16 +47,27 @@ abstract class DecodeHelper implements HelperCore {
4647 }
4748 }
4849
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+
4960 buffer.write (') {\n ' );
5061
5162 String deserializeFun (String paramOrFieldName,
5263 {ParameterElement ctorParam}) =>
5364 _deserializeForField (accessibleFields[paramOrFieldName],
5465 ctorParam: ctorParam);
5566
67+ final extraNames = [for (final extra in extras) extra.name];
5668 final data = _writeConstructorInvocation (
5769 element,
58- accessibleFields.keys,
70+ [... accessibleFields.keys, ...extraNames] ,
5971 accessibleFields.values
6072 .where ((fe) =>
6173 ! fe.isFinal ||
@@ -66,6 +78,7 @@ abstract class DecodeHelper implements HelperCore {
6678 .map ((fe) => fe.name)
6779 .toList (),
6880 unavailableReasons,
81+ extraNames,
6982 deserializeFun,
7083 );
7184
@@ -237,6 +250,7 @@ _ConstructorData _writeConstructorInvocation(
237250 Iterable <String > availableConstructorParameters,
238251 Iterable <String > writableFields,
239252 Map <String , String > unavailableReasons,
253+ List <String > extras,
240254 String Function (String paramOrFieldName, {ParameterElement ctorParam})
241255 deserializeForField,
242256) {
@@ -278,7 +292,7 @@ _ConstructorData _writeConstructorInvocation(
278292 } else {
279293 constructorArguments.add (arg);
280294 }
281- usedCtorParamsAndFields.add (arg.name);
295+ if ( ! extras. contains (arg.name)) usedCtorParamsAndFields.add (arg.name);
282296 }
283297
284298 // fields that aren't already set by the constructor and that aren't final
@@ -291,17 +305,19 @@ _ConstructorData _writeConstructorInvocation(
291305 buffer
292306 ..writeln ()
293307 ..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);
296311 return ' $content ,\n ' ;
297312 }));
298313 }
299314 if (namedConstructorArguments.isNotEmpty) {
300315 buffer
301316 ..writeln ()
302317 ..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);
305321 return ' ${paramElement .name }: $value ,\n ' ;
306322 }));
307323 }
0 commit comments