Skip to content

Commit 590635a

Browse files
author
Dart CI
committed
Version 2.17.0-17.0.dev
Merge commit '2a31ee5530c698329a643ec1f30217a05ff21c55' into 'dev'
2 parents d0d4dbf + 2a31ee5 commit 590635a

38 files changed

+1467
-316
lines changed

pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ abstract class TypeResolver {
3030
/// may be asked to run in this state during the development cycle. It is
3131
/// helpful for users if macros provide a best effort implementation in that
3232
/// case or handle the error in a useful way.
33-
Future<StaticType> resolve(TypeAnnotation typeAnnotation);
33+
Future<StaticType> resolve(covariant TypeAnnotation typeAnnotation);
3434
}
3535

3636
/// The api used to introspect on a [ClassDeclaration].

pkg/_fe_analyzer_shared/lib/src/macros/api/introspection.dart

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,10 +49,10 @@ abstract class NamedTypeAnnotation implements TypeAnnotation {
4949
/// compared to other static types.
5050
abstract class StaticType {
5151
/// Returns true if this is a subtype of [other].
52-
Future<bool> isSubtypeOf(StaticType other);
52+
Future<bool> isSubtypeOf(covariant StaticType other);
5353

5454
/// Returns true if this is an identical type to [other].
55-
Future<bool> isExactly(StaticType other);
55+
Future<bool> isExactly(covariant StaticType other);
5656
}
5757

5858
/// A subtype of [StaticType] representing types that can be resolved by name

pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart

Lines changed: 51 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ import 'dart:async';
2727
import 'dart:isolate';
2828
2929
import 'package:_fe_analyzer_shared/src/macros/executor_shared/introspection_impls.dart';
30+
import 'package:_fe_analyzer_shared/src/macros/executor_shared/remote_instance.dart';
3031
import 'package:_fe_analyzer_shared/src/macros/executor_shared/response_impls.dart';
3132
import 'package:_fe_analyzer_shared/src/macros/executor_shared/serialization.dart';
3233
import '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.
4142
void 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
114122
Future<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

Comments
 (0)