Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
$_
  • Loading branch information
tarrinneal committed Nov 14, 2023
commit e5df62f80a85f0278969c71259527385a14591e3
106 changes: 54 additions & 52 deletions packages/pigeon/example/app/lib/src/messages.g.dart
Original file line number Diff line number Diff line change
Expand Up @@ -98,111 +98,113 @@ class ExampleHostApi {
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
ExampleHostApi({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
final BinaryMessenger? _binaryMessenger;
: $_binaryMessenger = binaryMessenger;
final BinaryMessenger? $_binaryMessenger;

static const MessageCodec<Object?> codec = _ExampleHostApiCodec();
static const MessageCodec<Object?> $_codec = _ExampleHostApiCodec();

Future<String> getHostLanguage() async {
const String channelName =
const String $_channelName =
'dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.getHostLanguage';
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
channelName,
codec,
binaryMessenger: _binaryMessenger,
final BasicMessageChannel<Object?> $_channel = BasicMessageChannel<Object?>(
$_channelName,
$_codec,
binaryMessenger: $_binaryMessenger,
);
final List<Object?>? replyList = await channel.send(null) as List<Object?>?;
if (replyList == null) {
throw _createConnectionError(channelName);
} else if (replyList.length > 1) {
final List<Object?>? $_replyList =
await $_channel.send(null) as List<Object?>?;
if ($_replyList == null) {
throw _createConnectionError($_channelName);
} else if ($_replyList.length > 1) {
throw PlatformException(
code: replyList[0]! as String,
message: replyList[1] as String?,
details: replyList[2],
code: $_replyList[0]! as String,
message: $_replyList[1] as String?,
details: $_replyList[2],
);
} else if (replyList[0] == null) {
} else if ($_replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (replyList[0] as String?)!;
return ($_replyList[0] as String?)!;
}
}

Future<int> add(int a, int b) async {
const String channelName =
const String $_channelName =
'dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.add';
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
channelName,
codec,
binaryMessenger: _binaryMessenger,
final BasicMessageChannel<Object?> $_channel = BasicMessageChannel<Object?>(
$_channelName,
$_codec,
binaryMessenger: $_binaryMessenger,
);
final List<Object?>? replyList =
await channel.send(<Object?>[a, b]) as List<Object?>?;
if (replyList == null) {
throw _createConnectionError(channelName);
} else if (replyList.length > 1) {
final List<Object?>? $_replyList =
await $_channel.send(<Object?>[a, b]) as List<Object?>?;
if ($_replyList == null) {
throw _createConnectionError($_channelName);
} else if ($_replyList.length > 1) {
throw PlatformException(
code: replyList[0]! as String,
message: replyList[1] as String?,
details: replyList[2],
code: $_replyList[0]! as String,
message: $_replyList[1] as String?,
details: $_replyList[2],
);
} else if (replyList[0] == null) {
} else if ($_replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (replyList[0] as int?)!;
return ($_replyList[0] as int?)!;
}
}

Future<bool> sendMessage(MessageData message) async {
const String channelName =
const String $_channelName =
'dev.flutter.pigeon.pigeon_example_package.ExampleHostApi.sendMessage';
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
channelName,
codec,
binaryMessenger: _binaryMessenger,
final BasicMessageChannel<Object?> $_channel = BasicMessageChannel<Object?>(
$_channelName,
$_codec,
binaryMessenger: $_binaryMessenger,
);
final List<Object?>? replyList =
await channel.send(<Object?>[message]) as List<Object?>?;
if (replyList == null) {
throw _createConnectionError(channelName);
} else if (replyList.length > 1) {
final List<Object?>? $_replyList =
await $_channel.send(<Object?>[message]) as List<Object?>?;
if ($_replyList == null) {
throw _createConnectionError($_channelName);
} else if ($_replyList.length > 1) {
throw PlatformException(
code: replyList[0]! as String,
message: replyList[1] as String?,
details: replyList[2],
code: $_replyList[0]! as String,
message: $_replyList[1] as String?,
details: $_replyList[2],
);
} else if (replyList[0] == null) {
} else if ($_replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (replyList[0] as bool?)!;
return ($_replyList[0] as bool?)!;
}
}
}

abstract class MessageFlutterApi {
static const MessageCodec<Object?> codec = StandardMessageCodec();
static const MessageCodec<Object?> $_codec = StandardMessageCodec();

String flutterMethod(String? aString);

static void setup(MessageFlutterApi? api,
{BinaryMessenger? binaryMessenger}) {
{
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
final BasicMessageChannel<Object?> $_channel = BasicMessageChannel<
Object?>(
'dev.flutter.pigeon.pigeon_example_package.MessageFlutterApi.flutterMethod',
codec,
$_codec,
binaryMessenger: binaryMessenger);
if (api == null) {
channel.setMessageHandler(null);
$_channel.setMessageHandler(null);
} else {
channel.setMessageHandler((Object? message) async {
$_channel.setMessageHandler((Object? message) async {
assert(message != null,
'Argument for dev.flutter.pigeon.pigeon_example_package.MessageFlutterApi.flutterMethod was null.');
final List<Object?> args = (message as List<Object?>?)!;
Expand Down
8 changes: 4 additions & 4 deletions packages/pigeon/lib/ast.dart
Original file line number Diff line number Diff line change
Expand Up @@ -284,22 +284,22 @@ class Parameter extends NamedType {
isPositional = isPositional ?? true,
isRequired = isRequired ?? true;

/// Return `true` if this parameter is a named parameter.
/// Whether this parameter is a named parameter.
///
/// Defaults to `true`.
final bool isNamed;

/// Return `true` if this parameter is an optional parameter.
/// Whether this parameter is an optional parameter.
///
/// Defaults to `false`.
final bool isOptional;

/// Return `true` if this parameter is a positional parameter.
/// Whether this parameter is a positional parameter.
///
/// Defaults to `true`.
final bool isPositional;

/// Return `true` if this parameter is a required parameter.
/// Whether this parameter is a required parameter.
///
/// Defaults to `true`.
final bool isRequired;
Expand Down
53 changes: 28 additions & 25 deletions packages/pigeon/lib/dart_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,8 @@ import 'generator_tools.dart';
/// Documentation comment open symbol.
const String _docCommentPrefix = '///';

const String _varNamePrefix = r'$_';

/// Documentation comment spec.
const DocumentCommentSpecification _docCommentSpec =
DocumentCommentSpecification(_docCommentPrefix);
Expand Down Expand Up @@ -324,8 +326,8 @@ $resultAt != null
indent.writeln(
'static TestDefaultBinaryMessengerBinding? get _testBinaryMessengerBinding => TestDefaultBinaryMessengerBinding.instance;');
}
indent
.writeln('static const MessageCodec<Object?> codec = $codecName();');
indent.writeln(
'static const MessageCodec<Object?> ${_varNamePrefix}codec = $codecName();');
indent.newln();
for (final Method func in api.methods) {
addDocumentationComments(
Expand All @@ -346,20 +348,20 @@ $resultAt != null
indent.write('');
indent.addScoped('{', '}', () {
indent.writeln(
'final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(',
'final BasicMessageChannel<Object?> ${_varNamePrefix}channel = BasicMessageChannel<Object?>(',
);
final String channelName = channelNameFunc == null
? makeChannelName(api, func, dartPackageName)
: channelNameFunc(func);
indent.nest(2, () {
indent.writeln("'$channelName', codec,");
indent.writeln("'$channelName', ${_varNamePrefix}codec,");
indent.writeln(
'binaryMessenger: binaryMessenger);',
);
});
final String messageHandlerSetterWithOpeningParentheses = isMockHandler
? '_testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler<Object?>(channel, '
: 'channel.setMessageHandler(';
? '_testBinaryMessengerBinding!.defaultBinaryMessenger.setMockDecodedMessageHandler<Object?>(${_varNamePrefix}channel, '
: '${_varNamePrefix}channel.setMessageHandler(';
indent.write('if (api == null) ');
indent.addScoped('{', '}', () {
indent.writeln(
Expand Down Expand Up @@ -499,12 +501,12 @@ $resultAt != null
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
${api.name}({BinaryMessenger? binaryMessenger})
\t\t: _binaryMessenger = binaryMessenger;
final BinaryMessenger? _binaryMessenger;
\t\t: ${_varNamePrefix}binaryMessenger = binaryMessenger;
final BinaryMessenger? ${_varNamePrefix}binaryMessenger;
''');

indent
.writeln('static const MessageCodec<Object?> codec = $codecName();');
indent.writeln(
'static const MessageCodec<Object?> ${_varNamePrefix}codec = $codecName();');
indent.newln();
for (final Method func in api.methods) {
if (!first) {
Expand Down Expand Up @@ -534,17 +536,18 @@ final BinaryMessenger? _binaryMessenger;
);
indent.addScoped('{', '}', () {
indent.writeln(
"const String channelName = '${makeChannelName(api, func, dartPackageName)}';");
"const String ${_varNamePrefix}channelName = '${makeChannelName(api, func, dartPackageName)}';");
indent.writeScoped(
'final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(',
'final BasicMessageChannel<Object?> ${_varNamePrefix}channel = BasicMessageChannel<Object?>(',
');', () {
indent.writeln('channelName,');
indent.writeln('codec,');
indent.writeln('binaryMessenger: _binaryMessenger,');
indent.writeln('${_varNamePrefix}channelName,');
indent.writeln('${_varNamePrefix}codec,');
indent
.writeln('binaryMessenger: ${_varNamePrefix}binaryMessenger,');
});
final String returnType = _makeGenericTypeArguments(func.returnType);
final String genericCastCall = _makeGenericCastCall(func.returnType);
const String accessor = 'replyList[0]';
const String accessor = '${_varNamePrefix}replyList[0]';
// Avoid warnings from pointlessly casting to `Object?`.
final String nullablyTypedAccessor =
returnType == 'Object' ? accessor : '($accessor as $returnType?)';
Expand All @@ -567,22 +570,22 @@ final BinaryMessenger? _binaryMessenger;
returnStatement = '$returnStatement;';

indent.format('''
final List<Object?>? replyList =
\t\tawait channel.send($sendArgument) as List<Object?>?;
if (replyList == null) {
\tthrow _createConnectionError(channelName);
} else if (replyList.length > 1) {
final List<Object?>? ${_varNamePrefix}replyList =
\t\tawait ${_varNamePrefix}channel.send($sendArgument) as List<Object?>?;
if (${_varNamePrefix}replyList == null) {
\tthrow _createConnectionError(${_varNamePrefix}channelName);
} else if (${_varNamePrefix}replyList.length > 1) {
\tthrow PlatformException(
\t\tcode: replyList[0]! as String,
\t\tmessage: replyList[1] as String?,
\t\tdetails: replyList[2],
\t\tcode: ${_varNamePrefix}replyList[0]! as String,
\t\tmessage: ${_varNamePrefix}replyList[1] as String?,
\t\tdetails: ${_varNamePrefix}replyList[2],
\t);''');
// On iOS we can return nil from functions to accommodate error
// handling. Returning a nil value and not returning an error is an
// exception.
if (!func.returnType.isNullable && !func.returnType.isVoid) {
indent.format('''
} else if (replyList[0] == null) {
} else if (${_varNamePrefix}replyList[0] == null) {
\tthrow PlatformException(
\t\tcode: 'null-error',
\t\tmessage: 'Host platform returned null value for non-null return value.',
Expand Down
13 changes: 5 additions & 8 deletions packages/pigeon/lib/pigeon_lib.dart
Original file line number Diff line number Diff line change
Expand Up @@ -926,6 +926,7 @@ class _RootBuilder extends dart_ast_visitor.RecursiveAstVisitor<Object?> {
for (final Parameter param in func.parameters) {
paramList.add(param.copyWithType(_attachClassesAndEnums(param.type)));
}
func.parameters = paramList;
func.returnType = _attachClassesAndEnums(func.returnType);
}
}
Expand Down Expand Up @@ -1129,17 +1130,13 @@ class _RootBuilder extends dart_ast_visitor.RecursiveAstVisitor<Object?> {
if (formalParameter is dart_ast.DefaultFormalParameter) {
defaultValue = formalParameter.defaultValue?.toString();
}
final bool isNamed = simpleFormalParameter.isNamed;
final bool isOptional = simpleFormalParameter.isOptional;
final bool isPositional = simpleFormalParameter.isPositional;
final bool isRequired = simpleFormalParameter.isRequired;

return formalParameterToPigeonParameter(
simpleFormalParameter,
isNamed: isNamed,
isOptional: isOptional,
isPositional: isPositional,
isRequired: isRequired,
isNamed: simpleFormalParameter.isNamed,
isOptional: simpleFormalParameter.isOptional,
isPositional: simpleFormalParameter.isPositional,
isRequired: simpleFormalParameter.isRequired,
defaultValue: defaultValue,
);
} else {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,36 +24,36 @@ class BackgroundApi2Host {
/// available for dependency injection. If it is left null, the default
/// BinaryMessenger will be used which routes to the host platform.
BackgroundApi2Host({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;
final BinaryMessenger? _binaryMessenger;
: $_binaryMessenger = binaryMessenger;
final BinaryMessenger? $_binaryMessenger;

static const MessageCodec<Object?> codec = StandardMessageCodec();
static const MessageCodec<Object?> $_codec = StandardMessageCodec();

Future<int> add(int x, int y) async {
const String channelName =
const String $_channelName =
'dev.flutter.pigeon.pigeon_integration_tests.BackgroundApi2Host.add';
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
channelName,
codec,
binaryMessenger: _binaryMessenger,
final BasicMessageChannel<Object?> $_channel = BasicMessageChannel<Object?>(
$_channelName,
$_codec,
binaryMessenger: $_binaryMessenger,
);
final List<Object?>? replyList =
await channel.send(<Object?>[x, y]) as List<Object?>?;
if (replyList == null) {
throw _createConnectionError(channelName);
} else if (replyList.length > 1) {
final List<Object?>? $_replyList =
await $_channel.send(<Object?>[x, y]) as List<Object?>?;
if ($_replyList == null) {
throw _createConnectionError($_channelName);
} else if ($_replyList.length > 1) {
throw PlatformException(
code: replyList[0]! as String,
message: replyList[1] as String?,
details: replyList[2],
code: $_replyList[0]! as String,
message: $_replyList[1] as String?,
details: $_replyList[2],
);
} else if (replyList[0] == null) {
} else if ($_replyList[0] == null) {
throw PlatformException(
code: 'null-error',
message: 'Host platform returned null value for non-null return value.',
);
} else {
return (replyList[0] as int?)!;
return ($_replyList[0] as int?)!;
}
}
}
Loading