@@ -27,6 +27,7 @@ import 'dart:async';
2727import 'dart:isolate';
2828
2929import 'package:_fe_analyzer_shared/src/macros/executor_shared/introspection_impls.dart';
30+ import 'package:_fe_analyzer_shared/src/macros/executor_shared/remote_instance.dart';
3031import 'package:_fe_analyzer_shared/src/macros/executor_shared/response_impls.dart';
3132import 'package:_fe_analyzer_shared/src/macros/executor_shared/serialization.dart';
3233import 'package:_fe_analyzer_shared/src/macros/executor_shared/protocol.dart';
@@ -39,27 +40,33 @@ $_importMarker
3940///
4041/// Supports the client side of the macro expansion protocol.
4142void main(_, SendPort sendPort) {
43+ /// Local function that sends requests and returns responses using [sendPort].
44+ Future<Response> sendRequest(Request request) => _sendRequest(request, sendPort);
45+
4246 withSerializationMode(SerializationMode.client, () {
4347 ReceivePort receivePort = new ReceivePort();
4448 sendPort.send(receivePort.sendPort);
49+
4550 receivePort.listen((message) async {
4651 var deserializer = JsonDeserializer(message as Iterable<Object?>)
4752 ..moveNext();
53+ int zoneId = deserializer.expectNum();
54+ deserializer..moveNext();
4855 var type = MessageType.values[deserializer.expectNum()];
4956 var serializer = JsonSerializer();
5057 switch (type) {
5158 case MessageType.instantiateMacroRequest:
52- var request = InstantiateMacroRequest.deserialize(deserializer);
59+ var request = new InstantiateMacroRequest.deserialize(deserializer, zoneId );
5360 (await _instantiateMacro(request)).serialize(serializer);
5461 break;
5562 case MessageType.executeDefinitionsPhaseRequest:
56- var request = ExecuteDefinitionsPhaseRequest.deserialize(
57- deserializer,
58- ClientTypeResolver(),
59- ClientClassIntrospector(),
60- ClientTypeDeclarationsResolver());
61- (await _executeDefinitionsPhase(request)).serialize(serializer);
63+ var request = new ExecuteDefinitionsPhaseRequest.deserialize(deserializer, zoneId);
64+ (await _executeDefinitionsPhase(request, sendRequest)).serialize(serializer);
6265 break;
66+ case MessageType.response:
67+ var response = new SerializableResponse.deserialize(deserializer, zoneId);
68+ _responseCompleters.remove(response.requestId)!.complete(response);
69+ return;
6370 default:
6471 throw new StateError('Unhandled event type \$ type');
6572 }
@@ -102,31 +109,46 @@ Future<SerializableResponse> _instantiateMacro(
102109 response: identifier,
103110 requestId: request.id,
104111 serializationZoneId: request.serializationZoneId);
105- } catch (e) {
112+ } catch (e, s ) {
106113 return new SerializableResponse(
107114 responseType: MessageType.error,
108115 error: e.toString(),
116+ stackTrace: s.toString(),
109117 requestId: request.id,
110118 serializationZoneId: request.serializationZoneId);
111119 }
112120}
113121
114122Future<SerializableResponse> _executeDefinitionsPhase(
115- ExecuteDefinitionsPhaseRequest request) async {
123+ ExecuteDefinitionsPhaseRequest request,
124+ Future<Response> Function(Request request) sendRequest) async {
116125 try {
117126 Macro? instance = _macroInstances[request.macro];
118127 if (instance == null) {
119128 throw new StateError('Unrecognized macro instance \$ {request.macro}\\ n'
120129 'Known instances: \$ _macroInstances)');
121130 }
131+ var typeResolver = ClientTypeResolver(
132+ sendRequest,
133+ remoteInstance: request.typeResolver,
134+ serializationZoneId: request.serializationZoneId);
135+ var typeDeclarationResolver = ClientTypeDeclarationResolver(
136+ sendRequest,
137+ remoteInstance: request.typeDeclarationResolver,
138+ serializationZoneId: request.serializationZoneId);
139+ var classIntrospector = ClientClassIntrospector(
140+ sendRequest,
141+ remoteInstance: request.classIntrospector,
142+ serializationZoneId: request.serializationZoneId);
143+
122144 Declaration declaration = request.declaration;
123145 if (instance is FunctionDefinitionMacro &&
124146 declaration is FunctionDeclarationImpl) {
125147 FunctionDefinitionBuilderImpl builder = new FunctionDefinitionBuilderImpl(
126148 declaration,
127- request. typeResolver,
128- request. typeDeclarationResolver,
129- request. classIntrospector);
149+ typeResolver,
150+ typeDeclarationResolver,
151+ classIntrospector);
130152 await instance.buildDefinitionForFunction(declaration, builder);
131153 return new SerializableResponse(
132154 responseType: MessageType.macroExecutionResult,
@@ -137,12 +159,28 @@ Future<SerializableResponse> _executeDefinitionsPhase(
137159 throw new UnsupportedError(
138160 ('Only FunctionDefinitionMacros are supported currently'));
139161 }
140- } catch (e) {
162+ } catch (e, s ) {
141163 return new SerializableResponse(
142164 responseType: MessageType.error,
143165 error: e.toString(),
166+ stackTrace: s.toString(),
144167 requestId: request.id,
145168 serializationZoneId: request.serializationZoneId);
146169 }
147170}
171+
172+ /// Holds on to response completers by request id.
173+ final _responseCompleters = <int, Completer<Response>>{};
174+
175+ /// Serializes [request], sends it to [sendPort], and sets up a [Completer] in
176+ /// [_responseCompleters] to handle the response.
177+ Future<Response> _sendRequest(Request request, SendPort sendPort) {
178+ Completer<Response> completer = Completer();
179+ _responseCompleters[request.id] = completer;
180+ JsonSerializer serializer = JsonSerializer();
181+ serializer.addNum(request.serializationZoneId);
182+ request.serialize(serializer);
183+ sendPort.send(serializer.result);
184+ return completer.future;
185+ }
148186''' ;
0 commit comments