From c9053f1fea56efd5a7d77bd5063994a573743ab2 Mon Sep 17 00:00:00 2001 From: gaaclarke <30870216+gaaclarke@users.noreply.github.com> Date: Fri, 31 Jul 2020 13:07:04 -0700 Subject: [PATCH] [Pigeon] Added support for lists and maps in java and objc targets. (#186) --- packages/pigeon/CHANGELOG.md | 4 +++ packages/pigeon/lib/java_generator.dart | 3 ++ packages/pigeon/lib/objc_generator.dart | 4 +++ packages/pigeon/pigeons/list.dart | 15 ++++++++++ packages/pigeon/pubspec.yaml | 2 +- packages/pigeon/run_tests.sh | 2 ++ packages/pigeon/test/java_generator_test.dart | 30 +++++++++++++++++++ packages/pigeon/test/objc_generator_test.dart | 26 ++++++++++++++++ 8 files changed, 85 insertions(+), 1 deletion(-) create mode 100644 packages/pigeon/pigeons/list.dart diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index 403788f838..9553217367 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.3 + +* Added support for List and Map datatypes in Java and Objective-C targets. + ## 0.1.2+1 * Updated the Readme.md. diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart index 176dc2df7d..0710bb09ed 100644 --- a/packages/pigeon/lib/java_generator.dart +++ b/packages/pigeon/lib/java_generator.dart @@ -14,6 +14,8 @@ const Map _javaTypeForDartTypeMap = { 'Int32List': 'int[]', 'Int64List': 'long[]', 'Float64List': 'double[]', + 'List': 'ArrayList', + 'Map': 'HashMap', }; /// Options that control how Java code will be generated. @@ -195,6 +197,7 @@ void generateJava(JavaOptions options, Root root, StringSink sink) { indent.writeln('import io.flutter.plugin.common.BasicMessageChannel;'); indent.writeln('import io.flutter.plugin.common.BinaryMessenger;'); indent.writeln('import io.flutter.plugin.common.StandardMessageCodec;'); + indent.writeln('import java.util.ArrayList;'); indent.writeln('import java.util.HashMap;'); indent.addln(''); diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart index dd8dbb953e..fb52f0b9c3 100644 --- a/packages/pigeon/lib/objc_generator.dart +++ b/packages/pigeon/lib/objc_generator.dart @@ -41,6 +41,8 @@ const Map _objcTypeForDartTypeMap = { 'Int32List': 'FlutterStandardTypedData *', 'Int64List': 'FlutterStandardTypedData *', 'Float64List': 'FlutterStandardTypedData *', + 'List': 'NSArray *', + 'Map': 'NSDictionary *', }; const Map _propertyTypeForDartTypeMap = { @@ -52,6 +54,8 @@ const Map _propertyTypeForDartTypeMap = { 'Int32List': 'strong', 'Int64List': 'strong', 'Float64List': 'strong', + 'List': 'strong', + 'Map': 'strong', }; String _objcTypeForDartType(String type) { diff --git a/packages/pigeon/pigeons/list.dart b/packages/pigeon/pigeons/list.dart new file mode 100644 index 0000000000..bed4a79227 --- /dev/null +++ b/packages/pigeon/pigeons/list.dart @@ -0,0 +1,15 @@ +// Copyright 2020 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. + +import 'package:pigeon/pigeon.dart'; + +class TestMessage { + // ignore: always_specify_types + List testList; +} + +@HostApi() +abstract class TestApi { + void test(TestMessage msg); +} diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index 97dbc72475..616b1a5e5a 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -1,5 +1,5 @@ name: pigeon -version: 0.1.2+1 +version: 0.1.3 description: Code generator tool to make communication between Flutter and the host platform type-safe and easier. homepage: https://github.com/flutter/packages/tree/master/packages/pigeon dependencies: diff --git a/packages/pigeon/run_tests.sh b/packages/pigeon/run_tests.sh index 3bfbaf71e0..8058d80556 100755 --- a/packages/pigeon/run_tests.sh +++ b/packages/pigeon/run_tests.sh @@ -55,12 +55,14 @@ test_pigeon_android ./pigeons/host2flutter.dart test_pigeon_android ./pigeons/message.dart test_pigeon_android ./pigeons/void_arg_host.dart test_pigeon_android ./pigeons/void_arg_flutter.dart +test_pigeon_android ./pigeons/list.dart test_pigeon_ios ./pigeons/message.dart test_pigeon_ios ./pigeons/host2flutter.dart test_pigeon_ios ./pigeons/voidhost.dart test_pigeon_ios ./pigeons/voidflutter.dart test_pigeon_ios ./pigeons/void_arg_host.dart test_pigeon_ios ./pigeons/void_arg_flutter.dart +test_pigeon_ios ./pigeons/list.dart pushd $PWD pub run pigeon \ diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart index 9113261ad6..7174c2b76a 100644 --- a/packages/pigeon/test/java_generator_test.dart +++ b/packages/pigeon/test/java_generator_test.dart @@ -199,4 +199,34 @@ void main() { expect(code, contains('doSomething(Reply')); expect(code, contains('channel.send(null')); }); + + test('gen list', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'List')]), + ]); + final StringBuffer sink = StringBuffer(); + final JavaOptions javaOptions = JavaOptions(); + javaOptions.className = 'Messages'; + generateJava(javaOptions, root, sink); + final String code = sink.toString(); + expect(code, contains('public static class Foobar')); + expect(code, contains('private ArrayList field1;')); + }); + + test('gen map', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'Map')]), + ]); + final StringBuffer sink = StringBuffer(); + final JavaOptions javaOptions = JavaOptions(); + javaOptions.className = 'Messages'; + generateJava(javaOptions, root, sink); + final String code = sink.toString(); + expect(code, contains('public static class Foobar')); + expect(code, contains('private HashMap field1;')); + }); } diff --git a/packages/pigeon/test/objc_generator_test.dart b/packages/pigeon/test/objc_generator_test.dart index 939bed1f53..74ade0fdfe 100644 --- a/packages/pigeon/test/objc_generator_test.dart +++ b/packages/pigeon/test/objc_generator_test.dart @@ -405,4 +405,30 @@ void main() { '(void)doSomething:(void(^)(ABCOutput*, NSError*))completion')); expect(code, contains('channel sendMessage:nil')); }); + + test('gen list', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'List')]), + ]); + final StringBuffer sink = StringBuffer(); + generateObjcHeader(ObjcOptions(), root, sink); + final String code = sink.toString(); + expect(code, contains('@interface Foobar')); + expect(code, matches('@property.*NSArray.*field1')); + }); + + test('gen map', () { + final Root root = Root(apis: [], classes: [ + Class( + name: 'Foobar', + fields: [Field(name: 'field1', dataType: 'Map')]), + ]); + final StringBuffer sink = StringBuffer(); + generateObjcHeader(ObjcOptions(), root, sink); + final String code = sink.toString(); + expect(code, contains('@interface Foobar')); + expect(code, matches('@property.*NSDictionary.*field1')); + }); }