@@ -16,6 +16,32 @@ import 'unsupported_type_error.dart';
1616abstract class EncodeHelper implements HelperCore {
1717 String _fieldAccess (FieldElement field) => '$_toJsonParamName .${field .name }' ;
1818
19+ String createPerFieldToJson (Set <FieldElement > accessibleFieldSet) {
20+ final buffer = StringBuffer ()
21+ ..writeln ('// ignore: unused_element' )
22+ ..writeln ('abstract class _\$ ${element .name .nonPrivate }PerFieldToJson {' );
23+
24+ for (final field in accessibleFieldSet) {
25+ buffer
26+ ..writeln (' // ignore: unused_element' )
27+ ..write (
28+ 'static Object? ${field .name }'
29+ '${genericClassArgumentsImpl (withConstraints : true )}'
30+ '(${field .type } $_toJsonParamName ' ,
31+ );
32+
33+ if (config.genericArgumentFactories) {
34+ _writeGenericArgumentFactories (buffer);
35+ }
36+
37+ buffer.writeln (') => ${_serializeField (field , _toJsonParamName )};' );
38+ }
39+
40+ buffer.writeln ('}' );
41+
42+ return buffer.toString ();
43+ }
44+
1945 /// Generates an object containing metadatas related to the encoding,
2046 /// destined to be used by other code-generators.
2147 String createFieldMap (Set <FieldElement > accessibleFieldSet) {
@@ -42,26 +68,19 @@ abstract class EncodeHelper implements HelperCore {
4268
4369 final buffer = StringBuffer ();
4470
45- final functionName = '${prefix }ToJson${genericClassArgumentsImpl (true )}' ;
71+ final functionName =
72+ '${prefix }ToJson${genericClassArgumentsImpl (withConstraints : true )}' ;
4673 buffer.write ('Map<String, dynamic> '
4774 '$functionName ($targetClassReference $_toJsonParamName ' );
4875
49- if (config.genericArgumentFactories) {
50- for (var arg in element.typeParameters) {
51- final helperName = toJsonForType (
52- arg.instantiate (nullabilitySuffix: NullabilitySuffix .none),
53- );
54- buffer.write (',Object? Function(${arg .name } value) $helperName ' );
55- }
56- if (element.typeParameters.isNotEmpty) {
57- buffer.write (',' );
58- }
59- }
76+ if (config.genericArgumentFactories) _writeGenericArgumentFactories (buffer);
77+
6078 buffer.write (') ' );
6179
62- final writeNaive = accessibleFields.every (_writeJsonValueNaive);
80+ final canWriteAllJsonValuesWithoutNullCheck =
81+ accessibleFields.every (_canWriteJsonWithoutNullCheck);
6382
64- if (writeNaive ) {
83+ if (canWriteAllJsonValuesWithoutNullCheck ) {
6584 // write simple `toJson` method that includes all keys...
6685 _writeToJsonSimple (buffer, accessibleFields);
6786 } else {
@@ -72,6 +91,18 @@ abstract class EncodeHelper implements HelperCore {
7291 yield buffer.toString ();
7392 }
7493
94+ void _writeGenericArgumentFactories (StringBuffer buffer) {
95+ for (var arg in element.typeParameters) {
96+ final helperName = toJsonForType (
97+ arg.instantiate (nullabilitySuffix: NullabilitySuffix .none),
98+ );
99+ buffer.write (',Object? Function(${arg .name } value) $helperName ' );
100+ }
101+ if (element.typeParameters.isNotEmpty) {
102+ buffer.write (',' );
103+ }
104+ }
105+
75106 void _writeToJsonSimple (StringBuffer buffer, Iterable <FieldElement > fields) {
76107 buffer
77108 ..writeln ('=> <String, dynamic>{' )
@@ -112,7 +143,7 @@ abstract class EncodeHelper implements HelperCore {
112143 }
113144
114145 final expression = _serializeField (field, safeFieldAccess);
115- if (_writeJsonValueNaive (field)) {
146+ if (_canWriteJsonWithoutNullCheck (field)) {
116147 if (directWrite) {
117148 buffer.writeln (' $safeJsonKeyString : $expression ,' );
118149 } else {
@@ -160,7 +191,7 @@ abstract class EncodeHelper implements HelperCore {
160191
161192 /// Returns `true` if the field can be written to JSON 'naively' – meaning
162193 /// we can avoid checking for `null` .
163- bool _writeJsonValueNaive (FieldElement field) {
194+ bool _canWriteJsonWithoutNullCheck (FieldElement field) {
164195 final jsonKey = jsonKeyFor (field);
165196
166197 if (jsonKey.includeIfNull) {
0 commit comments