Skip to content

Commit db55947

Browse files
committed
Centralize error handling for calls to _serialize
1 parent ccf19ee commit db55947

File tree

1 file changed

+43
-44
lines changed

1 file changed

+43
-44
lines changed

json_serializable/lib/src/json_serializable_generator.dart

Lines changed: 43 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -147,8 +147,8 @@ class JsonSerializableGenerator
147147
return buffer.toString();
148148
}
149149

150-
void _writeToJsonWithNullChecks(
151-
StringBuffer buffer, Iterable<FieldElement> fields, bool includeIfNull) {
150+
void _writeToJsonWithNullChecks(StringBuffer buffer,
151+
Iterable<FieldElement> fields, bool classIncludeIfNull) {
152152
buffer.writeln('{');
153153

154154
buffer.writeln('var $toJsonMapVarName = <String, dynamic>{');
@@ -160,48 +160,42 @@ class JsonSerializableGenerator
160160
var directWrite = true;
161161

162162
for (var field in fields) {
163-
var fieldName = field.name;
164-
try {
165-
var safeJsonKeyString = _safeNameAccess(field);
166-
167-
// If `fieldName` collides with one of the local helpers, prefix
168-
// access with `this.`.
169-
if (fieldName == toJsonMapVarName || fieldName == toJsonMapHelperName) {
170-
fieldName = 'this.$fieldName';
171-
}
163+
var safeFieldAccess = field.name;
164+
var safeJsonKeyString = _safeNameAccess(field);
165+
166+
// If `fieldName` collides with one of the local helpers, prefix
167+
// access with `this.`.
168+
if (safeFieldAccess == toJsonMapVarName ||
169+
safeFieldAccess == toJsonMapHelperName) {
170+
safeFieldAccess = 'this.$safeFieldAccess';
171+
}
172172

173-
if (_includeIfNull(field, includeIfNull)) {
174-
if (directWrite) {
175-
buffer.writeln('$safeJsonKeyString : '
176-
'${_serialize(field.type, fieldName, _nullable(field))},');
177-
} else {
178-
buffer.writeln('$toJsonMapVarName[$safeJsonKeyString] = '
179-
'${_serialize(field.type, fieldName, _nullable(field))};');
180-
}
173+
if (_includeIfNull(field, classIncludeIfNull)) {
174+
if (directWrite) {
175+
buffer.writeln('$safeJsonKeyString : '
176+
'${_serializeField(field, accessOverride: safeFieldAccess)},');
181177
} else {
182-
if (directWrite) {
183-
// close the still-open map literal
184-
buffer.writeln('};');
185-
buffer.writeln();
186-
187-
// write the helper to be used by all following null-excluding
188-
// fields
189-
buffer.writeln('''
178+
buffer.writeln('$toJsonMapVarName[$safeJsonKeyString] = '
179+
'${_serializeField(field, accessOverride: safeFieldAccess)};');
180+
}
181+
} else {
182+
if (directWrite) {
183+
// close the still-open map literal
184+
buffer.writeln('};');
185+
buffer.writeln();
186+
187+
// write the helper to be used by all following null-excluding
188+
// fields
189+
buffer.writeln('''
190190
void $toJsonMapHelperName(String key, dynamic value) {
191191
if (value != null) {
192192
$toJsonMapVarName[key] = value;
193193
}
194194
}''');
195-
directWrite = false;
196-
}
197-
buffer.writeln('$toJsonMapHelperName($safeJsonKeyString, '
198-
'${_serialize(field.type, fieldName, _nullable(field))});');
195+
directWrite = false;
199196
}
200-
} on UnsupportedTypeError {
201-
throw new InvalidGenerationSourceError(
202-
'Could not generate `toJson` code for `${friendlyNameForElement(
203-
field)}`.',
204-
todo: 'Make sure all of the types are serializable.');
197+
buffer.writeln('$toJsonMapHelperName($safeJsonKeyString, '
198+
'${_serializeField(field, accessOverride: safeFieldAccess)});');
205199
}
206200
}
207201

@@ -215,14 +209,7 @@ void $toJsonMapHelperName(String key, dynamic value) {
215209

216210
var pairs = <String>[];
217211
for (var field in fields) {
218-
try {
219-
pairs.add('${_safeNameAccess(field)}: '
220-
'${_serialize(field.type, field.name, _nullable(field))}');
221-
} on UnsupportedTypeError {
222-
throw new InvalidGenerationSourceError(
223-
'Could not generate `toJson` code for `${friendlyNameForElement(field)}`.',
224-
todo: 'Make sure all of the types are serializable.');
225-
}
212+
pairs.add('${_safeNameAccess(field)}: ${_serializeField(field )}');
226213
}
227214
buffer.writeAll(pairs, ',\n');
228215

@@ -334,6 +321,18 @@ void $toJsonMapHelperName(String key, dynamic value) {
334321
Iterable<TypeHelper> get _allHelpers =>
335322
[_typeHelpers, _coreHelpers].expand((e) => e);
336323

324+
String _serializeField(FieldElement field, {String accessOverride}) {
325+
accessOverride ??= field.name;
326+
try {
327+
return _serialize(field.type, accessOverride, _nullable(field));
328+
} on UnsupportedTypeError {
329+
throw new InvalidGenerationSourceError(
330+
'Could not generate `toJson` code for '
331+
'`${friendlyNameForElement(field)}`.',
332+
todo: 'Make sure all of the types are serializable.');
333+
}
334+
}
335+
337336
/// [expression] may be just the name of the field or it may an expression
338337
/// representing the serialization of a value.
339338
String _serialize(DartType targetType, String expression, bool nullable) =>

0 commit comments

Comments
 (0)