Skip to content

Commit 4f40923

Browse files
author
Dart CI
committed
Version 2.17.0-54.0.dev
Merge commit '627326aec14f52f9fc9015ad22bd2810635e006d' into 'dev'
2 parents 1abc88e + 627326a commit 4f40923

21 files changed

Lines changed: 4442 additions & 199 deletions

File tree

DEPS

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -133,7 +133,7 @@ vars = {
133133
"mime_rev": "c931f4bed87221beaece356494b43731445ce7b8",
134134
"mockito_rev": "d39ac507483b9891165e422ec98d9fb480037c8b",
135135
"oauth2_rev": "7cd3284049fe5badbec9f2bea2afc41d14c01057",
136-
"package_config_rev": "fb736aa12316dd2d882b202a438a6946a4b4bea0",
136+
"package_config_rev": "8731bf10b5375542792a32a0f7c8a6f370583d96",
137137
"path_rev": "baedce9d2ca11ea2cdf54395a74eb038087777a4",
138138
"pedantic_rev": "66f2f6c27581c7936482e83be80b27be2719901c",
139139
"platform_rev": "1ffad63428bbd1b3ecaa15926bacfb724023648c",

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ void main(_, SendPort sendPort) {
7979
var request = new ExecuteDefinitionsPhaseRequest.deserialize(deserializer, zoneId);
8080
(await _executeDefinitionsPhase(request, sendRequest)).serialize(serializer);
8181
break;
82+
case MessageType.executeTypesPhaseRequest:
83+
var request = new ExecuteTypesPhaseRequest.deserialize(deserializer, zoneId);
84+
(await _executeTypesPhase(request, sendRequest)).serialize(serializer);
85+
break;
8286
case MessageType.response:
8387
var response = new SerializableResponse.deserialize(deserializer, zoneId);
8488
_responseCompleters.remove(response.requestId)!.complete(response);
@@ -135,6 +139,32 @@ Future<SerializableResponse> _instantiateMacro(
135139
}
136140
}
137141
142+
Future<SerializableResponse> _executeTypesPhase(
143+
ExecuteTypesPhaseRequest request,
144+
Future<Response> Function(Request request) sendRequest) async {
145+
try {
146+
Macro? instance = _macroInstances[request.macro];
147+
if (instance == null) {
148+
throw new StateError('Unrecognized macro instance \${request.macro}\\n'
149+
'Known instances: \$_macroInstances)');
150+
}
151+
152+
var result = await executeTypesMacro(instance, request.declaration);
153+
return new SerializableResponse(
154+
responseType: MessageType.macroExecutionResult,
155+
response: result,
156+
requestId: request.id,
157+
serializationZoneId: request.serializationZoneId);
158+
} catch (e, s) {
159+
return new SerializableResponse(
160+
responseType: MessageType.error,
161+
error: e.toString(),
162+
stackTrace: s.toString(),
163+
requestId: request.id,
164+
serializationZoneId: request.serializationZoneId);
165+
}
166+
}
167+
138168
Future<SerializableResponse> _executeDeclarationsPhase(
139169
ExecuteDeclarationsPhaseRequest request,
140170
Future<Response> Function(Request request) sendRequest) async {

pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/builder_impls.dart

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,13 @@ class TypeBuilderBase {
2424
: _augmentations = parentAugmentations ?? [];
2525
}
2626

27+
class TypeBuilderImpl extends TypeBuilderBase implements TypeBuilder {
28+
@override
29+
void declareType(DeclarationCode typeDeclaration) {
30+
_augmentations.add(typeDeclaration);
31+
}
32+
}
33+
2734
/// Base class for all [DeclarationBuilder]s.
2835
class DeclarationBuilderBase extends TypeBuilderBase
2936
implements ClassIntrospector, TypeResolver {
@@ -66,10 +73,8 @@ class DeclarationBuilderBase extends TypeBuilderBase
6673
class DeclarationBuilderImpl extends DeclarationBuilderBase
6774
implements DeclarationBuilder {
6875
DeclarationBuilderImpl(
69-
ClassIntrospector classIntrospector, TypeResolver typeResolver,
70-
{List<DeclarationCode>? parentAugmentations})
71-
: super(classIntrospector, typeResolver,
72-
parentAugmentations: parentAugmentations);
76+
ClassIntrospector classIntrospector, TypeResolver typeResolver)
77+
: super(classIntrospector, typeResolver);
7378

7479
@override
7580
void declareInLibrary(DeclarationCode declaration) {
@@ -82,10 +87,8 @@ class ClassMemberDeclarationBuilderImpl extends DeclarationBuilderImpl
8287
final TypeAnnotation definingClass;
8388

8489
ClassMemberDeclarationBuilderImpl(this.definingClass,
85-
ClassIntrospector classIntrospector, TypeResolver typeResolver,
86-
{List<DeclarationCode>? parentAugmentations})
87-
: super(classIntrospector, typeResolver,
88-
parentAugmentations: parentAugmentations);
90+
ClassIntrospector classIntrospector, TypeResolver typeResolver)
91+
: super(classIntrospector, typeResolver);
8992

9093
@override
9194
void declareInClass(DeclarationCode declaration) {

pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/execute_macro.dart

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,38 @@ import 'package:_fe_analyzer_shared/src/macros/executor.dart';
66
import 'package:_fe_analyzer_shared/src/macros/executor_shared/builder_impls.dart';
77
import 'package:_fe_analyzer_shared/src/macros/api.dart';
88

9+
/// Runs [macro] in the types phase and returns a [MacroExecutionResult].
10+
Future<MacroExecutionResult> executeTypesMacro(
11+
Macro macro, Declaration declaration) async {
12+
TypeBuilderImpl builder = new TypeBuilderImpl();
13+
if (declaration is FunctionDeclaration) {
14+
if (macro is ConstructorTypesMacro &&
15+
declaration is ConstructorDeclaration) {
16+
await macro.buildTypesForConstructor(declaration, builder);
17+
return builder.result;
18+
} else if (macro is MethodTypesMacro && declaration is MethodDeclaration) {
19+
await macro.buildTypesForMethod(declaration, builder);
20+
return builder.result;
21+
} else if (macro is FunctionTypesMacro) {
22+
await macro.buildTypesForFunction(declaration, builder);
23+
return builder.result;
24+
}
25+
} else if (declaration is VariableDeclaration) {
26+
if (macro is FieldTypesMacro && declaration is FieldDeclaration) {
27+
await macro.buildTypesForField(declaration, builder);
28+
return builder.result;
29+
} else if (macro is VariableTypesMacro) {
30+
await macro.buildTypesForVariable(declaration, builder);
31+
return builder.result;
32+
}
33+
} else if (macro is ClassTypesMacro && declaration is ClassDeclaration) {
34+
await macro.buildTypesForClass(declaration, builder);
35+
return builder.result;
36+
}
37+
throw new UnsupportedError('Unsupported macro type or invalid declaration:\n'
38+
'macro: $macro\ndeclaration: $declaration');
39+
}
40+
941
/// Runs [macro] in the declaration phase and returns a [MacroExecutionResult].
1042
Future<MacroExecutionResult> executeDeclarationsMacro(
1143
Macro macro,

pkg/_fe_analyzer_shared/lib/src/macros/executor_shared/protocol.dart

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -237,6 +237,32 @@ class InstantiateMacroRequest extends Request {
237237
}
238238
}
239239

240+
/// A request to execute a macro on a particular declaration in the types phase.
241+
class ExecuteTypesPhaseRequest extends Request {
242+
final MacroInstanceIdentifier macro;
243+
final DeclarationImpl declaration;
244+
245+
ExecuteTypesPhaseRequest(this.macro, this.declaration,
246+
{required int serializationZoneId})
247+
: super(serializationZoneId: serializationZoneId);
248+
249+
/// When deserializing we have already consumed the message type, so we don't
250+
/// consume it again.
251+
ExecuteTypesPhaseRequest.deserialize(
252+
Deserializer deserializer, int serializationZoneId)
253+
: macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
254+
declaration = RemoteInstance.deserialize(deserializer),
255+
super.deserialize(deserializer, serializationZoneId);
256+
257+
void serialize(Serializer serializer) {
258+
serializer.addNum(MessageType.executeTypesPhaseRequest.index);
259+
macro.serialize(serializer);
260+
declaration.serialize(serializer);
261+
262+
super.serialize(serializer);
263+
}
264+
}
265+
240266
/// A request to execute a macro on a particular declaration in the definition
241267
/// phase.
242268
class ExecuteDeclarationsPhaseRequest extends Request {
@@ -664,6 +690,7 @@ enum MessageType {
664690
error,
665691
executeDeclarationsPhaseRequest,
666692
executeDefinitionsPhaseRequest,
693+
executeTypesPhaseRequest,
667694
instantiateMacroRequest,
668695
isExactlyTypeRequest,
669696
isSubtypeOfRequest,

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

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -420,10 +420,9 @@ class _SingleIsolatedMacroExecutor extends MacroExecutor {
420420

421421
@override
422422
Future<MacroExecutionResult> executeTypesPhase(
423-
MacroInstanceIdentifier macro, Declaration declaration) {
424-
// TODO: implement executeTypesPhase
425-
throw new UnimplementedError();
426-
}
423+
MacroInstanceIdentifier macro, DeclarationImpl declaration) =>
424+
_sendRequest((zoneId) => new ExecuteTypesPhaseRequest(macro, declaration,
425+
serializationZoneId: zoneId));
427426

428427
@override
429428
Future<MacroInstanceIdentifier> instantiateMacro(

pkg/_fe_analyzer_shared/test/macros/isolated_executor/isolated_executor_test.dart

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,35 @@ void main() {
212212
var testTypeDeclarationResolver =
213213
TestTypeDeclarationResolver({myClassStaticType: myClass});
214214

215+
group('in the types phase', () {
216+
test('on methods', () async {
217+
var result = await executor.executeTypesPhase(instanceId, myMethod);
218+
expect(result.augmentations.single.debugString().toString(),
219+
equalsIgnoringWhitespace('class GeneratedByMyMethod {}'));
220+
});
221+
222+
test('on constructors', () async {
223+
var result =
224+
await executor.executeTypesPhase(instanceId, myConstructor);
225+
expect(result.augmentations.single.debugString().toString(),
226+
equalsIgnoringWhitespace('class GeneratedByMyConstructor {}'));
227+
});
228+
229+
test('on fields', () async {
230+
var result = await executor.executeTypesPhase(instanceId, myField);
231+
expect(result.augmentations.single.debugString().toString(),
232+
equalsIgnoringWhitespace('class GeneratedByMyField {}'));
233+
});
234+
235+
test('on classes', () async {
236+
var result = await executor.executeTypesPhase(instanceId, myClass);
237+
expect(
238+
result.augmentations.single.debugString().toString(),
239+
equalsIgnoringWhitespace(
240+
'class MyClassBuilder implements Builder<MyClass> {}'));
241+
});
242+
});
243+
215244
group('in the declaration phase', () {
216245
test('on methods', () async {
217246
var result = await executor.executeDeclarationsPhase(

pkg/_fe_analyzer_shared/test/macros/isolated_executor/simple_macro.dart

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,22 @@ import 'package:_fe_analyzer_shared/src/macros/api.dart';
1414
/// to validate the introspection APIs work as expected.
1515
class SimpleMacro
1616
implements
17+
ClassTypesMacro,
1718
ClassDeclarationsMacro,
1819
ClassDefinitionMacro,
20+
ConstructorTypesMacro,
1921
ConstructorDeclarationsMacro,
2022
ConstructorDefinitionMacro,
23+
FieldTypesMacro,
2124
FieldDeclarationsMacro,
2225
FieldDefinitionMacro,
26+
FunctionTypesMacro,
2327
FunctionDeclarationsMacro,
2428
FunctionDefinitionMacro,
29+
MethodTypesMacro,
2530
MethodDeclarationsMacro,
2631
MethodDefinitionMacro,
32+
VariableTypesMacro,
2733
VariableDeclarationsMacro,
2834
VariableDefinitionMacro {
2935
final int? x;
@@ -236,6 +242,77 @@ class SimpleMacro
236242
initializer: variable.initializer,
237243
);
238244
}
245+
246+
@override
247+
FutureOr<void> buildTypesForClass(
248+
ClassDeclaration clazz, TypeBuilder builder) {
249+
List<Object> _buildTypeParam(
250+
TypeParameterDeclaration typeParam, bool isFirst) {
251+
return [
252+
if (!isFirst) ', ',
253+
typeParam.name,
254+
if (typeParam.bounds != null) ...[
255+
' extends ',
256+
typeParam.bounds!,
257+
]
258+
];
259+
}
260+
261+
builder.declareType(DeclarationCode.fromParts([
262+
'class ${clazz.name}Builder',
263+
if (clazz.typeParameters.isNotEmpty) ...[
264+
'<',
265+
..._buildTypeParam(clazz.typeParameters.first, true),
266+
for (var typeParam in clazz.typeParameters.skip(1))
267+
..._buildTypeParam(typeParam, false),
268+
'>',
269+
],
270+
' implements Builder<',
271+
clazz.type,
272+
if (clazz.typeParameters.isNotEmpty) ...[
273+
'<',
274+
clazz.typeParameters.first,
275+
for (var typeParam in clazz.typeParameters) ', ${typeParam.name}',
276+
'>',
277+
],
278+
'> {}'
279+
]));
280+
}
281+
282+
@override
283+
FutureOr<void> buildTypesForConstructor(
284+
ConstructorDeclaration constructor, TypeBuilder builder) {
285+
builder.declareType(DeclarationCode.fromString(
286+
'class GeneratedBy${constructor.name.capitalize()} {}'));
287+
}
288+
289+
@override
290+
FutureOr<void> buildTypesForField(
291+
FieldDeclaration field, TypeBuilder builder) {
292+
builder.declareType(DeclarationCode.fromString(
293+
'class GeneratedBy${field.name.capitalize()} {}'));
294+
}
295+
296+
@override
297+
FutureOr<void> buildTypesForFunction(
298+
FunctionDeclaration function, TypeBuilder builder) {
299+
builder.declareType(DeclarationCode.fromString(
300+
'class GeneratedBy${function.name.capitalize()} {}'));
301+
}
302+
303+
@override
304+
FutureOr<void> buildTypesForMethod(
305+
MethodDeclaration method, TypeBuilder builder) {
306+
builder.declareType(DeclarationCode.fromString(
307+
'class GeneratedBy${method.name.capitalize()} {}'));
308+
}
309+
310+
@override
311+
FutureOr<void> buildTypesForVariable(
312+
VariableDeclaration variable, TypeBuilder builder) {
313+
builder.declareType(DeclarationCode.fromString(
314+
'class GeneratedBy${variable.name.capitalize()} {}'));
315+
}
239316
}
240317

241318
FunctionBodyCode _buildFunctionAugmentation(FunctionDeclaration function) =>

0 commit comments

Comments
 (0)