serialize method
Returns Dart code that serializes an expression
representing a Dart
object of type targetType
.
If targetType
is not supported, returns null
.
Let's say you want to serialize a class Foo
as just its id
property
of type int
.
Treating expression
as a opaque Dart expression, the serialize
implementation could be a simple as:
String serialize(DartType targetType, String expression) =>
"$expression.id";
```.
Implementation
@override
Object? serialize(
DartType targetType, String expression, TypeHelperContext context) {
if (!typeChecker.isAssignableFromType(targetType)) {
return null;
}
final args = targetType.typeArgumentsOf(typeChecker)!;
assert(args.length == 2);
final keyType = args[0];
final valueType = args[1];
checkSafeKeyType(expression, keyType);
final subFieldValue = context.serialize(valueType, closureArg);
final subKeyValue = forType(keyType)?.serialize(keyType, keyParam, false) ??
context.serialize(keyType, keyParam);
final targetTypeIsNullable = targetType.isNullableType;
final optionalQuestion = targetTypeIsNullable ? '?' : '';
if (closureArg == subFieldValue && keyParam == subKeyValue) {
return serializeToMapExpression(
expression, keyType, valueType, targetTypeIsNullable);
}
return serializeToMapExpression(
expression, keyType, valueType, targetTypeIsNullable) +
'$optionalQuestion.map(($keyParam, $closureArg) => MapEntry($subKeyValue, $subFieldValue))';
}