@@ -36,6 +36,8 @@ class JsonSerializableGenerator
36
36
37
37
final List <TypeHelper > _typeHelpers;
38
38
39
+ final bool _doNewThing = true ;
40
+
39
41
/// Creates an instance of [JsonSerializableGenerator] .
40
42
///
41
43
/// If [typeHelpers] is not provided, two built-in helpers are used:
@@ -117,10 +119,13 @@ class JsonSerializableGenerator
117
119
}
118
120
119
121
if (annotation.read ('createToJson' ).boolValue) {
122
+ var mixClassName = '${prefix }SerializerMixin' ;
123
+ var helpClassName = '${prefix }JsonMapWrapper' ;
124
+
120
125
//
121
126
// Generate the mixin class
122
127
//
123
- buffer.writeln ('abstract class ${ prefix }SerializerMixin {' );
128
+ buffer.writeln ('abstract class $mixClassName {' );
124
129
125
130
// write copies of the fields - this allows the toJson method to access
126
131
// the fields of the target class
@@ -129,19 +134,84 @@ class JsonSerializableGenerator
129
134
buffer.writeln (' ${field .type } get ${field .name };' );
130
135
}
131
136
132
- var includeIfNull = annotation.read ('includeIfNull' ).boolValue;
137
+ var classIncludeIfNull = annotation.read ('includeIfNull' ).boolValue;
133
138
134
- buffer.writeln (' Map<String, dynamic> toJson() ' );
135
- if (fieldsList. every ((e) => _includeIfNull (e, includeIfNull))) {
136
- // write simple `toJson` method that includes all keys...
137
- _writeToJsonSimple ( buffer, fields.values );
139
+ buffer.write (' Map<String, dynamic> toJson() ' );
140
+
141
+ if (_doNewThing) {
142
+ buffer. writeln ( '=> new $ helpClassName (this);' );
138
143
} else {
139
- // At least one field should be excluded if null
140
- _writeToJsonWithNullChecks (buffer, fields.values, includeIfNull);
144
+ if (fieldsList.every ((e) => _includeIfNull (e, classIncludeIfNull))) {
145
+ // write simple `toJson` method that includes all keys...
146
+ _writeToJsonSimple (buffer, fields.values);
147
+ } else {
148
+ // At least one field should be excluded if null
149
+ _writeToJsonWithNullChecks (buffer, fields.values, classIncludeIfNull);
150
+ }
141
151
}
142
152
143
153
// end of the mixin class
144
- buffer.write ('}' );
154
+ buffer.writeln ('}' );
155
+
156
+ if (_doNewThing) {
157
+ buffer.writeln ();
158
+ //
159
+ // Generate the Map helper class
160
+ //
161
+ // TODO(kevmoo): write JsonMapWrapper if annotation lib is prefix-imported
162
+ buffer.writeln ('''class $helpClassName extends JsonMapWrapper {
163
+ final $mixClassName _v;
164
+ $helpClassName (this._v);
165
+ ''' );
166
+
167
+ if (fieldsList.every ((e) => _includeIfNull (e, classIncludeIfNull))) {
168
+ // write simple `toJson` method that includes all keys...
169
+ //_writeToJsonSimple(buffer, fields);
170
+
171
+ var jsonKeys = fields.values.map (_safeNameAccess).join (', ' );
172
+
173
+ // TODO(kevmoo): maybe put this in a static field instead?
174
+ // const lists have unfortunate overhead
175
+ buffer.writeln (''' @override
176
+ Iterable<String> get keys => const [${jsonKeys }];
177
+ ''' );
178
+ } else {
179
+ // At least one field should be excluded if null
180
+ //_writeToJsonWithNullChecks(buffer, fields, includeIfNull);
181
+ buffer.writeln ('@override\n Iterable<String> get keys sync* {' );
182
+
183
+ for (var field in fields.values) {
184
+ var nullCheck = ! _includeIfNull (field, classIncludeIfNull);
185
+ if (nullCheck) {
186
+ buffer.writeln ('if (_v.${field .name } != null) {' );
187
+ }
188
+ buffer.writeln ('yield ${_safeNameAccess (field )};' );
189
+ if (nullCheck) {
190
+ buffer.writeln ('}' );
191
+ }
192
+ }
193
+
194
+ buffer.writeln ('}\n ' );
195
+ }
196
+
197
+ buffer.writeln ('''@override
198
+ dynamic operator [](Object key) {
199
+ if (key is String) {
200
+ switch(key) {
201
+ ''' );
202
+
203
+ for (var field in fields.values) {
204
+ var valueAccess = '_v.${field .name }' ;
205
+ buffer.write ('''case ${_safeNameAccess (field )}:
206
+ return ${_serializeField (field , accessOverride : valueAccess )};''' );
207
+ }
208
+
209
+ buffer.writeln ('''
210
+ }}
211
+ return null;
212
+ }''' );
213
+ }
214
+ buffer.writeln ('}' );
145
215
}
146
216
147
217
return buffer.toString ();
0 commit comments