[pigeon] removed warnings from generated java code (#171)
diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index 1df17cc..14ee437 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.1.2
+
+* Removed static analysis warnings from generated Java code.
+
## 0.1.1
* Fixed issue where nested types didn't work if they weren't present in the Api.
diff --git a/packages/pigeon/e2e_tests/test_objc/android/app/src/main/java/io/flutter/plugins/Pigeon.java b/packages/pigeon/e2e_tests/test_objc/android/app/src/main/java/io/flutter/plugins/Pigeon.java
new file mode 100644
index 0000000..a6962f7
--- /dev/null
+++ b/packages/pigeon/e2e_tests/test_objc/android/app/src/main/java/io/flutter/plugins/Pigeon.java
@@ -0,0 +1,232 @@
+// Autogenerated from Pigeon (v0.1.2), do not edit directly.
+// See also: https://pub.dev/packages/pigeon
+
+package dev.flutter.aaclarke.pigeon;
+
+import io.flutter.plugin.common.BasicMessageChannel;
+import io.flutter.plugin.common.BinaryMessenger;
+import io.flutter.plugin.common.StandardMessageCodec;
+import java.util.HashMap;
+
+/** Generated class from Pigeon. */
+@SuppressWarnings("unused")
+public class Pigeon {
+
+ /** Generated class from Pigeon that represents data sent in messages. */
+ public static class SearchReply {
+ private String result;
+
+ public String getResult() {
+ return result;
+ }
+
+ public void setResult(String setterArg) {
+ this.result = setterArg;
+ }
+
+ private String error;
+
+ public String getError() {
+ return error;
+ }
+
+ public void setError(String setterArg) {
+ this.error = setterArg;
+ }
+
+ HashMap toMap() {
+ HashMap<String, Object> toMapResult = new HashMap<>();
+ toMapResult.put("result", result);
+ toMapResult.put("error", error);
+ return toMapResult;
+ }
+
+ static SearchReply fromMap(HashMap map) {
+ SearchReply fromMapResult = new SearchReply();
+ Object result = map.get("result");
+ fromMapResult.result = (String) result;
+ Object error = map.get("error");
+ fromMapResult.error = (String) error;
+ return fromMapResult;
+ }
+ }
+
+ /** Generated class from Pigeon that represents data sent in messages. */
+ public static class SearchRequest {
+ private String query;
+
+ public String getQuery() {
+ return query;
+ }
+
+ public void setQuery(String setterArg) {
+ this.query = setterArg;
+ }
+
+ private Long anInt;
+
+ public Long getAnInt() {
+ return anInt;
+ }
+
+ public void setAnInt(Long setterArg) {
+ this.anInt = setterArg;
+ }
+
+ private Boolean aBool;
+
+ public Boolean getABool() {
+ return aBool;
+ }
+
+ public void setABool(Boolean setterArg) {
+ this.aBool = setterArg;
+ }
+
+ HashMap toMap() {
+ HashMap<String, Object> toMapResult = new HashMap<>();
+ toMapResult.put("query", query);
+ toMapResult.put("anInt", anInt);
+ toMapResult.put("aBool", aBool);
+ return toMapResult;
+ }
+
+ static SearchRequest fromMap(HashMap map) {
+ SearchRequest fromMapResult = new SearchRequest();
+ Object query = map.get("query");
+ fromMapResult.query = (String) query;
+ Object anInt = map.get("anInt");
+ fromMapResult.anInt =
+ (anInt == null) ? null : ((anInt instanceof Integer) ? (Integer) anInt : (Long) anInt);
+ Object aBool = map.get("aBool");
+ fromMapResult.aBool = (Boolean) aBool;
+ return fromMapResult;
+ }
+ }
+
+ /** Generated class from Pigeon that represents data sent in messages. */
+ public static class Nested {
+ private SearchRequest request;
+
+ public SearchRequest getRequest() {
+ return request;
+ }
+
+ public void setRequest(SearchRequest setterArg) {
+ this.request = setterArg;
+ }
+
+ HashMap toMap() {
+ HashMap<String, Object> toMapResult = new HashMap<>();
+ toMapResult.put("request", request);
+ return toMapResult;
+ }
+
+ static Nested fromMap(HashMap map) {
+ Nested fromMapResult = new Nested();
+ Object request = map.get("request");
+ fromMapResult.request = (SearchRequest) request;
+ return fromMapResult;
+ }
+ }
+
+ /** Generated class from Pigeon that represents Flutter messages that can be called from Java. */
+ public static class FlutterSearchApi {
+ private final BinaryMessenger binaryMessenger;
+
+ public FlutterSearchApi(BinaryMessenger argBinaryMessenger) {
+ this.binaryMessenger = argBinaryMessenger;
+ }
+
+ public interface Reply<T> {
+ void reply(T reply);
+ }
+
+ public void search(SearchRequest argInput, Reply<SearchReply> callback) {
+ BasicMessageChannel<Object> channel =
+ new BasicMessageChannel<>(
+ binaryMessenger,
+ "dev.flutter.pigeon.FlutterSearchApi.search",
+ new StandardMessageCodec());
+ HashMap inputMap = argInput.toMap();
+ channel.send(
+ inputMap,
+ channelReply -> {
+ HashMap outputMap = (HashMap) channelReply;
+ @SuppressWarnings("ConstantConditions")
+ SearchReply output = SearchReply.fromMap(outputMap);
+ callback.reply(output);
+ });
+ }
+ }
+
+ /** Generated interface from Pigeon that represents a handler of messages from Flutter. */
+ public interface NestedApi {
+ SearchReply search(Nested arg);
+
+ /** Sets up an instance of `NestedApi` to handle messages through the `binaryMessenger` */
+ static void setup(BinaryMessenger binaryMessenger, NestedApi api) {
+ {
+ BasicMessageChannel<Object> channel =
+ new BasicMessageChannel<>(
+ binaryMessenger, "dev.flutter.pigeon.NestedApi.search", new StandardMessageCodec());
+ if (api != null) {
+ channel.setMessageHandler(
+ (message, reply) -> {
+ HashMap<String, HashMap> wrapped = new HashMap<>();
+ try {
+ @SuppressWarnings("ConstantConditions")
+ Nested input = Nested.fromMap((HashMap) message);
+ SearchReply output = api.search(input);
+ wrapped.put("result", output.toMap());
+ } catch (Exception exception) {
+ wrapped.put("error", wrapError(exception));
+ }
+ reply.reply(wrapped);
+ });
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ }
+ }
+
+ /** Generated interface from Pigeon that represents a handler of messages from Flutter. */
+ public interface Api {
+ SearchReply search(SearchRequest arg);
+
+ /** Sets up an instance of `Api` to handle messages through the `binaryMessenger` */
+ static void setup(BinaryMessenger binaryMessenger, Api api) {
+ {
+ BasicMessageChannel<Object> channel =
+ new BasicMessageChannel<>(
+ binaryMessenger, "dev.flutter.pigeon.Api.search", new StandardMessageCodec());
+ if (api != null) {
+ channel.setMessageHandler(
+ (message, reply) -> {
+ HashMap<String, HashMap> wrapped = new HashMap<>();
+ try {
+ @SuppressWarnings("ConstantConditions")
+ SearchRequest input = SearchRequest.fromMap((HashMap) message);
+ SearchReply output = api.search(input);
+ wrapped.put("result", output.toMap());
+ } catch (Exception exception) {
+ wrapped.put("error", wrapError(exception));
+ }
+ reply.reply(wrapped);
+ });
+ } else {
+ channel.setMessageHandler(null);
+ }
+ }
+ }
+ }
+
+ private static HashMap wrapError(Exception exception) {
+ HashMap<String, Object> errorMap = new HashMap<>();
+ errorMap.put("message", exception.toString());
+ errorMap.put("code", null);
+ errorMap.put("details", null);
+ return errorMap;
+ }
+}
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 8ef38d7..3844745 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), do not edit directly.
+// Autogenerated from Pigeon (v0.1.2), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#import <Foundation/Foundation.h>
@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 2865b26..7b52efa 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), do not edit directly.
+// Autogenerated from Pigeon (v0.1.2), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#import "dartle.h"
#import <Flutter/Flutter.h>
diff --git a/packages/pigeon/e2e_tests/test_objc/lib/dartle.dart b/packages/pigeon/e2e_tests/test_objc/lib/dartle.dart
index 5c76d82..9f0db48 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), do not edit directly.
+// Autogenerated from Pigeon (v0.1.2), 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 18c8590..c65c2f2 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.
-const String pigeonVersion = '0.1.0';
+const String pigeonVersion = '0.1.2';
/// 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 0015bf3..176dc2d 100644
--- a/packages/pigeon/lib/java_generator.dart
+++ b/packages/pigeon/lib/java_generator.dart
@@ -40,7 +40,7 @@
indent.writeln(
'/** Sets up an instance of `${api.name}` to handle messages through the `binaryMessenger` */');
indent.write(
- 'public static void setup(BinaryMessenger binaryMessenger, ${api.name} api) ');
+ 'static void setup(BinaryMessenger binaryMessenger, ${api.name} api) ');
indent.scoped('{', '}', () {
for (Method method in api.methods) {
final String channelName = makeChannelName(api, method);
@@ -50,48 +50,44 @@
indent.inc();
indent.inc();
indent.writeln(
- 'new BasicMessageChannel<Object>(binaryMessenger, "$channelName", new StandardMessageCodec());');
+ 'new BasicMessageChannel<>(binaryMessenger, "$channelName", new StandardMessageCodec());');
indent.dec();
indent.dec();
indent.write('if (api != null) ');
indent.scoped('{', '} else {', () {
- indent.write(
- 'channel.setMessageHandler(new BasicMessageChannel.MessageHandler<Object>() ');
+ indent.write('channel.setMessageHandler((message, reply) -> ');
indent.scoped('{', '});', () {
- indent.write(
- 'public void onMessage(Object message, BasicMessageChannel.Reply<Object> reply) ');
+ final String argType = method.argType;
+ final String returnType = method.returnType;
+ indent.writeln(
+ 'HashMap<String, HashMap> wrapped = new HashMap<>();');
+ indent.write('try ');
indent.scoped('{', '}', () {
- final String argType = method.argType;
- final String returnType = method.returnType;
String methodArgument;
if (argType == 'void') {
methodArgument = '';
} else {
+ indent.writeln('@SuppressWarnings("ConstantConditions")');
indent.writeln(
'$argType input = $argType.fromMap((HashMap)message);');
methodArgument = 'input';
}
- indent.writeln(
- 'HashMap<String, HashMap> wrapped = new HashMap<String, 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('{', '}', () {
+ 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.error}", wrapError(exception));');
- });
- indent.writeln('reply.reply(wrapped);');
+ '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.scoped(null, '}', () {
@@ -109,7 +105,7 @@
'/** Generated class from Pigeon that represents Flutter messages that can be called from Java.*/');
indent.write('public static class ${api.name} ');
indent.scoped('{', '}', () {
- indent.writeln('private BinaryMessenger binaryMessenger;');
+ indent.writeln('private final BinaryMessenger binaryMessenger;');
indent.write('public ${api.name}(BinaryMessenger argBinaryMessenger)');
indent.scoped('{', '}', () {
indent.writeln('this.binaryMessenger = argBinaryMessenger;');
@@ -136,26 +132,23 @@
indent.inc();
indent.inc();
indent.writeln(
- 'new BasicMessageChannel<Object>(binaryMessenger, "$channelName", new StandardMessageCodec());');
+ 'new BasicMessageChannel<>(binaryMessenger, "$channelName", new StandardMessageCodec());');
indent.dec();
indent.dec();
if (func.argType != 'void') {
indent.writeln('HashMap inputMap = argInput.toMap();');
}
- indent.write(
- 'channel.send($sendArgument, new BasicMessageChannel.Reply<Object>() ');
+ indent.write('channel.send($sendArgument, channelReply -> ');
indent.scoped('{', '});', () {
- indent.write('public void reply(Object channelReply) ');
- indent.scoped('{', '}', () {
- if (func.returnType == 'void') {
- indent.writeln('callback.reply(null);');
- } else {
- indent.writeln('HashMap outputMap = (HashMap)channelReply;');
- indent.writeln(
- '${func.returnType} output = ${func.returnType}.fromMap(outputMap);');
- indent.writeln('callback.reply(output);');
- }
- });
+ if (func.returnType == 'void') {
+ indent.writeln('callback.reply(null);');
+ } else {
+ indent.writeln('HashMap outputMap = (HashMap)channelReply;');
+ indent.writeln('@SuppressWarnings("ConstantConditions")');
+ indent.writeln(
+ '${func.returnType} output = ${func.returnType}.fromMap(outputMap);');
+ indent.writeln('callback.reply(output);');
+ }
});
});
}
@@ -178,14 +171,13 @@
return _javaTypeForDartTypeMap[datatype];
}
-String _mapGetter(Field field, List<Class> classes, String mapName) {
+String _castObject(Field field, List<Class> classes, String varName) {
final HostDatatype hostDatatype =
getHostDatatype(field, classes, _javaTypeForDartType);
- final String result = '$mapName.get("${field.name}")';
if (field.dataType == 'int') {
- return '($result instanceof Integer) ? (Integer)$result : (${hostDatatype.datatype})$result';
+ return '($varName == null) ? null : (($varName instanceof Integer) ? (Integer)$varName : (${hostDatatype.datatype})$varName)';
} else {
- return '(${hostDatatype.datatype})$result';
+ return '(${hostDatatype.datatype})$varName';
}
}
@@ -200,16 +192,15 @@
indent.writeln('package ${options.package};');
}
indent.addln('');
-
- indent.writeln('import java.util.HashMap;');
- indent.addln('');
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.HashMap;');
indent.addln('');
assert(options.className != null);
indent.writeln('/** Generated class from Pigeon. */');
+ indent.writeln('@SuppressWarnings("unused")');
indent.write('public class ${options.className} ');
indent.scoped('{', '}', () {
for (Class klass in root.classes) {
@@ -231,7 +222,7 @@
indent.write('HashMap toMap() ');
indent.scoped('{', '}', () {
indent.writeln(
- 'HashMap<String, Object> toMapResult = new HashMap<String, Object>();');
+ 'HashMap<String, Object> toMapResult = new HashMap<>();');
for (Field field in klass.fields) {
indent.writeln('toMapResult.put("${field.name}", ${field.name});');
}
@@ -241,8 +232,9 @@
indent.scoped('{', '}', () {
indent.writeln('${klass.name} fromMapResult = new ${klass.name}();');
for (Field field in klass.fields) {
+ indent.writeln('Object ${field.name} = map.get("${field.name}");');
indent.writeln(
- 'fromMapResult.${field.name} = ${_mapGetter(field, root.classes, 'map')};');
+ 'fromMapResult.${field.name} = ${_castObject(field, root.classes, field.name)};');
}
indent.writeln('return fromMapResult;');
});
@@ -259,7 +251,7 @@
}
indent.format('''private static HashMap wrapError(Exception exception) {
-\tHashMap<String, Object> errorMap = new HashMap<String, Object>();
+\tHashMap<String, Object> errorMap = new HashMap<>();
\terrorMap.put("${Keys.errorMessage}", exception.toString());
\terrorMap.put("${Keys.errorCode}", null);
\terrorMap.put("${Keys.errorDetails}", null);
diff --git a/packages/pigeon/mock_handler_tester/test/message.dart b/packages/pigeon/mock_handler_tester/test/message.dart
index 5c76d82..9f0db48 100644
--- a/packages/pigeon/mock_handler_tester/test/message.dart
+++ b/packages/pigeon/mock_handler_tester/test/message.dart
@@ -1,4 +1,4 @@
-// Autogenerated from Pigeon (v0.1.0), do not edit directly.
+// Autogenerated from Pigeon (v0.1.2), 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/pubspec.yaml b/packages/pigeon/pubspec.yaml
index 537ac2f..b78d923 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -1,5 +1,5 @@
name: pigeon
-version: 0.1.1
+version: 0.1.2
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 9a81105..3bfbaf7 100755
--- a/packages/pigeon/run_tests.sh
+++ b/packages/pigeon/run_tests.sh
@@ -74,11 +74,13 @@
DARTLE_H="e2e_tests/test_objc/ios/Runner/dartle.h"
DARTLE_M="e2e_tests/test_objc/ios/Runner/dartle.m"
DARTLE_DART="e2e_tests/test_objc/lib/dartle.dart"
+PIGEON_JAVA="e2e_tests/test_objc/android/app/src/main/java/io/flutter/plugins/Pigeon.java"
pub run pigeon \
--input pigeons/message.dart \
--dart_out $DARTLE_DART \
--objc_header_out $DARTLE_H \
- --objc_source_out $DARTLE_M
+ --objc_source_out $DARTLE_M \
+ --java_out $PIGEON_JAVA
dartfmt -w $DARTLE_DART
pushd $PWD