Skip to content
Merged
Show file tree
Hide file tree
Changes from 6 commits
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
4 changes: 4 additions & 0 deletions packages/pigeon/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 19.0.1

* [dart] Updates `PigeonInstanceMangerApi` to use the shared api channel code.

## 19.0.0

* **Breaking Change** [swift] Removes `FlutterError` in favor of `PigeonError`.
Expand Down
107 changes: 0 additions & 107 deletions packages/pigeon/lib/dart/templates.dart
Original file line number Diff line number Diff line change
Expand Up @@ -215,113 +215,6 @@ class $instanceManagerClassName {
''';
}

/// Creates the `InstanceManagerApi` with the passed string values.
String instanceManagerApiTemplate({
required String dartPackageName,
required String pigeonChannelCodecVarName,
}) {
const String apiName = '${instanceManagerClassName}Api';

final String removeStrongReferenceName = makeChannelNameWithStrings(
apiName: apiName,
methodName: 'removeStrongReference',
dartPackageName: dartPackageName,
);

final String clearName = makeChannelNameWithStrings(
apiName: apiName,
methodName: 'clear',
dartPackageName: dartPackageName,
);

return '''
/// Generated API for managing the Dart and native `$instanceManagerClassName`s.
class _$apiName {
/// Constructor for [_$apiName].
_$apiName({BinaryMessenger? binaryMessenger})
: _binaryMessenger = binaryMessenger;

final BinaryMessenger? _binaryMessenger;

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

static void setUpMessageHandlers({
BinaryMessenger? binaryMessenger,
$instanceManagerClassName? instanceManager,
}) {
const String channelName =
r'$removeStrongReferenceName';
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
channelName,
$pigeonChannelCodecVarName,
binaryMessenger: binaryMessenger,
);
channel.setMessageHandler((Object? message) async {
assert(
message != null,
'Argument for \$channelName was null.',
);
final int? identifier = message as int?;
assert(
identifier != null,
r'Argument for \$channelName, expected non-null int.',
);
(instanceManager ?? $instanceManagerClassName.instance).remove(identifier!);
return;
});
}

Future<void> removeStrongReference(int identifier) async {
const String channelName =
r'$removeStrongReferenceName';
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
channelName,
$pigeonChannelCodecVarName,
binaryMessenger: _binaryMessenger,
);
final List<Object?>? replyList =
await channel.send(identifier) 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],
);
} else {
return;
}
}

/// Clear the native `$instanceManagerClassName`.
///
/// This is typically called after a hot restart.
Future<void> clear() async {
const String channelName =
r'$clearName';
final BasicMessageChannel<Object?> channel = BasicMessageChannel<Object?>(
channelName,
$pigeonChannelCodecVarName,
binaryMessenger: _binaryMessenger,
);
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],
);
} else {
return;
}
}
}''';
}

/// The base class for all ProxyApis.
///
/// All Dart classes generated as a ProxyApi extends this one.
Expand Down
206 changes: 198 additions & 8 deletions packages/pigeon/lib/dart_generator.dart
Original file line number Diff line number Diff line change
Expand Up @@ -362,6 +362,7 @@ $resultAt != null
name: func.name,
parameters: func.parameters,
returnType: func.returnType,
addSuffixVariable: true,
channelName: channelNameFunc == null
? makeChannelName(api, func, dartPackageName)
: channelNameFunc(func),
Expand Down Expand Up @@ -468,12 +469,203 @@ final BinaryMessenger? ${_varNamePrefix}binaryMessenger;
Indent indent, {
required String dartPackageName,
}) {
indent.format(
instanceManagerApiTemplate(
dartPackageName: dartPackageName,
pigeonChannelCodecVarName: _pigeonChannelCodec,
),
const String apiName = '${instanceManagerClassName}Api';

final cb.Parameter binaryMessengerParameter = cb.Parameter(
(cb.ParameterBuilder builder) => builder
..name = 'binaryMessenger'
..type = cb.refer('BinaryMessenger?')
..named = true,
);

final cb.Field binaryMessengerField = cb.Field(
(cb.FieldBuilder builder) => builder
..name = '${varNamePrefix}binaryMessenger'
..type = cb.refer('BinaryMessenger?')
..modifier = cb.FieldModifier.final$,
);

final String removeStrongReferenceName = makeChannelNameWithStrings(
apiName: apiName,
methodName: 'removeStrongReference',
dartPackageName: dartPackageName,
);

final cb.Class proxyApi = cb.Class(
(cb.ClassBuilder builder) => builder
..name = '_$apiName'
..docs.add(
'/// Generated API for managing the Dart and native `$instanceManagerClassName`s.',
)
..constructors.add(
cb.Constructor(
(cb.ConstructorBuilder builder) {
builder
..docs.add('/// Constructor for [_$apiName].')
..optionalParameters.add(binaryMessengerParameter)
..initializers.add(
cb.Code(
'${binaryMessengerField.name} = ${binaryMessengerParameter.name}',
),
);
},
),
)
..fields.addAll(
<cb.Field>[
binaryMessengerField,
cb.Field(
(cb.FieldBuilder builder) {
builder
..name = _pigeonChannelCodec
..type = cb.refer('MessageCodec<Object?>')
..static = true
..modifier = cb.FieldModifier.constant
..assignment = const cb.Code('StandardMessageCodec()');
},
)
],
)
..methods.add(
cb.Method(
(cb.MethodBuilder builder) {
builder
..name = 'setUpMessageHandlers'
..static = true
..returns = cb.refer('void')
..optionalParameters.addAll(<cb.Parameter>[
cb.Parameter(
(cb.ParameterBuilder builder) => builder
..name = '${classMemberNamePrefix}clearHandlers'
..type = cb.refer('bool')
..named = true
..defaultTo = const cb.Code('false'),
),
binaryMessengerParameter,
cb.Parameter(
(cb.ParameterBuilder builder) => builder
..name = 'instanceManager'
..named = true
..type = cb.refer('$instanceManagerClassName?'),
),
])
..body = cb.Block.of(
cb.Block(
(cb.BlockBuilder builder) {
final StringBuffer messageHandlerSink = StringBuffer();
_writeFlutterMethodMessageHandler(
Indent(messageHandlerSink),
name: 'removeStrongReferenceName',
parameters: <Parameter>[
Parameter(
name: 'identifier',
type: const TypeDeclaration(
baseName: 'int',
isNullable: false,
),
)
],
returnType: const TypeDeclaration.voidDeclaration(),
channelName: removeStrongReferenceName,
isMockHandler: false,
isAsynchronous: false,
nullHandlerExpression:
'${classMemberNamePrefix}clearHandlers',
onCreateApiCall: (
String methodName,
Iterable<Parameter> parameters,
Iterable<String> safeArgumentNames,
) {
return '(instanceManager ?? $instanceManagerClassName.instance).remove(${safeArgumentNames.single})';
},
);
builder.statements.add(
cb.Code(messageHandlerSink.toString()),
);
},
).statements,
);
},
),
)
..methods.addAll(
<cb.Method>[
cb.Method(
(cb.MethodBuilder builder) {
builder
..name = 'removeStrongReference'
..returns = cb.refer('Future<void>')
..modifier = cb.MethodModifier.async
..requiredParameters.add(
cb.Parameter(
(cb.ParameterBuilder builder) => builder
..name = 'identifier'
..type = cb.refer('int'),
),
)
..body = cb.Block(
(cb.BlockBuilder builder) {
final StringBuffer messageCallSink = StringBuffer();
_writeHostMethodMessageCall(
Indent(messageCallSink),
addSuffixVariable: false,
channelName: removeStrongReferenceName,
parameters: <Parameter>[
Parameter(
name: 'identifier',
type: const TypeDeclaration(
baseName: 'int',
isNullable: false,
),
),
],
returnType: const TypeDeclaration.voidDeclaration(),
);
builder.statements.addAll(<cb.Code>[
cb.Code(messageCallSink.toString()),
]);
},
);
},
),
cb.Method(
(cb.MethodBuilder builder) {
builder
..name = 'clear'
..returns = cb.refer('Future<void>')
..modifier = cb.MethodModifier.async
..docs.addAll(<String>[
'/// Clear the native `$instanceManagerClassName`.',
'///',
'/// This is typically called after a hot restart.',
])
..body = cb.Block(
(cb.BlockBuilder builder) {
final StringBuffer messageCallSink = StringBuffer();
_writeHostMethodMessageCall(
Indent(messageCallSink),
addSuffixVariable: false,
channelName: makeChannelNameWithStrings(
apiName: apiName,
methodName: 'clear',
dartPackageName: dartPackageName,
),
parameters: <Parameter>[],
returnType: const TypeDeclaration.voidDeclaration(),
);
builder.statements.addAll(<cb.Code>[
cb.Code(messageCallSink.toString()),
]);
},
);
},
),
],
),
);

final cb.DartEmitter emitter = cb.DartEmitter(useNullSafetySyntax: true);
indent.format(DartFormatter().format('${proxyApi.accept(emitter)}'));
}

@override
Expand Down Expand Up @@ -859,7 +1051,7 @@ if (${varNamePrefix}replyList == null) {
);
indent.nest(2, () {
final String channelSuffix =
addSuffixVariable ? '' : r'$messageChannelSuffix';
addSuffixVariable ? r'$messageChannelSuffix' : '';
indent.writeln("'$channelName$channelSuffix', $_pigeonChannelCodec,");
indent.writeln(
'binaryMessenger: binaryMessenger);',
Expand Down Expand Up @@ -1451,7 +1643,6 @@ if (${varNamePrefix}replyList == null) {
_writeFlutterMethodMessageHandler(
Indent(messageHandlerSink),
name: methodName,
addSuffixVariable: true,
parameters: <Parameter>[
Parameter(
name: '${classMemberNamePrefix}instanceIdentifier',
Expand Down Expand Up @@ -1507,7 +1698,6 @@ if (${varNamePrefix}replyList == null) {
_writeFlutterMethodMessageHandler(
Indent(messageHandlerSink),
name: method.name,
addSuffixVariable: true,
parameters: <Parameter>[
Parameter(
name: '${classMemberNamePrefix}instance',
Expand Down
2 changes: 1 addition & 1 deletion packages/pigeon/lib/generator_tools.dart
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import 'ast.dart';
/// The current version of pigeon.
///
/// This must match the version in pubspec.yaml.
const String pigeonVersion = '19.0.0';
const String pigeonVersion = '19.0.1';

/// Prefix for all local variables in methods.
///
Expand Down
Loading