mirror of
https://github.com/flutter/packages.git
synced 2025-07-01 15:23:25 +08:00
[pigeon] Fix Object arguments in Swift and C++ (#3020)
Fixes a warning in generated Swift output when an argument is of type Object. This is blocking flutter/plugins#6914 since we check our macOS and iOS plugin code for warnings in CI. Rather than add a Dart generator unit test for this one specific case, I tightened the Swift compilation settings for our test plugin to treat warnings as errors (per flutter/flutter#59116 (comment)) to catch the entire class of errors, and added echo* variants for Object to make sure this one then showed up. Incidental fixes: I had to make a similar fix to the Dart generator for a similar warning with casting to Object?, which we'd never noticed because we weren't analyzing any generated code that returning Object or Object? before. I had to make a change to the C++ generator so that generation would succeed, because it turned out we had no handling at all of Object in the C++ generator, causing it to throw. I'm not sure this is the output I'll keep for C++ (thus the TODO), but it's the simple fix to make it work at all. Fixes flutter/flutter#117994 Part of flutter/flutter#59116
This commit is contained in:
@ -1,3 +1,9 @@
|
||||
## 4.2.16
|
||||
|
||||
* [swift] Fixes warnings with `Object` parameters.
|
||||
* [dart] Fixes warnings with `Object` return values.
|
||||
* [c++] Generation of APIs that use `Object` no longer fails.
|
||||
|
||||
## 4.2.15
|
||||
|
||||
* Relocates generator classes. (Reverted)
|
||||
|
@ -547,6 +547,11 @@ const flutter::StandardMessageCodec& ${api.name}::GetCodec() {
|
||||
// ... then declare the arg as a reference to that local.
|
||||
indent.writeln(
|
||||
'const auto* $argName = $encodableArgName.IsNull() ? nullptr : &$valueVarName;');
|
||||
} else if (hostType.datatype == 'flutter::EncodableValue') {
|
||||
// Generic objects just pass the EncodableValue through
|
||||
// directly.
|
||||
indent.writeln(
|
||||
'const auto* $argName = &$encodableArgName;');
|
||||
} else if (hostType.isBuiltin) {
|
||||
indent.writeln(
|
||||
'const auto* $argName = std::get_if<${hostType.datatype}>(&$encodableArgName);');
|
||||
@ -564,6 +569,13 @@ const flutter::StandardMessageCodec& ${api.name}::GetCodec() {
|
||||
// requires an int64_t so that it can handle any case.
|
||||
indent.writeln(
|
||||
'const int64_t $argName = $encodableArgName.LongValue();');
|
||||
} else if (hostType.datatype == 'flutter::EncodableValue') {
|
||||
// Generic objects just pass the EncodableValue through
|
||||
// directly. This creates an alias just to avoid having to
|
||||
// special-case the argName/encodableArgName distinction
|
||||
// at a higher level.
|
||||
indent
|
||||
.writeln('const auto& $argName = $encodableArgName;');
|
||||
} else if (hostType.isBuiltin) {
|
||||
indent.writeln(
|
||||
'const auto& $argName = std::get<${hostType.datatype}>($encodableArgName);');
|
||||
@ -902,6 +914,7 @@ String? _baseCppTypeForBuiltinDartType(TypeDeclaration type) {
|
||||
'Float64List': 'std::vector<double>',
|
||||
'Map': 'flutter::EncodableMap',
|
||||
'List': 'flutter::EncodableList',
|
||||
'Object': 'flutter::EncodableValue',
|
||||
};
|
||||
if (cppTypeForDartTypeMap.containsKey(type.baseName)) {
|
||||
return cppTypeForDartTypeMap[type.baseName];
|
||||
@ -931,6 +944,8 @@ String _unownedArgumentType(HostDatatype type) {
|
||||
if (isString || _isPodType(type)) {
|
||||
return type.isNullable ? 'const $baseType*' : baseType;
|
||||
}
|
||||
// TODO(stuartmorgan): Consider special-casing `Object?` here, so that there
|
||||
// aren't two ways of representing null (nullptr or an isNull EncodableValue).
|
||||
return type.isNullable ? 'const $baseType*' : 'const $baseType&';
|
||||
}
|
||||
|
||||
|
@ -230,13 +230,17 @@ final BinaryMessenger? _binaryMessenger;
|
||||
indent.writeln('binaryMessenger: _binaryMessenger);');
|
||||
});
|
||||
final String returnType = _makeGenericTypeArguments(func.returnType);
|
||||
final String castCall = _makeGenericCastCall(func.returnType);
|
||||
final String genericCastCall = _makeGenericCastCall(func.returnType);
|
||||
const String accessor = 'replyList[0]';
|
||||
final String nullHandler =
|
||||
func.returnType.isNullable ? (castCall.isEmpty ? '' : '?') : '!';
|
||||
// Avoid warnings from pointlessly casting to `Object?`.
|
||||
final String nullablyTypedAccessor =
|
||||
returnType == 'Object' ? accessor : '($accessor as $returnType?)';
|
||||
final String nullHandler = func.returnType.isNullable
|
||||
? (genericCastCall.isEmpty ? '' : '?')
|
||||
: '!';
|
||||
final String returnStatement = func.returnType.isVoid
|
||||
? 'return;'
|
||||
: 'return ($accessor as $returnType?)$nullHandler$castCall;';
|
||||
: 'return $nullablyTypedAccessor$nullHandler$genericCastCall;';
|
||||
indent.format('''
|
||||
final List<Object?>? replyList =
|
||||
\t\tawait channel.send($sendArgument) as List<Object?>?;
|
||||
|
@ -9,7 +9,7 @@ import 'dart:mirrors';
|
||||
import 'ast.dart';
|
||||
|
||||
/// The current version of pigeon. This must match the version in pubspec.yaml.
|
||||
const String pigeonVersion = '4.2.15';
|
||||
const String pigeonVersion = '4.2.16';
|
||||
|
||||
/// Read all the content from [stdin] to a String.
|
||||
String readStdin() {
|
||||
|
@ -365,6 +365,9 @@ String _castForceUnwrap(String value, TypeDeclaration type, Root root) {
|
||||
final String nullableConditionPrefix =
|
||||
type.isNullable ? '$value == nil ? nil : ' : '';
|
||||
return '$nullableConditionPrefix${_swiftTypeForDartType(type)}(rawValue: $value as! Int)$forceUnwrap';
|
||||
} else if (type.baseName == 'Object') {
|
||||
// Special-cased to avoid warnings about using 'as' with Any.
|
||||
return type.isNullable ? value : '$value!';
|
||||
} else {
|
||||
final String castUnwrap = type.isNullable ? '?' : '!';
|
||||
return '$value as$castUnwrap ${_swiftTypeForDartType(type)}';
|
||||
|
@ -125,6 +125,10 @@ abstract class HostIntegrationCoreApi {
|
||||
@ObjCSelector('echoUint8List:')
|
||||
Uint8List echoUint8List(Uint8List aUint8List);
|
||||
|
||||
/// Returns the passed in generic Object.
|
||||
@ObjCSelector('echoObject:')
|
||||
Object echoObject(Object anObject);
|
||||
|
||||
// ========== Syncronous nullable method tests ==========
|
||||
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
@ -162,6 +166,10 @@ abstract class HostIntegrationCoreApi {
|
||||
@ObjCSelector('echoNullableUint8List:')
|
||||
Uint8List? echoNullableUint8List(Uint8List? aNullableUint8List);
|
||||
|
||||
/// Returns the passed in generic Object.
|
||||
@ObjCSelector('echoNullableObject:')
|
||||
Object? echoNullableObject(Object? aNullableObject);
|
||||
|
||||
// ========== Asyncronous method tests ==========
|
||||
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
|
@ -72,6 +72,11 @@ public class AlternateLanguageTestPlugin implements FlutterPlugin, HostIntegrati
|
||||
return aUint8List;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @NonNull Object echoObject(@NonNull Object anObject) {
|
||||
return anObject;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable String extractNestedNullableString(@NonNull AllNullableTypesWrapper wrapper) {
|
||||
return wrapper.getValues().getANullableString();
|
||||
@ -124,6 +129,11 @@ public class AlternateLanguageTestPlugin implements FlutterPlugin, HostIntegrati
|
||||
return aNullableUint8List;
|
||||
}
|
||||
|
||||
@Override
|
||||
public @Nullable Object echoNullableObject(@Nullable Object aNullableObject) {
|
||||
return aNullableObject;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void noopAsync(Result<Void> result) {
|
||||
result.success(null);
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
|
||||
package com.example.alternate_language_test_plugin;
|
||||
@ -713,12 +713,9 @@ public class CoreTests {
|
||||
return AllNullableTypes.fromList((ArrayList<Object>) readValue(buffer));
|
||||
|
||||
case (byte) 129:
|
||||
return AllNullableTypes.fromList((ArrayList<Object>) readValue(buffer));
|
||||
|
||||
case (byte) 130:
|
||||
return AllNullableTypesWrapper.fromList((ArrayList<Object>) readValue(buffer));
|
||||
|
||||
case (byte) 131:
|
||||
case (byte) 130:
|
||||
return AllTypes.fromList((ArrayList<Object>) readValue(buffer));
|
||||
|
||||
default:
|
||||
@ -731,14 +728,11 @@ public class CoreTests {
|
||||
if (value instanceof AllNullableTypes) {
|
||||
stream.write(128);
|
||||
writeValue(stream, ((AllNullableTypes) value).toList());
|
||||
} else if (value instanceof AllNullableTypes) {
|
||||
stream.write(129);
|
||||
writeValue(stream, ((AllNullableTypes) value).toList());
|
||||
} else if (value instanceof AllNullableTypesWrapper) {
|
||||
stream.write(130);
|
||||
stream.write(129);
|
||||
writeValue(stream, ((AllNullableTypesWrapper) value).toList());
|
||||
} else if (value instanceof AllTypes) {
|
||||
stream.write(131);
|
||||
stream.write(130);
|
||||
writeValue(stream, ((AllTypes) value).toList());
|
||||
} else {
|
||||
super.writeValue(stream, value);
|
||||
@ -780,6 +774,9 @@ public class CoreTests {
|
||||
/** Returns the passed in Uint8List. */
|
||||
@NonNull
|
||||
byte[] echoUint8List(@NonNull byte[] aUint8List);
|
||||
/** Returns the passed in generic Object. */
|
||||
@NonNull
|
||||
Object echoObject(@NonNull Object anObject);
|
||||
/**
|
||||
* Returns the inner `aString` value from the wrapped object, to test sending of nested objects.
|
||||
*/
|
||||
@ -811,6 +808,9 @@ public class CoreTests {
|
||||
/** Returns the passed in Uint8List. */
|
||||
@Nullable
|
||||
byte[] echoNullableUint8List(@Nullable byte[] aNullableUint8List);
|
||||
/** Returns the passed in generic Object. */
|
||||
@Nullable
|
||||
Object echoNullableObject(@Nullable Object aNullableObject);
|
||||
/**
|
||||
* A no-op function taking no arguments and returning no value, to sanity test basic
|
||||
* asynchronous calling.
|
||||
@ -1072,6 +1072,35 @@ public class CoreTests {
|
||||
channel.setMessageHandler(null);
|
||||
}
|
||||
}
|
||||
{
|
||||
BasicMessageChannel<Object> channel =
|
||||
new BasicMessageChannel<>(
|
||||
binaryMessenger,
|
||||
"dev.flutter.pigeon.HostIntegrationCoreApi.echoObject",
|
||||
getCodec());
|
||||
if (api != null) {
|
||||
channel.setMessageHandler(
|
||||
(message, reply) -> {
|
||||
ArrayList wrapped = new ArrayList<>();
|
||||
try {
|
||||
ArrayList<Object> args = (ArrayList<Object>) 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) {
|
||||
ArrayList<Object> wrappedError = wrapError(exception);
|
||||
wrapped = wrappedError;
|
||||
}
|
||||
reply.reply(wrapped);
|
||||
});
|
||||
} else {
|
||||
channel.setMessageHandler(null);
|
||||
}
|
||||
}
|
||||
{
|
||||
BasicMessageChannel<Object> channel =
|
||||
new BasicMessageChannel<>(
|
||||
@ -1292,6 +1321,32 @@ public class CoreTests {
|
||||
channel.setMessageHandler(null);
|
||||
}
|
||||
}
|
||||
{
|
||||
BasicMessageChannel<Object> channel =
|
||||
new BasicMessageChannel<>(
|
||||
binaryMessenger,
|
||||
"dev.flutter.pigeon.HostIntegrationCoreApi.echoNullableObject",
|
||||
getCodec());
|
||||
if (api != null) {
|
||||
channel.setMessageHandler(
|
||||
(message, reply) -> {
|
||||
ArrayList wrapped = new ArrayList<>();
|
||||
try {
|
||||
ArrayList<Object> args = (ArrayList<Object>) message;
|
||||
assert args != null;
|
||||
Object aNullableObjectArg = args.get(0);
|
||||
Object output = api.echoNullableObject(aNullableObjectArg);
|
||||
wrapped.add(0, output);
|
||||
} catch (Error | RuntimeException exception) {
|
||||
ArrayList<Object> wrappedError = wrapError(exception);
|
||||
wrapped = wrappedError;
|
||||
}
|
||||
reply.reply(wrapped);
|
||||
});
|
||||
} else {
|
||||
channel.setMessageHandler(null);
|
||||
}
|
||||
}
|
||||
{
|
||||
BasicMessageChannel<Object> channel =
|
||||
new BasicMessageChannel<>(
|
||||
|
@ -63,6 +63,10 @@
|
||||
return aUint8List;
|
||||
}
|
||||
|
||||
- (nullable id)echoObject:(id)anObject error:(FlutterError *_Nullable *_Nonnull)error {
|
||||
return anObject;
|
||||
}
|
||||
|
||||
- (nullable NSString *)extractNestedNullableStringFrom:(AllNullableTypesWrapper *)wrapper
|
||||
error:(FlutterError *_Nullable *_Nonnull)error {
|
||||
return wrapper.values.aNullableString;
|
||||
@ -114,6 +118,11 @@
|
||||
return aNullableUint8List;
|
||||
}
|
||||
|
||||
- (nullable id)echoNullableObject:(nullable id)aNullableObject
|
||||
error:(FlutterError *_Nullable *_Nonnull)error {
|
||||
return aNullableObject;
|
||||
}
|
||||
|
||||
- (void)noopAsyncWithCompletion:(void (^)(FlutterError *_Nullable))completion {
|
||||
completion(nil);
|
||||
}
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
#import <Foundation/Foundation.h>
|
||||
@protocol FlutterBinaryMessenger;
|
||||
@ -131,6 +131,10 @@ NSObject<FlutterMessageCodec> *HostIntegrationCoreApiGetCodec(void);
|
||||
/// @return `nil` only when `error != nil`.
|
||||
- (nullable FlutterStandardTypedData *)echoUint8List:(FlutterStandardTypedData *)aUint8List
|
||||
error:(FlutterError *_Nullable *_Nonnull)error;
|
||||
/// Returns the passed in generic Object.
|
||||
///
|
||||
/// @return `nil` only when `error != nil`.
|
||||
- (nullable id)echoObject:(id)anObject error:(FlutterError *_Nullable *_Nonnull)error;
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
/// sending of nested objects.
|
||||
- (nullable NSString *)extractNestedNullableStringFrom:(AllNullableTypesWrapper *)wrapper
|
||||
@ -166,6 +170,9 @@ NSObject<FlutterMessageCodec> *HostIntegrationCoreApiGetCodec(void);
|
||||
- (nullable FlutterStandardTypedData *)
|
||||
echoNullableUint8List:(nullable FlutterStandardTypedData *)aNullableUint8List
|
||||
error:(FlutterError *_Nullable *_Nonnull)error;
|
||||
/// Returns the passed in generic Object.
|
||||
- (nullable id)echoNullableObject:(nullable id)aNullableObject
|
||||
error:(FlutterError *_Nullable *_Nonnull)error;
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
/// test basic asynchronous calling.
|
||||
- (void)noopAsyncWithCompletion:(void (^)(FlutterError *_Nullable))completion;
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
#import "CoreTests.gen.h"
|
||||
#import <Flutter/Flutter.h>
|
||||
@ -220,12 +220,9 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
|
||||
return [AllNullableTypes fromList:[self readValue]];
|
||||
|
||||
case 129:
|
||||
return [AllNullableTypes fromList:[self readValue]];
|
||||
|
||||
case 130:
|
||||
return [AllNullableTypesWrapper fromList:[self readValue]];
|
||||
|
||||
case 131:
|
||||
case 130:
|
||||
return [AllTypes fromList:[self readValue]];
|
||||
|
||||
default:
|
||||
@ -241,14 +238,11 @@ static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
|
||||
if ([value isKindOfClass:[AllNullableTypes class]]) {
|
||||
[self writeByte:128];
|
||||
[self writeValue:[value toList]];
|
||||
} else if ([value isKindOfClass:[AllNullableTypes class]]) {
|
||||
} else if ([value isKindOfClass:[AllNullableTypesWrapper class]]) {
|
||||
[self writeByte:129];
|
||||
[self writeValue:[value toList]];
|
||||
} else if ([value isKindOfClass:[AllNullableTypesWrapper class]]) {
|
||||
[self writeByte:130];
|
||||
[self writeValue:[value toList]];
|
||||
} else if ([value isKindOfClass:[AllTypes class]]) {
|
||||
[self writeByte:131];
|
||||
[self writeByte:130];
|
||||
[self writeValue:[value toList]];
|
||||
} else {
|
||||
[super writeValue:value];
|
||||
@ -470,6 +464,27 @@ void HostIntegrationCoreApiSetup(id<FlutterBinaryMessenger> binaryMessenger,
|
||||
[channel setMessageHandler:nil];
|
||||
}
|
||||
}
|
||||
/// Returns the passed in generic Object.
|
||||
{
|
||||
FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc]
|
||||
initWithName:@"dev.flutter.pigeon.HostIntegrationCoreApi.echoObject"
|
||||
binaryMessenger:binaryMessenger
|
||||
codec:HostIntegrationCoreApiGetCodec()];
|
||||
if (api) {
|
||||
NSCAssert([api respondsToSelector:@selector(echoObject:error:)],
|
||||
@"HostIntegrationCoreApi api (%@) doesn't respond to @selector(echoObject:error:)",
|
||||
api);
|
||||
[channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
|
||||
NSArray *args = message;
|
||||
id arg_anObject = GetNullableObjectAtIndex(args, 0);
|
||||
FlutterError *error;
|
||||
id output = [api echoObject:arg_anObject error:&error];
|
||||
callback(wrapResult(output, error));
|
||||
}];
|
||||
} else {
|
||||
[channel setMessageHandler:nil];
|
||||
}
|
||||
}
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
/// sending of nested objects.
|
||||
{
|
||||
@ -656,6 +671,28 @@ void HostIntegrationCoreApiSetup(id<FlutterBinaryMessenger> binaryMessenger,
|
||||
[channel setMessageHandler:nil];
|
||||
}
|
||||
}
|
||||
/// Returns the passed in generic Object.
|
||||
{
|
||||
FlutterBasicMessageChannel *channel = [[FlutterBasicMessageChannel alloc]
|
||||
initWithName:@"dev.flutter.pigeon.HostIntegrationCoreApi.echoNullableObject"
|
||||
binaryMessenger:binaryMessenger
|
||||
codec:HostIntegrationCoreApiGetCodec()];
|
||||
if (api) {
|
||||
NSCAssert([api respondsToSelector:@selector(echoNullableObject:error:)],
|
||||
@"HostIntegrationCoreApi api (%@) doesn't respond to "
|
||||
@"@selector(echoNullableObject:error:)",
|
||||
api);
|
||||
[channel setMessageHandler:^(id _Nullable message, FlutterReply callback) {
|
||||
NSArray *args = message;
|
||||
id arg_aNullableObject = GetNullableObjectAtIndex(args, 0);
|
||||
FlutterError *error;
|
||||
id output = [api echoNullableObject:arg_aNullableObject error:&error];
|
||||
callback(wrapResult(output, error));
|
||||
}];
|
||||
} else {
|
||||
[channel setMessageHandler:nil];
|
||||
}
|
||||
}
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
/// test basic asynchronous calling.
|
||||
{
|
||||
|
@ -351,6 +351,19 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) {
|
||||
expect(receivedUint8List, sentUint8List);
|
||||
});
|
||||
|
||||
testWidgets('generic Objects serialize and deserialize correctly',
|
||||
(WidgetTester _) async {
|
||||
final HostIntegrationCoreApi api = HostIntegrationCoreApi();
|
||||
const Object sentString = "I'm a computer";
|
||||
final Object receivedString = await api.echoObject(sentString);
|
||||
expect(receivedString, sentString);
|
||||
|
||||
// Echo a second type as well to ensure the handling is generic.
|
||||
const Object sentInt = 42;
|
||||
final Object receivedInt = await api.echoObject(sentInt);
|
||||
expect(receivedInt, sentInt);
|
||||
});
|
||||
|
||||
testWidgets('Nullable Ints serialize and deserialize correctly',
|
||||
(WidgetTester _) async {
|
||||
final HostIntegrationCoreApi api = HostIntegrationCoreApi();
|
||||
@ -449,6 +462,27 @@ void runPigeonIntegrationTests(TargetGenerator targetGenerator) {
|
||||
await api.echoNullableUint8List(null);
|
||||
expect(receivedNullUint8List, null);
|
||||
});
|
||||
|
||||
testWidgets('generic nullable Objects serialize and deserialize correctly',
|
||||
(WidgetTester _) async {
|
||||
final HostIntegrationCoreApi api = HostIntegrationCoreApi();
|
||||
const Object sentString = "I'm a computer";
|
||||
final Object? receivedString = await api.echoNullableObject(sentString);
|
||||
expect(receivedString, sentString);
|
||||
|
||||
// Echo a second type as well to ensure the handling is generic.
|
||||
const Object sentInt = 42;
|
||||
final Object? receivedInt = await api.echoNullableObject(sentInt);
|
||||
expect(receivedInt, sentInt);
|
||||
});
|
||||
|
||||
testWidgets('Null generic Objects serialize and deserialize correctly',
|
||||
(WidgetTester _) async {
|
||||
final HostIntegrationCoreApi api = HostIntegrationCoreApi();
|
||||
|
||||
final Object? receivedNullObject = await api.echoNullableObject(null);
|
||||
expect(receivedNullObject, null);
|
||||
});
|
||||
});
|
||||
|
||||
group('Host async API tests', () {
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), 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
|
||||
import 'dart:async';
|
||||
@ -205,14 +205,11 @@ class _HostIntegrationCoreApiCodec extends StandardMessageCodec {
|
||||
if (value is AllNullableTypes) {
|
||||
buffer.putUint8(128);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is AllNullableTypes) {
|
||||
} else if (value is AllNullableTypesWrapper) {
|
||||
buffer.putUint8(129);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is AllNullableTypesWrapper) {
|
||||
buffer.putUint8(130);
|
||||
writeValue(buffer, value.encode());
|
||||
} else if (value is AllTypes) {
|
||||
buffer.putUint8(131);
|
||||
buffer.putUint8(130);
|
||||
writeValue(buffer, value.encode());
|
||||
} else {
|
||||
super.writeValue(buffer, value);
|
||||
@ -226,12 +223,9 @@ class _HostIntegrationCoreApiCodec extends StandardMessageCodec {
|
||||
return AllNullableTypes.decode(readValue(buffer)!);
|
||||
|
||||
case 129:
|
||||
return AllNullableTypes.decode(readValue(buffer)!);
|
||||
|
||||
case 130:
|
||||
return AllNullableTypesWrapper.decode(readValue(buffer)!);
|
||||
|
||||
case 131:
|
||||
case 130:
|
||||
return AllTypes.decode(readValue(buffer)!);
|
||||
|
||||
default:
|
||||
@ -489,6 +483,34 @@ class HostIntegrationCoreApi {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the passed in generic Object.
|
||||
Future<Object> echoObject(Object arg_anObject) async {
|
||||
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.HostIntegrationCoreApi.echoObject', codec,
|
||||
binaryMessenger: _binaryMessenger);
|
||||
final List<Object?>? replyList =
|
||||
await channel.send(<Object?>[arg_anObject]) as List<Object?>?;
|
||||
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 if (replyList[0] == null) {
|
||||
throw PlatformException(
|
||||
code: 'null-error',
|
||||
message: 'Host platform returned null value for non-null return value.',
|
||||
);
|
||||
} else {
|
||||
return replyList[0]!;
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
/// sending of nested objects.
|
||||
Future<String?> extractNestedNullableString(
|
||||
@ -694,6 +716,29 @@ class HostIntegrationCoreApi {
|
||||
}
|
||||
}
|
||||
|
||||
/// Returns the passed in generic Object.
|
||||
Future<Object?> echoNullableObject(Object? arg_aNullableObject) async {
|
||||
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
|
||||
'dev.flutter.pigeon.HostIntegrationCoreApi.echoNullableObject', codec,
|
||||
binaryMessenger: _binaryMessenger);
|
||||
final List<Object?>? replyList =
|
||||
await channel.send(<Object?>[arg_aNullableObject]) as List<Object?>?;
|
||||
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];
|
||||
}
|
||||
}
|
||||
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
/// test basic asynchronous calling.
|
||||
Future<void> noopAsync() async {
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
|
||||
package com.example.test_plugin
|
||||
@ -169,16 +169,11 @@ private object HostIntegrationCoreApiCodec : StandardMessageCodec() {
|
||||
}
|
||||
}
|
||||
129.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
AllNullableTypes.fromList(it)
|
||||
}
|
||||
}
|
||||
130.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
AllNullableTypesWrapper.fromList(it)
|
||||
}
|
||||
}
|
||||
131.toByte() -> {
|
||||
130.toByte() -> {
|
||||
return (readValue(buffer) as? List<Any?>)?.let {
|
||||
AllTypes.fromList(it)
|
||||
}
|
||||
@ -192,16 +187,12 @@ private object HostIntegrationCoreApiCodec : StandardMessageCodec() {
|
||||
stream.write(128)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
is AllNullableTypes -> {
|
||||
is AllNullableTypesWrapper -> {
|
||||
stream.write(129)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
is AllNullableTypesWrapper -> {
|
||||
stream.write(130)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
is AllTypes -> {
|
||||
stream.write(131)
|
||||
stream.write(130)
|
||||
writeValue(stream, value.toList())
|
||||
}
|
||||
else -> super.writeValue(stream, value)
|
||||
@ -237,6 +228,8 @@ interface HostIntegrationCoreApi {
|
||||
fun echoString(aString: String): String
|
||||
/** Returns the passed in Uint8List. */
|
||||
fun echoUint8List(aUint8List: ByteArray): ByteArray
|
||||
/** Returns the passed in generic Object. */
|
||||
fun echoObject(anObject: Any): Any
|
||||
/**
|
||||
* Returns the inner `aString` value from the wrapped object, to test
|
||||
* sending of nested objects.
|
||||
@ -259,6 +252,8 @@ interface HostIntegrationCoreApi {
|
||||
fun echoNullableString(aNullableString: String?): String?
|
||||
/** Returns the passed in Uint8List. */
|
||||
fun echoNullableUint8List(aNullableUint8List: ByteArray?): ByteArray?
|
||||
/** Returns the passed in generic Object. */
|
||||
fun echoNullableObject(aNullableObject: Any?): Any?
|
||||
/**
|
||||
* A no-op function taking no arguments and returning no value, to sanity
|
||||
* test basic asynchronous calling.
|
||||
@ -437,6 +432,24 @@ interface HostIntegrationCoreApi {
|
||||
channel.setMessageHandler(null)
|
||||
}
|
||||
}
|
||||
run {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.HostIntegrationCoreApi.echoObject", codec)
|
||||
if (api != null) {
|
||||
channel.setMessageHandler { message, reply ->
|
||||
var wrapped = listOf<Any?>()
|
||||
try {
|
||||
val args = message as List<Any?>
|
||||
val anObjectArg = args[0] as Any
|
||||
wrapped = listOf<Any?>(api.echoObject(anObjectArg))
|
||||
} catch (exception: Error) {
|
||||
wrapped = wrapError(exception)
|
||||
}
|
||||
reply.reply(wrapped)
|
||||
}
|
||||
} else {
|
||||
channel.setMessageHandler(null)
|
||||
}
|
||||
}
|
||||
run {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.HostIntegrationCoreApi.extractNestedNullableString", codec)
|
||||
if (api != null) {
|
||||
@ -583,6 +596,24 @@ interface HostIntegrationCoreApi {
|
||||
channel.setMessageHandler(null)
|
||||
}
|
||||
}
|
||||
run {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.HostIntegrationCoreApi.echoNullableObject", codec)
|
||||
if (api != null) {
|
||||
channel.setMessageHandler { message, reply ->
|
||||
var wrapped = listOf<Any?>()
|
||||
try {
|
||||
val args = message as List<Any?>
|
||||
val aNullableObjectArg = args[0] as? Any
|
||||
wrapped = listOf<Any?>(api.echoNullableObject(aNullableObjectArg))
|
||||
} catch (exception: Error) {
|
||||
wrapped = wrapError(exception)
|
||||
}
|
||||
reply.reply(wrapped)
|
||||
}
|
||||
} else {
|
||||
channel.setMessageHandler(null)
|
||||
}
|
||||
}
|
||||
run {
|
||||
val channel = BasicMessageChannel<Any?>(binaryMessenger, "dev.flutter.pigeon.HostIntegrationCoreApi.noopAsync", codec)
|
||||
if (api != null) {
|
||||
|
@ -64,6 +64,10 @@ class TestPlugin: FlutterPlugin, HostIntegrationCoreApi {
|
||||
return aUint8List
|
||||
}
|
||||
|
||||
override fun echoObject(anObject: Any): Any {
|
||||
return anObject
|
||||
}
|
||||
|
||||
override fun extractNestedNullableString(wrapper: AllNullableTypesWrapper): String? {
|
||||
return wrapper.values.aNullableString
|
||||
}
|
||||
@ -75,22 +79,31 @@ class TestPlugin: FlutterPlugin, HostIntegrationCoreApi {
|
||||
override fun sendMultipleNullableTypes(aNullableBool: Boolean?, aNullableInt: Long?, aNullableString: String?): AllNullableTypes {
|
||||
return AllNullableTypes(aNullableBool = aNullableBool, aNullableInt = aNullableInt, aNullableString = aNullableString)
|
||||
}
|
||||
|
||||
override fun echoNullableInt(aNullableInt: Long?): Long? {
|
||||
return aNullableInt
|
||||
}
|
||||
|
||||
override fun echoNullableDouble(aNullableDouble: Double?): Double? {
|
||||
return aNullableDouble
|
||||
}
|
||||
|
||||
override fun echoNullableBool(aNullableBool: Boolean?): Boolean? {
|
||||
return aNullableBool
|
||||
}
|
||||
|
||||
override fun echoNullableString(aNullableString: String?): String? {
|
||||
return aNullableString
|
||||
}
|
||||
|
||||
override fun echoNullableUint8List(aNullableUint8List: ByteArray?): ByteArray? {
|
||||
return aNullableUint8List
|
||||
}
|
||||
|
||||
override fun echoNullableObject(aNullableObject: Any?): Any? {
|
||||
return aNullableObject
|
||||
}
|
||||
|
||||
override fun noopAsync(callback: () -> Unit) {
|
||||
callback()
|
||||
}
|
||||
|
@ -41,5 +41,9 @@ end
|
||||
post_install do |installer|
|
||||
installer.pods_project.targets.each do |target|
|
||||
flutter_additional_ios_build_settings(target)
|
||||
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['SWIFT_TREAT_WARNINGS_AS_ERRORS'] = 'YES'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -40,5 +40,9 @@ end
|
||||
post_install do |installer|
|
||||
installer.pods_project.targets.each do |target|
|
||||
flutter_additional_macos_build_settings(target)
|
||||
|
||||
target.build_configurations.each do |config|
|
||||
config.build_settings['SWIFT_TREAT_WARNINGS_AS_ERRORS'] = 'YES'
|
||||
end
|
||||
end
|
||||
end
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
|
||||
import Foundation
|
||||
@ -178,10 +178,8 @@ private class HostIntegrationCoreApiCodecReader: FlutterStandardReader {
|
||||
case 128:
|
||||
return AllNullableTypes.fromList(self.readValue() as! [Any])
|
||||
case 129:
|
||||
return AllNullableTypes.fromList(self.readValue() as! [Any])
|
||||
case 130:
|
||||
return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
|
||||
case 131:
|
||||
case 130:
|
||||
return AllTypes.fromList(self.readValue() as! [Any])
|
||||
default:
|
||||
return super.readValue(ofType: type)
|
||||
@ -194,14 +192,11 @@ private class HostIntegrationCoreApiCodecWriter: FlutterStandardWriter {
|
||||
if let value = value as? AllNullableTypes {
|
||||
super.writeByte(128)
|
||||
super.writeValue(value.toList())
|
||||
} else if let value = value as? AllNullableTypes {
|
||||
} else if let value = value as? AllNullableTypesWrapper {
|
||||
super.writeByte(129)
|
||||
super.writeValue(value.toList())
|
||||
} else if let value = value as? AllNullableTypesWrapper {
|
||||
super.writeByte(130)
|
||||
super.writeValue(value.toList())
|
||||
} else if let value = value as? AllTypes {
|
||||
super.writeByte(131)
|
||||
super.writeByte(130)
|
||||
super.writeValue(value.toList())
|
||||
} else {
|
||||
super.writeValue(value)
|
||||
@ -247,6 +242,8 @@ protocol HostIntegrationCoreApi {
|
||||
func echoString(aString: String) -> String
|
||||
/// Returns the passed in Uint8List.
|
||||
func echoUint8List(aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData
|
||||
/// Returns the passed in generic Object.
|
||||
func echoObject(anObject: Any) -> Any
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
/// sending of nested objects.
|
||||
func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String?
|
||||
@ -265,6 +262,8 @@ protocol HostIntegrationCoreApi {
|
||||
func echoNullableString(aNullableString: String?) -> String?
|
||||
/// Returns the passed in Uint8List.
|
||||
func echoNullableUint8List(aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData?
|
||||
/// Returns the passed in generic Object.
|
||||
func echoNullableObject(aNullableObject: Any?) -> Any?
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
/// test basic asynchronous calling.
|
||||
func noopAsync(completion: @escaping () -> Void)
|
||||
@ -385,6 +384,18 @@ class HostIntegrationCoreApiSetup {
|
||||
} else {
|
||||
echoUint8ListChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// Returns the passed in generic Object.
|
||||
let echoObjectChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoObject", binaryMessenger: binaryMessenger, codec: codec)
|
||||
if let api = api {
|
||||
echoObjectChannel.setMessageHandler { message, reply in
|
||||
let args = message as! [Any?]
|
||||
let anObjectArg = args[0]!
|
||||
let result = api.echoObject(anObject: anObjectArg)
|
||||
reply(wrapResult(result))
|
||||
}
|
||||
} else {
|
||||
echoObjectChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
/// sending of nested objects.
|
||||
let extractNestedNullableStringChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.extractNestedNullableString", binaryMessenger: binaryMessenger, codec: codec)
|
||||
@ -485,6 +496,18 @@ class HostIntegrationCoreApiSetup {
|
||||
} else {
|
||||
echoNullableUint8ListChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// Returns the passed in generic Object.
|
||||
let echoNullableObjectChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoNullableObject", binaryMessenger: binaryMessenger, codec: codec)
|
||||
if let api = api {
|
||||
echoNullableObjectChannel.setMessageHandler { message, reply in
|
||||
let args = message as! [Any?]
|
||||
let aNullableObjectArg = args[0]
|
||||
let result = api.echoNullableObject(aNullableObject: aNullableObjectArg)
|
||||
reply(wrapResult(result))
|
||||
}
|
||||
} else {
|
||||
echoNullableObjectChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
/// test basic asynchronous calling.
|
||||
let noopAsyncChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.noopAsync", binaryMessenger: binaryMessenger, codec: codec)
|
||||
|
@ -59,6 +59,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi {
|
||||
return aUint8List
|
||||
}
|
||||
|
||||
func echoObject(anObject: Any) -> Any {
|
||||
return anObject
|
||||
}
|
||||
|
||||
func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String? {
|
||||
return wrapper.values.aNullableString;
|
||||
}
|
||||
@ -92,6 +96,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi {
|
||||
return aNullableUint8List
|
||||
}
|
||||
|
||||
func echoNullableObject(aNullableObject: Any?) -> Any? {
|
||||
return aNullableObject
|
||||
}
|
||||
|
||||
func noopAsync(completion: @escaping () -> Void) {
|
||||
completion()
|
||||
}
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
|
||||
import Foundation
|
||||
@ -178,10 +178,8 @@ private class HostIntegrationCoreApiCodecReader: FlutterStandardReader {
|
||||
case 128:
|
||||
return AllNullableTypes.fromList(self.readValue() as! [Any])
|
||||
case 129:
|
||||
return AllNullableTypes.fromList(self.readValue() as! [Any])
|
||||
case 130:
|
||||
return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
|
||||
case 131:
|
||||
case 130:
|
||||
return AllTypes.fromList(self.readValue() as! [Any])
|
||||
default:
|
||||
return super.readValue(ofType: type)
|
||||
@ -194,14 +192,11 @@ private class HostIntegrationCoreApiCodecWriter: FlutterStandardWriter {
|
||||
if let value = value as? AllNullableTypes {
|
||||
super.writeByte(128)
|
||||
super.writeValue(value.toList())
|
||||
} else if let value = value as? AllNullableTypes {
|
||||
} else if let value = value as? AllNullableTypesWrapper {
|
||||
super.writeByte(129)
|
||||
super.writeValue(value.toList())
|
||||
} else if let value = value as? AllNullableTypesWrapper {
|
||||
super.writeByte(130)
|
||||
super.writeValue(value.toList())
|
||||
} else if let value = value as? AllTypes {
|
||||
super.writeByte(131)
|
||||
super.writeByte(130)
|
||||
super.writeValue(value.toList())
|
||||
} else {
|
||||
super.writeValue(value)
|
||||
@ -247,6 +242,8 @@ protocol HostIntegrationCoreApi {
|
||||
func echoString(aString: String) -> String
|
||||
/// Returns the passed in Uint8List.
|
||||
func echoUint8List(aUint8List: FlutterStandardTypedData) -> FlutterStandardTypedData
|
||||
/// Returns the passed in generic Object.
|
||||
func echoObject(anObject: Any) -> Any
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
/// sending of nested objects.
|
||||
func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String?
|
||||
@ -265,6 +262,8 @@ protocol HostIntegrationCoreApi {
|
||||
func echoNullableString(aNullableString: String?) -> String?
|
||||
/// Returns the passed in Uint8List.
|
||||
func echoNullableUint8List(aNullableUint8List: FlutterStandardTypedData?) -> FlutterStandardTypedData?
|
||||
/// Returns the passed in generic Object.
|
||||
func echoNullableObject(aNullableObject: Any?) -> Any?
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
/// test basic asynchronous calling.
|
||||
func noopAsync(completion: @escaping () -> Void)
|
||||
@ -385,6 +384,18 @@ class HostIntegrationCoreApiSetup {
|
||||
} else {
|
||||
echoUint8ListChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// Returns the passed in generic Object.
|
||||
let echoObjectChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoObject", binaryMessenger: binaryMessenger, codec: codec)
|
||||
if let api = api {
|
||||
echoObjectChannel.setMessageHandler { message, reply in
|
||||
let args = message as! [Any?]
|
||||
let anObjectArg = args[0]!
|
||||
let result = api.echoObject(anObject: anObjectArg)
|
||||
reply(wrapResult(result))
|
||||
}
|
||||
} else {
|
||||
echoObjectChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// Returns the inner `aString` value from the wrapped object, to test
|
||||
/// sending of nested objects.
|
||||
let extractNestedNullableStringChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.extractNestedNullableString", binaryMessenger: binaryMessenger, codec: codec)
|
||||
@ -485,6 +496,18 @@ class HostIntegrationCoreApiSetup {
|
||||
} else {
|
||||
echoNullableUint8ListChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// Returns the passed in generic Object.
|
||||
let echoNullableObjectChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.echoNullableObject", binaryMessenger: binaryMessenger, codec: codec)
|
||||
if let api = api {
|
||||
echoNullableObjectChannel.setMessageHandler { message, reply in
|
||||
let args = message as! [Any?]
|
||||
let aNullableObjectArg = args[0]
|
||||
let result = api.echoNullableObject(aNullableObject: aNullableObjectArg)
|
||||
reply(wrapResult(result))
|
||||
}
|
||||
} else {
|
||||
echoNullableObjectChannel.setMessageHandler(nil)
|
||||
}
|
||||
/// A no-op function taking no arguments and returning no value, to sanity
|
||||
/// test basic asynchronous calling.
|
||||
let noopAsyncChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.HostIntegrationCoreApi.noopAsync", binaryMessenger: binaryMessenger, codec: codec)
|
||||
|
@ -59,6 +59,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi {
|
||||
return aUint8List
|
||||
}
|
||||
|
||||
func echoObject(anObject: Any) -> Any {
|
||||
return anObject
|
||||
}
|
||||
|
||||
func extractNestedNullableString(wrapper: AllNullableTypesWrapper) -> String? {
|
||||
return wrapper.values.aNullableString;
|
||||
}
|
||||
@ -92,6 +96,10 @@ public class TestPlugin: NSObject, FlutterPlugin, HostIntegrationCoreApi {
|
||||
return aNullableUint8List
|
||||
}
|
||||
|
||||
func echoNullableObject(aNullableObject: Any?) -> Any? {
|
||||
return aNullableObject
|
||||
}
|
||||
|
||||
func noopAsync(completion: @escaping () -> Void) {
|
||||
completion()
|
||||
}
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
|
||||
#undef _HAS_EXCEPTIONS
|
||||
@ -490,14 +490,10 @@ flutter::EncodableValue HostIntegrationCoreApiCodecSerializer::ReadValueOfType(
|
||||
std::get<flutter::EncodableList>(ReadValue(stream))));
|
||||
|
||||
case 129:
|
||||
return flutter::CustomEncodableValue(AllNullableTypes(
|
||||
std::get<flutter::EncodableList>(ReadValue(stream))));
|
||||
|
||||
case 130:
|
||||
return flutter::CustomEncodableValue(AllNullableTypesWrapper(
|
||||
std::get<flutter::EncodableList>(ReadValue(stream))));
|
||||
|
||||
case 131:
|
||||
case 130:
|
||||
return flutter::CustomEncodableValue(
|
||||
AllTypes(std::get<flutter::EncodableList>(ReadValue(stream))));
|
||||
|
||||
@ -519,16 +515,8 @@ void HostIntegrationCoreApiCodecSerializer::WriteValue(
|
||||
stream);
|
||||
return;
|
||||
}
|
||||
if (custom_value->type() == typeid(AllNullableTypes)) {
|
||||
stream->WriteByte(129);
|
||||
WriteValue(
|
||||
flutter::EncodableValue(
|
||||
std::any_cast<AllNullableTypes>(*custom_value).ToEncodableList()),
|
||||
stream);
|
||||
return;
|
||||
}
|
||||
if (custom_value->type() == typeid(AllNullableTypesWrapper)) {
|
||||
stream->WriteByte(130);
|
||||
stream->WriteByte(129);
|
||||
WriteValue(flutter::EncodableValue(
|
||||
std::any_cast<AllNullableTypesWrapper>(*custom_value)
|
||||
.ToEncodableList()),
|
||||
@ -536,7 +524,7 @@ void HostIntegrationCoreApiCodecSerializer::WriteValue(
|
||||
return;
|
||||
}
|
||||
if (custom_value->type() == typeid(AllTypes)) {
|
||||
stream->WriteByte(131);
|
||||
stream->WriteByte(130);
|
||||
WriteValue(flutter::EncodableValue(
|
||||
std::any_cast<AllTypes>(*custom_value).ToEncodableList()),
|
||||
stream);
|
||||
@ -869,6 +857,43 @@ void HostIntegrationCoreApi::SetUp(flutter::BinaryMessenger* binary_messenger,
|
||||
channel->SetMessageHandler(nullptr);
|
||||
}
|
||||
}
|
||||
{
|
||||
auto channel =
|
||||
std::make_unique<flutter::BasicMessageChannel<flutter::EncodableValue>>(
|
||||
binary_messenger,
|
||||
"dev.flutter.pigeon.HostIntegrationCoreApi.echoObject",
|
||||
&GetCodec());
|
||||
if (api != nullptr) {
|
||||
channel->SetMessageHandler(
|
||||
[api](const flutter::EncodableValue& message,
|
||||
const flutter::MessageReply<flutter::EncodableValue>& reply) {
|
||||
flutter::EncodableList wrapped;
|
||||
try {
|
||||
const auto& args = std::get<flutter::EncodableList>(message);
|
||||
const auto& encodable_an_object_arg = args.at(0);
|
||||
if (encodable_an_object_arg.IsNull()) {
|
||||
reply(flutter::EncodableValue(
|
||||
WrapError("an_object_arg unexpectedly null.")));
|
||||
return;
|
||||
}
|
||||
const auto& an_object_arg = encodable_an_object_arg;
|
||||
ErrorOr<flutter::EncodableValue> output =
|
||||
api->EchoObject(an_object_arg);
|
||||
if (output.has_error()) {
|
||||
wrapped = WrapError(output.error());
|
||||
} else {
|
||||
wrapped.push_back(
|
||||
flutter::EncodableValue(std::move(output).TakeValue()));
|
||||
}
|
||||
} catch (const std::exception& exception) {
|
||||
wrapped = WrapError(exception.what());
|
||||
}
|
||||
reply(flutter::EncodableValue(std::move(wrapped)));
|
||||
});
|
||||
} else {
|
||||
channel->SetMessageHandler(nullptr);
|
||||
}
|
||||
}
|
||||
{
|
||||
auto channel = std::make_unique<
|
||||
flutter::BasicMessageChannel<flutter::EncodableValue>>(
|
||||
@ -1190,6 +1215,44 @@ void HostIntegrationCoreApi::SetUp(flutter::BinaryMessenger* binary_messenger,
|
||||
channel->SetMessageHandler(nullptr);
|
||||
}
|
||||
}
|
||||
{
|
||||
auto channel =
|
||||
std::make_unique<flutter::BasicMessageChannel<flutter::EncodableValue>>(
|
||||
binary_messenger,
|
||||
"dev.flutter.pigeon.HostIntegrationCoreApi.echoNullableObject",
|
||||
&GetCodec());
|
||||
if (api != nullptr) {
|
||||
channel->SetMessageHandler(
|
||||
[api](const flutter::EncodableValue& message,
|
||||
const flutter::MessageReply<flutter::EncodableValue>& reply) {
|
||||
flutter::EncodableList wrapped;
|
||||
try {
|
||||
const auto& args = std::get<flutter::EncodableList>(message);
|
||||
const auto& encodable_a_nullable_object_arg = args.at(0);
|
||||
const auto* a_nullable_object_arg =
|
||||
&encodable_a_nullable_object_arg;
|
||||
ErrorOr<std::optional<flutter::EncodableValue>> output =
|
||||
api->EchoNullableObject(a_nullable_object_arg);
|
||||
if (output.has_error()) {
|
||||
wrapped = WrapError(output.error());
|
||||
} else {
|
||||
auto output_optional = std::move(output).TakeValue();
|
||||
if (output_optional) {
|
||||
wrapped.push_back(flutter::EncodableValue(
|
||||
std::move(output_optional).value()));
|
||||
} else {
|
||||
wrapped.push_back(flutter::EncodableValue());
|
||||
}
|
||||
}
|
||||
} catch (const std::exception& exception) {
|
||||
wrapped = WrapError(exception.what());
|
||||
}
|
||||
reply(flutter::EncodableValue(std::move(wrapped)));
|
||||
});
|
||||
} else {
|
||||
channel->SetMessageHandler(nullptr);
|
||||
}
|
||||
}
|
||||
{
|
||||
auto channel =
|
||||
std::make_unique<flutter::BasicMessageChannel<flutter::EncodableValue>>(
|
||||
|
@ -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 (v4.2.15), do not edit directly.
|
||||
// Autogenerated from Pigeon (v4.2.16), do not edit directly.
|
||||
// See also: https://pub.dev/packages/pigeon
|
||||
|
||||
#ifndef PIGEON_CORE_TESTS_GEN_CORE_TESTS_PIGEONTEST_H_
|
||||
@ -283,6 +283,9 @@ class HostIntegrationCoreApi {
|
||||
// Returns the passed in Uint8List.
|
||||
virtual ErrorOr<std::vector<uint8_t>> EchoUint8List(
|
||||
const std::vector<uint8_t>& a_uint8_list) = 0;
|
||||
// Returns the passed in generic Object.
|
||||
virtual ErrorOr<flutter::EncodableValue> EchoObject(
|
||||
const flutter::EncodableValue& an_object) = 0;
|
||||
// Returns the inner `aString` value from the wrapped object, to test
|
||||
// sending of nested objects.
|
||||
virtual ErrorOr<std::optional<std::string>> ExtractNestedNullableString(
|
||||
@ -310,6 +313,9 @@ class HostIntegrationCoreApi {
|
||||
// Returns the passed in Uint8List.
|
||||
virtual ErrorOr<std::optional<std::vector<uint8_t>>> EchoNullableUint8List(
|
||||
const std::vector<uint8_t>* a_nullable_uint8_list) = 0;
|
||||
// Returns the passed in generic Object.
|
||||
virtual ErrorOr<std::optional<flutter::EncodableValue>> EchoNullableObject(
|
||||
const flutter::EncodableValue* a_nullable_object) = 0;
|
||||
// A no-op function taking no arguments and returning no value, to sanity
|
||||
// test basic asynchronous calling.
|
||||
virtual void NoopAsync(
|
||||
|
@ -73,6 +73,11 @@ ErrorOr<std::vector<uint8_t>> TestPlugin::EchoUint8List(
|
||||
return a_uint8_list;
|
||||
}
|
||||
|
||||
ErrorOr<flutter::EncodableValue> TestPlugin::EchoObject(
|
||||
const flutter::EncodableValue& an_object) {
|
||||
return an_object;
|
||||
}
|
||||
|
||||
ErrorOr<std::optional<std::string>> TestPlugin::ExtractNestedNullableString(
|
||||
const AllNullableTypesWrapper& wrapper) {
|
||||
const std::string* inner_string = wrapper.values().a_nullable_string();
|
||||
@ -153,6 +158,14 @@ ErrorOr<std::optional<std::vector<uint8_t>>> TestPlugin::EchoNullableUint8List(
|
||||
return *a_nullable_uint8_list;
|
||||
};
|
||||
|
||||
ErrorOr<std::optional<flutter::EncodableValue>> TestPlugin::EchoNullableObject(
|
||||
const flutter::EncodableValue* a_nullable_object) {
|
||||
if (!a_nullable_object) {
|
||||
return std::nullopt;
|
||||
}
|
||||
return *a_nullable_object;
|
||||
};
|
||||
|
||||
void TestPlugin::NoopAsync(
|
||||
std::function<void(std::optional<FlutterError> reply)> result) {
|
||||
result(std::nullopt);
|
||||
|
@ -47,6 +47,8 @@ class TestPlugin : public flutter::Plugin,
|
||||
const std::string& a_string) override;
|
||||
core_tests_pigeontest::ErrorOr<std::vector<uint8_t>> EchoUint8List(
|
||||
const std::vector<uint8_t>& a_uint8_list) override;
|
||||
core_tests_pigeontest::ErrorOr<flutter::EncodableValue> EchoObject(
|
||||
const flutter::EncodableValue& an_object) override;
|
||||
core_tests_pigeontest::ErrorOr<std::optional<std::string>>
|
||||
ExtractNestedNullableString(
|
||||
const core_tests_pigeontest::AllNullableTypesWrapper& wrapper) override;
|
||||
@ -67,7 +69,8 @@ class TestPlugin : public flutter::Plugin,
|
||||
core_tests_pigeontest::ErrorOr<std::optional<std::vector<uint8_t>>>
|
||||
EchoNullableUint8List(
|
||||
const std::vector<uint8_t>* a_nullable_uint8_list) override;
|
||||
|
||||
core_tests_pigeontest::ErrorOr<std::optional<flutter::EncodableValue>>
|
||||
EchoNullableObject(const flutter::EncodableValue* a_nullable_object) override;
|
||||
void NoopAsync(std::function<
|
||||
void(std::optional<core_tests_pigeontest::FlutterError> reply)>
|
||||
result) override;
|
||||
|
@ -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: 4.2.15 # This must match the version in lib/generator_tools.dart
|
||||
version: 4.2.16 # This must match the version in lib/generator_tools.dart
|
||||
|
||||
environment:
|
||||
sdk: ">=2.12.0 <3.0.0"
|
||||
|
@ -809,6 +809,12 @@ void main() {
|
||||
baseName: 'ParameterObject',
|
||||
isNullable: true,
|
||||
)),
|
||||
NamedType(
|
||||
name: 'aGenericObject',
|
||||
type: const TypeDeclaration(
|
||||
baseName: 'Object',
|
||||
isNullable: true,
|
||||
)),
|
||||
],
|
||||
returnType: const TypeDeclaration.voidDeclaration(),
|
||||
),
|
||||
@ -834,7 +840,8 @@ void main() {
|
||||
'const std::string* a_string, '
|
||||
'const flutter::EncodableList* a_list, '
|
||||
'const flutter::EncodableMap* a_map, '
|
||||
'const ParameterObject* an_object)'));
|
||||
'const ParameterObject* an_object, '
|
||||
'const flutter::EncodableValue* a_generic_object)'));
|
||||
}
|
||||
{
|
||||
final StringBuffer sink = StringBuffer();
|
||||
@ -875,6 +882,12 @@ void main() {
|
||||
code,
|
||||
contains(
|
||||
'const auto* an_object_arg = &(std::any_cast<const ParameterObject&>(std::get<flutter::CustomEncodableValue>(encodable_an_object_arg)));'));
|
||||
// "Object" requires no extraction at all since it has to use
|
||||
// EncodableValue directly.
|
||||
expect(
|
||||
code,
|
||||
contains(
|
||||
'const auto* a_generic_object_arg = &encodable_a_generic_object_arg;'));
|
||||
}
|
||||
});
|
||||
|
||||
@ -927,6 +940,12 @@ void main() {
|
||||
baseName: 'ParameterObject',
|
||||
isNullable: false,
|
||||
)),
|
||||
NamedType(
|
||||
name: 'aGenericObject',
|
||||
type: const TypeDeclaration(
|
||||
baseName: 'Object',
|
||||
isNullable: false,
|
||||
)),
|
||||
],
|
||||
returnType: const TypeDeclaration.voidDeclaration(),
|
||||
),
|
||||
@ -952,7 +971,8 @@ void main() {
|
||||
'const std::string& a_string, '
|
||||
'const flutter::EncodableList& a_list, '
|
||||
'const flutter::EncodableMap& a_map, '
|
||||
'const ParameterObject& an_object)'));
|
||||
'const ParameterObject& an_object, '
|
||||
'const flutter::EncodableValue& a_generic_object)'));
|
||||
}
|
||||
{
|
||||
final StringBuffer sink = StringBuffer();
|
||||
@ -988,6 +1008,12 @@ void main() {
|
||||
code,
|
||||
contains(
|
||||
'const auto& an_object_arg = std::any_cast<const ParameterObject&>(std::get<flutter::CustomEncodableValue>(encodable_an_object_arg));'));
|
||||
// "Object" requires no extraction at all since it has to use
|
||||
// EncodableValue directly.
|
||||
expect(
|
||||
code,
|
||||
contains(
|
||||
'const auto& a_generic_object_arg = encodable_a_generic_object_arg;'));
|
||||
}
|
||||
});
|
||||
|
||||
|
Reference in New Issue
Block a user