[pigeon] Change generator formatting to closer match formatter output (#3072)
* dart and some java
* java
* objc header
* objc source
* newln
* loopable new lines
* better counting
* cpp and redo previous changes
* changelog
* nest and nits
* addScoped
* rewrite description of newln
* regex tests
diff --git a/packages/pigeon/CHANGELOG.md b/packages/pigeon/CHANGELOG.md
index bdf032f..6c3bdf7 100644
--- a/packages/pigeon/CHANGELOG.md
+++ b/packages/pigeon/CHANGELOG.md
@@ -1,3 +1,8 @@
+## 7.0.1
+
+* [generator_tools] adds `newln` method for adding empty lines and ending lines.
+* Updates generators to more closely match Flutter formatter tool output.
+
## 7.0.0
* [java] **BREAKING CHANGE**: Makes data classes final.
diff --git a/packages/pigeon/lib/cpp_generator.dart b/packages/pigeon/lib/cpp_generator.dart
index 71a3a24..844e80e 100644
--- a/packages/pigeon/lib/cpp_generator.dart
+++ b/packages/pigeon/lib/cpp_generator.dart
@@ -104,7 +104,7 @@
}
indent.writeln('$_commentPrefix $generatedCodeWarning');
indent.writeln('$_commentPrefix $seeAlsoWarning');
- indent.addln('');
+ indent.newln();
}
@override
@@ -119,34 +119,34 @@
'flutter/encodable_value.h',
'flutter/standard_message_codec.h',
]);
- indent.addln('');
+ indent.newln();
_writeSystemHeaderIncludeBlock(indent, <String>[
'map',
'string',
'optional',
]);
- indent.addln('');
+ indent.newln();
if (generatorOptions.namespace != null) {
indent.writeln('namespace ${generatorOptions.namespace} {');
}
- indent.addln('');
+ indent.newln();
if (generatorOptions.namespace?.endsWith('_pigeontest') ?? false) {
final String testFixtureClass =
'${_pascalCaseFromSnakeCase(generatorOptions.namespace!.replaceAll('_pigeontest', ''))}Test';
indent.writeln('class $testFixtureClass;');
}
- indent.addln('');
+ indent.newln();
indent.writeln('$_commentPrefix Generated class from Pigeon.');
}
@override
void writeEnum(
CppOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
- indent.writeln('');
+ indent.newln();
addDocumentationComments(
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('enum class ${anEnum.name} ');
- indent.scoped('{', '};', () {
+ indent.addScoped('{', '};', () {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
@@ -173,7 +173,7 @@
testFixtureClass =
'${_pascalCaseFromSnakeCase(generatorOptions.namespace!.replaceAll('_pigeontest', ''))}Test';
}
- indent.addln('');
+ indent.newln();
const List<String> generatedMessages = <String>[
' Generated class from Pigeon that represents data sent in messages.'
@@ -184,8 +184,8 @@
generatorComments: generatedMessages);
indent.write('class ${klass.name} ');
- indent.scoped('{', '};', () {
- indent.scoped(' public:', '', () {
+ indent.addScoped('{', '};', () {
+ indent.addScoped(' public:', '', () {
indent.writeln('${klass.name}();');
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
addDocumentationComments(
@@ -204,11 +204,11 @@
indent.writeln(
'void ${_makeSetterName(field)}(${_unownedArgumentType(nonNullType)} value_arg);');
}
- indent.addln('');
+ indent.newln();
}
});
- indent.scoped(' private:', '', () {
+ indent.addScoped(' private:', '', () {
indent.writeln('${klass.name}(const flutter::EncodableList& list);');
indent.writeln('flutter::EncodableList ToEncodableList() const;');
for (final Class friend in root.classes) {
@@ -236,7 +236,7 @@
}
});
}, nestCount: 0);
- indent.writeln('');
+ indent.newln();
}
@override
@@ -256,14 +256,14 @@
addDocumentationComments(indent, api.documentationComments, _docCommentSpec,
generatorComments: generatedMessages);
indent.write('class ${api.name} ');
- indent.scoped('{', '};', () {
- indent.scoped(' private:', '', () {
+ indent.addScoped('{', '};', () {
+ indent.addScoped(' private:', '', () {
indent.writeln('flutter::BinaryMessenger* binary_messenger_;');
});
- indent.scoped(' public:', '', () {
+ indent.addScoped(' public:', '', () {
indent
.write('${api.name}(flutter::BinaryMessenger* binary_messenger);');
- indent.writeln('');
+ indent.newln();
indent
.writeln('static const flutter::StandardMessageCodec& GetCodec();');
for (final Method func in api.methods) {
@@ -288,7 +288,7 @@
}
});
}, nestCount: 0);
- indent.writeln('');
+ indent.newln();
}
@override
@@ -308,8 +308,8 @@
addDocumentationComments(indent, api.documentationComments, _docCommentSpec,
generatorComments: generatedMessages);
indent.write('class ${api.name} ');
- indent.scoped('{', '};', () {
- indent.scoped(' public:', '', () {
+ indent.addScoped('{', '};', () {
+ indent.addScoped(' public:', '', () {
indent.writeln('${api.name}(const ${api.name}&) = delete;');
indent.writeln('${api.name}& operator=(const ${api.name}&) = delete;');
indent.writeln('virtual ~${api.name}() { };');
@@ -347,7 +347,7 @@
'virtual $returnTypeName ${_makeMethodName(method)}(${argSignature.join(', ')}) = 0;');
}
}
- indent.addln('');
+ indent.newln();
indent.writeln('$_commentPrefix The codec used by ${api.name}.');
indent
.writeln('static const flutter::StandardMessageCodec& GetCodec();');
@@ -360,7 +360,7 @@
indent.writeln(
'static flutter::EncodableValue WrapError(const FlutterError& error);');
});
- indent.scoped(' protected:', '', () {
+ indent.addScoped(' protected:', '', () {
indent.writeln('${api.name}() = default;');
});
}, nestCount: 0);
@@ -372,9 +372,9 @@
final String codeSerializerName = _getCodecSerializerName(api);
indent
.write('class $codeSerializerName : public $_defaultCodecSerializer ');
- indent.scoped('{', '};', () {
- indent.scoped(' public:', '', () {
- indent.writeln('');
+ indent.addScoped('{', '};', () {
+ indent.addScoped(' public:', '', () {
+ indent.newln();
indent.format('''
inline static $codeSerializerName& GetInstance() {
\tstatic $codeSerializerName sInstance;
@@ -392,7 +392,7 @@
'flutter::EncodableValue ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const override;');
});
}, nestCount: 0);
- indent.addln('');
+ indent.newln();
}
void _writeErrorOr(Indent indent,
@@ -468,28 +468,28 @@
}
indent.writeln('$_commentPrefix $generatedCodeWarning');
indent.writeln('$_commentPrefix $seeAlsoWarning');
- indent.addln('');
+ indent.newln();
indent.addln('#undef _HAS_EXCEPTIONS');
- indent.addln('');
+ indent.newln();
}
@override
void writeFileImports(CppOptions generatorOptions, Root root, Indent indent) {
indent.writeln('#include "${generatorOptions.headerIncludePath}"');
- indent.addln('');
+ indent.newln();
_writeSystemHeaderIncludeBlock(indent, <String>[
'flutter/basic_message_channel.h',
'flutter/binary_messenger.h',
'flutter/encodable_value.h',
'flutter/standard_message_codec.h',
]);
- indent.addln('');
+ indent.newln();
_writeSystemHeaderIncludeBlock(indent, <String>[
'map',
'string',
'optional',
]);
- indent.addln('');
+ indent.newln();
}
@override
@@ -508,9 +508,9 @@
final Set<String> customEnumNames =
root.enums.map((Enum x) => x.name).toSet();
- indent.addln('');
+ indent.newln();
indent.writeln('$_commentPrefix ${klass.name}');
- indent.addln('');
+ indent.newln();
// Getters and setters.
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
@@ -523,7 +523,7 @@
// Default constructor.
indent.writeln('${klass.name}::${klass.name}() {}');
- indent.addln('');
+ indent.newln();
// Deserialization.
writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
@@ -541,8 +541,8 @@
) {
indent.write(
'flutter::EncodableList ${klass.name}::ToEncodableList() const ');
- indent.scoped('{', '}', () {
- indent.scoped('return flutter::EncodableList{', '};', () {
+ indent.addScoped('{', '}', () {
+ indent.addScoped('return flutter::EncodableList{', '};', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
final HostDatatype hostDatatype = getFieldHostDatatype(
field, root.classes, root.enums, _baseCppTypeForBuiltinDartType);
@@ -552,7 +552,7 @@
}
});
});
- indent.addln('');
+ indent.newln();
}
@override
@@ -566,7 +566,7 @@
) {
indent.write(
'${klass.name}::${klass.name}(const flutter::EncodableList& list) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
enumerate(getFieldsInSerializationOrder(klass),
(int index, final NamedType field) {
final String instanceVariableName = _makeInstanceVariableName(field);
@@ -593,21 +593,20 @@
.contains(field.type.baseName)) {
indent.write(
'if (const flutter::EncodableList* $pointerFieldName = std::get_if<flutter::EncodableList>(&$encodableFieldName)) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'$instanceVariableName = ${hostDatatype.datatype}(*$pointerFieldName);');
});
} else {
indent.write(
'if (const ${hostDatatype.datatype}* $pointerFieldName = std::get_if<${hostDatatype.datatype}>(&$encodableFieldName)) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('$instanceVariableName = *$pointerFieldName;');
});
}
}
});
});
- indent.addln('');
}
@override
@@ -625,10 +624,10 @@
'$_commentPrefix Generated class from Pigeon that represents Flutter messages that can be called from C++.');
indent.write(
'${api.name}::${api.name}(flutter::BinaryMessenger* binary_messenger) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('this->binary_messenger_ = binary_messenger;');
});
- indent.writeln('');
+ indent.newln();
final String codeSerializerName = getCodecClasses(api, root).isNotEmpty
? _getCodecSerializerName(api)
: _defaultCodecSerializer;
@@ -657,7 +656,7 @@
];
indent.write(
'void ${api.name}::${_makeMethodName(func)}(${parameters.join(', ')}) ');
- indent.scoped('{', '}', () {
+ indent.writeScoped('{', '}', () {
const String channel = 'channel';
indent.writeln(
'auto channel = std::make_unique<flutter::BasicMessageChannel<>>(binary_messenger_, '
@@ -669,7 +668,7 @@
if (func.arguments.isEmpty) {
indent.addln('flutter::EncodableValue();');
} else {
- indent.scoped(
+ indent.addScoped(
'flutter::EncodableValue(flutter::EncodableList{', '});', () {
for (final _HostNamedType param in hostParameters) {
final String encodedArgument = _wrappedHostApiArgumentExpression(
@@ -683,7 +682,7 @@
// ignore: missing_whitespace_between_adjacent_strings
'[on_success = std::move(on_success), on_error = std::move(on_error)]'
'(const uint8_t* reply, size_t reply_size) ');
- indent.scoped('{', '});', () {
+ indent.addScoped('{', '});', () {
final String successCallbackArgument;
if (func.returnType.isVoid) {
successCallbackArgument = '';
@@ -725,21 +724,21 @@
'$_commentPrefix Sets up an instance of `${api.name}` to handle messages through the `binary_messenger`.');
indent.write(
'void ${api.name}::SetUp(flutter::BinaryMessenger* binary_messenger, ${api.name}* api) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method method in api.methods) {
final String channelName = makeChannelName(api, method);
indent.write('');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'auto channel = std::make_unique<flutter::BasicMessageChannel<>>(binary_messenger, '
'"$channelName", &GetCodec());');
indent.write('if (api != nullptr) ');
- indent.scoped('{', '} else {', () {
+ indent.addScoped('{', '} else {', () {
indent.write(
'channel->SetMessageHandler([api](const flutter::EncodableValue& message, const flutter::MessageReply<flutter::EncodableValue>& reply) ');
- indent.scoped('{', '});', () {
+ indent.addScoped('{', '});', () {
indent.write('try ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
final List<String> methodArgument = <String>[];
if (method.arguments.isNotEmpty) {
indent.writeln(
@@ -760,7 +759,7 @@
'const auto& $encodableArgName = args.at($index);');
if (!arg.type.isNullable) {
indent.write('if ($encodableArgName.IsNull()) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'reply(WrapError("$argName unexpectedly null."));');
indent.writeln('return;');
@@ -793,9 +792,9 @@
indent.writeln('$returnTypeName output = $call;');
indent.format(_wrapResponse(indent, root, method.returnType));
}
- });
- indent.write('catch (const std::exception& exception) ');
- indent.scoped('{', '}', () {
+ }, addTrailingNewline: false);
+ indent.add(' catch (const std::exception& exception) ');
+ indent.addScoped('{', '}', () {
// There is a potential here for `reply` to be called twice, which
// is a violation of the API contract, because there's no way of
// knowing whether or not the plugin code called `reply` before
@@ -808,14 +807,14 @@
});
});
});
- indent.scoped(null, '}', () {
+ indent.addScoped(null, '}', () {
indent.writeln('channel->SetMessageHandler(nullptr);');
});
});
}
});
- indent.addln('');
+ indent.newln();
indent.format('''
flutter::EncodableValue ${api.name}::WrapError(std::string_view error_message) {
\treturn flutter::EncodableValue(flutter::EncodableList{
@@ -831,7 +830,7 @@
\t\terror.details()
\t});
}''');
- indent.addln('');
+ indent.newln();
}
void _writeCodec(
@@ -842,12 +841,13 @@
) {
assert(getCodecClasses(api, root).isNotEmpty);
final String codeSerializerName = _getCodecSerializerName(api);
+ indent.newln();
indent.writeln('$codeSerializerName::$codeSerializerName() {}');
indent.write(
'flutter::EncodableValue $codeSerializerName::ReadValueOfType(uint8_t type, flutter::ByteStreamReader* stream) const ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('switch (type) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
indent.write('case ${customClass.enumeration}:');
indent.writeScoped('', '', () {
@@ -862,17 +862,17 @@
}, addTrailingNewline: false);
});
});
- indent.writeln('');
+ indent.newln();
indent.write(
'void $codeSerializerName::WriteValue(const flutter::EncodableValue& value, flutter::ByteStreamWriter* stream) const ');
indent.writeScoped('{', '}', () {
indent.write(
'if (const flutter::CustomEncodableValue* custom_value = std::get_if<flutter::CustomEncodableValue>(&value)) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass in getCodecClasses(api, root)) {
indent.write(
'if (custom_value->type() == typeid(${customClass.name})) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('stream->WriteByte(${customClass.enumeration});');
indent.writeln(
'WriteValue(flutter::EncodableValue(std::any_cast<${customClass.name}>(*custom_value).ToEncodableList()), stream);');
@@ -882,7 +882,7 @@
});
indent.writeln('$_defaultCodecSerializer::WriteValue(value, stream);');
});
- indent.writeln('');
+ indent.newln();
}
void _writeCppSourceClassField(CppOptions generatorOptions, Root root,
@@ -919,7 +919,7 @@
indent.writeln(makeSetter(nonNullType));
}
- indent.addln('');
+ indent.newln();
}
String _wrapResponse(Indent indent, Root root, TypeDeclaration returnType,
diff --git a/packages/pigeon/lib/dart_generator.dart b/packages/pigeon/lib/dart_generator.dart
index 3b62aff..b45a9a9 100644
--- a/packages/pigeon/lib/dart_generator.dart
+++ b/packages/pigeon/lib/dart_generator.dart
@@ -86,7 +86,7 @@
indent.writeln(
'// 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',
);
- indent.addln('');
+ indent.newln();
}
@override
@@ -96,7 +96,7 @@
indent.writeln(
"import 'dart:typed_data' show Float64List, Int32List, Int64List, Uint8List;",
);
- indent.addln('');
+ indent.newln();
indent.writeln(
"import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;");
indent.writeln("import 'package:flutter/services.dart';");
@@ -105,11 +105,11 @@
@override
void writeEnum(
DartOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
- indent.writeln('');
+ indent.newln();
addDocumentationComments(
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('enum ${anEnum.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumMember member in anEnum.members) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
@@ -126,25 +126,25 @@
final Set<String> customEnumNames =
root.enums.map((Enum x) => x.name).toSet();
- indent.writeln('');
+ indent.newln();
addDocumentationComments(
indent, klass.documentationComments, _docCommentSpec);
indent.write('class ${klass.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
_writeConstructor(indent, klass);
- indent.addln('');
+ indent.newln();
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
addDocumentationComments(
indent, field.documentationComments, _docCommentSpec);
final String datatype = _addGenericTypesNullable(field.type);
indent.writeln('$datatype ${field.name};');
- indent.writeln('');
+ indent.newln();
}
writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
customEnumNames);
- indent.writeln('');
+ indent.newln();
writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
customEnumNames);
});
@@ -152,7 +152,7 @@
void _writeConstructor(Indent indent, Class klass) {
indent.write(klass.name);
- indent.scoped('({', '});', () {
+ indent.addScoped('({', '});', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
final String required = field.type.isNullable ? '' : 'required ';
indent.writeln('${required}this.${field.name},');
@@ -170,11 +170,11 @@
Set<String> customEnumNames,
) {
indent.write('Object encode() ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write(
'return <Object?>',
);
- indent.scoped('[', '];', () {
+ indent.addScoped('[', '];', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
final String conditional = field.type.isNullable ? '?' : '';
if (customClassNames.contains(field.type.baseName)) {
@@ -207,27 +207,25 @@
if (customClassNames.contains(field.type.baseName)) {
final String nonNullValue =
'${field.type.baseName}.decode($resultAt! as List<Object?>)';
- indent.format(
- field.type.isNullable
- ? '''
+ if (field.type.isNullable) {
+ indent.format('''
$resultAt != null
\t\t? $nonNullValue
-\t\t: null'''
- : nonNullValue,
- leadingSpace: false,
- trailingNewline: false);
+\t\t: null''', leadingSpace: false, trailingNewline: false);
+ } else {
+ indent.add(nonNullValue);
+ }
} else if (customEnumNames.contains(field.type.baseName)) {
final String nonNullValue =
'${field.type.baseName}.values[$resultAt! as int]';
- indent.format(
- field.type.isNullable
- ? '''
+ if (field.type.isNullable) {
+ indent.format('''
$resultAt != null
\t\t? $nonNullValue
-\t\t: null'''
- : nonNullValue,
- leadingSpace: false,
- trailingNewline: false);
+\t\t: null''', leadingSpace: false, trailingNewline: false);
+ } else {
+ indent.add(nonNullValue);
+ }
} else if (field.type.typeArguments.isNotEmpty) {
final String genericType = _makeGenericTypeArguments(field.type);
final String castCall = _makeGenericCastCall(field.type);
@@ -252,10 +250,10 @@
indent.write(
'static ${klass.name} decode(Object result) ',
);
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('result as List<Object?>;');
indent.write('return ${klass.name}');
- indent.scoped('(', ');', () {
+ indent.addScoped('(', ');', () {
enumerate(getFieldsInSerializationOrder(klass),
(int index, final NamedType field) {
indent.write('${field.name}: ');
@@ -292,15 +290,15 @@
codecName = _getCodecName(api);
_writeCodec(indent, codecName, api, root);
}
- indent.addln('');
+ indent.newln();
addDocumentationComments(
indent, api.documentationComments, _docCommentSpec);
indent.write('abstract class ${api.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent
.writeln('static const MessageCodec<Object?> codec = $codecName();');
- indent.addln('');
+ indent.newln();
for (final Method func in api.methods) {
addDocumentationComments(
indent, func.documentationComments, _docCommentSpec);
@@ -314,14 +312,14 @@
_getArgumentName,
);
indent.writeln('$returnType ${func.name}($argSignature);');
- indent.writeln('');
+ indent.newln();
}
indent.write(
'static void setup(${api.name}? api, {BinaryMessenger? binaryMessenger}) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method func in api.methods) {
indent.write('');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(',
);
@@ -337,15 +335,15 @@
final String messageHandlerSetter =
isMockHandler ? 'setMockMessageHandler' : 'setMessageHandler';
indent.write('if (api == null) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('channel.$messageHandlerSetter(null);');
}, addTrailingNewline: false);
indent.add(' else ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write(
'channel.$messageHandlerSetter((Object? message) async ',
);
- indent.scoped('{', '});', () {
+ indent.addScoped('{', '});', () {
final String returnType =
_addGenericTypesNullable(func.returnType);
final bool isAsync = func.isAsynchronous;
@@ -382,8 +380,9 @@
'$leftHandSide = ($argsArray[$count] as $genericArgType?)${castCall.isEmpty ? '' : '?$castCall'};');
}
if (!arg.type.isNullable) {
+ indent.writeln('assert($argName != null,');
indent.writeln(
- "assert($argName != null, 'Argument for $channelName was null, expected non-null $argType.');");
+ " 'Argument for $channelName was null, expected non-null $argType.');");
}
});
final Iterable<String> argNames =
@@ -446,12 +445,12 @@
codecName = _getCodecName(api);
_writeCodec(indent, codecName, api, root);
}
- indent.addln('');
+ indent.newln();
bool first = true;
addDocumentationComments(
indent, api.documentationComments, _docCommentSpec);
indent.write('class ${api.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.format('''
/// Constructor for [${api.name}]. The [binaryMessenger] named argument is
/// available for dependency injection. If it is left null, the default
@@ -463,10 +462,10 @@
indent
.writeln('static const MessageCodec<Object?> codec = $codecName();');
- indent.addln('');
+ indent.newln();
for (final Method func in api.methods) {
if (!first) {
- indent.writeln('');
+ indent.newln();
} else {
first = false;
}
@@ -494,7 +493,7 @@
indent.write(
'Future<${_addGenericTypesNullable(func.returnType)}> ${func.name}($argSignature) async ',
);
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
final String channelName = makeChannelName(api, func);
indent.writeln(
'final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(');
@@ -585,7 +584,6 @@
dartHostTestHandler: api.dartHostTestHandler,
documentationComments: api.documentationComments,
);
- indent.writeln('');
writeFlutterApi(
generatorOptions,
root,
@@ -621,7 +619,7 @@
"import 'package:flutter/foundation.dart' show ReadBuffer, WriteBuffer;");
indent.writeln("import 'package:flutter/services.dart';");
indent.writeln("import 'package:flutter_test/flutter_test.dart';");
- indent.writeln('');
+ indent.newln();
}
}
@@ -642,33 +640,34 @@
void _writeCodec(Indent indent, String codecName, Api api, Root root) {
assert(getCodecClasses(api, root).isNotEmpty);
final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
+ indent.newln();
indent.write('class $codecName extends $_standardMessageCodec');
- indent.scoped(' {', '}', () {
+ indent.addScoped(' {', '}', () {
indent.writeln('const $codecName();');
indent.writeln('@override');
indent.write('void writeValue(WriteBuffer buffer, Object? value) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
enumerate(codecClasses, (int index, final EnumeratedClass customClass) {
final String ifValue = 'if (value is ${customClass.name}) ';
if (index == 0) {
indent.write('');
}
indent.add(ifValue);
- indent.scoped('{', '} else ', () {
+ indent.addScoped('{', '} else ', () {
indent.writeln('buffer.putUint8(${customClass.enumeration});');
indent.writeln('writeValue(buffer, value.encode());');
}, addTrailingNewline: false);
});
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('super.writeValue(buffer, value);');
});
});
- indent.writeln('');
+ indent.newln();
indent.writeln('@override');
indent.write('Object? readValueOfType(int type, ReadBuffer buffer) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('switch (type) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass in codecClasses) {
indent.write('case ${customClass.enumeration}: ');
indent.writeScoped('', '', () {
@@ -677,7 +676,7 @@
});
}
indent.writeln('default:');
- indent.scoped('', '', () {
+ indent.nest(1, () {
indent.writeln('return super.readValueOfType(type, buffer);');
});
});
diff --git a/packages/pigeon/lib/generator_tools.dart b/packages/pigeon/lib/generator_tools.dart
index 5cfbcc5..972cd34 100644
--- a/packages/pigeon/lib/generator_tools.dart
+++ b/packages/pigeon/lib/generator_tools.dart
@@ -9,7 +9,7 @@
import 'ast.dart';
/// The current version of pigeon. This must match the version in pubspec.yaml.
-const String pigeonVersion = '7.0.0';
+const String pigeonVersion = '7.0.1';
/// Read all the content from [stdin] to a String.
String readStdin() {
@@ -83,7 +83,7 @@
/// Scoped increase of the ident level. For the execution of [func] the
/// indentation will be incremented.
- void scoped(
+ void addScoped(
String? begin,
String? end,
Function func, {
@@ -102,14 +102,14 @@
}
}
- /// Like `scoped` but writes the current indentation level.
+ /// Like `addScoped` but writes the current indentation level.
void writeScoped(
String? begin,
String end,
Function func, {
bool addTrailingNewline = true,
}) {
- scoped(str() + (begin ?? ''), end, func,
+ addScoped(str() + (begin ?? ''), end, func,
addTrailingNewline: addTrailingNewline);
}
@@ -144,6 +144,13 @@
void add(String text) {
_sink.write(text);
}
+
+ /// Adds [lines] number of newlines.
+ void newln([int lines = 1]) {
+ for (; lines > 0; lines--) {
+ _sink.write(newline);
+ }
+ }
}
/// Create the generated channel name for a [func] on a [api].
diff --git a/packages/pigeon/lib/java_generator.dart b/packages/pigeon/lib/java_generator.dart
index 65d82bf..ec5ead0 100644
--- a/packages/pigeon/lib/java_generator.dart
+++ b/packages/pigeon/lib/java_generator.dart
@@ -98,7 +98,7 @@
}
indent.writeln('// $generatedCodeWarning');
indent.writeln('// $seeAlsoWarning');
- indent.addln('');
+ indent.newln();
}
@override
@@ -106,6 +106,7 @@
JavaOptions generatorOptions, Root root, Indent indent) {
if (generatorOptions.package != null) {
indent.writeln('package ${generatorOptions.package};');
+ indent.newln();
}
indent.writeln('import android.util.Log;');
indent.writeln('import androidx.annotation.NonNull;');
@@ -116,13 +117,13 @@
indent.writeln('import io.flutter.plugin.common.StandardMessageCodec;');
indent.writeln('import java.io.ByteArrayOutputStream;');
indent.writeln('import java.nio.ByteBuffer;');
- indent.writeln('import java.util.Arrays;');
indent.writeln('import java.util.ArrayList;');
+ indent.writeln('import java.util.Arrays;');
indent.writeln('import java.util.Collections;');
+ indent.writeln('import java.util.HashMap;');
indent.writeln('import java.util.List;');
indent.writeln('import java.util.Map;');
- indent.writeln('import java.util.HashMap;');
- indent.addln('');
+ indent.newln();
}
@override
@@ -149,22 +150,23 @@
.toUpperCase();
}
- indent.writeln('');
+ indent.newln();
addDocumentationComments(
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('public enum ${anEnum.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
indent.writeln(
'${camelToSnake(member.name)}($index)${index == anEnum.members.length - 1 ? ';' : ','}');
});
- indent.writeln('');
+ indent.newln();
indent.writeln('private final int index;');
+ indent.newln();
indent.write('private ${anEnum.name}(final int index) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('this.index = index;');
});
});
@@ -181,24 +183,25 @@
const List<String> generatedMessages = <String>[
' Generated class from Pigeon that represents data sent in messages.'
];
- indent.addln('');
+ indent.newln();
addDocumentationComments(
indent, klass.documentationComments, _docCommentSpec,
generatorComments: generatedMessages);
indent.write('public static final class ${klass.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
_writeClassField(generatorOptions, root, indent, field);
- indent.addln('');
+ indent.newln();
}
if (getFieldsInSerializationOrder(klass)
.map((NamedType e) => !e.type.isNullable)
.any((bool e) => e)) {
indent.writeln(
- '${_docCommentPrefix}Constructor is private to enforce null safety; use Builder.$_docCommentSuffix');
+ '$_docCommentPrefix Constructor is private to enforce null safety; use Builder.$_docCommentSuffix');
indent.writeln('private ${klass.name}() {}');
+ indent.newln();
}
_writeClassBuilder(generatorOptions, root, indent, klass);
@@ -219,8 +222,13 @@
indent.writeln(
'private $nullability ${hostDatatype.datatype} ${field.name};');
- indent.writeln(
- 'public $nullability ${hostDatatype.datatype} ${_makeGetter(field)}() { return ${field.name}; }');
+ indent.newln();
+ indent.write(
+ 'public $nullability ${hostDatatype.datatype} ${_makeGetter(field)}() ');
+ indent.addScoped('{', '}', () {
+ indent.writeln('return ${field.name};');
+ });
+ indent.newln();
indent.writeScoped(
'public void ${_makeSetter(field)}($nullability ${hostDatatype.datatype} setterArg) {',
'}', () {
@@ -241,7 +249,7 @@
Class klass,
) {
indent.write('public static final class Builder ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
final HostDatatype hostDatatype = getFieldHostDatatype(
field,
@@ -250,8 +258,10 @@
(TypeDeclaration x) => _javaTypeForBuiltinDartType(x));
final String nullability =
field.type.isNullable ? '@Nullable' : '@NonNull';
+ indent.newln();
indent.writeln(
'private @Nullable ${hostDatatype.datatype} ${field.name};');
+ indent.newln();
indent.writeScoped(
'public @NonNull Builder ${_makeSetter(field)}($nullability ${hostDatatype.datatype} setterArg) {',
'}', () {
@@ -259,8 +269,9 @@
indent.writeln('return this;');
});
}
+ indent.newln();
indent.write('public @NonNull ${klass.name} build() ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
const String returnVal = 'pigeonReturn';
indent.writeln('${klass.name} $returnVal = new ${klass.name}();');
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
@@ -280,8 +291,10 @@
Set<String> customClassNames,
Set<String> customEnumNames,
) {
- indent.write('@NonNull ArrayList<Object> toList() ');
- indent.scoped('{', '}', () {
+ indent.newln();
+ indent.writeln('@NonNull');
+ indent.write('ArrayList<Object> toList() ');
+ indent.addScoped('{', '}', () {
indent.writeln(
'ArrayList<Object> toListResult = new ArrayList<Object>(${klass.fields.length});');
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
@@ -316,9 +329,10 @@
Set<String> customClassNames,
Set<String> customEnumNames,
) {
+ indent.newln();
indent.write(
'static @NonNull ${klass.name} fromList(@NonNull ArrayList<Object> list) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
const String result = 'pigeonResult';
indent.writeln('${klass.name} $result = new ${klass.name}();');
enumerate(getFieldsInSerializationOrder(klass),
@@ -365,26 +379,28 @@
generatorComments: generatedMessages);
indent.write('public static final class ${api.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('private final BinaryMessenger binaryMessenger;');
- indent.write('public ${api.name}(BinaryMessenger argBinaryMessenger)');
- indent.scoped('{', '}', () {
+ indent.newln();
+ indent.write('public ${api.name}(BinaryMessenger argBinaryMessenger) ');
+ indent.addScoped('{', '}', () {
indent.writeln('this.binaryMessenger = argBinaryMessenger;');
});
+ indent.newln();
indent.write('/** Public interface for sending reply. */ ');
indent.write('public interface Reply<T> ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('void reply(T reply);');
});
final String codecName = _getCodecName(api);
indent.writeln('/** The codec used by ${api.name}. */');
indent.write('static MessageCodec<Object> getCodec() ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return ');
if (getCodecClasses(api, root).isNotEmpty) {
- indent.writeln('$codecName.INSTANCE;');
+ indent.addln('$codecName.INSTANCE;');
} else {
- indent.writeln('new $_standardMessageCodec();');
+ indent.addln('new $_standardMessageCodec();');
}
});
@@ -418,32 +434,36 @@
indent.write(
'public void ${func.name}($argsSignature, Reply<$returnType> callback) ');
}
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
const String channel = 'channel';
indent.writeln('BasicMessageChannel<Object> $channel =');
- indent.inc();
- indent.inc();
- indent.writeln(
- 'new BasicMessageChannel<>(binaryMessenger, "$channelName", getCodec());');
- indent.dec();
- indent.dec();
- indent.write('$channel.send($sendArgument, channelReply -> ');
- if (func.returnType.isVoid) {
- indent.addln('callback.reply(null));');
- } else {
- indent.scoped('{', '});', () {
- const String output = 'output';
- indent.writeln('@SuppressWarnings("ConstantConditions")');
- if (func.returnType.baseName == 'int') {
- indent.writeln(
- '$returnType $output = channelReply == null ? null : ((Number)channelReply).longValue();');
- } else {
- indent.writeln(
- '$returnType $output = ($returnType)channelReply;');
- }
- indent.writeln('callback.reply($output);');
+ indent.nest(2, () {
+ indent.writeln('new BasicMessageChannel<>(');
+ indent.nest(2, () {
+ indent.writeln('binaryMessenger, "$channelName", getCodec());');
});
- }
+ });
+ indent.writeln('$channel.send(');
+ indent.nest(2, () {
+ indent.writeln('$sendArgument,');
+ indent.write('channelReply -> ');
+ if (func.returnType.isVoid) {
+ indent.addln('callback.reply(null));');
+ } else {
+ indent.addScoped('{', '});', () {
+ const String output = 'output';
+ indent.writeln('@SuppressWarnings("ConstantConditions")');
+ if (func.returnType.baseName == 'int') {
+ indent.writeln(
+ '$returnType $output = channelReply == null ? null : ((Number) channelReply).longValue();');
+ } else {
+ indent.writeln(
+ '$returnType $output = ($returnType) channelReply;');
+ }
+ indent.writeln('callback.reply($output);');
+ });
+ }
+ });
});
}
});
@@ -454,7 +474,7 @@
if (root.apis.any((Api api) =>
api.location == ApiLocation.host &&
api.methods.any((Method it) => it.isAsynchronous))) {
- indent.addln('');
+ indent.newln();
_writeResultInterface(indent);
}
super.writeApis(generatorOptions, root, indent);
@@ -480,20 +500,20 @@
generatorComments: generatedMessages);
indent.write('public interface ${api.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method method in api.methods) {
_writeInterfaceMethod(generatorOptions, root, indent, api, method);
}
- indent.addln('');
+ indent.newln();
final String codecName = _getCodecName(api);
indent.writeln('/** The codec used by ${api.name}. */');
indent.write('static MessageCodec<Object> getCodec() ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return ');
if (getCodecClasses(api, root).isNotEmpty) {
- indent.write('$codecName.INSTANCE;');
+ indent.addln('$codecName.INSTANCE;');
} else {
- indent.write('new $_standardMessageCodec();');
+ indent.addln('new $_standardMessageCodec();');
}
});
@@ -501,7 +521,7 @@
'${_docCommentPrefix}Sets up an instance of `${api.name}` to handle messages through the `binaryMessenger`.$_docCommentSuffix');
indent.write(
'static void setup(BinaryMessenger binaryMessenger, ${api.name} api) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method method in api.methods) {
_writeMethodSetup(generatorOptions, root, indent, api, method);
}
@@ -514,9 +534,12 @@
/// int add(int x, int y);
void _writeInterfaceMethod(JavaOptions generatorOptions, Root root,
Indent indent, Api api, final Method method) {
+ final String nullableType = method.isAsynchronous
+ ? ''
+ : _nullabilityAnnotationFromType(method.returnType);
final String returnType = method.isAsynchronous
? 'void'
- : _nullsafeJavaTypeForDartType(method.returnType);
+ : _javaTypeForDartType(method.returnType);
final List<String> argSignature = <String>[];
if (method.arguments.isNotEmpty) {
final Iterable<String> argTypes = method.arguments
@@ -534,9 +557,15 @@
: _javaTypeForDartType(method.returnType);
argSignature.add('Result<$resultType> result');
}
- addDocumentationComments(
- indent, method.documentationComments, _docCommentSpec);
-
+ if (method.documentationComments.isNotEmpty) {
+ addDocumentationComments(
+ indent, method.documentationComments, _docCommentSpec);
+ } else {
+ indent.newln();
+ }
+ if (nullableType != '') {
+ indent.writeln(nullableType);
+ }
indent.writeln('$returnType ${method.name}(${argSignature.join(', ')});');
}
@@ -547,7 +576,7 @@
Api api, final Method method) {
final String channelName = makeChannelName(api, method);
indent.write('');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
String? taskQueue;
if (method.taskQueueType != TaskQueueType.serial) {
taskQueue = 'taskQueue';
@@ -555,106 +584,111 @@
'BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue();');
}
indent.writeln('BasicMessageChannel<Object> channel =');
- indent.inc();
- indent.inc();
- indent.write(
- 'new BasicMessageChannel<>(binaryMessenger, "$channelName", getCodec()');
- if (taskQueue != null) {
- indent.addln(', $taskQueue);');
- } else {
- indent.addln(');');
- }
- indent.dec();
- indent.dec();
- indent.write('if (api != null) ');
- indent.scoped('{', '} else {', () {
- indent.write('channel.setMessageHandler((message, reply) -> ');
- indent.scoped('{', '});', () {
- final String returnType = method.returnType.isVoid
- ? 'Void'
- : _javaTypeForDartType(method.returnType);
- indent.writeln('ArrayList wrapped = new ArrayList<>();');
- indent.write('try ');
- indent.scoped('{', '}', () {
- final List<String> methodArgument = <String>[];
- if (method.arguments.isNotEmpty) {
- indent.writeln(
- 'ArrayList<Object> args = (ArrayList<Object>)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 if (argType != 'Object') {
- accessor = '($argType)$accessor';
- }
- indent.writeln('$argType $argName = $accessor;');
- if (!arg.type.isNullable) {
- indent.write('if ($argName == null) ');
- indent.scoped('{', '}', () {
- 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('''
-Result<$returnType> $resultName = new Result<$returnType>() {
-\tpublic void success($returnType result) {
-\t\twrapped.add(0, $resultValue);
-\t\treply.reply(wrapped);
-\t}
-\tpublic void error(Throwable error) {
-\t\tArrayList<Object> wrappedError = wrapError(error);
-\t\treply.reply(wrappedError);
-\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);');
- }
- });
- indent.write('catch (Error | RuntimeException exception) ');
- indent.scoped('{', '}', () {
- indent.writeln(
- 'ArrayList<Object> wrappedError = wrapError(exception);');
- if (method.isAsynchronous) {
- indent.writeln('reply.reply(wrappedError);');
- } else {
- indent.writeln('wrapped = wrappedError;');
- }
- });
- if (!method.isAsynchronous) {
- indent.writeln('reply.reply(wrapped);');
+ indent.nest(2, () {
+ indent.writeln('new BasicMessageChannel<>(');
+ indent.nest(2, () {
+ indent.write('binaryMessenger, "$channelName", getCodec()');
+ if (taskQueue != null) {
+ indent.addln(', $taskQueue);');
+ } else {
+ indent.addln(');');
}
});
});
- indent.scoped(null, '}', () {
+ indent.write('if (api != null) ');
+ indent.addScoped('{', '} else {', () {
+ indent.writeln('channel.setMessageHandler(');
+ indent.nest(2, () {
+ indent.write('(message, reply) -> ');
+ indent.addScoped('{', '});', () {
+ final String returnType = method.returnType.isVoid
+ ? 'Void'
+ : _javaTypeForDartType(method.returnType);
+ indent.writeln('ArrayList wrapped = new ArrayList<>();');
+ indent.write('try ');
+ indent.addScoped('{', '}', () {
+ final List<String> methodArgument = <String>[];
+ if (method.arguments.isNotEmpty) {
+ indent.writeln(
+ 'ArrayList<Object> args = (ArrayList<Object>) 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 if (argType != 'Object') {
+ accessor = '($argType) $accessor';
+ }
+ 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('''
+Result<$returnType> $resultName =
+\t\tnew Result<$returnType>() {
+\t\t\tpublic void success($returnType result) {
+\t\t\t\twrapped.add(0, $resultValue);
+\t\t\t\treply.reply(wrapped);
+\t\t\t}
+
+\t\t\tpublic void error(Throwable error) {
+\t\t\t\tArrayList<Object> wrappedError = wrapError(error);
+\t\t\t\treply.reply(wrappedError);
+\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<Object> wrappedError = wrapError(exception);');
+ if (method.isAsynchronous) {
+ indent.writeln('reply.reply(wrappedError);');
+ } else {
+ indent.writeln('wrapped = wrappedError;');
+ }
+ });
+ if (!method.isAsynchronous) {
+ indent.writeln('reply.reply(wrapped);');
+ }
+ });
+ });
+ });
+ indent.addScoped(null, '}', () {
indent.writeln('channel.setMessageHandler(null);');
});
});
@@ -667,66 +701,78 @@
assert(getCodecClasses(api, root).isNotEmpty);
final Iterable<EnumeratedClass> codecClasses = getCodecClasses(api, root);
final String codecName = _getCodecName(api);
+ indent.newln();
indent.write(
'private static class $codecName extends $_standardMessageCodec ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'public static final $codecName INSTANCE = new $codecName();');
+ indent.newln();
indent.writeln('private $codecName() {}');
+ indent.newln();
indent.writeln('@Override');
indent.write(
'protected Object readValueOfType(byte type, @NonNull ByteBuffer buffer) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('switch (type) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass in codecClasses) {
- indent.write('case (byte)${customClass.enumeration}: ');
+ indent.write('case (byte) ${customClass.enumeration}: ');
indent.writeScoped('', '', () {
indent.writeln(
'return ${customClass.name}.fromList((ArrayList<Object>) readValue(buffer));');
});
}
indent.write('default:');
- indent.writeScoped('', '', () {
+ indent.addScoped('', '', () {
indent.writeln('return super.readValueOfType(type, buffer);');
- });
+ }, addTrailingNewline: false);
});
});
+ indent.newln();
indent.writeln('@Override');
indent.write(
'protected void writeValue(@NonNull ByteArrayOutputStream stream, Object value) ');
- indent.writeScoped('{', '}', () {
+ indent.addScoped('{', '}', () {
+ bool firstClass = true;
for (final EnumeratedClass customClass in codecClasses) {
- indent.write('if (value instanceof ${customClass.name}) ');
- indent.scoped('{', '} else ', () {
+ if (firstClass) {
+ indent.write('');
+ firstClass = false;
+ }
+ indent.add('if (value instanceof ${customClass.name}) ');
+ indent.addScoped('{', '} else ', () {
indent.writeln('stream.write(${customClass.enumeration});');
indent.writeln(
'writeValue(stream, ((${customClass.name}) value).toList());');
- });
+ }, addTrailingNewline: false);
}
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('super.writeValue(stream, value);');
});
});
});
- indent.addln('');
+ indent.newln();
}
void _writeResultInterface(Indent indent) {
indent.write('public interface Result<T> ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('void success(T result);');
+ indent.newln();
indent.writeln('void error(Throwable error);');
});
}
void _writeWrapError(Indent indent) {
indent.format('''
-@NonNull private static ArrayList<Object> wrapError(@NonNull Throwable exception) {
+@NonNull
+private static ArrayList<Object> wrapError(@NonNull Throwable exception) {
\tArrayList<Object> errorList = new ArrayList<>(3);
\terrorList.add(exception.toString());
\terrorList.add(exception.getClass().getSimpleName());
-\terrorList.add("Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception));
+\terrorList.add(
+\t\t"Cause: " + exception.getCause() + ", Stacktrace: " + Log.getStackTraceString(exception));
\treturn errorList;
}''');
}
@@ -751,7 +797,7 @@
/// Converts an expression that evaluates to an nullable int to an expression
/// that evaluates to a nullable enum.
String _intToEnum(String expression, String enumName) =>
- '$expression == null ? null : $enumName.values()[(int)$expression]';
+ '$expression == null ? null : $enumName.values()[(int) $expression]';
String _getArgumentName(int count, NamedType argument) =>
argument.name.isEmpty ? 'arg$count' : argument.name;
@@ -815,9 +861,12 @@
return _javaTypeForBuiltinDartType(type) ?? type.baseName;
}
+String _nullabilityAnnotationFromType(TypeDeclaration type) {
+ return type.isVoid ? '' : (type.isNullable ? '@Nullable ' : '@NonNull ');
+}
+
String _nullsafeJavaTypeForDartType(TypeDeclaration type) {
- final String nullSafe =
- type.isVoid ? '' : (type.isNullable ? '@Nullable ' : '@NonNull ');
+ final String nullSafe = _nullabilityAnnotationFromType(type);
return '$nullSafe${_javaTypeForDartType(type)}';
}
@@ -829,11 +878,11 @@
final HostDatatype hostDatatype = getFieldHostDatatype(field, classes, enums,
(TypeDeclaration x) => _javaTypeForBuiltinDartType(x));
if (field.type.baseName == 'int') {
- return '($varName == null) ? null : (($varName instanceof Integer) ? (Integer)$varName : (${hostDatatype.datatype})$varName)';
+ return '($varName == null) ? null : (($varName instanceof Integer) ? (Integer) $varName : (${hostDatatype.datatype}) $varName)';
} else if (!hostDatatype.isBuiltin &&
classes.map((Class x) => x.name).contains(field.type.baseName)) {
- return '($varName == null) ? null : ${hostDatatype.datatype}.fromList((ArrayList<Object>)$varName)';
+ return '($varName == null) ? null : ${hostDatatype.datatype}.fromList((ArrayList<Object>) $varName)';
} else {
- return '(${hostDatatype.datatype})$varName';
+ return '(${hostDatatype.datatype}) $varName';
}
}
diff --git a/packages/pigeon/lib/kotlin_generator.dart b/packages/pigeon/lib/kotlin_generator.dart
index 178309a..ab2cc2a 100644
--- a/packages/pigeon/lib/kotlin_generator.dart
+++ b/packages/pigeon/lib/kotlin_generator.dart
@@ -83,11 +83,11 @@
@override
void writeFileImports(
KotlinOptions generatorOptions, Root root, Indent indent) {
- indent.addln('');
+ indent.newln();
if (generatorOptions.package != null) {
indent.writeln('package ${generatorOptions.package}');
}
- indent.addln('');
+ indent.newln();
indent.writeln('import android.util.Log');
indent.writeln('import io.flutter.plugin.common.BasicMessageChannel');
indent.writeln('import io.flutter.plugin.common.BinaryMessenger');
@@ -100,11 +100,11 @@
@override
void writeEnum(
KotlinOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
- indent.writeln('');
+ indent.newln();
addDocumentationComments(
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('enum class ${anEnum.name}(val raw: Int) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
@@ -116,11 +116,11 @@
}
});
- indent.writeln('');
+ indent.newln();
indent.write('companion object ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('fun ofRaw(raw: Int): ${anEnum.name}? ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('return values().firstOrNull { it.raw == raw }');
});
});
@@ -138,24 +138,24 @@
const List<String> generatedMessages = <String>[
' Generated class from Pigeon that represents data sent in messages.'
];
- indent.addln('');
+ indent.newln();
addDocumentationComments(
indent, klass.documentationComments, _docCommentSpec,
generatorComments: generatedMessages);
indent.write('data class ${klass.name} ');
- indent.scoped('(', '', () {
+ indent.addScoped('(', '', () {
for (final NamedType element in getFieldsInSerializationOrder(klass)) {
_writeClassField(indent, element);
if (getFieldsInSerializationOrder(klass).last != element) {
indent.addln(',');
} else {
- indent.addln('');
+ indent.newln();
}
}
});
- indent.scoped(') {', '}', () {
+ indent.addScoped(') {', '}', () {
writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
customEnumNames);
writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
@@ -173,9 +173,9 @@
Set<String> customEnumNames,
) {
indent.write('fun toList(): List<Any?> ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return listOf<Any?>');
- indent.scoped('(', ')', () {
+ indent.addScoped('(', ')', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
final HostDatatype hostDatatype = _getHostDatatype(root, field);
String toWriteValue = '';
@@ -207,11 +207,11 @@
final String className = klass.name;
indent.write('companion object ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('@Suppress("UNCHECKED_CAST")');
indent.write('fun fromList(list: List<Any?>): $className ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
enumerate(getFieldsInSerializationOrder(klass),
(int index, final NamedType field) {
final HostDatatype hostDatatype = _getHostDatatype(root, field);
@@ -229,14 +229,14 @@
customClassNames.contains(field.type.baseName)) {
indent.write('val ${field.name}: $fieldType? = ');
indent.add('($listValue as? List<Any?>)?.let ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('$fieldType.fromList(it)');
});
} else if (!hostDatatype.isBuiltin &&
customEnumNames.contains(field.type.baseName)) {
indent.write('val ${field.name}: $fieldType? = ');
indent.add('($listValue as? Int)?.let ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('$fieldType.ofRaw(it)');
});
} else if (isInt) {
@@ -290,7 +290,7 @@
if (root.apis.any((Api api) =>
api.location == ApiLocation.host &&
api.methods.any((Method it) => it.isAsynchronous))) {
- indent.addln('');
+ indent.newln();
}
super.writeApis(generatorOptions, root, indent);
}
@@ -323,12 +323,12 @@
indent.writeln('@Suppress("UNCHECKED_CAST")');
indent
.write('class $apiName(private val binaryMessenger: BinaryMessenger) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('companion object ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('/** The codec used by $apiName. */');
indent.write('val codec: MessageCodec<Any?> by lazy ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
if (isCustomCodec) {
indent.writeln(_getCodecName(api));
} else {
@@ -366,18 +366,18 @@
'fun ${func.name}($argsSignature, callback: ($returnType) -> Unit) ');
}
}
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
const String channel = 'channel';
indent.writeln(
'val $channel = BasicMessageChannel<Any?>(binaryMessenger, "$channelName", codec)');
indent.write('$channel.send($sendArgument) ');
if (func.returnType.isVoid) {
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('callback()');
});
} else {
final String forceUnwrap = func.returnType.isNullable ? '?' : '';
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('val result = it as$forceUnwrap $returnType');
indent.writeln('callback(result)');
});
@@ -418,7 +418,7 @@
generatorComments: generatedMessages);
indent.write('interface $apiName ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method method in api.methods) {
final List<String> argSignature = <String>[];
if (method.arguments.isNotEmpty) {
@@ -450,12 +450,12 @@
}
}
- indent.addln('');
+ indent.newln();
indent.write('companion object ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('/** The codec used by $apiName. */');
indent.write('val codec: MessageCodec<Any?> by lazy ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
if (isCustomCodec) {
indent.writeln(_getCodecName(api));
} else {
@@ -467,10 +467,10 @@
indent.writeln('@Suppress("UNCHECKED_CAST")');
indent.write(
'fun setUp(binaryMessenger: BinaryMessenger, api: $apiName?) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method method in api.methods) {
indent.write('run ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
String? taskQueue;
if (method.taskQueueType != TaskQueueType.serial) {
taskQueue = 'taskQueue';
@@ -490,15 +490,15 @@
}
indent.write('if (api != null) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
final String messageVarName =
method.arguments.isNotEmpty ? 'message' : '_';
indent.write('channel.setMessageHandler ');
- indent.scoped('{ $messageVarName, reply ->', '}', () {
+ indent.addScoped('{ $messageVarName, reply ->', '}', () {
indent.writeln('var wrapped = listOf<Any?>()');
indent.write('try ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
final List<String> methodArgument = <String>[];
if (method.arguments.isNotEmpty) {
indent.writeln('val args = message as List<Any?>');
@@ -516,7 +516,7 @@
indent.write('$call ');
final String resultValue =
method.returnType.isVoid ? 'null' : 'it';
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('reply.reply(wrapResult($resultValue))');
});
} else if (method.returnType.isVoid) {
@@ -527,7 +527,7 @@
}
}, addTrailingNewline: false);
indent.add(' catch (exception: Error) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('wrapped = wrapError(exception)');
if (method.isAsynchronous) {
indent.writeln('reply.reply(wrapped)');
@@ -538,7 +538,7 @@
}
});
}, addTrailingNewline: false);
- indent.scoped(' else {', '}', () {
+ indent.addScoped(' else {', '}', () {
indent.writeln('channel.setMessageHandler(null)');
});
});
@@ -557,17 +557,17 @@
final String codecName = _getCodecName(api);
indent.writeln('@Suppress("UNCHECKED_CAST")');
indent.write('private object $codecName : StandardMessageCodec() ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write(
'override fun readValueOfType(type: Byte, buffer: ByteBuffer): Any? ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return when (type) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass in codecClasses) {
indent.write('${customClass.enumeration}.toByte() -> ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return (readValue(buffer) as? List<Any?>)?.let ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('${customClass.name}.fromList(it)');
});
});
@@ -580,10 +580,10 @@
'override fun writeValue(stream: ByteArrayOutputStream, value: Any?) ');
indent.writeScoped('{', '}', () {
indent.write('when (value) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass in codecClasses) {
indent.write('is ${customClass.name} -> ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('stream.write(${customClass.enumeration})');
indent.writeln('writeValue(stream, value.toList())');
});
@@ -592,23 +592,23 @@
});
});
});
- indent.addln('');
+ indent.newln();
}
void _writeWrapResult(Indent indent) {
- indent.addln('');
+ indent.newln();
indent.write('private fun wrapResult(result: Any?): List<Any?> ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('return listOf(result)');
});
}
void _writeWrapError(Indent indent) {
- indent.addln('');
+ indent.newln();
indent.write('private fun wrapError(exception: Throwable): List<Any> ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return ');
- indent.scoped('listOf<Any>(', ')', () {
+ indent.addScoped('listOf<Any>(', ')', () {
indent.writeln('exception.javaClass.simpleName,');
indent.writeln('exception.toString(),');
indent.writeln(
diff --git a/packages/pigeon/lib/objc_generator.dart b/packages/pigeon/lib/objc_generator.dart
index 2b165c9..17b3d9c 100644
--- a/packages/pigeon/lib/objc_generator.dart
+++ b/packages/pigeon/lib/objc_generator.dart
@@ -96,20 +96,20 @@
}
indent.writeln('// $generatedCodeWarning');
indent.writeln('// $seeAlsoWarning');
- indent.addln('');
+ indent.newln();
}
@override
void writeFileImports(
ObjcOptions generatorOptions, Root root, Indent indent) {
indent.writeln('#import <Foundation/Foundation.h>');
- indent.addln('');
+ indent.newln();
indent.writeln('@protocol FlutterBinaryMessenger;');
indent.writeln('@protocol FlutterMessageCodec;');
indent.writeln('@class FlutterError;');
indent.writeln('@class FlutterStandardTypedData;');
- indent.addln('');
+ indent.newln();
indent.writeln('NS_ASSUME_NONNULL_BEGIN');
}
@@ -117,12 +117,12 @@
void writeEnum(
ObjcOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
final String enumName = _className(generatorOptions.prefix, anEnum.name);
- indent.writeln('');
+ indent.newln();
addDocumentationComments(
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('typedef NS_ENUM(NSUInteger, $enumName) ');
- indent.scoped('{', '};', () {
+ indent.addScoped('{', '};', () {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
@@ -136,12 +136,12 @@
@override
void writeDataClasses(
ObjcOptions generatorOptions, Root root, Indent indent) {
- indent.writeln('');
+ indent.newln();
for (final Class klass in root.classes) {
indent.writeln(
'@class ${_className(generatorOptions.prefix, klass.name)};');
}
- indent.writeln('');
+ indent.newln();
super.writeDataClasses(generatorOptions, root, indent);
}
@@ -192,7 +192,7 @@
'@property(nonatomic, $propertyType$nullability) ${hostDatatype.datatype} ${field.name};');
}
indent.writeln('@end');
- indent.writeln('');
+ indent.newln();
}
@override
@@ -232,7 +232,7 @@
'$_docCommentPrefix The codec used by ${_className(generatorOptions.prefix, api.name)}.');
indent.writeln(
'NSObject<FlutterMessageCodec> *${_getCodecGetterName(generatorOptions.prefix, api.name)}(void);');
- indent.addln('');
+ indent.newln();
final String apiName = _className(generatorOptions.prefix, api.name);
addDocumentationComments(
indent, api.documentationComments, _docCommentSpec);
@@ -257,7 +257,7 @@
)};');
}
indent.writeln('@end');
- indent.writeln('');
+ indent.newln();
}
@override
@@ -271,7 +271,7 @@
'$_docCommentPrefix The codec used by ${_className(generatorOptions.prefix, api.name)}.');
indent.writeln(
'NSObject<FlutterMessageCodec> *${_getCodecGetterName(generatorOptions.prefix, api.name)}(void);');
- indent.addln('');
+ indent.newln();
final String apiName = _className(generatorOptions.prefix, api.name);
addDocumentationComments(
indent, api.documentationComments, _docCommentSpec);
@@ -287,11 +287,11 @@
if (func.isAsynchronous) {
returnType = 'void';
if (func.returnType.isVoid) {
- lastArgType = 'void(^)(FlutterError *_Nullable)';
+ lastArgType = 'void (^)(FlutterError *_Nullable)';
lastArgName = 'completion';
} else {
lastArgType =
- 'void(^)(${returnTypeName.ptr}_Nullable, FlutterError *_Nullable)';
+ 'void (^)(${returnTypeName.ptr}_Nullable, FlutterError *_Nullable)';
lastArgName = 'completion';
}
} else {
@@ -322,10 +322,10 @@
indent.writeln('$signature;');
}
indent.writeln('@end');
- indent.writeln('');
+ indent.newln();
indent.writeln(
'extern void ${apiName}Setup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<$apiName> *_Nullable api);');
- indent.writeln('');
+ indent.newln();
}
}
@@ -342,7 +342,7 @@
}
indent.writeln('// $generatedCodeWarning');
indent.writeln('// $seeAlsoWarning');
- indent.addln('');
+ indent.newln();
}
@override
@@ -350,24 +350,23 @@
ObjcOptions generatorOptions, Root root, Indent indent) {
indent.writeln('#import "${generatorOptions.headerIncludePath}"');
indent.writeln('#import <Flutter/Flutter.h>');
- indent.addln('');
+ indent.newln();
indent.writeln('#if !__has_feature(objc_arc)');
indent.writeln('#error File requires ARC to be enabled.');
indent.writeln('#endif');
- indent.addln('');
+ indent.newln();
}
@override
void writeDataClasses(
ObjcOptions generatorOptions, Root root, Indent indent) {
_writeObjcSourceHelperFunctions(indent);
- indent.addln('');
for (final Class klass in root.classes) {
_writeObjcSourceDataClassExtension(generatorOptions, indent, klass);
}
- indent.writeln('');
+ indent.newln();
super.writeDataClasses(generatorOptions, root, indent);
}
@@ -388,7 +387,7 @@
writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
customEnumNames);
indent.writeln('@end');
- indent.writeln('');
+ indent.newln();
}
@override
@@ -401,9 +400,9 @@
Set<String> customEnumNames,
) {
indent.write('- (NSArray *)toList ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return');
- indent.scoped(' @[', '];', () {
+ indent.addScoped(' @[', '];', () {
for (final NamedType field in klass.fields) {
indent.writeln(
'${_arrayValue(customClassNames, customEnumNames, field)},');
@@ -423,7 +422,7 @@
) {
final String className = _className(generatorOptions.prefix, klass.name);
indent.write('+ ($className *)fromList:(NSArray *)list ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
const String resultName = 'pigeonResult';
indent.writeln('$className *$resultName = [[$className alloc] init];');
enumerate(getFieldsInSerializationOrder(klass),
@@ -442,8 +441,10 @@
indent.writeln('return $resultName;');
});
- indent.writeln(
- '+ (nullable $className *)nullableFromList:(NSArray *)list { return (list) ? [$className fromList:list] : nil; }');
+ indent.write('+ (nullable $className *)nullableFromList:(NSArray *)list ');
+ indent.addScoped('{', '}', () {
+ indent.writeln('return (list) ? [$className fromList:list] : nil;');
+ });
}
void _writeCodecAndGetter(
@@ -451,10 +452,10 @@
final String codecName = _getCodecName(generatorOptions.prefix, api.name);
if (getCodecClasses(api, root).isNotEmpty) {
_writeCodec(indent, codecName, generatorOptions, api, root);
- indent.addln('');
+ indent.newln();
}
_writeCodecGetter(indent, codecName, generatorOptions, api, root);
- indent.addln('');
+ indent.newln();
}
@override
@@ -470,15 +471,15 @@
_writeCodecAndGetter(generatorOptions, root, indent, api);
_writeExtension(indent, apiName);
- indent.addln('');
+ indent.newln();
indent.writeln('@implementation $apiName');
- indent.addln('');
+ indent.newln();
_writeInitializer(indent);
for (final Method func in api.methods) {
_writeMethod(generatorOptions, root, indent, api, func);
}
indent.writeln('@end');
- indent.writeln('');
+ indent.newln();
}
@override
@@ -496,13 +497,12 @@
const String channelName = 'channel';
indent.write(
'void ${apiName}Setup(id<FlutterBinaryMessenger> binaryMessenger, NSObject<$apiName> *api) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method func in api.methods) {
- indent.write('');
addDocumentationComments(
indent, func.documentationComments, _docCommentSpec);
- indent.scoped('{', '}', () {
+ indent.writeScoped('{', '}', () {
String? taskQueue;
if (func.taskQueueType != TaskQueueType.serial) {
taskQueue = 'taskQueue';
@@ -512,12 +512,12 @@
_writeChannelAllocation(
generatorOptions, indent, api, func, channelName, taskQueue);
indent.write('if (api) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
_writeChannelApiBinding(
generatorOptions, root, indent, apiName, func, channelName);
- });
- indent.write('else ');
- indent.scoped('{', '}', () {
+ }, addTrailingNewline: false);
+ indent.add(' else ');
+ indent.addScoped('{', '}', () {
indent.writeln('[$channelName setMessageHandler:nil];');
});
});
@@ -595,7 +595,7 @@
'NSCAssert([api respondsToSelector:@selector($selector)], @"$apiName api (%@) doesn\'t respond to @selector($selector)", api);');
indent.write(
'[$channel setMessageHandler:^(id _Nullable message, FlutterReply callback) ');
- indent.scoped('{', '}];', () {
+ indent.addScoped('{', '}];', () {
final _ObjcPtr returnType =
_objcTypeForDartType(generatorOptions.prefix, func.returnType);
final Iterable<String> selectorComponents =
@@ -624,54 +624,56 @@
void _writeChannelAllocation(ObjcOptions generatorOptions, Indent indent,
Api api, Method func, String varName, String? taskQueue) {
indent.writeln('FlutterBasicMessageChannel *$varName =');
- indent.inc();
- indent.writeln('[[FlutterBasicMessageChannel alloc]');
- indent.inc();
- indent.writeln('initWithName:@"${makeChannelName(api, func)}"');
- indent.writeln('binaryMessenger:binaryMessenger');
- indent.write('codec:');
- indent.add('${_getCodecGetterName(generatorOptions.prefix, api.name)}()');
+ indent.nest(1, () {
+ indent.writeln('[[FlutterBasicMessageChannel alloc]');
+ indent.nest(1, () {
+ indent.writeln('initWithName:@"${makeChannelName(api, func)}"');
+ indent.writeln('binaryMessenger:binaryMessenger');
+ indent.write('codec:');
+ indent
+ .add('${_getCodecGetterName(generatorOptions.prefix, api.name)}()');
- if (taskQueue != null) {
- indent.addln('');
- indent.addln('taskQueue:$taskQueue];');
- } else {
- indent.addln('];');
- }
- indent.dec();
- indent.dec();
+ if (taskQueue != null) {
+ indent.newln();
+ indent.addln('taskQueue:$taskQueue];');
+ } else {
+ indent.addln('];');
+ }
+ });
+ });
}
void _writeObjcSourceHelperFunctions(Indent indent) {
indent.format('''
static NSArray *wrapResult(id result, FlutterError *error) {
\tif (error) {
-\t\treturn @[ error.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null] ];
+\t\treturn @[
+\t\t\terror.code ?: [NSNull null], error.message ?: [NSNull null], error.details ?: [NSNull null]
+\t\t];
\t}
-\treturn @[ result ?: [NSNull null] ];
+\treturn @[ result ?: [NSNull null] ];
}''');
indent.format('''
-static id GetNullableObject(NSDictionary* dict, id key) {
+static id GetNullableObject(NSDictionary *dict, id key) {
\tid result = dict[key];
\treturn (result == [NSNull null]) ? nil : result;
}
-static id GetNullableObjectAtIndex(NSArray* array, NSInteger key) {
+static id GetNullableObjectAtIndex(NSArray *array, NSInteger key) {
\tid result = array[key];
\treturn (result == [NSNull null]) ? nil : result;
-}
-''');
+}''');
}
void _writeObjcSourceDataClassExtension(
ObjcOptions languageOptions, Indent indent, Class klass) {
final String className = _className(languageOptions.prefix, klass.name);
+ indent.newln();
indent.writeln('@interface $className ()');
indent.writeln('+ ($className *)fromList:(NSArray *)list;');
indent
.writeln('+ (nullable $className *)nullableFromList:(NSArray *)list;');
indent.writeln('- (NSArray *)toList;');
indent.writeln('@end');
- indent.writeln('');
}
void _writeObjcSourceClassInitializer(
@@ -715,10 +717,10 @@
indent.writeln('@interface $readerName : FlutterStandardReader');
indent.writeln('@end');
indent.writeln('@implementation $readerName');
- indent.writeln('- (nullable id)readValueOfType:(UInt8)type ');
- indent.scoped('{', '}', () {
+ indent.write('- (nullable id)readValueOfType:(UInt8)type ');
+ indent.addScoped('{', '}', () {
indent.write('switch (type) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass in codecClasses) {
indent.write('case ${customClass.enumeration}: ');
indent.writeScoped('', '', () {
@@ -726,33 +728,38 @@
'return [${_className(options.prefix, customClass.name)} fromList:[self readValue]];');
});
}
- indent.write('default:');
- indent.writeScoped('', '', () {
+ indent.writeln('default:');
+ indent.nest(1, () {
indent.writeln('return [super readValueOfType:type];');
});
});
});
indent.writeln('@end');
- indent.addln('');
+ indent.newln();
indent.writeln('@interface $writerName : FlutterStandardWriter');
indent.writeln('@end');
indent.writeln('@implementation $writerName');
- indent.writeln('- (void)writeValue:(id)value ');
- indent.scoped('{', '}', () {
+ indent.write('- (void)writeValue:(id)value ');
+ indent.addScoped('{', '}', () {
+ bool firstClass = true;
for (final EnumeratedClass customClass in codecClasses) {
- indent.write(
+ if (firstClass) {
+ indent.write('');
+ firstClass = false;
+ }
+ indent.add(
'if ([value isKindOfClass:[${_className(options.prefix, customClass.name)} class]]) ');
- indent.scoped('{', '} else ', () {
+ indent.addScoped('{', '} else ', () {
indent.writeln('[self writeByte:${customClass.enumeration}];');
indent.writeln('[self writeValue:[value toList]];');
- });
+ }, addTrailingNewline: false);
}
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('[super writeValue:value];');
});
});
indent.writeln('@end');
- indent.addln('');
+ indent.newln();
indent.format('''
@interface $readerWriterName : FlutterStandardReaderWriter
@end
@@ -763,8 +770,7 @@
- (FlutterStandardReader *)readerWithData:(NSData *)data {
\treturn [[$readerName alloc] initWithData:data];
}
-@end
-''');
+@end''');
}
void _writeCodecGetter(
@@ -773,13 +779,13 @@
indent.write(
'NSObject<FlutterMessageCodec> *${_getCodecGetterName(options.prefix, api.name)}() ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent
.writeln('static FlutterStandardMessageCodec *sSharedObject = nil;');
if (getCodecClasses(api, root).isNotEmpty) {
indent.writeln('static dispatch_once_t sPred = 0;');
indent.write('dispatch_once(&sPred, ^');
- indent.scoped('{', '});', () {
+ indent.addScoped('{', '});', () {
indent.writeln(
'$readerWriterName *readerWriter = [[$readerWriterName alloc] init];');
indent.writeln(
@@ -809,7 +815,7 @@
final void Function(String) printer = isFirst
? indent.add
: (String x) {
- indent.addln('');
+ indent.newln();
indent.write(x);
};
isFirst = false;
@@ -840,8 +846,8 @@
/// Calculates callback block signature for for async methods.
String _callbackForType(TypeDeclaration type, _ObjcPtr objcType) {
return type.isVoid
- ? 'void(^)(NSError *_Nullable)'
- : 'void(^)(${objcType.ptr.trim()}_Nullable, NSError *_Nullable)';
+ ? 'void (^)(NSError *_Nullable)'
+ : 'void (^)(${objcType.ptr.trim()}_Nullable, NSError *_Nullable)';
}
/// Represents an ObjC pointer (ex 'id', 'NSString *').
@@ -1050,17 +1056,17 @@
void _writeExtension(Indent indent, String apiName) {
indent.writeln('@interface $apiName ()');
indent.writeln(
- '@property (nonatomic, strong) NSObject<FlutterBinaryMessenger> *binaryMessenger;');
+ '@property(nonatomic, strong) NSObject<FlutterBinaryMessenger> *binaryMessenger;');
indent.writeln('@end');
}
void _writeInitializer(Indent indent) {
indent.write(
'- (instancetype)initWithBinaryMessenger:(NSObject<FlutterBinaryMessenger> *)binaryMessenger ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('self = [super init];');
indent.write('if (self) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('_binaryMessenger = binaryMessenger;');
});
indent.writeln('return self;');
@@ -1091,20 +1097,21 @@
argNameFunc: argNameFunc,
isEnum: (TypeDeclaration t) => isEnum(root, t),
));
- indent.scoped(' {', '}', () {
+ indent.addScoped(' {', '}', () {
indent.writeln('FlutterBasicMessageChannel *channel =');
- indent.inc();
- indent.writeln('[FlutterBasicMessageChannel');
- indent.inc();
- indent.writeln('messageChannelWithName:@"${makeChannelName(api, func)}"');
- indent.writeln('binaryMessenger:self.binaryMessenger');
- indent.write(
- 'codec:${_getCodecGetterName(languageOptions.prefix, api.name)}()');
- indent.addln('];');
- indent.dec();
- indent.dec();
+ indent.nest(1, () {
+ indent.writeln('[FlutterBasicMessageChannel');
+ indent.nest(1, () {
+ indent
+ .writeln('messageChannelWithName:@"${makeChannelName(api, func)}"');
+ indent.writeln('binaryMessenger:self.binaryMessenger');
+ indent.write(
+ 'codec:${_getCodecGetterName(languageOptions.prefix, api.name)}()');
+ indent.addln('];');
+ });
+ });
indent.write('[channel sendMessage:$sendArgument reply:^(id reply) ');
- indent.scoped('{', '}];', () {
+ indent.addScoped('{', '}];', () {
if (func.returnType.isVoid) {
indent.writeln('completion(nil);');
} else {
diff --git a/packages/pigeon/lib/swift_generator.dart b/packages/pigeon/lib/swift_generator.dart
index d8f5b1a..b0aa98d 100644
--- a/packages/pigeon/lib/swift_generator.dart
+++ b/packages/pigeon/lib/swift_generator.dart
@@ -61,7 +61,7 @@
}
indent.writeln('// $generatedCodeWarning');
indent.writeln('// $seeAlsoWarning');
- indent.addln('');
+ indent.newln();
}
@override
@@ -77,18 +77,18 @@
#error("Unsupported platform.")
#endif
''');
- indent.writeln('');
+ indent.newln();
}
@override
void writeEnum(
SwiftOptions generatorOptions, Root root, Indent indent, Enum anEnum) {
- indent.writeln('');
+ indent.newln();
addDocumentationComments(
indent, anEnum.documentationComments, _docCommentSpec);
indent.write('enum ${anEnum.name}: Int ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
enumerate(anEnum.members, (int index, final EnumMember member) {
addDocumentationComments(
indent, member.documentationComments, _docCommentSpec);
@@ -108,18 +108,18 @@
const List<String> generatedComments = <String>[
' Generated class from Pigeon that represents data sent in messages.'
];
- indent.addln('');
+ indent.newln();
addDocumentationComments(
indent, klass.documentationComments, _docCommentSpec,
generatorComments: generatedComments);
indent.write('struct ${klass.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
getFieldsInSerializationOrder(klass).forEach((NamedType field) {
_writeClassField(indent, field);
});
- indent.writeln('');
+ indent.newln();
writeClassDecode(generatorOptions, root, indent, klass, customClassNames,
customEnumNames);
writeClassEncode(generatorOptions, root, indent, klass, customClassNames,
@@ -137,9 +137,9 @@
Set<String> customEnumNames,
) {
indent.write('func toList() -> [Any?] ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return ');
- indent.scoped('[', ']', () {
+ indent.addScoped('[', ']', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
final HostDatatype hostDatatype = _getHostDatatype(root, field);
String toWriteValue = '';
@@ -173,7 +173,7 @@
final String className = klass.name;
indent.write('static func fromList(_ list: [Any?]) -> $className? ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
enumerate(getFieldsInSerializationOrder(klass),
(int index, final NamedType field) {
final HostDatatype hostDatatype = _getHostDatatype(root, field);
@@ -186,7 +186,7 @@
customClassNames.contains(field.type.baseName)) {
indent.writeln('var ${field.name}: $fieldType? = nil');
indent.write('if let ${field.name}List = $listValue as? [Any?] ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'${field.name} = $fieldType.fromList(${field.name}List)');
});
@@ -194,7 +194,7 @@
customEnumNames.contains(field.type.baseName)) {
indent.writeln('var ${field.name}: $fieldType? = nil');
indent.write('if let ${field.name}RawValue = $listValue as? Int ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'${field.name} = $fieldType(rawValue: ${field.name}RawValue)');
});
@@ -216,9 +216,9 @@
}
});
- indent.writeln('');
+ indent.newln();
indent.write('return ');
- indent.scoped('$className(', ')', () {
+ indent.addScoped('$className(', ')', () {
for (final NamedType field in getFieldsInSerializationOrder(klass)) {
final String comma =
getFieldsInSerializationOrder(klass).last == field ? '' : ',';
@@ -247,7 +247,7 @@
if (root.apis.any((Api api) =>
api.location == ApiLocation.host &&
api.methods.any((Method it) => it.isAsynchronous))) {
- indent.addln('');
+ indent.newln();
}
super.writeApis(generatorOptions, root, indent);
}
@@ -278,10 +278,10 @@
generatorComments: generatedComments);
indent.write('class ${api.name} ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('private let binaryMessenger: FlutterBinaryMessenger');
indent.write('init(binaryMessenger: FlutterBinaryMessenger)');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('self.binaryMessenger = binaryMessenger');
});
final String codecName = _getCodecName(api);
@@ -289,7 +289,7 @@
if (getCodecClasses(api, root).isNotEmpty) {
codecArgumentString = ', codec: codec';
indent.write('var codec: FlutterStandardMessageCodec ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('return $codecName.shared');
});
}
@@ -328,17 +328,17 @@
'func ${func.name}($argsSignature, completion: @escaping ($returnType) -> Void) ');
}
}
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
const String channel = 'channel';
indent.writeln(
'let $channel = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger$codecArgumentString)');
indent.write('$channel.sendMessage($sendArgument) ');
if (func.returnType.isVoid) {
- indent.scoped('{ _ in', '}', () {
+ indent.addScoped('{ _ in', '}', () {
indent.writeln('completion()');
});
} else {
- indent.scoped('{ response in', '}', () {
+ indent.addScoped('{ response in', '}', () {
indent.writeln(
'let result = ${_castForceUnwrap("response", func.returnType, root)}');
indent.writeln('completion(result)');
@@ -377,7 +377,7 @@
generatorComments: generatedComments);
indent.write('protocol $apiName ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method method in api.methods) {
final List<String> argSignature = <String>[];
if (method.arguments.isNotEmpty) {
@@ -409,11 +409,11 @@
}
});
- indent.addln('');
+ indent.newln();
indent.writeln(
'$_docCommentPrefix Generated setup class from Pigeon to handle messages through the `binaryMessenger`.');
indent.write('class ${apiName}Setup ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
final String codecName = _getCodecName(api);
indent.writeln('$_docCommentPrefix The codec used by $apiName.');
String codecArgumentString = '';
@@ -426,7 +426,7 @@
'$_docCommentPrefix Sets up an instance of `$apiName` to handle messages through the `binaryMessenger`.');
indent.write(
'static func setUp(binaryMessenger: FlutterBinaryMessenger, api: $apiName?) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final Method method in api.methods) {
final String channelName = makeChannelName(api, method);
final String varChannelName = '${method.name}Channel';
@@ -436,11 +436,11 @@
indent.writeln(
'let $varChannelName = FlutterBasicMessageChannel(name: "$channelName", binaryMessenger: binaryMessenger$codecArgumentString)');
indent.write('if let api = api ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('$varChannelName.setMessageHandler ');
final String messageVarName =
method.arguments.isNotEmpty ? 'message' : '_';
- indent.scoped('{ $messageVarName, reply in', '}', () {
+ indent.addScoped('{ $messageVarName, reply in', '}', () {
final List<String> methodArgument = <String>[];
if (method.arguments.isNotEmpty) {
indent.writeln('let args = message as! [Any?]');
@@ -457,11 +457,11 @@
if (method.isAsynchronous) {
indent.write('$call ');
if (method.returnType.isVoid) {
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('reply(wrapResult(nil))');
});
} else {
- indent.scoped('{ result in', '}', () {
+ indent.addScoped('{ result in', '}', () {
indent.writeln('reply(wrapResult(result))');
});
}
@@ -476,7 +476,7 @@
}
});
}, addTrailingNewline: false);
- indent.scoped(' else {', '}', () {
+ indent.addScoped(' else {', '}', () {
indent.writeln('$varChannelName.setMessageHandler(nil)');
});
}
@@ -498,22 +498,22 @@
// Generate Reader
indent.write('private class $readerName: FlutterStandardReader ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
if (getCodecClasses(api, root).isNotEmpty) {
indent.write('override func readValue(ofType type: UInt8) -> Any? ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('switch type ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
for (final EnumeratedClass customClass
in getCodecClasses(api, root)) {
- indent.write('case ${customClass.enumeration}:');
- indent.scoped('', '', () {
- indent.write(
+ indent.writeln('case ${customClass.enumeration}:');
+ indent.nest(1, () {
+ indent.writeln(
'return ${customClass.name}.fromList(self.readValue() as! [Any])');
});
}
- indent.write('default:');
- indent.scoped('', '', () {
+ indent.writeln('default:');
+ indent.nest(1, () {
indent.writeln('return super.readValue(ofType: type)');
});
});
@@ -522,69 +522,70 @@
});
// Generate Writer
+ indent.newln();
indent.write('private class $writerName: FlutterStandardWriter ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
if (getCodecClasses(api, root).isNotEmpty) {
indent.write('override func writeValue(_ value: Any) ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('');
for (final EnumeratedClass customClass
in getCodecClasses(api, root)) {
indent.add('if let value = value as? ${customClass.name} ');
- indent.scoped('{', '} else ', () {
+ indent.addScoped('{', '} else ', () {
indent.writeln('super.writeByte(${customClass.enumeration})');
indent.writeln('super.writeValue(value.toList())');
}, addTrailingNewline: false);
}
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('super.writeValue(value)');
});
});
}
});
- indent.writeln('');
+ indent.newln();
// Generate ReaderWriter
indent
.write('private class $readerWriterName: FlutterStandardReaderWriter ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write(
'override func reader(with data: Data) -> FlutterStandardReader ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('return $readerName(data: data)');
});
- indent.writeln('');
+ indent.newln();
indent.write(
'override func writer(with data: NSMutableData) -> FlutterStandardWriter ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('return $writerName(data: data)');
});
});
- indent.writeln('');
+ indent.newln();
// Generate Codec
indent.write('class $codecName: FlutterStandardMessageCodec ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln(
'static let shared = $codecName(readerWriter: $readerWriterName())');
});
- indent.addln('');
+ indent.newln();
}
void _writeWrapResult(Indent indent) {
- indent.addln('');
+ indent.newln();
indent.write('private func wrapResult(_ result: Any?) -> [Any?] ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.writeln('return [result]');
});
}
void _writeWrapError(Indent indent) {
- indent.addln('');
+ indent.newln();
indent.write('private func wrapError(_ error: FlutterError) -> [Any?] ');
- indent.scoped('{', '}', () {
+ indent.addScoped('{', '}', () {
indent.write('return ');
- indent.scoped('[', ']', () {
+ indent.addScoped('[', ']', () {
indent.writeln('error.code,');
indent.writeln('error.message,');
indent.writeln('error.details');
diff --git a/packages/pigeon/mock_handler_tester/test/message.dart b/packages/pigeon/mock_handler_tester/test/message.dart
index 8b15d22..d9010c1 100644
--- a/packages/pigeon/mock_handler_tester/test/message.dart
+++ b/packages/pigeon/mock_handler_tester/test/message.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
diff --git a/packages/pigeon/mock_handler_tester/test/test.dart b/packages/pigeon/mock_handler_tester/test/test.dart
index 7ca3642..582a60f 100644
--- a/packages/pigeon/mock_handler_tester/test/test.dart
+++ b/packages/pigeon/mock_handler_tester/test/test.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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, unnecessary_import
// ignore_for_file: avoid_relative_lib_imports
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 fc6a620..947ca16 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
package com.example.alternate_language_test_plugin;
@@ -196,6 +196,7 @@
private AllTypes() {}
public static final class Builder {
+
private @Nullable Boolean aBool;
public @NonNull Builder setABool(@NonNull Boolean setterArg) {
@@ -479,6 +480,7 @@
}
public static final class Builder {
+
private @Nullable Boolean aNullableBool;
public @NonNull Builder setANullableBool(@Nullable Boolean setterArg) {
@@ -675,6 +677,7 @@
private AllNullableTypesWrapper() {}
public static final class Builder {
+
private @Nullable AllNullableTypes values;
public @NonNull Builder setValues(@NonNull AllNullableTypes setterArg) {
@@ -2177,6 +2180,7 @@
public FlutterIntegrationCoreApi(BinaryMessenger argBinaryMessenger) {
this.binaryMessenger = argBinaryMessenger;
}
+
/** Public interface for sending reply. */
public interface Reply<T> {
void reply(T reply);
@@ -2459,6 +2463,7 @@
* <p>Generated interface from Pigeon that represents a handler of messages from Flutter.
*/
public interface HostTrivialApi {
+
void noop();
/** The codec used by HostTrivialApi. */
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 11e6a1c..da0a19f 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#import <Foundation/Foundation.h>
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 6e276ac..4936726 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#import "CoreTests.gen.h"
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 585b73d..9ff225b 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
@@ -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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart
index c549d7f..d74904e 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/multiple_arity.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart
index 83bfa88..218dcb4 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/non_null_fields.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart
index 688334d..040c5c4 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_fields.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart
index 9b49e63..df1a5e9 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/null_safe_pigeon.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart
index 2ac5d48..118d7fa 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.gen.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/nullable_returns.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
diff --git a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart
index 8475c62..96eddd1 100644
--- a/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.dart
+++ b/packages/pigeon/platform_tests/flutter_null_safe_unit_tests/lib/primitive.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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
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 585b73d..9ff225b 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), 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
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 2103ad1..0c74d9f 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
package com.example.test_plugin
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 10208bc..a22d39e 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
import Foundation
@@ -187,17 +187,17 @@
override func readValue(ofType type: UInt8) -> Any? {
switch type {
case 128:
- return AllNullableTypes.fromList(self.readValue() as! [Any])
+ return AllNullableTypes.fromList(self.readValue() as! [Any])
case 129:
- return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
+ return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
case 130:
- return AllTypes.fromList(self.readValue() as! [Any])
+ return AllTypes.fromList(self.readValue() as! [Any])
default:
return super.readValue(ofType: type)
-
}
}
}
+
private class HostIntegrationCoreApiCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) {
if let value = value as? AllNullableTypes {
@@ -769,17 +769,17 @@
override func readValue(ofType type: UInt8) -> Any? {
switch type {
case 128:
- return AllNullableTypes.fromList(self.readValue() as! [Any])
+ return AllNullableTypes.fromList(self.readValue() as! [Any])
case 129:
- return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
+ return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
case 130:
- return AllTypes.fromList(self.readValue() as! [Any])
+ return AllTypes.fromList(self.readValue() as! [Any])
default:
return super.readValue(ofType: type)
-
}
}
}
+
private class FlutterIntegrationCoreApiCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) {
if let value = value as? AllNullableTypes {
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 10208bc..a22d39e 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
import Foundation
@@ -187,17 +187,17 @@
override func readValue(ofType type: UInt8) -> Any? {
switch type {
case 128:
- return AllNullableTypes.fromList(self.readValue() as! [Any])
+ return AllNullableTypes.fromList(self.readValue() as! [Any])
case 129:
- return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
+ return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
case 130:
- return AllTypes.fromList(self.readValue() as! [Any])
+ return AllTypes.fromList(self.readValue() as! [Any])
default:
return super.readValue(ofType: type)
-
}
}
}
+
private class HostIntegrationCoreApiCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) {
if let value = value as? AllNullableTypes {
@@ -769,17 +769,17 @@
override func readValue(ofType type: UInt8) -> Any? {
switch type {
case 128:
- return AllNullableTypes.fromList(self.readValue() as! [Any])
+ return AllNullableTypes.fromList(self.readValue() as! [Any])
case 129:
- return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
+ return AllNullableTypesWrapper.fromList(self.readValue() as! [Any])
case 130:
- return AllTypes.fromList(self.readValue() as! [Any])
+ return AllTypes.fromList(self.readValue() as! [Any])
default:
return super.readValue(ofType: type)
-
}
}
}
+
private class FlutterIntegrationCoreApiCodecWriter: FlutterStandardWriter {
override func writeValue(_ value: Any) {
if let value = value as? AllNullableTypes {
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 41bf167..2905839 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#undef _HAS_EXCEPTIONS
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 36a56eb..c2e06eb 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 (v7.0.0), do not edit directly.
+// Autogenerated from Pigeon (v7.0.1), do not edit directly.
// See also: https://pub.dev/packages/pigeon
#ifndef PIGEON_CORE_TESTS_GEN_H_
diff --git a/packages/pigeon/pubspec.yaml b/packages/pigeon/pubspec.yaml
index f4a883c..1c26d35 100644
--- a/packages/pigeon/pubspec.yaml
+++ b/packages/pigeon/pubspec.yaml
@@ -2,7 +2,7 @@
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: 7.0.0 # This must match the version in lib/generator_tools.dart
+version: 7.0.1 # This must match the version in lib/generator_tools.dart
environment:
sdk: ">=2.12.0 <3.0.0"
diff --git a/packages/pigeon/test/java_generator_test.dart b/packages/pigeon/test/java_generator_test.dart
index e79eee0..2e5b264 100644
--- a/packages/pigeon/test/java_generator_test.dart
+++ b/packages/pigeon/test/java_generator_test.dart
@@ -36,8 +36,8 @@
expect(code, contains('private @Nullable Long field1;'));
expect(
code,
- contains(
- '@NonNull private static ArrayList<Object> wrapError(@NonNull Throwable exception)'));
+ contains(RegExp(
+ r'@NonNull\s*private static ArrayList<Object> wrapError\(@NonNull Throwable exception\)')));
});
test('gen one enum', () {
@@ -386,7 +386,7 @@
generator.generate(javaOptions, root, sink);
final String code = sink.toString();
expect(code, contains('doSomething(Reply<Output>'));
- expect(code, contains('channel.send(null'));
+ expect(code, contains(RegExp(r'channel.send\(\s*null')));
});
test('gen list', () {
@@ -469,7 +469,7 @@
expect(
code,
contains(
- '(nested == null) ? null : Nested.fromList((ArrayList<Object>)nested)'));
+ '(nested == null) ? null : Nested.fromList((ArrayList<Object>) nested)'));
expect(code, contains('add((nested == null) ? null : nested.toList());'));
});
@@ -613,7 +613,7 @@
expect(
code,
contains(
- 'pigeonResult.setEnum1(enum1 == null ? null : Enum1.values()[(int)enum1])'));
+ 'pigeonResult.setEnum1(enum1 == null ? null : Enum1.values()[(int) enum1])'));
});
test('primitive enum host', () {
@@ -644,7 +644,7 @@
expect(
code,
contains(
- 'Foo fooArg = args.get(0) == null ? null : Foo.values()[(int)args.get(0)];'));
+ 'Foo fooArg = args.get(0) == null ? null : Foo.values()[(int) args.get(0)];'));
});
Iterable<String> makeIterable(String string) sync* {
@@ -859,7 +859,7 @@
expect(
code,
contains(
- 'Long output = channelReply == null ? null : ((Number)channelReply).longValue();'));
+ 'Long output = channelReply == null ? null : ((Number) channelReply).longValue();'));
});
test('host multiple args', () {
@@ -888,10 +888,10 @@
final String code = sink.toString();
expect(code, contains('class Messages'));
expect(code, contains('Long add(@NonNull Long x, @NonNull Long y)'));
- expect(
- code, contains('ArrayList<Object> args = (ArrayList<Object>)message;'));
- expect(code, contains('Number xArg = (Number)args.get(0)'));
- expect(code, contains('Number yArg = (Number)args.get(1)'));
+ expect(code,
+ contains('ArrayList<Object> args = (ArrayList<Object>) message;'));
+ expect(code, contains('Number xArg = (Number) args.get(0)'));
+ expect(code, contains('Number yArg = (Number) args.get(1)'));
expect(
code,
contains(
@@ -954,8 +954,8 @@
'public void add(@NonNull Long xArg, @NonNull Long yArg, Reply<Long> callback)'));
expect(
code,
- contains(
- 'channel.send(new ArrayList<Object>(Arrays.asList(xArg, yArg)), channelReply ->'));
+ contains(RegExp(
+ r'channel.send\(\s*new ArrayList<Object>\(Arrays.asList\(xArg, yArg\)\),\s*channelReply ->')));
});
test('flutter single args', () {
@@ -980,8 +980,8 @@
final String code = sink.toString();
expect(
code,
- contains(
- 'channel.send(new ArrayList<Object>(Collections.singletonList(xArg)), channelReply ->'));
+ contains(RegExp(
+ r'channel.send\(\s*new ArrayList<Object>\(Collections.singletonList\(xArg\)\),\s*channelReply ->')));
});
test('return nullable host', () {
@@ -1005,7 +1005,7 @@
const JavaGenerator generator = JavaGenerator();
generator.generate(javaOptions, root, sink);
final String code = sink.toString();
- expect(code, contains('@Nullable Long doit();'));
+ expect(code, contains(RegExp(r'@Nullable\s*Long doit\(\);')));
});
test('return nullable host async', () {
@@ -1125,8 +1125,8 @@
'BinaryMessenger.TaskQueue taskQueue = binaryMessenger.makeBackgroundTaskQueue();'));
expect(
code,
- contains(
- 'new BasicMessageChannel<>(binaryMessenger, "dev.flutter.pigeon.Api.doit", getCodec(), taskQueue)'));
+ contains(RegExp(
+ r'new BasicMessageChannel<>\(\s*binaryMessenger, "dev.flutter.pigeon.Api.doit", getCodec\(\), taskQueue\)')));
});
test('generated annotation', () {
diff --git a/packages/pigeon/test/objc_generator_test.dart b/packages/pigeon/test/objc_generator_test.dart
index 64f92c8..e54bf59 100644
--- a/packages/pigeon/test/objc_generator_test.dart
+++ b/packages/pigeon/test/objc_generator_test.dart
@@ -801,7 +801,7 @@
);
generator.generate(generatorOptions, root, sink);
final String code = sink.toString();
- expect(code, contains('completion:(void(^)(NSError *_Nullable))'));
+ expect(code, contains('completion:(void (^)(NSError *_Nullable))'));
});
test('gen flutter void return source', () {
@@ -836,7 +836,7 @@
);
generator.generate(generatorOptions, root, sink);
final String code = sink.toString();
- expect(code, contains('completion:(void(^)(NSError *_Nullable))'));
+ expect(code, contains('completion:(void (^)(NSError *_Nullable))'));
expect(code, contains('completion(nil)'));
});
@@ -927,7 +927,7 @@
expect(
code,
contains(
- '(void)doSomethingWithCompletion:(void(^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
+ '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
});
test('gen flutter void arg source', () {
@@ -959,7 +959,7 @@
expect(
code,
contains(
- '(void)doSomethingWithCompletion:(void(^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
+ '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, NSError *_Nullable))completion'));
expect(code, contains('channel sendMessage:nil'));
});
@@ -1066,7 +1066,7 @@
expect(code, contains('(NSDictionary<NSString *, id> *)foo'));
});
- test('async void(input) HostApi header', () {
+ test('async void (input) HostApi header', () {
final Root root = Root(apis: <Api>[
Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
Method(
@@ -1107,7 +1107,7 @@
expect(
code,
contains(
- '(void)doSomethingInput:(ABCInput *)input completion:(void(^)(FlutterError *_Nullable))completion'));
+ '(void)doSomethingInput:(ABCInput *)input completion:(void (^)(FlutterError *_Nullable))completion'));
});
test('async output(input) HostApi header', () {
@@ -1152,7 +1152,7 @@
expect(
code,
contains(
- '(void)doSomethingInput:(ABCInput *)input completion:(void(^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
+ '(void)doSomethingInput:(ABCInput *)input completion:(void (^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
});
test('async output(void) HostApi header', () {
@@ -1185,10 +1185,10 @@
expect(
code,
contains(
- '(void)doSomethingWithCompletion:(void(^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
+ '(void)doSomethingWithCompletion:(void (^)(ABCOutput *_Nullable, FlutterError *_Nullable))completion'));
});
- test('async void(void) HostApi header', () {
+ test('async void (void) HostApi header', () {
final Root root = Root(apis: <Api>[
Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
Method(
@@ -1211,7 +1211,7 @@
expect(
code,
contains(
- '(void)doSomethingWithCompletion:(void(^)(FlutterError *_Nullable))completion'));
+ '(void)doSomethingWithCompletion:(void (^)(FlutterError *_Nullable))completion'));
});
test('async output(input) HostApi source', () {
@@ -1259,7 +1259,7 @@
'[api doSomething:arg0 completion:^(ABCOutput *_Nullable output, FlutterError *_Nullable error) {'));
});
- test('async void(input) HostApi source', () {
+ test('async void (input) HostApi source', () {
final Root root = Root(apis: <Api>[
Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
Method(
@@ -1303,7 +1303,7 @@
'[api doSomethingFoo:arg_foo completion:^(FlutterError *_Nullable error) {'));
});
- test('async void(void) HostApi source', () {
+ test('async void (void) HostApi source', () {
final Root root = Root(apis: <Api>[
Api(name: 'Api', location: ApiLocation.host, methods: <Method>[
Method(
@@ -1655,7 +1655,7 @@
generator.generate(generatorOptions, root, sink);
final String code = sink.toString();
expect(
- code, contains('doitWithCompletion:(void(^)(NSArray<NSNumber *> *'));
+ code, contains('doitWithCompletion:(void (^)(NSArray<NSNumber *> *'));
}
{
final StringBuffer sink = StringBuffer();
@@ -1669,7 +1669,7 @@
generator.generate(generatorOptions, root, sink);
final String code = sink.toString();
expect(
- code, contains('doitWithCompletion:(void(^)(NSArray<NSNumber *> *'));
+ code, contains('doitWithCompletion:(void (^)(NSArray<NSNumber *> *'));
}
});
@@ -1763,7 +1763,7 @@
expect(
code,
contains(
- '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void(^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;'));
+ '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void (^)(NSNumber *_Nullable, FlutterError *_Nullable))completion;'));
}
{
final StringBuffer sink = StringBuffer();
@@ -1818,7 +1818,7 @@
expect(
code,
contains(
- '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void(^)(NSNumber *_Nullable, NSError *_Nullable))completion;'));
+ '- (void)addX:(NSNumber *)x y:(NSNumber *)y completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion;'));
}
{
final StringBuffer sink = StringBuffer();
@@ -1834,7 +1834,7 @@
expect(
code,
contains(
- '- (void)addX:(NSNumber *)arg_x y:(NSNumber *)arg_y completion:(void(^)(NSNumber *_Nullable, NSError *_Nullable))completion {'));
+ '- (void)addX:(NSNumber *)arg_x y:(NSNumber *)arg_y completion:(void (^)(NSNumber *_Nullable, NSError *_Nullable))completion {'));
expect(
code,
contains(