[pigeon] fixed null support for java enums (#528)
diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index 2fefeff..2620359 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.12
+
+* [java] Fixes enum support for null values.
+
## 1.0.11
* [ci] Starts transition to a Dart test runner, adds windows support.
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 4b07ea0..86ef5b3 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -8,7 +8,7 @@
import 'ast.dart';
/// The current version of pigeon. This must match the version in pubspec.yaml.
-const String pigeonVersion = '1.0.11';
+const String pigeonVersion = '1.0.12';
/// Read all the content from [stdin] to a String.
String readStdin() {
diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart
index 2bf2001..9985512 100644
--- a/packages/pigeon/lib/java_generator.dart
+++ b/packages/pigeon/lib/java_generator.dart
@@ -474,13 +474,13 @@
root.enums,
(NamedType x) => _javaTypeForBuiltinDartType(x.type));
String toWriteValue = '';
+ final String fieldName = field.name;
if (!hostDatatype.isBuiltin &&
rootClassNameSet.contains(field.type.baseName)) {
- final String fieldName = field.name;
toWriteValue = '($fieldName == null) ? null : $fieldName.toMap()';
} else if (!hostDatatype.isBuiltin &&
rootEnumNameSet.contains(field.type.baseName)) {
- toWriteValue = '${field.name}.index';
+ toWriteValue = '$fieldName == null ? null : $fieldName.index';
} else {
toWriteValue = field.name;
}
@@ -492,13 +492,14 @@
indent.scoped('{', '}', () {
indent.writeln('${klass.name} fromMapResult = new ${klass.name}();');
for (final NamedType field in klass.fields) {
- indent.writeln('Object ${field.name} = map.get("${field.name}");');
+ final String fieldVariable = field.name;
+ indent.writeln('Object $fieldVariable = map.get("${field.name}");');
if (rootEnumNameSet.contains(field.type.baseName)) {
indent.writeln(
- 'fromMapResult.${field.name} = ${field.type.baseName}.values()[(int)${field.name}];');
+ 'fromMapResult.${field.name} = $fieldVariable == null ? null : ${field.type.baseName}.values()[(int)$fieldVariable];');
} else {
indent.writeln(
- 'fromMapResult.${field.name} = ${_castObject(field, root.classes, root.enums, field.name)};');
+ 'fromMapResult.${field.name} = ${_castObject(field, root.classes, root.enums, fieldVariable)};');
}
}
indent.writeln('return fromMapResult;');
diff --git a/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/EnumTest.java b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/EnumTest.java
new file mode 100644
index 0000000..32225a4
--- /dev/null
+++ b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/EnumTest.java
@@ -0,0 +1,21 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+package com.example.android_unit_tests;
+
+import static org.junit.Assert.*;
+
+import java.util.Map;
+import org.junit.Test;
+
+public class EnumTest {
+ @Test
+ public void nullValue() {
+ Enum.Data value = new Enum.Data();
+ value.setState(null);
+ Map<String, Object> map = value.toMap();
+ Enum.Data readValue = Enum.Data.fromMap(map);
+ assertEquals(value.getState(), readValue.getState());
+ }
+}
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index d0e471a..c09f93e 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -2,7 +2,7 @@
description: Code generator tool to make communication between Flutter and the host platform type-safe and easier.
repository: https://github.com/flutter/packages/tree/master/packages/pigeon
issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon
-version: 1.0.11 # This must match the version in lib/generator_tools.dart
+version: 1.0.12 # This must match the version in lib/generator_tools.dart
environment:
sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh
index aaa73dd..81e5983 100755
--- a/packages/pigeon/run_tests.sh
+++ b/packages/pigeon/run_tests.sh
@@ -320,6 +320,7 @@
gen_android_unittests_code ./pigeons/all_void.dart AllVoid
gen_android_unittests_code ./pigeons/android_unittests.dart Pigeon
gen_android_unittests_code ./pigeons/async_handlers.dart AsyncHandlers
+ gen_android_unittests_code ./pigeons/enum.dart Enum
gen_android_unittests_code ./pigeons/host2flutter.dart Host2Flutter
gen_android_unittests_code ./pigeons/java_double_host_api.dart JavaDoubleHostApi
gen_android_unittests_code ./pigeons/list.dart PigeonList
diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart
index 461a806..ae815ef 100644
--- a/packages/pigeon/test/java_generator_test.dart
+++ b/packages/pigeon/test/java_generator_test.dart
@@ -609,8 +609,14 @@
expect(code, contains('private Enum1(final int index) {'));
expect(code, contains(' this.index = index;'));
- expect(code, contains('toMapResult.put("enum1", enum1.index);'));
- expect(code, contains('fromMapResult.enum1 = Enum1.values()[(int)enum1];'));
+ expect(
+ code,
+ contains(
+ 'toMapResult.put("enum1", enum1 == null ? null : enum1.index);'));
+ expect(
+ code,
+ contains(
+ 'fromMapResult.enum1 = enum1 == null ? null : Enum1.values()[(int)enum1];'));
});
Iterable<String> _makeIterable(String string) sync* {