diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md index 3202e8b7eb1..7d8d8bdcaa5 100644 --- a/packages/pigeon/CHANGELOG.md +++ b/packages/pigeon/CHANGELOG.md @@ -1,3 +1,13 @@ +## 9.1.0 + +* [java] Adds a `GeneratedApi.FlutterError` exception for passing custom error details (code, message, details). +* [kotlin] Adds a `FlutterError` exception for passing custom error details (code, message, details). +* [kotlin] Adds an `errorClassName` option in `KotlinOptions` for custom error class names. +* [java] Removes legacy try catch from async apis. +* [java] Removes legacy null check on non-nullable method arguments. +* [cpp] Fixes wrong order of items in `FlutterError`. +* Adds `FlutterError` handling integration tests for all platforms. + ## 9.0.7 * [swift] Changes all ints to int64. diff --git a/packages/pigeon/README.md b/packages/pigeon/README.md index 9c5ef034f2d..16d6c67656e 100644 --- a/packages/pigeon/README.md +++ b/packages/pigeon/README.md @@ -112,7 +112,7 @@ abstract class Api2Host { Generates: ```objc -// Objc +// Objective-C @protocol Api2Host -(void)calculate:(nullable Value *)input completion:(void(^)(Value *_Nullable, FlutterError *_Nullable))completion; @@ -145,7 +145,7 @@ public interface Api2Host { /** Generated interface from Pigeon that represents a handler of messages from Flutter.*/ interface Api2Host { - fun calculate(value: Value, callback: (Value) -> Unit) + fun calculate(value: Value, callback: (Result) -> Unit) } ``` @@ -224,6 +224,61 @@ abstract class Api2Host { } ``` +### Error Handling + +#### Kotlin, Java and Swift + +All Host API exceptions are translated into Flutter `PlatformException`. +* For synchronous methods, thrown exceptions will be caught and translated. +* For asynchronous methods, there is no default exception handling; errors should be returned via the provided callback. + +To pass custom details into `PlatformException` for error handling, use `FlutterError` in your Host API. +For example: + +```kotlin +// Kotlin +class MyApi : GeneratedApi { + // For synchronous methods + override fun doSomething() { + throw FlutterError('error_code', 'message', 'details') + } + + // For async methods + override fun doSomethingAsync(callback: (Result) -> Unit) { + callback(Result.failure(FlutterError('error_code', 'message', 'details')) + } +} +``` + +#### Objective-C and C++ + +Likewise, Host API errors can be sent using the provided `FlutterError` class (translated into `PlatformException`). + +For synchronous methods: +* Objective-C - Assign the `error` argument to a `FlutterError` reference. +* C++ - Return a `FlutterError` directly (for void methods) or within an `ErrorOr` instance. + +For async methods: +* Both - Return a `FlutterError` through the provided callback. + +#### Handling the errors + +Then you can implement error handling on the Flutter side: + +```dart +// Dart +void doSomething() { + try { + myApi.doSomething() + } catch (PlatformException e) { + if (e.code == 'error_code') { + // Perform custom error handling + assert(e.message == 'message') + assert(e.details == 'details') + } + } +} +``` ## Feedback diff --git a/packages/pigeon/lib/cpp_generator.dart b/packages/pigeon/lib/cpp_generator.dart index b983fb983cc..cae09fd932d 100644 --- a/packages/pigeon/lib/cpp_generator.dart +++ b/packages/pigeon/lib/cpp_generator.dart @@ -839,8 +839,8 @@ EncodableValue ${api.name}::WrapError(std::string_view error_message) { } EncodableValue ${api.name}::WrapError(const FlutterError& error) { \treturn EncodableValue(EncodableList{ -\t\tEncodableValue(error.message()), \t\tEncodableValue(error.code()), +\t\tEncodableValue(error.message()), \t\terror.details() \t}); }'''); diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart index 69a80f4c534..07f5800e79d 100644 --- a/packages/pigeon/lib/generator_tools.dart +++ b/packages/pigeon/lib/generator_tools.dart @@ -11,7 +11,7 @@ import 'ast.dart'; /// The current version of pigeon. /// /// This must match the version in pubspec.yaml. -const String pigeonVersion = '9.0.7'; +const String pigeonVersion = '9.1.0'; /// 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 18677b3a41a..f14fc3658f5 100644 --- a/packages/pigeon/lib/java_generator.dart +++ b/packages/pigeon/lib/java_generator.dart @@ -132,7 +132,7 @@ class JavaGenerator extends StructuredGenerator { indent.writeln( '$_docCommentPrefix Generated class from Pigeon.$_docCommentSuffix'); indent.writeln( - '@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"})'); + '@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"})'); if (generatorOptions.useGeneratedAnnotation ?? false) { indent.writeln('@javax.annotation.Generated("dev.flutter.pigeon")'); } @@ -606,46 +606,36 @@ class JavaGenerator extends StructuredGenerator { : _javaTypeForDartType(method.returnType); indent.writeln( 'ArrayList wrapped = new ArrayList();'); - indent.write('try '); - indent.addScoped('{', '}', () { - final List methodArgument = []; - if (method.arguments.isNotEmpty) { - indent.writeln( - 'ArrayList args = (ArrayList) message;'); - indent.writeln('assert args != null;'); - enumerate(method.arguments, (int index, NamedType arg) { - // 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 argName = _getSafeArgumentName(index, arg); - final String argExpression = isInt - ? '($argName == null) ? null : $argName.longValue()' - : argName; - String accessor = 'args.get($index)'; - if (isEnum(root, arg.type)) { - accessor = _intToEnum(accessor, arg.type.baseName); - } else { - accessor = _cast(accessor, javaType: argType); - } - indent.writeln('$argType $argName = $accessor;'); - if (!arg.type.isNullable) { - indent.write('if ($argName == null) '); - indent.addScoped('{', '}', () { - indent.writeln( - 'throw new NullPointerException("$argName unexpectedly null.");'); - }); - } - methodArgument.add(argExpression); - }); - } - if (method.isAsynchronous) { - final String resultValue = - method.returnType.isVoid ? 'null' : 'result'; - const String resultName = 'resultCallback'; - indent.format(''' + final List methodArgument = []; + if (method.arguments.isNotEmpty) { + indent.writeln( + 'ArrayList args = (ArrayList) message;'); + enumerate(method.arguments, (int index, NamedType arg) { + // 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 argName = _getSafeArgumentName(index, arg); + final String argExpression = isInt + ? '($argName == null) ? null : $argName.longValue()' + : argName; + String accessor = 'args.get($index)'; + if (isEnum(root, arg.type)) { + accessor = _intToEnum(accessor, arg.type.baseName); + } else if (argType != 'Object') { + accessor = _cast(accessor, javaType: argType); + } + indent.writeln('$argType $argName = $accessor;'); + methodArgument.add(argExpression); + }); + } + if (method.isAsynchronous) { + final String resultValue = + method.returnType.isVoid ? 'null' : 'result'; + const String resultName = 'resultCallback'; + indent.format(''' Result<$returnType> $resultName = \t\tnew Result<$returnType>() { \t\t\tpublic void success($returnType result) { @@ -659,31 +649,33 @@ Result<$returnType> $resultName = \t\t\t} \t\t}; '''); - methodArgument.add(resultName); - } - final String call = - 'api.${method.name}(${methodArgument.join(', ')})'; - if (method.isAsynchronous) { - indent.writeln('$call;'); - } else if (method.returnType.isVoid) { - indent.writeln('$call;'); - indent.writeln('wrapped.add(0, null);'); - } else { - indent.writeln('$returnType output = $call;'); - indent.writeln('wrapped.add(0, output);'); - } - }, addTrailingNewline: false); - indent.add(' catch (Error | RuntimeException exception) '); - indent.addScoped('{', '}', () { - indent.writeln( - 'ArrayList wrappedError = wrapError(exception);'); - if (method.isAsynchronous) { - indent.writeln('reply.reply(wrappedError);'); - } else { - indent.writeln('wrapped = wrappedError;'); - } - }); - if (!method.isAsynchronous) { + methodArgument.add(resultName); + } + final String call = + 'api.${method.name}(${methodArgument.join(', ')})'; + if (method.isAsynchronous) { + indent.writeln('$call;'); + } else { + indent.write('try '); + indent.addScoped('{', '}', () { + if (method.returnType.isVoid) { + indent.writeln('$call;'); + indent.writeln('wrapped.add(0, null);'); + } else { + indent.writeln('$returnType output = $call;'); + indent.writeln('wrapped.add(0, output);'); + } + }); + indent.add(' catch (Throwable exception) '); + indent.addScoped('{', '}', () { + indent.writeln( + 'ArrayList wrappedError = wrapError(exception);'); + if (method.isAsynchronous) { + indent.writeln('reply.reply(wrappedError);'); + } else { + indent.writeln('wrapped = wrappedError;'); + } + }); indent.writeln('reply.reply(wrapped);'); } }); @@ -765,15 +757,45 @@ Result<$returnType> $resultName = }); } + void _writeErrorClass(Indent indent) { + indent.writeln( + '/** Error class for passing custom error details to Flutter via a thrown PlatformException. */'); + indent.write('public static class FlutterError extends RuntimeException '); + indent.addScoped('{', '}', () { + indent.newln(); + indent.writeln('/** The error code. */'); + indent.writeln('public final String code;'); + indent.newln(); + indent.writeln( + '/** The error details. Must be a datatype supported by the api codec. */'); + indent.writeln('public final Object details;'); + indent.newln(); + indent.writeln( + 'public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) '); + indent.writeScoped('{', '}', () { + indent.writeln('super(message);'); + indent.writeln('this.code = code;'); + indent.writeln('this.details = details;'); + }); + }); + } + void _writeWrapError(Indent indent) { indent.format(''' @NonNull private static ArrayList wrapError(@NonNull Throwable exception) { \tArrayList errorList = new ArrayList(3); -\terrorList.add(exception.toString()); -\terrorList.add(exception.getClass().getSimpleName()); -\terrorList.add( -\t\t"Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); +\tif (exception instanceof FlutterError) { +\t\tFlutterError error = (FlutterError) exception; +\t\terrorList.add(error.code); +\t\terrorList.add(error.getMessage()); +\t\terrorList.add(error.details); +\t} else { +\t\terrorList.add(exception.toString()); +\t\terrorList.add(exception.getClass().getSimpleName()); +\t\terrorList.add( +\t\t\t"Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); +\t} \treturn errorList; }'''); } @@ -781,6 +803,9 @@ private static ArrayList wrapError(@NonNull Throwable exception) { @override void writeGeneralUtilities( JavaOptions generatorOptions, Root root, Indent indent) { + indent.newln(); + _writeErrorClass(indent); + indent.newln(); _writeWrapError(indent); } diff --git a/packages/pigeon/lib/kotlin_generator.dart b/packages/pigeon/lib/kotlin_generator.dart index ff9148bea15..a3fa80205db 100644 --- a/packages/pigeon/lib/kotlin_generator.dart +++ b/packages/pigeon/lib/kotlin_generator.dart @@ -28,10 +28,8 @@ const DocumentCommentSpecification _docCommentSpec = /// Options that control how Kotlin code will be generated. class KotlinOptions { /// Creates a [KotlinOptions] object - const KotlinOptions({ - this.package, - this.copyrightHeader, - }); + const KotlinOptions( + {this.package, this.copyrightHeader, this.errorClassName}); /// The package where the generated class will live. final String? package; @@ -39,12 +37,16 @@ class KotlinOptions { /// A copyright header that will get prepended to generated code. final Iterable? copyrightHeader; + /// The name of the error class used for passing custom error parameters. + final String? errorClassName; + /// Creates a [KotlinOptions] from a Map representation where: /// `x = KotlinOptions.fromMap(x.toMap())`. static KotlinOptions fromMap(Map map) { return KotlinOptions( package: map['package'] as String?, copyrightHeader: map['copyrightHeader'] as Iterable?, + errorClassName: map['errorClassName'] as String?, ); } @@ -54,6 +56,7 @@ class KotlinOptions { final Map result = { if (package != null) 'package': package!, if (copyrightHeader != null) 'copyrightHeader': copyrightHeader!, + if (errorClassName != null) 'errorClassName': errorClassName!, }; return result; } @@ -400,6 +403,7 @@ class KotlinGenerator extends StructuredGenerator { /// fun setUp(binaryMessenger: BinaryMessenger, api: Api) {...} /// } /// } + /// @override void writeHostApi( KotlinOptions generatorOptions, @@ -548,7 +552,7 @@ class KotlinGenerator extends StructuredGenerator { indent.writeln('wrapped = listOf($call)'); } }, addTrailingNewline: false); - indent.add(' catch (exception: Error) '); + indent.add(' catch (exception: Throwable) '); indent.addScoped('{', '}', () { indent.writeln('wrapped = wrapError(exception)'); }); @@ -621,25 +625,57 @@ class KotlinGenerator extends StructuredGenerator { }); } - void _writeWrapError(Indent indent) { + void _writeWrapError(KotlinOptions generatorOptions, Indent indent) { indent.newln(); - indent.write('private fun wrapError(exception: Throwable): List '); + indent.write('private fun wrapError(exception: Throwable): List '); indent.addScoped('{', '}', () { - indent.write('return '); - indent.addScoped('listOf(', ')', () { - indent.writeln('exception.javaClass.simpleName,'); - indent.writeln('exception.toString(),'); - indent.writeln( - '"Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception)'); + indent.write( + 'if (exception is ${generatorOptions.errorClassName ?? "FlutterError"}) '); + indent.addScoped('{', '}', () { + indent.write('return '); + indent.addScoped('listOf(', ')', () { + indent.writeln('exception.code,'); + indent.writeln('exception.message,'); + indent.writeln('exception.details'); + }); + }, addTrailingNewline: false); + indent.addScoped(' else {', '}', () { + indent.write('return '); + indent.addScoped('listOf(', ')', () { + indent.writeln('exception.javaClass.simpleName,'); + indent.writeln('exception.toString(),'); + indent.writeln( + '"Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception)'); + }); }); }); } + void _writeErrorClass(KotlinOptions generatorOptions, Indent indent) { + indent.newln(); + indent.writeln('/**'); + indent.writeln( + ' * Error class for passing custom error details to Flutter via a thrown PlatformException.'); + indent.writeln(' * @property code The error code.'); + indent.writeln(' * @property message The error message.'); + indent.writeln( + ' * @property details The error details. Must be a datatype supported by the api codec.'); + indent.writeln(' */'); + indent.write('class ${generatorOptions.errorClassName ?? "FlutterError"} '); + indent.addScoped('(', ')', () { + indent.writeln('val code: String,'); + indent.writeln('override val message: String? = null,'); + indent.writeln('val details: Any? = null'); + }, addTrailingNewline: false); + indent.addln(' : Throwable()'); + } + @override void writeGeneralUtilities( KotlinOptions generatorOptions, Root root, Indent indent) { _writeWrapResult(indent); - _writeWrapError(indent); + _writeWrapError(generatorOptions, indent); + _writeErrorClass(generatorOptions, indent); } } diff --git a/packages/pigeon/lib/pigeon_lib.dart b/packages/pigeon/lib/pigeon_lib.dart index fda8c2d2bba..0ab77b8b615 100644 --- a/packages/pigeon/lib/pigeon_lib.dart +++ b/packages/pigeon/lib/pigeon_lib.dart @@ -633,6 +633,7 @@ class KotlinGeneratorAdapter implements GeneratorAdapter { KotlinOptions kotlinOptions = options.kotlinOptions ?? const KotlinOptions(); kotlinOptions = kotlinOptions.merge(KotlinOptions( + errorClassName: kotlinOptions.errorClassName ?? 'FlutterError', copyrightHeader: options.copyrightHeader != null ? _lineReader(options.copyrightHeader!) : null)); diff --git a/packages/pigeon/pigeons/core_tests.dart b/packages/pigeon/pigeons/core_tests.dart index 9ea6f47a5fd..ac9fd7768dc 100644 --- a/packages/pigeon/pigeons/core_tests.dart +++ b/packages/pigeon/pigeons/core_tests.dart @@ -106,9 +106,12 @@ abstract class HostIntegrationCoreApi { /// Returns an error, to test error handling. Object? throwError(); - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. void throwErrorFromVoid(); + /// Returns a Flutter error, to test error handling. + Object? throwFlutterError(); + /// Returns passed in int. @ObjCSelector('echoInt:') @SwiftFunction('echo(_:)') @@ -277,6 +280,10 @@ abstract class HostIntegrationCoreApi { @async void throwAsyncErrorFromVoid(); + /// Responds with a Flutter error from an async function returning a value. + @async + Object? throwAsyncFlutterError(); + /// Returns the passed object, to test async serialization and deserialization. @async @ObjCSelector('echoAsyncAllTypes:') diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/AlternateLanguageTestPlugin.java b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/AlternateLanguageTestPlugin.java index 6d32da5b201..97a7c7ddbb8 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/AlternateLanguageTestPlugin.java +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/AlternateLanguageTestPlugin.java @@ -54,6 +54,11 @@ public void throwErrorFromVoid() { throw new RuntimeException("An error"); } + @Override + public @Nullable Object throwFlutterError() { + throw new CoreTests.FlutterError("code", "message", "details"); + } + @Override public Long echoInt(@NonNull Long anInt) { return anInt; @@ -176,6 +181,11 @@ public void throwAsyncErrorFromVoid(Result result) { result.error(new RuntimeException("An error")); } + @Override + public void throwAsyncFlutterError(Result result) { + result.error(new CoreTests.FlutterError("code", "message", "details")); + } + @Override public void echoAsyncAllTypes(@NonNull AllTypes everything, Result result) { result.success(everything); diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java index fa417d37548..eef371b8a72 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/main/java/com/example/alternate_language_test_plugin/CoreTests.java @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon package com.example.alternate_language_test_plugin; @@ -23,15 +23,39 @@ import java.util.Map; /** Generated class from Pigeon. */ -@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression"}) +@SuppressWarnings({"unused", "unchecked", "CodeBlock2Expr", "RedundantSuppression", "serial"}) public class CoreTests { + + /** Error class for passing custom error details to Flutter via a thrown PlatformException. */ + public static class FlutterError extends RuntimeException { + + /** The error code. */ + public final String code; + + /** The error details. Must be a datatype supported by the api codec. */ + public final Object details; + + public FlutterError(@NonNull String code, @Nullable String message, @Nullable Object details) { + super(message); + this.code = code; + this.details = details; + } + } + @NonNull private static ArrayList wrapError(@NonNull Throwable exception) { ArrayList errorList = new ArrayList(3); - errorList.add(exception.toString()); - errorList.add(exception.getClass().getSimpleName()); - errorList.add( - "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + if (exception instanceof FlutterError) { + FlutterError error = (FlutterError) exception; + errorList.add(error.code); + errorList.add(error.getMessage()); + errorList.add(error.details); + } else { + errorList.add(exception.toString()); + errorList.add(exception.getClass().getSimpleName()); + errorList.add( + "Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception)); + } return errorList; } @@ -872,8 +896,11 @@ public interface HostIntegrationCoreApi { /** Returns an error, to test error handling. */ @Nullable Object throwError(); - /** Responds with an error from an async void function. */ + /** Returns an error from a void function, to test error handling. */ void throwErrorFromVoid(); + /** Returns a Flutter error, to test error handling. */ + @Nullable + Object throwFlutterError(); /** Returns passed in int. */ @NonNull Long echoInt(@NonNull Long anInt); @@ -966,6 +993,8 @@ AllNullableTypes sendMultipleNullableTypes( void throwAsyncError(Result result); /** Responds with an error from an async void function. */ void throwAsyncErrorFromVoid(Result result); + /** Responds with a Flutter error from an async function returning a value. */ + void throwAsyncFlutterError(Result result); /** Returns the passed object, to test async serialization and deserialization. */ void echoAsyncAllTypes(@NonNull AllTypes everything, Result result); /** Returns the passed object, to test serialization and deserialization. */ @@ -1052,7 +1081,7 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { try { api.noop(); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1072,16 +1101,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + AllTypes everythingArg = (AllTypes) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - AllTypes everythingArg = (AllTypes) args.get(0); - if (everythingArg == null) { - throw new NullPointerException("everythingArg unexpectedly null."); - } AllTypes output = api.echoAllTypes(everythingArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1104,7 +1129,7 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { try { Object output = api.throwError(); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1127,7 +1152,30 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { try { api.throwErrorFromVoid(); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { + ArrayList wrappedError = wrapError(exception); + wrapped = wrappedError; + } + reply.reply(wrapped); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError", + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList(); + try { + Object output = api.throwFlutterError(); + wrapped.add(0, output); + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1145,16 +1193,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number anIntArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number anIntArg = (Number) args.get(0); - if (anIntArg == null) { - throw new NullPointerException("anIntArg unexpectedly null."); - } Long output = api.echoInt((anIntArg == null) ? null : anIntArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1174,16 +1218,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Double aDoubleArg = (Double) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Double aDoubleArg = (Double) args.get(0); - if (aDoubleArg == null) { - throw new NullPointerException("aDoubleArg unexpectedly null."); - } Double output = api.echoDouble(aDoubleArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1201,16 +1241,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Boolean aBoolArg = (Boolean) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aBoolArg = (Boolean) args.get(0); - if (aBoolArg == null) { - throw new NullPointerException("aBoolArg unexpectedly null."); - } Boolean output = api.echoBool(aBoolArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1230,16 +1266,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + String aStringArg = (String) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - String aStringArg = (String) args.get(0); - if (aStringArg == null) { - throw new NullPointerException("aStringArg unexpectedly null."); - } String output = api.echoString(aStringArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1259,16 +1291,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + byte[] aUint8ListArg = (byte[]) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - byte[] aUint8ListArg = (byte[]) args.get(0); - if (aUint8ListArg == null) { - throw new NullPointerException("aUint8ListArg unexpectedly null."); - } byte[] output = api.echoUint8List(aUint8ListArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1288,16 +1316,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Object anObjectArg = args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Object anObjectArg = args.get(0); - if (anObjectArg == null) { - throw new NullPointerException("anObjectArg unexpectedly null."); - } Object output = api.echoObject(anObjectArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1315,16 +1339,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + List aListArg = (List) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - List aListArg = (List) args.get(0); - if (aListArg == null) { - throw new NullPointerException("aListArg unexpectedly null."); - } List output = api.echoList(aListArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1342,16 +1362,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Map aMapArg = (Map) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Map aMapArg = (Map) args.get(0); - if (aMapArg == null) { - throw new NullPointerException("aMapArg unexpectedly null."); - } Map output = api.echoMap(aMapArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1371,13 +1387,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + AllNullableTypes everythingArg = (AllNullableTypes) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - AllNullableTypes everythingArg = (AllNullableTypes) args.get(0); AllNullableTypes output = api.echoAllNullableTypes(everythingArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1397,16 +1412,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + AllNullableTypesWrapper wrapperArg = (AllNullableTypesWrapper) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - AllNullableTypesWrapper wrapperArg = (AllNullableTypesWrapper) args.get(0); - if (wrapperArg == null) { - throw new NullPointerException("wrapperArg unexpectedly null."); - } String output = api.extractNestedNullableString(wrapperArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1426,14 +1437,13 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + String nullableStringArg = (String) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - String nullableStringArg = (String) args.get(0); AllNullableTypesWrapper output = api.createNestedNullableString(nullableStringArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1453,19 +1463,18 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Boolean aNullableBoolArg = (Boolean) args.get(0); + Number aNullableIntArg = (Number) args.get(1); + String aNullableStringArg = (String) args.get(2); try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aNullableBoolArg = (Boolean) args.get(0); - Number aNullableIntArg = (Number) args.get(1); - String aNullableStringArg = (String) args.get(2); AllNullableTypes output = api.sendMultipleNullableTypes( aNullableBoolArg, (aNullableIntArg == null) ? null : aNullableIntArg.longValue(), aNullableStringArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1485,15 +1494,14 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Number aNullableIntArg = (Number) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Number aNullableIntArg = (Number) args.get(0); Long output = api.echoNullableInt( (aNullableIntArg == null) ? null : aNullableIntArg.longValue()); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1513,13 +1521,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Double aNullableDoubleArg = (Double) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Double aNullableDoubleArg = (Double) args.get(0); Double output = api.echoNullableDouble(aNullableDoubleArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1539,13 +1546,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Boolean aNullableBoolArg = (Boolean) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aNullableBoolArg = (Boolean) args.get(0); Boolean output = api.echoNullableBool(aNullableBoolArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1565,13 +1571,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + String aNullableStringArg = (String) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - String aNullableStringArg = (String) args.get(0); String output = api.echoNullableString(aNullableStringArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1591,13 +1596,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + byte[] aNullableUint8ListArg = (byte[]) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - byte[] aNullableUint8ListArg = (byte[]) args.get(0); byte[] output = api.echoNullableUint8List(aNullableUint8ListArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1617,13 +1621,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Object aNullableObjectArg = args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Object aNullableObjectArg = args.get(0); Object output = api.echoNullableObject(aNullableObjectArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1643,13 +1646,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + List aNullableListArg = (List) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - List aNullableListArg = (List) args.get(0); List output = api.echoNullableList(aNullableListArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1669,13 +1671,12 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); + ArrayList args = (ArrayList) message; + Map aNullableMapArg = (Map) args.get(0); try { - ArrayList args = (ArrayList) message; - assert args != null; - Map aNullableMapArg = (Map) args.get(0); Map output = api.echoNullableMap(aNullableMapArg); wrapped.add(0, output); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -1693,25 +1694,20 @@ static void setup(BinaryMessenger binaryMessenger, HostIntegrationCoreApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.noopAsync(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Void result) { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.noopAsync(resultCallback); }); } else { channel.setMessageHandler(null); @@ -1727,32 +1723,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Number anIntArg = (Number) args.get(0); - if (anIntArg == null) { - throw new NullPointerException("anIntArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(Long result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncInt( - (anIntArg == null) ? null : anIntArg.longValue(), resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Number anIntArg = (Number) args.get(0); + Result resultCallback = + new Result() { + public void success(Long result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncInt((anIntArg == null) ? null : anIntArg.longValue(), resultCallback); }); } else { channel.setMessageHandler(null); @@ -1768,31 +1754,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Double aDoubleArg = (Double) args.get(0); - if (aDoubleArg == null) { - throw new NullPointerException("aDoubleArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(Double result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncDouble(aDoubleArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Double aDoubleArg = (Double) args.get(0); + Result resultCallback = + new Result() { + public void success(Double result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncDouble(aDoubleArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -1808,31 +1785,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aBoolArg = (Boolean) args.get(0); - if (aBoolArg == null) { - throw new NullPointerException("aBoolArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(Boolean result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncBool(aBoolArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Boolean aBoolArg = (Boolean) args.get(0); + Result resultCallback = + new Result() { + public void success(Boolean result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncBool(aBoolArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -1848,31 +1816,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - String aStringArg = (String) args.get(0); - if (aStringArg == null) { - throw new NullPointerException("aStringArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncString(aStringArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + String aStringArg = (String) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncString(aStringArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -1888,31 +1847,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - byte[] aUint8ListArg = (byte[]) args.get(0); - if (aUint8ListArg == null) { - throw new NullPointerException("aUint8ListArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(byte[] result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncUint8List(aUint8ListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + byte[] aUint8ListArg = (byte[]) args.get(0); + Result resultCallback = + new Result() { + public void success(byte[] result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncUint8List(aUint8ListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -1928,31 +1878,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Object anObjectArg = args.get(0); - if (anObjectArg == null) { - throw new NullPointerException("anObjectArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(Object result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncObject(anObjectArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Object anObjectArg = args.get(0); + Result resultCallback = + new Result() { + public void success(Object result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncObject(anObjectArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -1968,31 +1909,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - List aListArg = (List) args.get(0); - if (aListArg == null) { - throw new NullPointerException("aListArg unexpectedly null."); - } - Result> resultCallback = - new Result>() { - public void success(List result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncList(aListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + List aListArg = (List) args.get(0); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncList(aListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2008,31 +1940,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Map aMapArg = (Map) args.get(0); - if (aMapArg == null) { - throw new NullPointerException("aMapArg unexpectedly null."); - } - Result> resultCallback = - new Result>() { - public void success(Map result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncMap(aMapArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Map aMapArg = (Map) args.get(0); + Result> resultCallback = + new Result>() { + public void success(Map result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncMap(aMapArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2048,25 +1971,20 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Object result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.throwAsyncError(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Object result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.throwAsyncError(resultCallback); }); } else { channel.setMessageHandler(null); @@ -2082,25 +2000,49 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.throwAsyncErrorFromVoid(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Void result) { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.throwAsyncErrorFromVoid(resultCallback); + }); + } else { + channel.setMessageHandler(null); + } + } + { + BasicMessageChannel channel = + new BasicMessageChannel<>( + binaryMessenger, + "dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError", + getCodec()); + if (api != null) { + channel.setMessageHandler( + (message, reply) -> { + ArrayList wrapped = new ArrayList(); + Result resultCallback = + new Result() { + public void success(Object result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.throwAsyncFlutterError(resultCallback); }); } else { channel.setMessageHandler(null); @@ -2116,31 +2058,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - AllTypes everythingArg = (AllTypes) args.get(0); - if (everythingArg == null) { - throw new NullPointerException("everythingArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(AllTypes result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncAllTypes(everythingArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + AllTypes everythingArg = (AllTypes) args.get(0); + Result resultCallback = + new Result() { + public void success(AllTypes result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncAllTypes(everythingArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2156,28 +2089,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - AllNullableTypes everythingArg = (AllNullableTypes) args.get(0); - Result resultCallback = - new Result() { - public void success(AllNullableTypes result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableAllNullableTypes(everythingArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + AllNullableTypes everythingArg = (AllNullableTypes) args.get(0); + Result resultCallback = + new Result() { + public void success(AllNullableTypes result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableAllNullableTypes(everythingArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2193,29 +2120,23 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Number anIntArg = (Number) args.get(0); - Result resultCallback = - new Result() { - public void success(Long result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableInt( - (anIntArg == null) ? null : anIntArg.longValue(), resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Number anIntArg = (Number) args.get(0); + Result resultCallback = + new Result() { + public void success(Long result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableInt( + (anIntArg == null) ? null : anIntArg.longValue(), resultCallback); }); } else { channel.setMessageHandler(null); @@ -2231,28 +2152,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Double aDoubleArg = (Double) args.get(0); - Result resultCallback = - new Result() { - public void success(Double result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableDouble(aDoubleArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Double aDoubleArg = (Double) args.get(0); + Result resultCallback = + new Result() { + public void success(Double result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableDouble(aDoubleArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2268,28 +2183,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aBoolArg = (Boolean) args.get(0); - Result resultCallback = - new Result() { - public void success(Boolean result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableBool(aBoolArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Boolean aBoolArg = (Boolean) args.get(0); + Result resultCallback = + new Result() { + public void success(Boolean result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableBool(aBoolArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2305,28 +2214,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - String aStringArg = (String) args.get(0); - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableString(aStringArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + String aStringArg = (String) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableString(aStringArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2342,28 +2245,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - byte[] aUint8ListArg = (byte[]) args.get(0); - Result resultCallback = - new Result() { - public void success(byte[] result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableUint8List(aUint8ListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + byte[] aUint8ListArg = (byte[]) args.get(0); + Result resultCallback = + new Result() { + public void success(byte[] result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableUint8List(aUint8ListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2379,28 +2276,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Object anObjectArg = args.get(0); - Result resultCallback = - new Result() { - public void success(Object result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableObject(anObjectArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Object anObjectArg = args.get(0); + Result resultCallback = + new Result() { + public void success(Object result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableObject(anObjectArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2416,28 +2307,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - List aListArg = (List) args.get(0); - Result> resultCallback = - new Result>() { - public void success(List result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableList(aListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + List aListArg = (List) args.get(0); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableList(aListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2453,28 +2338,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Map aMapArg = (Map) args.get(0); - Result> resultCallback = - new Result>() { - public void success(Map result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echoAsyncNullableMap(aMapArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Map aMapArg = (Map) args.get(0); + Result> resultCallback = + new Result>() { + public void success(Map result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echoAsyncNullableMap(aMapArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2490,25 +2369,20 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterNoop(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Void result) { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterNoop(resultCallback); }); } else { channel.setMessageHandler(null); @@ -2524,25 +2398,20 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Object result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterThrowError(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Object result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterThrowError(resultCallback); }); } else { channel.setMessageHandler(null); @@ -2558,25 +2427,20 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterThrowErrorFromVoid(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Void result) { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterThrowErrorFromVoid(resultCallback); }); } else { channel.setMessageHandler(null); @@ -2592,31 +2456,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - AllTypes everythingArg = (AllTypes) args.get(0); - if (everythingArg == null) { - throw new NullPointerException("everythingArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(AllTypes result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoAllTypes(everythingArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + AllTypes everythingArg = (AllTypes) args.get(0); + Result resultCallback = + new Result() { + public void success(AllTypes result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoAllTypes(everythingArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2632,34 +2487,28 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aNullableBoolArg = (Boolean) args.get(0); - Number aNullableIntArg = (Number) args.get(1); - String aNullableStringArg = (String) args.get(2); - Result resultCallback = - new Result() { - public void success(AllNullableTypes result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterSendMultipleNullableTypes( - aNullableBoolArg, - (aNullableIntArg == null) ? null : aNullableIntArg.longValue(), - aNullableStringArg, - resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Boolean aNullableBoolArg = (Boolean) args.get(0); + Number aNullableIntArg = (Number) args.get(1); + String aNullableStringArg = (String) args.get(2); + Result resultCallback = + new Result() { + public void success(AllNullableTypes result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterSendMultipleNullableTypes( + aNullableBoolArg, + (aNullableIntArg == null) ? null : aNullableIntArg.longValue(), + aNullableStringArg, + resultCallback); }); } else { channel.setMessageHandler(null); @@ -2675,31 +2524,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aBoolArg = (Boolean) args.get(0); - if (aBoolArg == null) { - throw new NullPointerException("aBoolArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(Boolean result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoBool(aBoolArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Boolean aBoolArg = (Boolean) args.get(0); + Result resultCallback = + new Result() { + public void success(Boolean result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoBool(aBoolArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2715,32 +2555,23 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Number anIntArg = (Number) args.get(0); - if (anIntArg == null) { - throw new NullPointerException("anIntArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(Long result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoInt( - (anIntArg == null) ? null : anIntArg.longValue(), resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Number anIntArg = (Number) args.get(0); + Result resultCallback = + new Result() { + public void success(Long result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoInt( + (anIntArg == null) ? null : anIntArg.longValue(), resultCallback); }); } else { channel.setMessageHandler(null); @@ -2756,31 +2587,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Double aDoubleArg = (Double) args.get(0); - if (aDoubleArg == null) { - throw new NullPointerException("aDoubleArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(Double result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoDouble(aDoubleArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Double aDoubleArg = (Double) args.get(0); + Result resultCallback = + new Result() { + public void success(Double result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoDouble(aDoubleArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2796,31 +2618,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - String aStringArg = (String) args.get(0); - if (aStringArg == null) { - throw new NullPointerException("aStringArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoString(aStringArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + String aStringArg = (String) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoString(aStringArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2836,31 +2649,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - byte[] aListArg = (byte[]) args.get(0); - if (aListArg == null) { - throw new NullPointerException("aListArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(byte[] result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoUint8List(aListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + byte[] aListArg = (byte[]) args.get(0); + Result resultCallback = + new Result() { + public void success(byte[] result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoUint8List(aListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2876,31 +2680,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - List aListArg = (List) args.get(0); - if (aListArg == null) { - throw new NullPointerException("aListArg unexpectedly null."); - } - Result> resultCallback = - new Result>() { - public void success(List result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoList(aListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + List aListArg = (List) args.get(0); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoList(aListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2916,31 +2711,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Map aMapArg = (Map) args.get(0); - if (aMapArg == null) { - throw new NullPointerException("aMapArg unexpectedly null."); - } - Result> resultCallback = - new Result>() { - public void success(Map result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoMap(aMapArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Map aMapArg = (Map) args.get(0); + Result> resultCallback = + new Result>() { + public void success(Map result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoMap(aMapArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2956,28 +2742,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Boolean aBoolArg = (Boolean) args.get(0); - Result resultCallback = - new Result() { - public void success(Boolean result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoNullableBool(aBoolArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Boolean aBoolArg = (Boolean) args.get(0); + Result resultCallback = + new Result() { + public void success(Boolean result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoNullableBool(aBoolArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -2993,29 +2773,23 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Number anIntArg = (Number) args.get(0); - Result resultCallback = - new Result() { - public void success(Long result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoNullableInt( - (anIntArg == null) ? null : anIntArg.longValue(), resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Number anIntArg = (Number) args.get(0); + Result resultCallback = + new Result() { + public void success(Long result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoNullableInt( + (anIntArg == null) ? null : anIntArg.longValue(), resultCallback); }); } else { channel.setMessageHandler(null); @@ -3031,28 +2805,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Double aDoubleArg = (Double) args.get(0); - Result resultCallback = - new Result() { - public void success(Double result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoNullableDouble(aDoubleArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Double aDoubleArg = (Double) args.get(0); + Result resultCallback = + new Result() { + public void success(Double result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoNullableDouble(aDoubleArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -3068,28 +2836,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - String aStringArg = (String) args.get(0); - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoNullableString(aStringArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + String aStringArg = (String) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoNullableString(aStringArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -3105,28 +2867,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - byte[] aListArg = (byte[]) args.get(0); - Result resultCallback = - new Result() { - public void success(byte[] result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoNullableUint8List(aListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + byte[] aListArg = (byte[]) args.get(0); + Result resultCallback = + new Result() { + public void success(byte[] result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoNullableUint8List(aListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -3142,28 +2898,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - List aListArg = (List) args.get(0); - Result> resultCallback = - new Result>() { - public void success(List result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoNullableList(aListArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + List aListArg = (List) args.get(0); + Result> resultCallback = + new Result>() { + public void success(List result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoNullableList(aListArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -3179,28 +2929,22 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - Map aMapArg = (Map) args.get(0); - Result> resultCallback = - new Result>() { - public void success(Map result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.callFlutterEchoNullableMap(aMapArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + Map aMapArg = (Map) args.get(0); + Result> resultCallback = + new Result>() { + public void success(Map result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.callFlutterEchoNullableMap(aMapArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -3617,7 +3361,7 @@ static void setup(BinaryMessenger binaryMessenger, HostTrivialApi api) { try { api.noop(); wrapped.add(0, null); - } catch (Error | RuntimeException exception) { + } catch (Throwable exception) { ArrayList wrappedError = wrapError(exception); wrapped = wrappedError; } @@ -3654,31 +3398,22 @@ static void setup(BinaryMessenger binaryMessenger, HostSmallApi api) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - ArrayList args = (ArrayList) message; - assert args != null; - String aStringArg = (String) args.get(0); - if (aStringArg == null) { - throw new NullPointerException("aStringArg unexpectedly null."); - } - Result resultCallback = - new Result() { - public void success(String result) { - wrapped.add(0, result); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.echo(aStringArg, resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + ArrayList args = (ArrayList) message; + String aStringArg = (String) args.get(0); + Result resultCallback = + new Result() { + public void success(String result) { + wrapped.add(0, result); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.echo(aStringArg, resultCallback); }); } else { channel.setMessageHandler(null); @@ -3692,25 +3427,20 @@ public void error(Throwable error) { channel.setMessageHandler( (message, reply) -> { ArrayList wrapped = new ArrayList(); - try { - Result resultCallback = - new Result() { - public void success(Void result) { - wrapped.add(0, null); - reply.reply(wrapped); - } - - public void error(Throwable error) { - ArrayList wrappedError = wrapError(error); - reply.reply(wrappedError); - } - }; - - api.voidVoid(resultCallback); - } catch (Error | RuntimeException exception) { - ArrayList wrappedError = wrapError(exception); - reply.reply(wrappedError); - } + Result resultCallback = + new Result() { + public void success(Void result) { + wrapped.add(0, null); + reply.reply(wrapped); + } + + public void error(Throwable error) { + ArrayList wrappedError = wrapError(error); + reply.reply(wrappedError); + } + }; + + api.voidVoid(resultCallback); }); } else { channel.setMessageHandler(null); diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/test/java/com/example/alternate_language_test_plugin/PigeonTest.java b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/test/java/com/example/alternate_language_test_plugin/PigeonTest.java index e03ad372a6b..a9dbc3ee64a 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/test/java/com/example/alternate_language_test_plugin/PigeonTest.java +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/android/src/test/java/com/example/alternate_language_test_plugin/PigeonTest.java @@ -9,9 +9,6 @@ import com.example.alternate_language_test_plugin.CoreTests.HostSmallApi; import io.flutter.plugin.common.BinaryMessenger; -import io.flutter.plugin.common.MessageCodec; -import java.nio.ByteBuffer; -import java.util.ArrayList; import org.junit.Test; import org.mockito.ArgumentCaptor; @@ -26,32 +23,4 @@ public void clearsHandler() { HostSmallApi.setup(binaryMessenger, null); verify(binaryMessenger, atLeast(1)).setMessageHandler(eq(channelName.getValue()), isNull()); } - - /** Causes an exception in the handler by passing in null when a non-null value is expected. */ - @Test - public void errorMessage() { - HostSmallApi mockApi = mock(HostSmallApi.class); - BinaryMessenger binaryMessenger = mock(BinaryMessenger.class); - HostSmallApi.setup(binaryMessenger, mockApi); - ArgumentCaptor handler = - ArgumentCaptor.forClass(BinaryMessenger.BinaryMessageHandler.class); - verify(binaryMessenger, atLeast(1)).setMessageHandler(anyString(), handler.capture()); - MessageCodec codec = HostSmallApi.getCodec(); - ByteBuffer message = codec.encodeMessage(null); - handler - .getAllValues() - .get(0) // "echo" is the first method. - .onMessage( - message, - (bytes) -> { - bytes.rewind(); - @SuppressWarnings("unchecked") - ArrayList error = (ArrayList) codec.decodeMessage(bytes); - assertNotNull(error.get(0)); - assertNotNull(error.get(1)); - String details = (String) error.get(2); - assertTrue(details.contains("Cause:")); - assertTrue(details.contains("Stacktrace:")); - }); - } } diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m index 0fc171bafff..843232acf3a 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/AlternateLanguageTestPlugin.m @@ -45,6 +45,11 @@ - (void)throwErrorFromVoidWithError:(FlutterError *_Nullable *_Nonnull)error { *error = [FlutterError errorWithCode:@"An error" message:nil details:nil]; } +- (nullable id)throwFlutterErrorWithError:(FlutterError *_Nullable *_Nonnull)error { + *error = [FlutterError errorWithCode:@"code" message:@"message" details:@"details"]; + return nil; +} + - (nullable NSNumber *)echoInt:(NSNumber *)anInt error:(FlutterError *_Nullable *_Nonnull)error { return anInt; } @@ -161,6 +166,11 @@ - (void)throwAsyncErrorFromVoidWithCompletion:(void (^)(FlutterError *_Nullable) completion([FlutterError errorWithCode:@"An error" message:nil details:nil]); } +- (void)throwAsyncFlutterErrorWithCompletion:(void (^)(id _Nullable, + FlutterError *_Nullable))completion { + completion(nil, [FlutterError errorWithCode:@"code" message:@"message" details:@"details"]); +} + - (void)echoAsyncAllTypes:(AllTypes *)everything completion:(void (^)(AllTypes *_Nullable, FlutterError *_Nullable))completion { completion(everything, nil); diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h index 180bf58b9bc..485b769df88 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.h @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon #import @@ -118,8 +118,10 @@ NSObject *HostIntegrationCoreApiGetCodec(void); error:(FlutterError *_Nullable *_Nonnull)error; /// Returns an error, to test error handling. - (nullable id)throwErrorWithError:(FlutterError *_Nullable *_Nonnull)error; -/// Responds with an error from an async void function. +/// Returns an error from a void function, to test error handling. - (void)throwErrorFromVoidWithError:(FlutterError *_Nullable *_Nonnull)error; +/// Returns a Flutter error, to test error handling. +- (nullable id)throwFlutterErrorWithError:(FlutterError *_Nullable *_Nonnull)error; /// Returns passed in int. /// /// @return `nil` only when `error != nil`. @@ -238,6 +240,9 @@ NSObject *HostIntegrationCoreApiGetCodec(void); - (void)throwAsyncErrorWithCompletion:(void (^)(id _Nullable, FlutterError *_Nullable))completion; /// Responds with an error from an async void function. - (void)throwAsyncErrorFromVoidWithCompletion:(void (^)(FlutterError *_Nullable))completion; +/// Responds with a Flutter error from an async function returning a value. +- (void)throwAsyncFlutterErrorWithCompletion:(void (^)(id _Nullable, + FlutterError *_Nullable))completion; /// Returns the passed object, to test async serialization and deserialization. - (void)echoAsyncAllTypes:(AllTypes *)everything completion:(void (^)(AllTypes *_Nullable, FlutterError *_Nullable))completion; diff --git a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m index aeb5c18d4df..f2782a337fe 100644 --- a/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m +++ b/packages/pigeon/platform_tests/alternate_language_test_plugin/ios/Classes/CoreTests.gen.m @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon #import "CoreTests.gen.h" @@ -373,7 +373,7 @@ void HostIntegrationCoreApiSetup(id binaryMessenger, [channel setMessageHandler:nil]; } } - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] initWithName:@"dev.flutter.pigeon.HostIntegrationCoreApi.throwErrorFromVoid" @@ -393,6 +393,26 @@ void HostIntegrationCoreApiSetup(id binaryMessenger, [channel setMessageHandler:nil]; } } + /// Returns a Flutter error, to test error handling. + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError" + binaryMessenger:binaryMessenger + codec:HostIntegrationCoreApiGetCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(throwFlutterErrorWithError:)], + @"HostIntegrationCoreApi api (%@) doesn't respond to " + @"@selector(throwFlutterErrorWithError:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + FlutterError *error; + id output = [api throwFlutterErrorWithError:&error]; + callback(wrapResult(output, error)); + }]; + } else { + [channel setMessageHandler:nil]; + } + } /// Returns passed in int. { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] @@ -1083,6 +1103,27 @@ void HostIntegrationCoreApiSetup(id binaryMessenger, [channel setMessageHandler:nil]; } } + /// Responds with a Flutter error from an async function returning a value. + { + FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] + initWithName:@"dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError" + binaryMessenger:binaryMessenger + codec:HostIntegrationCoreApiGetCodec()]; + if (api) { + NSCAssert([api respondsToSelector:@selector(throwAsyncFlutterErrorWithCompletion:)], + @"HostIntegrationCoreApi api (%@) doesn't respond to " + @"@selector(throwAsyncFlutterErrorWithCompletion:)", + api); + [channel setMessageHandler:^(id _Nullable message, FlutterReply callback) { + [api throwAsyncFlutterErrorWithCompletion:^(id _Nullable output, + FlutterError *_Nullable error) { + callback(wrapResult(output, error)); + }]; + }]; + } else { + [channel setMessageHandler:nil]; + } + } /// Returns the passed object, to test async serialization and deserialization. { FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc] diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart index d47a4aa2775..d4b87aa8a46 100644 --- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart +++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/core_tests.gen.dart @@ -354,7 +354,7 @@ class HostIntegrationCoreApi { } } - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. Future throwErrorFromVoid() async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.HostIntegrationCoreApi.throwErrorFromVoid', codec, @@ -376,6 +376,28 @@ class HostIntegrationCoreApi { } } + /// Returns a Flutter error, to test error handling. + Future throwFlutterError() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError', codec, + binaryMessenger: _binaryMessenger); + final List? replyList = await channel.send(null) as List?; + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else { + return replyList[0]; + } + } + /// Returns passed in int. Future echoInt(int arg_anInt) async { final BasicMessageChannel channel = BasicMessageChannel( @@ -1193,6 +1215,29 @@ class HostIntegrationCoreApi { } } + /// Responds with a Flutter error from an async function returning a value. + Future throwAsyncFlutterError() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError', + codec, + binaryMessenger: _binaryMessenger); + final List? replyList = await channel.send(null) as List?; + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else { + return replyList[0]; + } + } + /// Returns the passed object, to test async serialization and deserialization. Future echoAsyncAllTypes(AllTypes arg_everything) async { final BasicMessageChannel channel = BasicMessageChannel( diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart index ab0a776be46..9af7fc7932e 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/integration_tests.dart @@ -250,10 +250,23 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); expect(() async { - await api.throwAsyncErrorFromVoid(); + await api.throwErrorFromVoid(); }, throwsA(isA())); }); + testWidgets('flutter errors are returned correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + expect( + () => api.throwFlutterError(), + throwsA((dynamic e) => + e is PlatformException && + e.code == 'code' && + e.message == 'message' && + e.details == 'details')); + }); + testWidgets('nested objects can be sent correctly', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); @@ -597,6 +610,20 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) { }, throwsA(isA())); }); + testWidgets( + 'async flutter errors are returned from non void methods correctly', + (WidgetTester _) async { + final HostIntegrationCoreApi api = HostIntegrationCoreApi(); + + expect( + () => api.throwAsyncFlutterError(), + throwsA((dynamic e) => + e is PlatformException && + e.code == 'code' && + e.message == 'message' && + e.details == 'details')); + }); + testWidgets('all datatypes async serialize and deserialize correctly', (WidgetTester _) async { final HostIntegrationCoreApi api = HostIntegrationCoreApi(); diff --git a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart index d47a4aa2775..46dc806edd0 100644 --- a/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart +++ b/packages/pigeon/platform_tests/shared_test_plugin_code/lib/src/generated/core_tests.gen.dart @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), 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, unnecessary_parenthesis, prefer_null_aware_operators, omit_local_variable_types, unused_shown_name, unnecessary_import @@ -354,7 +354,7 @@ class HostIntegrationCoreApi { } } - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. Future throwErrorFromVoid() async { final BasicMessageChannel channel = BasicMessageChannel( 'dev.flutter.pigeon.HostIntegrationCoreApi.throwErrorFromVoid', codec, @@ -376,6 +376,28 @@ class HostIntegrationCoreApi { } } + /// Returns a Flutter error, to test error handling. + Future throwFlutterError() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError', codec, + binaryMessenger: _binaryMessenger); + final List? replyList = await channel.send(null) as List?; + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else { + return replyList[0]; + } + } + /// Returns passed in int. Future echoInt(int arg_anInt) async { final BasicMessageChannel channel = BasicMessageChannel( @@ -1193,6 +1215,29 @@ class HostIntegrationCoreApi { } } + /// Responds with a Flutter error from an async function returning a value. + Future throwAsyncFlutterError() async { + final BasicMessageChannel channel = BasicMessageChannel( + 'dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError', + codec, + binaryMessenger: _binaryMessenger); + final List? replyList = await channel.send(null) as List?; + if (replyList == null) { + throw PlatformException( + code: 'channel-error', + message: 'Unable to establish connection on channel.', + ); + } else if (replyList.length > 1) { + throw PlatformException( + code: replyList[0]! as String, + message: replyList[1] as String?, + details: replyList[2], + ); + } else { + return replyList[0]; + } + } + /// Returns the passed object, to test async serialization and deserialization. Future echoAsyncAllTypes(AllTypes arg_everything) async { final BasicMessageChannel channel = BasicMessageChannel( diff --git a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt index e2f85e1e154..ed0601c57c2 100644 --- a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt +++ b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/CoreTests.gen.kt @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon package com.example.test_plugin @@ -19,14 +19,34 @@ private fun wrapResult(result: Any?): List { return listOf(result) } -private fun wrapError(exception: Throwable): List { - return listOf( - exception.javaClass.simpleName, - exception.toString(), - "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) - ) +private fun wrapError(exception: Throwable): List { + if (exception is FlutterError) { + return listOf( + exception.code, + exception.message, + exception.details + ) + } else { + return listOf( + exception.javaClass.simpleName, + exception.toString(), + "Cause: " + exception.cause + ", Stacktrace: " + Log.getStackTraceString(exception) + ) + } } +/** + * Error class for passing custom error details to Flutter via a thrown PlatformException. + * @property code The error code. + * @property message The error message. + * @property details The error details. Must be a datatype supported by the api codec. + */ +class FlutterError ( + val code: String, + override val message: String? = null, + val details: Any? = null +) : Throwable() + enum class AnEnum(val raw: Int) { ONE(0), TWO(1), @@ -262,8 +282,10 @@ interface HostIntegrationCoreApi { fun echoAllTypes(everything: AllTypes): AllTypes /** Returns an error, to test error handling. */ fun throwError(): Any? - /** Responds with an error from an async void function. */ + /** Returns an error from a void function, to test error handling. */ fun throwErrorFromVoid() + /** Returns a Flutter error, to test error handling. */ + fun throwFlutterError(): Any? /** Returns passed in int. */ fun echoInt(anInt: Long): Long /** Returns passed in double. */ @@ -335,6 +357,8 @@ interface HostIntegrationCoreApi { fun throwAsyncError(callback: (Result) -> Unit) /** Responds with an error from an async void function. */ fun throwAsyncErrorFromVoid(callback: (Result) -> Unit) + /** Responds with a Flutter error from an async function returning a value. */ + fun throwAsyncFlutterError(callback: (Result) -> Unit) /** Returns the passed object, to test async serialization and deserialization. */ fun echoAsyncAllTypes(everything: AllTypes, callback: (Result) -> Unit) /** Returns the passed object, to test serialization and deserialization. */ @@ -391,7 +415,7 @@ interface HostIntegrationCoreApi { try { api.noop() wrapped = listOf(null) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -409,7 +433,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoAllTypes(everythingArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -425,7 +449,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.throwError()) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -442,7 +466,23 @@ interface HostIntegrationCoreApi { try { api.throwErrorFromVoid() wrapped = listOf(null) - } catch (exception: Error) { + } catch (exception: Throwable) { + wrapped = wrapError(exception) + } + reply.reply(wrapped) + } + } else { + channel.setMessageHandler(null) + } + } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + var wrapped: List + try { + wrapped = listOf(api.throwFlutterError()) + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -460,7 +500,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoInt(anIntArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -478,7 +518,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoDouble(aDoubleArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -496,7 +536,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoBool(aBoolArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -514,7 +554,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoString(aStringArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -532,7 +572,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoUint8List(aUint8ListArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -550,7 +590,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoObject(anObjectArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -568,7 +608,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoList(aListArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -586,7 +626,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoMap(aMapArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -604,7 +644,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoAllNullableTypes(everythingArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -622,7 +662,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.extractNestedNullableString(wrapperArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -640,7 +680,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.createNestedNullableString(nullableStringArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -660,7 +700,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.sendMultipleNullableTypes(aNullableBoolArg, aNullableIntArg, aNullableStringArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -678,7 +718,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableInt(aNullableIntArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -696,7 +736,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableDouble(aNullableDoubleArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -714,7 +754,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableBool(aNullableBoolArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -732,7 +772,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableString(aNullableStringArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -750,7 +790,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableUint8List(aNullableUint8ListArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -768,7 +808,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableObject(aNullableObjectArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -786,7 +826,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableList(aNullableListArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -804,7 +844,7 @@ interface HostIntegrationCoreApi { var wrapped: List try { wrapped = listOf(api.echoNullableMap(aNullableMapArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -1025,6 +1065,24 @@ interface HostIntegrationCoreApi { channel.setMessageHandler(null) } } + run { + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError", codec) + if (api != null) { + channel.setMessageHandler { _, reply -> + api.throwAsyncFlutterError() { result: Result -> + val error = result.exceptionOrNull() + if (error != null) { + reply.reply(wrapError(error)) + } else { + val data = result.getOrNull() + reply.reply(wrapResult(data)) + } + } + } + } else { + channel.setMessageHandler(null) + } + } run { val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.HostIntegrationCoreApi.echoAsyncAllTypes", codec) if (api != null) { @@ -1874,7 +1932,7 @@ interface HostTrivialApi { try { api.noop() wrapped = listOf(null) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) diff --git a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt index 944e4163cfc..1c2b68d8b41 100644 --- a/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt +++ b/packages/pigeon/platform_tests/test_plugin/android/src/main/kotlin/com/example/test_plugin/TestPlugin.kt @@ -47,6 +47,10 @@ class TestPlugin: FlutterPlugin, HostIntegrationCoreApi { throw Exception("An error"); } + override fun throwFlutterError(): Any? { + throw FlutterError("code", "message", "details"); + } + override fun echoInt(anInt: Long): Long { return anInt } @@ -134,6 +138,10 @@ class TestPlugin: FlutterPlugin, HostIntegrationCoreApi { callback(Result.failure(Exception("except"))) } + override fun throwAsyncFlutterError(callback: (Result) -> Unit) { + callback(Result.failure(FlutterError("code", "message", "details"))) + } + override fun echoAsyncAllTypes(everything: AllTypes, callback: (Result) -> Unit) { callback(Result.success(everything)) } diff --git a/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift index 18c37bd6d9f..b37d1560435 100644 --- a/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift +++ b/packages/pigeon/platform_tests/test_plugin/ios/Classes/CoreTests.gen.swift @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon import Foundation @@ -281,8 +281,10 @@ protocol HostIntegrationCoreApi { func echo(_ everything: AllTypes) throws -> AllTypes /// Returns an error, to test error handling. func throwError() throws -> Any? - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. func throwErrorFromVoid() throws + /// Returns a Flutter error, to test error handling. + func throwFlutterError() throws -> Any? /// Returns passed in int. func echo(_ anInt: Int64) throws -> Int64 /// Returns passed in double. @@ -348,6 +350,8 @@ protocol HostIntegrationCoreApi { func throwAsyncError(completion: @escaping (Result) -> Void) /// Responds with an error from an async void function. func throwAsyncErrorFromVoid(completion: @escaping (Result) -> Void) + /// Responds with a Flutter error from an async function returning a value. + func throwAsyncFlutterError(completion: @escaping (Result) -> Void) /// Returns the passed object, to test async serialization and deserialization. func echoAsync(_ everything: AllTypes, completion: @escaping (Result) -> Void) /// Returns the passed object, to test serialization and deserialization. @@ -440,7 +444,7 @@ class HostIntegrationCoreApiSetup { } else { throwErrorChannel.setMessageHandler(nil) } - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. let throwErrorFromVoidChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.throwErrorFromVoid", binaryMessenger: binaryMessenger, codec: codec) if let api = api { throwErrorFromVoidChannel.setMessageHandler { _, reply in @@ -454,6 +458,20 @@ class HostIntegrationCoreApiSetup { } else { throwErrorFromVoidChannel.setMessageHandler(nil) } + /// Returns a Flutter error, to test error handling. + let throwFlutterErrorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + throwFlutterErrorChannel.setMessageHandler { _, reply in + do { + let result = try api.throwFlutterError() + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + throwFlutterErrorChannel.setMessageHandler(nil) + } /// Returns passed in int. let echoIntChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoInt", binaryMessenger: binaryMessenger, codec: codec) if let api = api { @@ -971,6 +989,22 @@ class HostIntegrationCoreApiSetup { } else { throwAsyncErrorFromVoidChannel.setMessageHandler(nil) } + /// Responds with a Flutter error from an async function returning a value. + let throwAsyncFlutterErrorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + throwAsyncFlutterErrorChannel.setMessageHandler { _, reply in + api.throwAsyncFlutterError() { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + throwAsyncFlutterErrorChannel.setMessageHandler(nil) + } /// Returns the passed object, to test async serialization and deserialization. let echoAsyncAllTypesChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoAsyncAllTypes", binaryMessenger: binaryMessenger, codec: codec) if let api = api { diff --git a/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift b/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift index ed05f94dc17..36ecbfd4328 100644 --- a/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift +++ b/packages/pigeon/platform_tests/test_plugin/ios/Classes/TestPlugin.swift @@ -45,6 +45,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi { throw FlutterError(code: "code", message: "message", details: "details") } + func throwFlutterError() throws -> Any? { + throw FlutterError(code: "code", message: "message", details: "details") + } + func echo(_ anInt: Int64) -> Int64 { return anInt } @@ -134,6 +138,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi { completion(.failure(FlutterError(code: "code", message: "message", details: "details"))) } + func throwAsyncFlutterError(completion: @escaping (Result) -> Void) { + completion(.failure(FlutterError(code: "code", message: "message", details: "details"))) + } + func echoAsync(_ everything: AllTypes, completion: @escaping (Result) -> Void) { completion(.success(everything)) } diff --git a/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift b/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift index 18c37bd6d9f..b37d1560435 100644 --- a/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift +++ b/packages/pigeon/platform_tests/test_plugin/macos/Classes/CoreTests.gen.swift @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon import Foundation @@ -281,8 +281,10 @@ protocol HostIntegrationCoreApi { func echo(_ everything: AllTypes) throws -> AllTypes /// Returns an error, to test error handling. func throwError() throws -> Any? - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. func throwErrorFromVoid() throws + /// Returns a Flutter error, to test error handling. + func throwFlutterError() throws -> Any? /// Returns passed in int. func echo(_ anInt: Int64) throws -> Int64 /// Returns passed in double. @@ -348,6 +350,8 @@ protocol HostIntegrationCoreApi { func throwAsyncError(completion: @escaping (Result) -> Void) /// Responds with an error from an async void function. func throwAsyncErrorFromVoid(completion: @escaping (Result) -> Void) + /// Responds with a Flutter error from an async function returning a value. + func throwAsyncFlutterError(completion: @escaping (Result) -> Void) /// Returns the passed object, to test async serialization and deserialization. func echoAsync(_ everything: AllTypes, completion: @escaping (Result) -> Void) /// Returns the passed object, to test serialization and deserialization. @@ -440,7 +444,7 @@ class HostIntegrationCoreApiSetup { } else { throwErrorChannel.setMessageHandler(nil) } - /// Responds with an error from an async void function. + /// Returns an error from a void function, to test error handling. let throwErrorFromVoidChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.throwErrorFromVoid", binaryMessenger: binaryMessenger, codec: codec) if let api = api { throwErrorFromVoidChannel.setMessageHandler { _, reply in @@ -454,6 +458,20 @@ class HostIntegrationCoreApiSetup { } else { throwErrorFromVoidChannel.setMessageHandler(nil) } + /// Returns a Flutter error, to test error handling. + let throwFlutterErrorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + throwFlutterErrorChannel.setMessageHandler { _, reply in + do { + let result = try api.throwFlutterError() + reply(wrapResult(result)) + } catch { + reply(wrapError(error)) + } + } + } else { + throwFlutterErrorChannel.setMessageHandler(nil) + } /// Returns passed in int. let echoIntChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoInt", binaryMessenger: binaryMessenger, codec: codec) if let api = api { @@ -971,6 +989,22 @@ class HostIntegrationCoreApiSetup { } else { throwAsyncErrorFromVoidChannel.setMessageHandler(nil) } + /// Responds with a Flutter error from an async function returning a value. + let throwAsyncFlutterErrorChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError", binaryMessenger: binaryMessenger, codec: codec) + if let api = api { + throwAsyncFlutterErrorChannel.setMessageHandler { _, reply in + api.throwAsyncFlutterError() { result in + switch result { + case .success(let res): + reply(wrapResult(res)) + case .failure(let error): + reply(wrapError(error)) + } + } + } + } else { + throwAsyncFlutterErrorChannel.setMessageHandler(nil) + } /// Returns the passed object, to test async serialization and deserialization. let echoAsyncAllTypesChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoAsyncAllTypes", binaryMessenger: binaryMessenger, codec: codec) if let api = api { diff --git a/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift b/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift index fa2c6b470cd..04bda07e95f 100644 --- a/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift +++ b/packages/pigeon/platform_tests/test_plugin/macos/Classes/TestPlugin.swift @@ -44,6 +44,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi { throw FlutterError(code: "code", message: "message", details: "details") } + func throwFlutterError() throws -> Any? { + throw FlutterError(code: "code", message: "message", details: "details") + } + func echo(_ anInt: Int64) -> Int64 { return anInt } @@ -133,6 +137,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi { completion(.failure(FlutterError(code: "code", message: "message", details: "details"))) } + func throwAsyncFlutterError(completion: @escaping (Result) -> Void) { + completion(.failure(FlutterError(code: "code", message: "message", details: "details"))) + } + func echoAsync(_ everything: AllTypes, completion: @escaping (Result) -> Void) { completion(.success(everything)) } diff --git a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp index e6ee7d6e552..9f1defc54bc 100644 --- a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp +++ b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.cpp @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon #undef _HAS_EXCEPTIONS @@ -721,6 +721,39 @@ void HostIntegrationCoreApi::SetUp(flutter::BinaryMessenger* binary_messenger, channel->SetMessageHandler(nullptr); } } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.HostIntegrationCoreApi.throwFlutterError", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + ErrorOr> output = + api->ThrowFlutterError(); + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + auto output_optional = std::move(output).TakeValue(); + if (output_optional) { + wrapped.push_back( + EncodableValue(std::move(output_optional).value())); + } else { + wrapped.push_back(EncodableValue()); + } + reply(EncodableValue(std::move(wrapped))); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } { auto channel = std::make_unique>( binary_messenger, "dev.flutter.pigeon.HostIntegrationCoreApi.echoInt", @@ -1820,6 +1853,40 @@ void HostIntegrationCoreApi::SetUp(flutter::BinaryMessenger* binary_messenger, channel->SetMessageHandler(nullptr); } } + { + auto channel = std::make_unique>( + binary_messenger, + "dev.flutter.pigeon.HostIntegrationCoreApi.throwAsyncFlutterError", + &GetCodec()); + if (api != nullptr) { + channel->SetMessageHandler( + [api](const EncodableValue& message, + const flutter::MessageReply& reply) { + try { + api->ThrowAsyncFlutterError( + [reply](ErrorOr>&& output) { + if (output.has_error()) { + reply(WrapError(output.error())); + return; + } + EncodableList wrapped; + auto output_optional = std::move(output).TakeValue(); + if (output_optional) { + wrapped.push_back( + EncodableValue(std::move(output_optional).value())); + } else { + wrapped.push_back(EncodableValue()); + } + reply(EncodableValue(std::move(wrapped))); + }); + } catch (const std::exception& exception) { + reply(WrapError(exception.what())); + } + }); + } else { + channel->SetMessageHandler(nullptr); + } + } { auto channel = std::make_unique>( binary_messenger, @@ -2934,8 +3001,8 @@ EncodableValue HostIntegrationCoreApi::WrapError( EncodableValue("Error"), EncodableValue()}); } EncodableValue HostIntegrationCoreApi::WrapError(const FlutterError& error) { - return EncodableValue(EncodableList{EncodableValue(error.message()), - EncodableValue(error.code()), + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), error.details()}); } @@ -3516,8 +3583,8 @@ EncodableValue HostTrivialApi::WrapError(std::string_view error_message) { EncodableValue("Error"), EncodableValue()}); } EncodableValue HostTrivialApi::WrapError(const FlutterError& error) { - return EncodableValue(EncodableList{EncodableValue(error.message()), - EncodableValue(error.code()), + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), error.details()}); } @@ -3599,8 +3666,8 @@ EncodableValue HostSmallApi::WrapError(std::string_view error_message) { EncodableValue("Error"), EncodableValue()}); } EncodableValue HostSmallApi::WrapError(const FlutterError& error) { - return EncodableValue(EncodableList{EncodableValue(error.message()), - EncodableValue(error.code()), + return EncodableValue(EncodableList{EncodableValue(error.code()), + EncodableValue(error.message()), error.details()}); } diff --git a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h index e0892848511..bfc3e18cb49 100644 --- a/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h +++ b/packages/pigeon/platform_tests/test_plugin/windows/pigeon/core_tests.gen.h @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // -// Autogenerated from Pigeon (v9.0.7), do not edit directly. +// Autogenerated from Pigeon (v9.1.0), do not edit directly. // See also: https://pub.dev/packages/pigeon #ifndef PIGEON_CORE_TESTS_GEN_H_ @@ -320,8 +320,11 @@ class HostIntegrationCoreApi { virtual ErrorOr EchoAllTypes(const AllTypes& everything) = 0; // Returns an error, to test error handling. virtual ErrorOr> ThrowError() = 0; - // Responds with an error from an async void function. + // Returns an error from a void function, to test error handling. virtual std::optional ThrowErrorFromVoid() = 0; + // Returns a Flutter error, to test error handling. + virtual ErrorOr> + ThrowFlutterError() = 0; // Returns passed in int. virtual ErrorOr EchoInt(int64_t an_int) = 0; // Returns passed in double. @@ -423,6 +426,10 @@ class HostIntegrationCoreApi { // Responds with an error from an async void function. virtual void ThrowAsyncErrorFromVoid( std::function reply)> result) = 0; + // Responds with a Flutter error from an async function returning a value. + virtual void ThrowAsyncFlutterError( + std::function> reply)> + result) = 0; // Returns the passed object, to test async serialization and deserialization. virtual void EchoAsyncAllTypes( const AllTypes& everything, diff --git a/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.cpp b/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.cpp index ebb9977abfa..f84d5069cc9 100644 --- a/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.cpp +++ b/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.cpp @@ -65,6 +65,11 @@ std::optional TestPlugin::ThrowErrorFromVoid() { return FlutterError("An error"); } +ErrorOr> +TestPlugin::ThrowFlutterError() { + return FlutterError("code", "message", EncodableValue("details")); +} + ErrorOr TestPlugin::EchoInt(int64_t an_int) { return an_int; } ErrorOr TestPlugin::EchoDouble(double a_double) { return a_double; } @@ -212,6 +217,11 @@ void TestPlugin::ThrowAsyncErrorFromVoid( result(FlutterError("code", "message", EncodableValue("details"))); } +void TestPlugin::ThrowAsyncFlutterError( + std::function> reply)> result) { + result(FlutterError("code", "message", EncodableValue("details"))); +} + void TestPlugin::EchoAsyncAllTypes( const AllTypes& everything, std::function reply)> result) { diff --git a/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.h b/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.h index 6212ca3e4ea..c65931d91c7 100644 --- a/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.h +++ b/packages/pigeon/platform_tests/test_plugin/windows/test_plugin.h @@ -43,6 +43,8 @@ class TestPlugin : public flutter::Plugin, ThrowError() override; std::optional ThrowErrorFromVoid() override; + core_tests_pigeontest::ErrorOr> + ThrowFlutterError() override; core_tests_pigeontest::ErrorOr EchoInt(int64_t an_int) override; core_tests_pigeontest::ErrorOr EchoDouble(double a_double) override; core_tests_pigeontest::ErrorOr EchoBool(bool a_bool) override; @@ -94,6 +96,11 @@ class TestPlugin : public flutter::Plugin, std::function< void(std::optional reply)> result) override; + void ThrowAsyncFlutterError( + std::function> + reply)> + result) override; void EchoAsyncAllTypes( const core_tests_pigeontest::AllTypes& everything, std::function< diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml index 7daf05ae4be..366b2186ea0 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/main/packages/pigeon issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3Apigeon -version: 9.0.7 # This must match the version in lib/generator_tools.dart +version: 9.1.0 # This must match the version in lib/generator_tools.dart environment: sdk: ">=2.17.0 <3.0.0" diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart index 11c95a4d1f5..9c4a0abc4d9 100644 --- a/packages/pigeon/test/java_generator_test.dart +++ b/packages/pigeon/test/java_generator_test.dart @@ -1336,4 +1336,25 @@ void main() { final String code = sink.toString(); expect(code, contains(' extends StandardMessageCodec')); }); + + test('creates api error class for custom errors', () { + final Api api = + Api(name: 'Api', location: ApiLocation.host, methods: []); + final Root root = Root( + apis: [api], + classes: [], + enums: [], + ); + final StringBuffer sink = StringBuffer(); + const JavaOptions javaOptions = JavaOptions(className: 'Messages'); + const JavaGenerator generator = JavaGenerator(); + generator.generate(javaOptions, root, sink); + final String code = sink.toString(); + expect(code, contains('class FlutterError')); + expect(code, contains('if (exception instanceof FlutterError)')); + expect(code, contains('FlutterError error = (FlutterError) exception;')); + expect(code, contains('errorList.add(error.code);')); + expect(code, contains('errorList.add(error.getMessage());')); + expect(code, contains('errorList.add(error.details);')); + }); } diff --git a/packages/pigeon/test/kotlin_generator_test.dart b/packages/pigeon/test/kotlin_generator_test.dart index dba6921f953..5acb4c64e91 100644 --- a/packages/pigeon/test/kotlin_generator_test.dart +++ b/packages/pigeon/test/kotlin_generator_test.dart @@ -190,7 +190,7 @@ void main() { var wrapped: List try { wrapped = listOf(api.doSomething(inputArg)) - } catch (exception: Error) { + } catch (exception: Throwable) { wrapped = wrapError(exception) } reply.reply(wrapped) @@ -1329,4 +1329,29 @@ void main() { final String code = sink.toString(); expect(code, contains(' : StandardMessageCodec() ')); }); + + test('creates api error class for custom errors', () { + final Method method = Method( + name: 'doSomething', + returnType: const TypeDeclaration.voidDeclaration(), + arguments: []); + final Api api = Api( + name: 'SomeApi', location: ApiLocation.host, methods: [method]); + final Root root = Root( + apis: [api], + classes: [], + enums: [], + ); + final StringBuffer sink = StringBuffer(); + const KotlinOptions kotlinOptions = + KotlinOptions(errorClassName: 'SomeError'); + const KotlinGenerator generator = KotlinGenerator(); + generator.generate(kotlinOptions, root, sink); + final String code = sink.toString(); + expect(code, contains('class SomeError')); + expect(code, contains('if (exception is SomeError)')); + expect(code, contains('exception.code,')); + expect(code, contains('exception.message,')); + expect(code, contains('exception.details')); + }); } diff --git a/packages/pigeon/tool/shared/generation.dart b/packages/pigeon/tool/shared/generation.dart index bc5674bf17b..1e78ece9be1 100644 --- a/packages/pigeon/tool/shared/generation.dart +++ b/packages/pigeon/tool/shared/generation.dart @@ -79,6 +79,8 @@ Future generatePigeons({required String baseDir}) async { ? null : '$outputBase/android/src/main/kotlin/com/example/test_plugin/$pascalCaseName.gen.kt', kotlinPackage: 'com.example.test_plugin', + kotlinErrorClassName: + input == 'core_tests' ? null : '${pascalCaseName}Error', // iOS swiftOut: skipLanguages.contains(GeneratorLanguages.swift) ? null @@ -139,6 +141,7 @@ Future runPigeon({ required String input, String? kotlinOut, String? kotlinPackage, + String? kotlinErrorClassName, String? swiftOut, String? cppHeaderOut, String? cppSourceOut, @@ -162,7 +165,8 @@ Future runPigeon({ javaOut: javaOut, javaOptions: JavaOptions(package: javaPackage), kotlinOut: kotlinOut, - kotlinOptions: KotlinOptions(package: kotlinPackage), + kotlinOptions: KotlinOptions( + package: kotlinPackage, errorClassName: kotlinErrorClassName), objcHeaderOut: objcHeaderOut, objcSourceOut: objcSourceOut, objcOptions: const ObjcOptions(),