From 62c9db672bd45bdc9cf4b812cc2162f3aec9de97 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Thu, 2 Dec 2021 09:22:22 -0800 Subject: [PATCH] [pigeon] fixed null support for java enums (#528) --- packages/pigeon/CHANGELOG.md | 4 ++++ packages/pigeon/lib/generator_tools.dart | 2 +- packages/pigeon/lib/java_generator.dart | 11 +++++----- .../example/android_unit_tests/EnumTest.java | 21 +++++++++++++++++++ packages/pigeon/pubspec.yaml | 2 +- packages/pigeon/run_tests.sh | 1 + packages/pigeon/test/java_generator_test.dart | 10 +++++++-- 7 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/EnumTest.java diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index 2fefeff7b4..26203591c6 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 4b07ea0f60..86ef5b3fb5 100644 --- a/packages/pigeon/lib/generator_tools.dart +++ b/packages/pigeon/lib/generator_tools.dart @@ -8,7 +8,7 @@ import 'dart:mirrors'; 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 2bf2001c10..998551288c 100644 --- a/packages/pigeon/lib/java_generator.dart +++ b/packages/pigeon/lib/java_generator.dart @@ -474,13 +474,13 @@ void generateJava(JavaOptions options, Root root, StringSink sink) { 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 @@ void generateJava(JavaOptions options, Root root, StringSink sink) { 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 0000000000..32225a45da --- /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 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 d0e471aa56..c09f93ed65 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -2,7 +2,7 @@ name: pigeon 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 aaa73dd2ee..81e598354d 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -320,6 +320,7 @@ run_android_unittests() { 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 461a806df7..ae815ef73e 100644 --- a/packages/pigeon/test/java_generator_test.dart +++ b/packages/pigeon/test/java_generator_test.dart @@ -609,8 +609,14 @@ void main() { 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 _makeIterable(String string) sync* {