[pigeon] fixed bug when using integer primitives on java (#472)
diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index da16220..1f64a3b 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 1.0.5
+
+* [java] Fixed bug when using Integer arguments to methods declared with 'int'
+ arguments.
+
## 1.0.4
* [front-end] Fixed bug where codecs weren't generating support for types that
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 451fcc2..7656288 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.4';
+const String pigeonVersion = '1.0.5';
/// 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 2a4aac0..f239989 100644
--- a/packages/pigeon/lib/java_generator.dart
+++ b/packages/pigeon/lib/java_generator.dart
@@ -171,7 +171,13 @@
indent.writeln(
'ArrayList<Object> args = (ArrayList<Object>)message;');
enumerate(method.arguments, (int index, NamedType arg) {
- final String argType = _javaTypeForDartType(arg.type);
+ // The StandardMessageCodec can give us [Integer, Long] for
+ // a Dart 'int'. To keep things simple we just use 64bit
+ // longs in Pigeon with Java.
+ final bool isInt = arg.type.baseName == 'int';
+ final String argType =
+ isInt ? 'Number' : _javaTypeForDartType(arg.type);
+ final String argCast = isInt ? '.longValue()' : '';
final String argName = _getSafeArgumentName(index, arg);
indent.writeln(
'$argType $argName = ($argType)args.get($index);');
@@ -180,7 +186,7 @@
indent.writeln(
'throw new NullPointerException("$argName unexpectedly null.");');
});
- methodArgument.add(argName);
+ methodArgument.add('$argName$argCast');
});
}
if (method.isAsynchronous) {
@@ -365,6 +371,9 @@
return _javaTypeForBuiltinDartType(type) ?? type.baseName;
}
+/// Casts variable named [varName] to the correct host datatype for [field].
+/// This is for use in codecs where we may have a map representation of an
+/// object.
String _castObject(
NamedType field, List<Class> classes, List<Enum> enums, String varName) {
final HostDatatype hostDatatype = getHostDatatype(field, classes, enums,
diff --git a/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/AllDatatypesTest.java b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/AllDatatypesTest.java
index c59e660..b6a8cf1 100644
--- a/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/AllDatatypesTest.java
+++ b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/AllDatatypesTest.java
@@ -13,6 +13,7 @@
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
+import java.util.Map;
import org.junit.Test;
public class AllDatatypesTest {
@@ -122,4 +123,15 @@
});
assertTrue(didCall[0]);
}
+
+ @Test
+ public void integerToLong() {
+ Everything everything = new Everything();
+ everything.setAnInt(123L);
+ Map<String, Object> map = everything.toMap();
+ assertTrue(map.containsKey("anInt"));
+ map.put("anInt", 123);
+ Everything readEverything = Everything.fromMap(map);
+ assertEquals(readEverything.getAnInt(), everything.getAnInt());
+ }
}
diff --git a/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java
index dae86ad..eabdb5f 100644
--- a/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java
+++ b/packages/pigeon/platform_tests/android_unit_tests/android/app/src/test/java/com/example/android_unit_tests/PrimitiveTest.java
@@ -8,13 +8,17 @@
import static org.mockito.Mockito.*;
import com.example.android_unit_tests.Primitive.PrimitiveFlutterApi;
+import com.example.android_unit_tests.Primitive.PrimitiveHostApi;
import io.flutter.plugin.common.BinaryMessenger;
+import io.flutter.plugin.common.MessageCodec;
import java.nio.ByteBuffer;
import java.util.ArrayList;
+import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import org.junit.Test;
+import org.mockito.ArgumentCaptor;
public class PrimitiveTest {
private static BinaryMessenger makeMockBinaryMessenger() {
@@ -51,6 +55,32 @@
}
@Test
+ public void primitiveIntHostApi() {
+ PrimitiveHostApi mockApi = mock(PrimitiveHostApi.class);
+ when(mockApi.anInt(1L)).thenReturn(1L);
+ BinaryMessenger binaryMessenger = mock(BinaryMessenger.class);
+ PrimitiveHostApi.setup(binaryMessenger, mockApi);
+ ArgumentCaptor<BinaryMessenger.BinaryMessageHandler> handler =
+ ArgumentCaptor.forClass(BinaryMessenger.BinaryMessageHandler.class);
+ verify(binaryMessenger)
+ .setMessageHandler(eq("dev.flutter.pigeon.PrimitiveHostApi.anInt"), handler.capture());
+ MessageCodec<Object> codec = PrimitiveHostApi.getCodec();
+ ByteBuffer message = codec.encodeMessage(new ArrayList<Object>(Arrays.asList((Integer) 1)));
+ message.rewind();
+ handler
+ .getValue()
+ .onMessage(
+ message,
+ (bytes) -> {
+ bytes.rewind();
+ @SuppressWarnings("unchecked")
+ Map<String, Object> wrapped = (Map<String, Object>) codec.decodeMessage(bytes);
+ assertTrue(wrapped.containsKey("result"));
+ assertEquals(1L, ((Long) wrapped.get("result")).longValue());
+ });
+ }
+
+ @Test
public void primitiveBool() {
BinaryMessenger binaryMessenger = makeMockBinaryMessenger();
PrimitiveFlutterApi api = new PrimitiveFlutterApi(binaryMessenger);
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index ca87553..0d4b8d2 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.4 # This must match the version in lib/generator_tools.dart
+version: 1.0.5 # This must match the version in lib/generator_tools.dart
environment:
sdk: '>=2.12.0 <3.0.0'
diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart
index 5fe056a..835725a 100644
--- a/packages/pigeon/test/java_generator_test.dart
+++ b/packages/pigeon/test/java_generator_test.dart
@@ -818,9 +818,10 @@
expect(code, contains('Long add(Long x, Long y)'));
expect(
code, contains('ArrayList<Object> args = (ArrayList<Object>)message;'));
- expect(code, contains('Long xArg = (Long)args.get(0)'));
- expect(code, contains('Long yArg = (Long)args.get(1)'));
- expect(code, contains('Long output = api.add(xArg, yArg)'));
+ expect(code, contains('Number xArg = (Number)args.get(0)'));
+ expect(code, contains('Number yArg = (Number)args.get(1)'));
+ expect(code,
+ contains('Long output = api.add(xArg.longValue(), yArg.longValue())'));
});
test('flutter multiple args', () {