Skip to content

Commit cb4c9c7

Browse files
jakemac53Commit Queue
authored and
Commit Queue
committed
Add support for mixin declarations in the macro APIs
Adds MixinDeclaration/IntrospectableMixinDeclaration for introspection. Adds MixinTypesMacro/MixinDeclarationsMacro/MixinDefinitionsMacro macro interfaces. Updates supporting serialization/execution code and tests. Change-Id: I57245fe7d177b6d5ba57649455fbd844ba1f85c3 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/294380 Reviewed-by: Bob Nystrom <[email protected]> Commit-Queue: Jake Macdonald <[email protected]>
1 parent cc4eb93 commit cb4c9c7

File tree

19 files changed

+639
-139
lines changed

19 files changed

+639
-139
lines changed

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

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,25 @@ abstract class EnumValueDeclaration implements Declaration {
198198
abstract class IntrospectableEnumDeclaration
199199
implements EnumDeclaration, IntrospectableEnum {}
200200

201+
/// Mixin introspection information.
202+
///
203+
/// Information about fields and methods must be retrieved from the `builder`
204+
/// objects.
205+
abstract class MixinDeclaration implements ParameterizedTypeDeclaration {
206+
/// Whether this mixin has a `base` modifier.
207+
bool get hasBase;
208+
209+
/// All the `implements` type annotations.
210+
Iterable<NamedTypeAnnotation> get interfaces;
211+
212+
/// All the `on` clause type annotations.
213+
Iterable<NamedTypeAnnotation> get superclassConstraints;
214+
}
215+
216+
/// An introspectable mixin declaration.
217+
abstract class IntrospectableMixinDeclaration
218+
implements MixinDeclaration, IntrospectableType {}
219+
201220
/// Type alias introspection information.
202221
abstract class TypeAliasDeclaration implements ParameterizedTypeDeclaration {
203222
/// The type annotation this is an alias for.

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -178,3 +178,24 @@ abstract class ConstructorDefinitionMacro implements Macro {
178178
FutureOr<void> buildDefinitionForConstructor(
179179
ConstructorDeclaration constructor, ConstructorDefinitionBuilder builder);
180180
}
181+
182+
/// The interface for [Macro]s that can be applied to any mixin declaration, and
183+
/// want to contribute new type declarations to the program.
184+
abstract class MixinTypesMacro implements Macro {
185+
FutureOr<void> buildTypesForMixin(
186+
MixinDeclaration mixin, TypeBuilder builder);
187+
}
188+
189+
/// The interface for [Macro]s that can be applied to any mixin declaration, and
190+
/// want to contribute new non-type declarations to the program.
191+
abstract class MixinDeclarationsMacro implements Macro {
192+
FutureOr<void> buildDeclarationsForMixin(
193+
IntrospectableMixinDeclaration mixin, MemberDeclarationBuilder builder);
194+
}
195+
196+
/// The interface for [Macro]s that can be applied to any mixin declaration, and
197+
/// want to augment the definitions of the members of that mixin.
198+
abstract class MixinDefinitionMacro implements Macro {
199+
FutureOr<void> buildDefinitionForMixin(
200+
IntrospectableMixinDeclaration clazz, TypeDefinitionBuilder builder);
201+
}

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,11 +312,14 @@ abstract class MacroExecutionResult implements Serializable {
312312

313313
/// Each of the possible types of declarations a macro can be applied to
314314
enum DeclarationKind {
315-
clazz,
315+
classType,
316316
constructor,
317+
enumType,
318+
enumValue,
317319
field,
318320
function,
319321
method,
322+
mixinType,
320323
variable,
321324
}
322325

pkg/_fe_analyzer_shared/lib/src/macros/executor/augmentation_library.dart

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,10 @@ mixin AugmentationLibraryBuilder on MacroExecutor {
127127
? 'class'
128128
: typeDeclaration is EnumDeclaration
129129
? 'enum'
130-
: throw new UnsupportedError(
131-
'Unsupported augmentation type $typeDeclaration');
130+
: typeDeclaration is MixinDeclaration
131+
? 'mixin'
132+
: throw new UnsupportedError(
133+
'Unsupported augmentation type $typeDeclaration');
132134
final List<String> keywords = [
133135
if (typeDeclaration is ClassDeclaration) ...[
134136
if (typeDeclaration.hasAbstract) 'abstract',
@@ -138,7 +140,9 @@ mixin AugmentationLibraryBuilder on MacroExecutor {
138140
if (typeDeclaration.hasInterface) 'interface',
139141
if (typeDeclaration.hasMixin) 'mixin',
140142
if (typeDeclaration.hasSealed) 'sealed',
141-
],
143+
] else if (typeDeclaration is MixinDeclaration &&
144+
typeDeclaration.hasBase)
145+
'base',
142146
];
143147
// Has the effect of adding a space after the keywords
144148
if (keywords.isNotEmpty) keywords.add('');

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,9 @@ Future<MacroExecutionResult> executeTypesMacro(Macro macro,
3737
} else if (macro is EnumTypesMacro && declaration is EnumDeclaration) {
3838
await macro.buildTypesForEnum(declaration, builder);
3939
return builder.result;
40+
} else if (macro is MixinTypesMacro && declaration is MixinDeclaration) {
41+
await macro.buildTypesForMixin(declaration, builder);
42+
return builder.result;
4043
} else if (macro is EnumValueTypesMacro &&
4144
declaration is EnumValueDeclaration) {
4245
await macro.buildTypesForEnumValue(declaration, builder);
@@ -82,6 +85,21 @@ Future<MacroExecutionResult> executeDeclarationsMacro(
8285
typeResolver);
8386
await macro.buildDeclarationsForEnum(declaration, builder);
8487
return builder.result;
88+
} else if (declaration is MixinDeclaration &&
89+
macro is MixinDeclarationsMacro) {
90+
if (declaration is! IntrospectableMixinDeclarationImpl) {
91+
throw new ArgumentError(
92+
'Mixin declarations annotated with a macro should be introspectable '
93+
'in the declarations phase.');
94+
}
95+
MemberDeclarationBuilderImpl builder = new MemberDeclarationBuilderImpl(
96+
declaration.identifier,
97+
identifierResolver,
98+
typeIntrospector,
99+
typeDeclarationResolver,
100+
typeResolver);
101+
await macro.buildDeclarationsForMixin(declaration, builder);
102+
return builder.result;
85103
} else if (declaration is MemberDeclaration) {
86104
MemberDeclarationBuilderImpl builder = new MemberDeclarationBuilderImpl(
87105
declaration.definingType as IdentifierImpl,
@@ -243,6 +261,21 @@ Future<MacroExecutionResult> executeDefinitionMacro(
243261
typeInferrer);
244262
await macro.buildDefinitionForEnumValue(declaration, builder);
245263
return builder.result;
264+
} else if (macro is MixinDefinitionMacro && declaration is MixinDeclaration) {
265+
if (declaration is! IntrospectableMixinDeclaration) {
266+
throw new ArgumentError(
267+
'Mixin declarations annotated with a macro should be introspectable '
268+
'in the definitions phase.');
269+
}
270+
TypeDefinitionBuilderImpl builder = new TypeDefinitionBuilderImpl(
271+
declaration,
272+
identifierResolver,
273+
typeIntrospector,
274+
typeDeclarationResolver,
275+
typeResolver,
276+
typeInferrer);
277+
await macro.buildDefinitionForMixin(declaration, builder);
278+
return builder.result;
246279
}
247280
throw new UnsupportedError('Unsupported macro type or invalid declaration:\n'
248281
'macro: $macro\ndeclaration: $declaration');

pkg/_fe_analyzer_shared/lib/src/macros/executor/introspection_impls.dart

Lines changed: 73 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -487,10 +487,10 @@ class MethodDeclarationImpl extends FunctionDeclarationImpl
487487
final bool isStatic;
488488

489489
MethodDeclarationImpl({
490-
// Declaration fields
490+
// Declaration fields.
491491
required super.id,
492492
required super.identifier,
493-
// Function fields
493+
// Function fields.
494494
required super.isAbstract,
495495
required super.isExternal,
496496
required super.isGetter,
@@ -500,7 +500,7 @@ class MethodDeclarationImpl extends FunctionDeclarationImpl
500500
required super.positionalParameters,
501501
required super.returnType,
502502
required super.typeParameters,
503-
// Method fields
503+
// Method fields.
504504
required this.definingType,
505505
required this.isStatic,
506506
});
@@ -525,10 +525,10 @@ class ConstructorDeclarationImpl extends MethodDeclarationImpl
525525
RemoteInstanceKind get kind => RemoteInstanceKind.constructorDeclaration;
526526

527527
ConstructorDeclarationImpl({
528-
// Declaration fields
528+
// Declaration fields.
529529
required super.id,
530530
required super.identifier,
531-
// Function fields
531+
// Function fields.
532532
required super.isAbstract,
533533
required super.isExternal,
534534
required super.isGetter,
@@ -538,9 +538,9 @@ class ConstructorDeclarationImpl extends MethodDeclarationImpl
538538
required super.positionalParameters,
539539
required super.returnType,
540540
required super.typeParameters,
541-
// Method fields
541+
// Method fields.
542542
required super.definingType,
543-
// Constructor fields
543+
// Constructor fields.
544544
required this.isFactory,
545545
}) : super(
546546
isStatic: true,
@@ -605,15 +605,15 @@ class FieldDeclarationImpl extends VariableDeclarationImpl
605605
final bool isStatic;
606606

607607
FieldDeclarationImpl({
608-
// Declaration fields
608+
// Declaration fields.
609609
required super.id,
610610
required super.identifier,
611-
// Variable fields
611+
// Variable fields.
612612
required super.isExternal,
613613
required super.isFinal,
614614
required super.isLate,
615615
required super.type,
616-
// Field fields
616+
// Field fields.
617617
required this.definingType,
618618
required this.isStatic,
619619
});
@@ -699,12 +699,12 @@ class ClassDeclarationImpl extends ParameterizedTypeDeclarationImpl
699699
: RemoteInstanceKind.classDeclaration;
700700

701701
ClassDeclarationImpl({
702-
// Declaration fields
702+
// Declaration fields.
703703
required super.id,
704704
required super.identifier,
705-
// TypeDeclaration fields
705+
// TypeDeclaration fields.
706706
required super.typeParameters,
707-
// ClassDeclaration fields
707+
// ClassDeclaration fields.
708708
required this.interfaces,
709709
required this.hasAbstract,
710710
required this.hasBase,
@@ -763,12 +763,12 @@ class EnumDeclarationImpl extends ParameterizedTypeDeclarationImpl
763763
: RemoteInstanceKind.enumDeclaration;
764764

765765
EnumDeclarationImpl({
766-
// Declaration fields
766+
// Declaration fields.
767767
required super.id,
768768
required super.identifier,
769-
// TypeDeclaration fields
769+
// TypeDeclaration fields.
770770
required super.typeParameters,
771-
// EnumDeclaration fields
771+
// EnumDeclaration fields.
772772
required this.interfaces,
773773
required this.mixins,
774774
});
@@ -817,6 +817,60 @@ class EnumValueDeclarationImpl extends DeclarationImpl
817817
}
818818
}
819819

820+
class IntrospectableMixinDeclarationImpl = MixinDeclarationImpl
821+
with IntrospectableType
822+
implements IntrospectableMixinDeclaration;
823+
824+
class MixinDeclarationImpl extends ParameterizedTypeDeclarationImpl
825+
implements MixinDeclaration {
826+
@override
827+
final bool hasBase;
828+
829+
@override
830+
final List<NamedTypeAnnotationImpl> interfaces;
831+
832+
@override
833+
final List<NamedTypeAnnotationImpl> superclassConstraints;
834+
835+
@override
836+
RemoteInstanceKind get kind => this is IntrospectableMixinDeclaration
837+
? RemoteInstanceKind.introspectableMixinDeclaration
838+
: RemoteInstanceKind.mixinDeclaration;
839+
840+
MixinDeclarationImpl({
841+
// Declaration fields.
842+
required super.id,
843+
required super.identifier,
844+
// TypeDeclaration fields.
845+
required super.typeParameters,
846+
// MixinDeclaration fields.
847+
required this.hasBase,
848+
required this.interfaces,
849+
required this.superclassConstraints,
850+
});
851+
852+
@override
853+
void serialize(Serializer serializer) {
854+
super.serialize(serializer);
855+
// Client side we don't encode anything but the ID.
856+
if (serializationMode.isClient) return;
857+
858+
serializer
859+
..addBool(hasBase)
860+
..startList();
861+
for (NamedTypeAnnotationImpl interface in interfaces) {
862+
interface.serialize(serializer);
863+
}
864+
serializer
865+
..endList()
866+
..startList();
867+
for (NamedTypeAnnotationImpl constraint in superclassConstraints) {
868+
constraint.serialize(serializer);
869+
}
870+
serializer..endList();
871+
}
872+
}
873+
820874
class TypeAliasDeclarationImpl extends ParameterizedTypeDeclarationImpl
821875
implements TypeAliasDeclaration {
822876
/// The type being aliased.
@@ -827,12 +881,12 @@ class TypeAliasDeclarationImpl extends ParameterizedTypeDeclarationImpl
827881
RemoteInstanceKind get kind => RemoteInstanceKind.typeAliasDeclaration;
828882

829883
TypeAliasDeclarationImpl({
830-
// Declaration fields
884+
// Declaration fields.
831885
required super.id,
832886
required super.identifier,
833-
// TypeDeclaration fields
887+
// TypeDeclaration fields.
834888
required super.typeParameters,
835-
// TypeAlias fields
889+
// TypeAlias fields.
836890
required this.aliasedType,
837891
});
838892

pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -100,21 +100,23 @@ enum RemoteInstanceKind {
100100
functionTypeParameter,
101101
identifier,
102102
identifierResolver,
103-
typeIntrospector,
104103
introspectableClassDeclaration,
105104
introspectableEnumDeclaration,
106-
namedStaticType,
105+
introspectableMixinDeclaration,
107106
methodDeclaration,
107+
mixinDeclaration,
108+
namedStaticType,
108109
namedTypeAnnotation,
109110
omittedTypeAnnotation,
110111
parameterDeclaration,
111112
recordFieldDeclaration,
112113
recordTypeAnnotation,
113114
staticType,
114115
typeAliasDeclaration,
116+
typeDeclarationResolver,
115117
typeParameterDeclaration,
116118
typeResolver,
117-
typeDeclarationResolver,
118119
typeInferrer,
120+
typeIntrospector,
119121
variableDeclaration,
120122
}

0 commit comments

Comments
 (0)