[pigeon] wrap encodable lists in encodable value before reply (#2968)

* wrap encodable lists before reply

* Changelog

* changelog

* basic test

* positive test and move

* nit
This commit is contained in:
Tarrin Neal
2022-12-19 22:23:22 -08:00
committed by GitHub
parent 6d22f5989a
commit 4331f3aab8
5 changed files with 82 additions and 6 deletions

View File

@ -1,3 +1,7 @@
## 4.2.14
* [c++] Fixes reply sending non EncodableValue wrapped lists.
## 4.2.13
* Add documentation comment support for Enum members.

View File

@ -590,7 +590,7 @@ const flutter::StandardMessageCodec& ${api.name}::GetCodec() {
indent.write('if ($encodableArgName.IsNull()) ');
indent.scoped('{', '}', () {
indent.writeln(
'reply(WrapError("$argName unexpectedly null."));');
'reply(flutter::EncodableValue(WrapError("$argName unexpectedly null.")));');
indent.writeln('return;');
});
}
@ -656,7 +656,7 @@ $prefix\t}${indent.newline}''';
if (method.isAsynchronous) {
methodArgument.add(
'[&wrapped, &reply]($returnTypeName&& output) {${indent.newline}'
'${wrapResponse('\treply(wrapped);${indent.newline}', method.returnType)}'
'${wrapResponse('\treply(flutter::EncodableValue(std::move(wrapped)));${indent.newline}', method.returnType)}'
'}',
);
}
@ -673,11 +673,13 @@ $prefix\t}${indent.newline}''';
indent.scoped('{', '}', () {
indent.writeln('wrapped = WrapError(exception.what());');
if (method.isAsynchronous) {
indent.writeln('reply(wrapped);');
indent.writeln(
'reply(flutter::EncodableValue(std::move(wrapped)));');
}
});
if (!method.isAsynchronous) {
indent.writeln('reply(wrapped);');
indent.writeln(
'reply(flutter::EncodableValue(std::move(wrapped)));');
}
});
});

View File

@ -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.13';
const String pigeonVersion = '4.2.14';
/// Read all the content from [stdin] to a String.
String readStdin() {

View File

@ -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.13 # This must match the version in lib/generator_tools.dart
version: 4.2.14 # This must match the version in lib/generator_tools.dart
environment:
sdk: ">=2.12.0 <3.0.0"

View File

@ -1203,4 +1203,74 @@ void main() {
final String code = sink.toString();
expect(code, contains(' : public flutter::StandardCodecSerializer'));
});
test('Does not send unwrapped EncodableLists', () {
final Root root = Root(apis: <Api>[
Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
Method(
name: 'doSomething',
arguments: <NamedType>[
NamedType(
name: 'aBool',
type: const TypeDeclaration(
baseName: 'bool',
isNullable: false,
)),
NamedType(
name: 'anInt',
type: const TypeDeclaration(
baseName: 'int',
isNullable: false,
)),
NamedType(
name: 'aString',
type: const TypeDeclaration(
baseName: 'String',
isNullable: false,
)),
NamedType(
name: 'aList',
type: const TypeDeclaration(
baseName: 'List',
typeArguments: <TypeDeclaration>[
TypeDeclaration(baseName: 'Object', isNullable: true)
],
isNullable: false,
)),
NamedType(
name: 'aMap',
type: const TypeDeclaration(
baseName: 'Map',
typeArguments: <TypeDeclaration>[
TypeDeclaration(baseName: 'String', isNullable: true),
TypeDeclaration(baseName: 'Object', isNullable: true),
],
isNullable: false,
)),
NamedType(
name: 'anObject',
type: const TypeDeclaration(
baseName: 'ParameterObject',
isNullable: false,
)),
],
returnType: const TypeDeclaration.voidDeclaration(),
),
])
], classes: <Class>[
Class(name: 'ParameterObject', fields: <NamedType>[
NamedType(
type: const TypeDeclaration(
baseName: 'bool',
isNullable: false,
),
name: 'aValue'),
]),
], enums: <Enum>[]);
final StringBuffer sink = StringBuffer();
generateCppSource(const CppOptions(), root, sink);
final String code = sink.toString();
expect(code, isNot(contains('reply(wrap')));
expect(code, contains('reply(flutter::EncodableValue('));
});
}