diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index e61cf9d22d..3ac6ce9452 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,7 @@ +## 0.1.0-experimental.11 + +* Fixed setting an api to null in Java. + ## 0.1.0-experimental.10 * Added support for void argument functions. diff --git a/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.h b/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.h index 91d45fa852..4371da8ba0 100644 --- a/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.h +++ b/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.h @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v0.1.0-experimental.10), do not edit directly. +// Autogenerated from Pigeon (v0.1.0-experimental.11), do not edit directly. // See also: https://pub.dev/packages/pigeon #import @protocol FlutterBinaryMessenger; diff --git a/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.m b/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.m index 05c5b17216..bf419cc900 100644 --- a/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.m +++ b/packages/pigeon/e2e_tests/test_objc/ios/Runner/dartle.m @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v0.1.0-experimental.10), do not edit directly. +// Autogenerated from Pigeon (v0.1.0-experimental.11), do not edit directly. // See also: https://pub.dev/packages/pigeon #import "dartle.h" #import diff --git a/packages/pigeon/e2e_tests/test_objc/lib/dartle.dart b/packages/pigeon/e2e_tests/test_objc/lib/dartle.dart index cb9f3b9493..f314807227 100644 --- a/packages/pigeon/e2e_tests/test_objc/lib/dartle.dart +++ b/packages/pigeon/e2e_tests/test_objc/lib/dartle.dart @@ -1,4 +1,4 @@ -// Autogenerated from Pigeon (v0.1.0-experimental.10), do not edit directly. +// Autogenerated from Pigeon (v0.1.0-experimental.11), do not edit directly. // See also: https://pub.dev/packages/pigeon // ignore_for_file: public_member_api_docs, non_constant_identifier_names, avoid_as, unused_import import 'dart:async'; diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart index 7d5f8d869c..57d8340368 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. -const String pigeonVersion = '0.1.0-experimental.10'; +const String pigeonVersion = '0.1.0-experimental.11'; /// Read all the content from [stdin] to a String. String readStdin() { @@ -64,11 +64,15 @@ class Indent { /// Scoped increase of the ident level. For the execution of [func] the /// indentation will be incremented. void scoped(String begin, String end, Function func) { - _sink.write(begin + newline); + if (begin != null) { + _sink.write(begin + newline); + } inc(); func(); dec(); - _sink.write(str() + end + newline); + if (end != null) { + _sink.write(str() + end + newline); + } } /// Add [str] with indentation and a newline. diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart index 3cb5c7ee5f..0015bf39d2 100644 --- a/packages/pigeon/lib/java_generator.dart +++ b/packages/pigeon/lib/java_generator.dart @@ -53,44 +53,50 @@ void _writeHostApi(Indent indent, Api api) { 'new BasicMessageChannel(binaryMessenger, "$channelName", new StandardMessageCodec());'); indent.dec(); indent.dec(); - indent.write( - 'channel.setMessageHandler(new BasicMessageChannel.MessageHandler() '); - indent.scoped('{', '});', () { + indent.write('if (api != null) '); + indent.scoped('{', '} else {', () { indent.write( - 'public void onMessage(Object message, BasicMessageChannel.Reply reply) '); - indent.scoped('{', '}', () { - final String argType = method.argType; - final String returnType = method.returnType; - String methodArgument; - if (argType == 'void') { - methodArgument = ''; - } else { - indent.writeln( - '$argType input = $argType.fromMap((HashMap)message);'); - methodArgument = 'input'; - } - indent.writeln( - 'HashMap wrapped = new HashMap();'); - indent.write('try '); + 'channel.setMessageHandler(new BasicMessageChannel.MessageHandler() '); + indent.scoped('{', '});', () { + indent.write( + 'public void onMessage(Object message, BasicMessageChannel.Reply reply) '); indent.scoped('{', '}', () { - final String call = 'api.${method.name}($methodArgument)'; - if (method.returnType == 'void') { - indent.writeln('$call;'); - indent.writeln('wrapped.put("${Keys.result}", null);'); + final String argType = method.argType; + final String returnType = method.returnType; + String methodArgument; + if (argType == 'void') { + methodArgument = ''; } else { - indent.writeln('$returnType output = $call;'); indent.writeln( - 'wrapped.put("${Keys.result}", output.toMap());'); + '$argType input = $argType.fromMap((HashMap)message);'); + methodArgument = 'input'; } - }); - indent.write('catch (Exception exception) '); - indent.scoped('{', '}', () { indent.writeln( - 'wrapped.put("${Keys.error}", wrapError(exception));'); + 'HashMap wrapped = new HashMap();'); + indent.write('try '); + indent.scoped('{', '}', () { + final String call = 'api.${method.name}($methodArgument)'; + if (method.returnType == 'void') { + indent.writeln('$call;'); + indent.writeln('wrapped.put("${Keys.result}", null);'); + } else { + indent.writeln('$returnType output = $call;'); + indent.writeln( + 'wrapped.put("${Keys.result}", output.toMap());'); + } + }); + indent.write('catch (Exception exception) '); + indent.scoped('{', '}', () { + indent.writeln( + 'wrapped.put("${Keys.error}", wrapError(exception));'); + }); + indent.writeln('reply.reply(wrapped);'); }); - indent.writeln('reply.reply(wrapped);'); }); }); + indent.scoped(null, '}', () { + indent.writeln('channel.setMessageHandler(null);'); + }); }); } }); diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index d529dae9c1..f3c11e9a37 100644 --- a/packages/pigeon/pubspec.yaml +++ b/packages/pigeon/pubspec.yaml @@ -1,5 +1,5 @@ name: pigeon -version: 0.1.0-experimental.10 +version: 0.1.0-experimental.11 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/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart index 51eef3e186..9113261ad6 100644 --- a/packages/pigeon/test/java_generator_test.dart +++ b/packages/pigeon/test/java_generator_test.dart @@ -69,6 +69,7 @@ void main() { final String code = sink.toString(); expect(code, contains('public interface Api')); expect(code, matches('Output.*doSomething.*Input')); + expect(code, contains('channel.setMessageHandler(null)')); }); test('all the simple datatypes header', () {