Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Next Next commit
Fix nullable enum and class fields
  • Loading branch information
stuartmorgan-g committed Apr 15, 2022
commit 473538e945d2343f5389349a37ab05d8366405fd
31 changes: 23 additions & 8 deletions packages/pigeon/lib/dart_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -459,13 +459,14 @@ void generateDart(DartOptions opt, Root root, StringSink sink) {
);
for (final NamedType field in klass.fields) {
indent.write('pigeonMap[\'${field.name}\'] = ');
final String conditional = field.type.isNullable ? '?' : '';
if (customClassNames.contains(field.type.baseName)) {
indent.addln(
'${field.name}?.encode();',
'${field.name}$conditional.encode();',
);
} else if (customEnumNames.contains(field.type.baseName)) {
indent.addln(
'${field.name}?.index;',
'${field.name}$conditional.index;',
);
} else {
indent.addln('${field.name};');
Expand All @@ -478,15 +479,29 @@ void generateDart(DartOptions opt, Root root, StringSink sink) {
void writeDecode() {
void writeValueDecode(NamedType field) {
if (customClassNames.contains(field.type.baseName)) {
indent.format('''
final String nonNullValue =
"${field.type.baseName}.decode(pigeonMap['${field.name}']!)";
indent.format(
field.type.isNullable
? '''
pigeonMap['${field.name}'] != null
\t\t? ${field.type.baseName}.decode(pigeonMap['${field.name}']!)
\t\t: null''', leadingSpace: false, trailingNewline: false);
\t\t? $nonNullValue
\t\t: null'''
: nonNullValue,
leadingSpace: false,
trailingNewline: false);
} else if (customEnumNames.contains(field.type.baseName)) {
indent.format('''
final String nonNullValue =
"${field.type.baseName}.values[pigeonMap['${field.name}']! as int]";
indent.format(
field.type.isNullable
? '''
pigeonMap['${field.name}'] != null
\t\t? ${field.type.baseName}.values[pigeonMap['${field.name}']! as int]
\t\t: null''', leadingSpace: false, trailingNewline: false);
\t\t? $nonNullValue
\t\t: null'''
: nonNullValue,
leadingSpace: false,
trailingNewline: false);
} else if (field.type.typeArguments.isNotEmpty) {
final String genericType = _makeGenericTypeArguments(field.type);
final String castCall = _makeGenericCastCall(field.type);
Expand Down
12 changes: 11 additions & 1 deletion packages/pigeon/pigeons/non_null_fields.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,21 @@ class SearchRequest {
String query;
}

class ExtraData {
ExtraData({required this.detailA, required this.detailB});
String detailA;
String detailB;
}

enum ReplyType { success, error }

class SearchReply {
SearchReply(this.result, this.error, this.indices);
SearchReply(this.result, this.error, this.indices, this.extraData, this.type);
String result;
String error;
List<int?> indices;
ExtraData extraData;
ReplyType type;
}

@HostApi()
Expand Down