Version 2.18.0-124.0.dev
Merge commit '6ef2b237e06bc4497cfb8a1fe1cceada96982a90' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
index c80faa19..40a52c4 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -459,8 +459,8 @@
}
benchmarker?.enterPhase(BenchmarkPhases.outline_checkSemantics);
- List<SourceClassBuilder>? sourceClassBuilders =
- loader.checkSemantics(objectClassBuilder);
+ List<SourceClassBuilder>? sortedSourceClassBuilders =
+ loader.checkClassCycles(objectClassBuilder);
benchmarker?.enterPhase(BenchmarkPhases.outline_finishTypeVariables);
loader.finishTypeVariables(
@@ -484,15 +484,16 @@
computeCoreTypes();
benchmarker?.enterPhase(BenchmarkPhases.outline_buildClassHierarchy);
- loader.buildClassHierarchy(sourceClassBuilders, objectClassBuilder);
+ loader.buildClassHierarchy(sortedSourceClassBuilders, objectClassBuilder);
benchmarker?.enterPhase(BenchmarkPhases.outline_checkSupertypes);
loader.checkSupertypes(
- sourceClassBuilders, enumClass, underscoreEnumClass);
+ sortedSourceClassBuilders, enumClass, underscoreEnumClass);
if (macroApplications != null) {
benchmarker?.enterPhase(BenchmarkPhases.outline_applyDeclarationMacros);
- await macroApplications.applyDeclarationsMacros(loader.hierarchyBuilder,
+ await macroApplications.applyDeclarationsMacros(
+ loader.hierarchyBuilder, sortedSourceClassBuilders,
(SourceLibraryBuilder augmentationLibrary) async {
List<SourceLibraryBuilder> augmentationLibraries = [
augmentationLibrary
@@ -508,14 +509,14 @@
benchmarker
?.enterPhase(BenchmarkPhases.outline_installSyntheticConstructors);
- installSyntheticConstructors(sourceClassBuilders);
+ installSyntheticConstructors(sortedSourceClassBuilders);
benchmarker?.enterPhase(BenchmarkPhases.outline_resolveConstructors);
loader.resolveConstructors(loader.sourceLibraryBuilders);
benchmarker
?.enterPhase(BenchmarkPhases.outline_buildClassHierarchyMembers);
- loader.buildClassHierarchyMembers(sourceClassBuilders);
+ loader.buildClassHierarchyMembers(sortedSourceClassBuilders);
benchmarker?.enterPhase(BenchmarkPhases.outline_computeHierarchy);
loader.computeHierarchy();
@@ -527,20 +528,20 @@
loader.installTypedefTearOffs();
benchmarker?.enterPhase(BenchmarkPhases.outline_performTopLevelInference);
- loader.performTopLevelInference(sourceClassBuilders);
+ loader.performTopLevelInference(sortedSourceClassBuilders);
benchmarker?.enterPhase(BenchmarkPhases.outline_checkOverrides);
- loader.checkOverrides(sourceClassBuilders);
+ loader.checkOverrides(sortedSourceClassBuilders);
benchmarker?.enterPhase(BenchmarkPhases.outline_checkAbstractMembers);
- loader.checkAbstractMembers(sourceClassBuilders);
+ loader.checkAbstractMembers(sortedSourceClassBuilders);
benchmarker
?.enterPhase(BenchmarkPhases.outline_addNoSuchMethodForwarders);
- loader.addNoSuchMethodForwarders(sourceClassBuilders);
+ loader.addNoSuchMethodForwarders(sortedSourceClassBuilders);
benchmarker?.enterPhase(BenchmarkPhases.outline_checkMixins);
- loader.checkMixins(sourceClassBuilders);
+ loader.checkMixins(sortedSourceClassBuilders);
benchmarker?.enterPhase(BenchmarkPhases.outline_buildOutlineExpressions);
// TODO(johnniwinther): Add an interface for registering delayed actions.
@@ -554,7 +555,7 @@
benchmarker
?.enterPhase(BenchmarkPhases.outline_checkRedirectingFactories);
- loader.checkRedirectingFactories(sourceClassBuilders);
+ loader.checkRedirectingFactories(sortedSourceClassBuilders);
benchmarker
?.enterPhase(BenchmarkPhases.outline_finishSynthesizedParameters);
@@ -574,7 +575,7 @@
// of time, meaning that all source library builders will be kept alive
// (for whatever amount of time) even though we convert them to dill
// library builders. To avoid it we null it out here.
- sourceClassBuilders = null;
+ sortedSourceClassBuilders = null;
return new BuildResult(
component: component, macroApplications: macroApplications);
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
index 8b992bf..d75672e 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
@@ -39,6 +39,9 @@
result.add(application);
}
}
+ if (result != null && result.length > 1) {
+ result = result.reversed.toList(growable: false);
+ }
return result;
}
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
index 18a3e34..7805bbb 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
@@ -67,16 +67,36 @@
final String constructorName;
final macro.Arguments arguments;
- // TODO(johnniwinther): Add support for arguments.
-
MacroApplication(this.classBuilder, this.constructorName, this.arguments);
late macro.MacroInstanceIdentifier instanceIdentifier;
@override
String toString() {
- return '${classBuilder.name}.'
- '${constructorName.isEmpty ? 'new' : constructorName}()';
+ StringBuffer sb = new StringBuffer();
+ sb.write(classBuilder.name);
+ sb.write('.');
+ if (constructorName.isEmpty) {
+ sb.write('new');
+ } else {
+ sb.write(constructorName);
+ }
+ sb.write('(');
+ String comma = '';
+ for (Object? positional in arguments.positional) {
+ sb.write(comma);
+ sb.write(positional);
+ comma = ',';
+ }
+ for (MapEntry<String, Object?> named in arguments.named.entries) {
+ sb.write(comma);
+ sb.write(named.key);
+ sb.write(':');
+ sb.write(named.value);
+ comma = ',';
+ }
+ sb.write(')');
+ return sb.toString();
}
}
@@ -95,16 +115,45 @@
memberDeclarationsResults = {};
Map<MemberBuilder, List<macro.MacroExecutionResult>>
memberDefinitionsResults = {};
+
+ List<ApplicationDataForTesting> typesApplicationOrder = [];
+ List<ApplicationDataForTesting> declarationsApplicationOrder = [];
+ List<ApplicationDataForTesting> definitionApplicationOrder = [];
+}
+
+class ApplicationDataForTesting {
+ final ApplicationData applicationData;
+ final MacroApplication macroApplication;
+
+ ApplicationDataForTesting(this.applicationData, this.macroApplication);
+
+ @override
+ String toString() {
+ StringBuffer sb = new StringBuffer();
+ Builder builder = applicationData.builder;
+ if (builder is MemberBuilder) {
+ if (builder.classBuilder != null) {
+ sb.write(builder.classBuilder!.name);
+ sb.write('.');
+ }
+ sb.write(builder.name);
+ } else {
+ sb.write((builder as ClassBuilder).name);
+ }
+ sb.write(':');
+ sb.write(macroApplication);
+ return sb.toString();
+ }
}
class LibraryMacroApplicationData {
Map<SourceClassBuilder, ClassMacroApplicationData> classData = {};
- Map<MemberBuilder, List<MacroApplication>> memberApplications = {};
+ Map<MemberBuilder, ApplicationData> memberApplications = {};
}
class ClassMacroApplicationData {
- List<MacroApplication>? classApplications;
- Map<MemberBuilder, List<MacroApplication>> memberApplications = {};
+ ApplicationData? classApplications;
+ Map<MemberBuilder, ApplicationData> memberApplications = {};
}
/// Macro classes that need to be precompiled.
@@ -121,7 +170,7 @@
final macro.MacroExecutor _macroExecutor;
final Map<SourceLibraryBuilder, LibraryMacroApplicationData> libraryData;
final MacroApplicationDataForTesting? dataForTesting;
- List<_ApplicationData>? _applicationDataCache;
+ bool _hasComputedApplicationData = false;
MacroApplications(
this._macroExecutor, this.libraryData, this.dataForTesting) {
@@ -170,15 +219,16 @@
for (LibraryMacroApplicationData libraryData in libraryData.values) {
for (ClassMacroApplicationData classData
in libraryData.classData.values) {
- await ensureMacroClassIds(classData.classApplications);
- for (List<MacroApplication> applications
+ await ensureMacroClassIds(
+ classData.classApplications?.macroApplications);
+ for (ApplicationData applicationData
in classData.memberApplications.values) {
- await ensureMacroClassIds(applications);
+ await ensureMacroClassIds(applicationData.macroApplications);
}
}
- for (List<MacroApplication> applications
+ for (ApplicationData applicationData
in libraryData.memberApplications.values) {
- await ensureMacroClassIds(applications);
+ await ensureMacroClassIds(applicationData.macroApplications);
}
}
return new MacroApplications(macroExecutor, libraryData, dataForTesting);
@@ -238,59 +288,53 @@
throw new UnimplementedError('This is not yet supported!');
}
- Iterable<_ApplicationData> get _applicationData {
- if (_applicationDataCache == null) {
- List<_ApplicationData> data = _applicationDataCache = [];
- for (MapEntry<SourceLibraryBuilder,
- LibraryMacroApplicationData> libraryEntry in libraryData.entries) {
- SourceLibraryBuilder libraryBuilder = libraryEntry.key;
- LibraryMacroApplicationData libraryMacroApplicationData =
- libraryEntry.value;
- for (MapEntry<MemberBuilder, List<MacroApplication>> memberEntry
- in libraryMacroApplicationData.memberApplications.entries) {
+ void _ensureApplicationData() {
+ if (_hasComputedApplicationData) return;
+ for (LibraryMacroApplicationData libraryMacroApplicationData
+ in libraryData.values) {
+ for (MapEntry<MemberBuilder, ApplicationData> memberEntry
+ in libraryMacroApplicationData.memberApplications.entries) {
+ MemberBuilder memberBuilder = memberEntry.key;
+ macro.Declaration? declaration = _getMemberDeclaration(memberBuilder);
+ if (declaration != null) {
+ memberEntry.value.declaration = declaration;
+ }
+ }
+ for (MapEntry<SourceClassBuilder, ClassMacroApplicationData> classEntry
+ in libraryMacroApplicationData.classData.entries) {
+ SourceClassBuilder classBuilder = classEntry.key;
+ ClassMacroApplicationData classData = classEntry.value;
+ ApplicationData? classApplicationData = classData.classApplications;
+ if (classApplicationData != null) {
+ macro.ClassDeclaration classDeclaration =
+ getClassDeclaration(classBuilder);
+ classApplicationData.declaration = classDeclaration;
+ }
+ for (MapEntry<MemberBuilder, ApplicationData> memberEntry
+ in classData.memberApplications.entries) {
MemberBuilder memberBuilder = memberEntry.key;
macro.Declaration? declaration = _getMemberDeclaration(memberBuilder);
if (declaration != null) {
- data.add(new _ApplicationData(
- libraryBuilder, memberBuilder, declaration, memberEntry.value));
- }
- }
- for (MapEntry<SourceClassBuilder, ClassMacroApplicationData> classEntry
- in libraryMacroApplicationData.classData.entries) {
- SourceClassBuilder classBuilder = classEntry.key;
- ClassMacroApplicationData classData = classEntry.value;
- List<MacroApplication>? classApplications =
- classData.classApplications;
- if (classApplications != null) {
- macro.ClassDeclaration classDeclaration =
- getClassDeclaration(classBuilder);
- data.add(new _ApplicationData(libraryBuilder, classBuilder,
- classDeclaration, classApplications));
- }
- for (MapEntry<MemberBuilder, List<MacroApplication>> memberEntry
- in classData.memberApplications.entries) {
- MemberBuilder memberBuilder = memberEntry.key;
- macro.Declaration? declaration =
- _getMemberDeclaration(memberBuilder);
- if (declaration != null) {
- data.add(new _ApplicationData(libraryBuilder, memberBuilder,
- declaration, memberEntry.value));
- }
+ memberEntry.value.declaration = declaration;
}
}
}
}
- return _applicationDataCache!;
+ _hasComputedApplicationData = true;
}
Future<List<macro.MacroExecutionResult>> _applyTypeMacros(
- _ApplicationData applicationData) async {
+ ApplicationData applicationData) async {
macro.Declaration declaration = applicationData.declaration;
List<macro.MacroExecutionResult> results = [];
for (MacroApplication macroApplication
in applicationData.macroApplications) {
if (macroApplication.instanceIdentifier
.shouldExecute(_declarationKind(declaration), macro.Phase.types)) {
+ if (retainDataForTesting) {
+ dataForTesting!.typesApplicationOrder.add(
+ new ApplicationDataForTesting(applicationData, macroApplication));
+ }
macro.MacroExecutionResult result =
await _macroExecutor.executeTypesPhase(
macroApplication.instanceIdentifier,
@@ -320,39 +364,50 @@
SourceLoader sourceLoader) async {
identifierResolver = new _IdentifierResolver(sourceLoader);
List<SourceLibraryBuilder> augmentationLibraries = [];
- Map<SourceLibraryBuilder, List<macro.MacroExecutionResult>> results = {};
- for (_ApplicationData macroApplication in _applicationData) {
- List<macro.MacroExecutionResult> executionResults =
- await _applyTypeMacros(macroApplication);
- if (executionResults.isNotEmpty) {
- (results[macroApplication.libraryBuilder] ??= [])
- .addAll(executionResults);
+ _ensureApplicationData();
+ for (MapEntry<SourceLibraryBuilder, LibraryMacroApplicationData> entry
+ in libraryData.entries) {
+ List<macro.MacroExecutionResult> executionResults = [];
+ SourceLibraryBuilder libraryBuilder = entry.key;
+ LibraryMacroApplicationData data = entry.value;
+ for (ApplicationData applicationData in data.memberApplications.values) {
+ executionResults.addAll(await _applyTypeMacros(applicationData));
}
- }
- for (MapEntry<SourceLibraryBuilder, List<macro.MacroExecutionResult>> entry
- in results.entries) {
- SourceLibraryBuilder sourceLibraryBuilder = entry.key;
- assert(entry.value.isNotEmpty);
- String result = _macroExecutor
- .buildAugmentationLibrary(
- entry.value, _resolveIdentifier, _inferOmittedType)
- .trim();
- assert(
- result.trim().isNotEmpty,
- "Empty types phase augmentation library source for "
- "$sourceLibraryBuilder}");
- if (result.isNotEmpty) {
- if (retainDataForTesting) {
- dataForTesting?.libraryTypesResult[sourceLibraryBuilder] = result;
+ for (MapEntry<ClassBuilder, ClassMacroApplicationData> entry
+ in data.classData.entries) {
+ ClassMacroApplicationData classApplicationData = entry.value;
+ for (ApplicationData applicationData
+ in classApplicationData.memberApplications.values) {
+ executionResults.addAll(await _applyTypeMacros(applicationData));
}
- augmentationLibraries
- .add(await sourceLibraryBuilder.createAugmentationLibrary(result));
+ if (classApplicationData.classApplications != null) {
+ executionResults.addAll(
+ await _applyTypeMacros(classApplicationData.classApplications!));
+ }
+ }
+ if (executionResults.isNotEmpty) {
+ String result = _macroExecutor
+ .buildAugmentationLibrary(
+ executionResults, _resolveIdentifier, _inferOmittedType)
+ .trim();
+ assert(
+ result.trim().isNotEmpty,
+ "Empty types phase augmentation library source for "
+ "$libraryBuilder}");
+ if (result.isNotEmpty) {
+ if (retainDataForTesting) {
+ dataForTesting?.libraryTypesResult[libraryBuilder] = result;
+ }
+ augmentationLibraries
+ .add(await libraryBuilder.createAugmentationLibrary(result));
+ }
}
}
+
return augmentationLibraries;
}
- Future<void> _applyDeclarationsMacros(_ApplicationData applicationData,
+ Future<void> _applyDeclarationsMacros(ApplicationData applicationData,
Future<void> Function(SourceLibraryBuilder) onAugmentationLibrary) async {
List<macro.MacroExecutionResult> results = [];
macro.Declaration declaration = applicationData.declaration;
@@ -360,6 +415,10 @@
in applicationData.macroApplications) {
if (macroApplication.instanceIdentifier.shouldExecute(
_declarationKind(declaration), macro.Phase.declarations)) {
+ if (retainDataForTesting) {
+ dataForTesting!.declarationsApplicationOrder.add(
+ new ApplicationDataForTesting(applicationData, macroApplication));
+ }
macro.MacroExecutionResult result =
await _macroExecutor.executeDeclarationsPhase(
macroApplication.instanceIdentifier,
@@ -395,24 +454,55 @@
late macro.TypeResolver typeResolver;
late macro.ClassIntrospector classIntrospector;
- Future<void> applyDeclarationsMacros(ClassHierarchyBuilder classHierarchy,
+ Future<void> applyDeclarationsMacros(
+ ClassHierarchyBuilder classHierarchy,
+ List<SourceClassBuilder> sortedSourceClassBuilders,
Future<void> Function(SourceLibraryBuilder) onAugmentationLibrary) async {
types = new Types(classHierarchy);
typeResolver = new _TypeResolver(this);
classIntrospector = new _ClassIntrospector(this, classHierarchy);
- for (_ApplicationData macroApplication in _applicationData) {
- await _applyDeclarationsMacros(macroApplication, onAugmentationLibrary);
+
+ // Apply macros to classes first, in class hierarchy order.
+ for (SourceClassBuilder classBuilder in sortedSourceClassBuilders) {
+ LibraryMacroApplicationData? libraryApplicationData =
+ libraryData[classBuilder.libraryBuilder];
+ if (libraryApplicationData == null) continue;
+
+ ClassMacroApplicationData? classApplicationData =
+ libraryApplicationData.classData[classBuilder];
+ if (classApplicationData == null) continue;
+ for (ApplicationData applicationData
+ in classApplicationData.memberApplications.values) {
+ await _applyDeclarationsMacros(applicationData, onAugmentationLibrary);
+ }
+ if (classApplicationData.classApplications != null) {
+ await _applyDeclarationsMacros(
+ classApplicationData.classApplications!, onAugmentationLibrary);
+ }
+ }
+
+ // Apply macros to library members second.
+ for (MapEntry<SourceLibraryBuilder, LibraryMacroApplicationData> entry
+ in libraryData.entries) {
+ LibraryMacroApplicationData data = entry.value;
+ for (ApplicationData applicationData in data.memberApplications.values) {
+ await _applyDeclarationsMacros(applicationData, onAugmentationLibrary);
+ }
}
}
Future<List<macro.MacroExecutionResult>> _applyDefinitionMacros(
- _ApplicationData applicationData) async {
+ ApplicationData applicationData) async {
List<macro.MacroExecutionResult> results = [];
macro.Declaration declaration = applicationData.declaration;
for (MacroApplication macroApplication
in applicationData.macroApplications) {
if (macroApplication.instanceIdentifier.shouldExecute(
_declarationKind(declaration), macro.Phase.definitions)) {
+ if (retainDataForTesting) {
+ dataForTesting!.definitionApplicationOrder.add(
+ new ApplicationDataForTesting(applicationData, macroApplication));
+ }
macro.MacroExecutionResult result =
await _macroExecutor.executeDefinitionsPhase(
macroApplication.instanceIdentifier,
@@ -446,30 +536,43 @@
typeDeclarationResolver = new _TypeDeclarationResolver(this);
typeInferrer = new _TypeInferrer(this);
List<SourceLibraryBuilder> augmentationLibraries = [];
- Map<SourceLibraryBuilder, List<macro.MacroExecutionResult>> results = {};
- for (_ApplicationData macroApplication in _applicationData) {
- List<macro.MacroExecutionResult> executionResults =
- await _applyDefinitionMacros(macroApplication);
+ for (MapEntry<SourceLibraryBuilder, LibraryMacroApplicationData> entry
+ in libraryData.entries) {
+ List<macro.MacroExecutionResult> executionResults = [];
+ SourceLibraryBuilder libraryBuilder = entry.key;
+ LibraryMacroApplicationData data = entry.value;
+ for (ApplicationData applicationData in data.memberApplications.values) {
+ executionResults.addAll(await _applyDefinitionMacros(applicationData));
+ }
+ for (MapEntry<ClassBuilder, ClassMacroApplicationData> entry
+ in data.classData.entries) {
+ ClassMacroApplicationData classApplicationData = entry.value;
+ for (ApplicationData applicationData
+ in classApplicationData.memberApplications.values) {
+ executionResults
+ .addAll(await _applyDefinitionMacros(applicationData));
+ }
+ if (classApplicationData.classApplications != null) {
+ executionResults.addAll(await _applyDefinitionMacros(
+ classApplicationData.classApplications!));
+ }
+ }
if (executionResults.isNotEmpty) {
- (results[macroApplication.libraryBuilder] ??= [])
- .addAll(executionResults);
+ String result = _macroExecutor
+ .buildAugmentationLibrary(
+ executionResults, _resolveIdentifier, _inferOmittedType)
+ .trim();
+ assert(
+ result.trim().isNotEmpty,
+ "Empty definitions phase augmentation library source for "
+ "$libraryBuilder}");
+ if (retainDataForTesting) {
+ dataForTesting?.libraryDefinitionResult[libraryBuilder] = result;
+ }
+ augmentationLibraries
+ .add(await libraryBuilder.createAugmentationLibrary(result));
}
}
- for (MapEntry<SourceLibraryBuilder, List<macro.MacroExecutionResult>> entry
- in results.entries) {
- SourceLibraryBuilder sourceLibraryBuilder = entry.key;
- String result = _macroExecutor.buildAugmentationLibrary(
- entry.value, _resolveIdentifier, _inferOmittedType);
- assert(
- result.trim().isNotEmpty,
- "Empty definitions phase augmentation library source for "
- "$sourceLibraryBuilder}");
- if (retainDataForTesting) {
- dataForTesting?.libraryDefinitionResult[sourceLibraryBuilder] = result;
- }
- augmentationLibraries
- .add(await sourceLibraryBuilder.createAugmentationLibrary(result));
- }
return augmentationLibraries;
}
@@ -477,7 +580,9 @@
_macroExecutor.close();
_staticTypeCache.clear();
_typeAnnotationCache.clear();
- _applicationDataCache?.clear();
+ if (!retainDataForTesting) {
+ libraryData.clear();
+ }
}
macro.ClassDeclaration _createClassDeclaration(ClassBuilder builder) {
@@ -1019,14 +1124,14 @@
}
/// Data needed to apply a list of macro applications to a class or member.
-class _ApplicationData {
+class ApplicationData {
final SourceLibraryBuilder libraryBuilder;
final Builder builder;
- final macro.Declaration declaration;
final List<MacroApplication> macroApplications;
- _ApplicationData(this.libraryBuilder, this.builder, this.declaration,
- this.macroApplications);
+ late final macro.Declaration declaration;
+
+ ApplicationData(this.libraryBuilder, this.builder, this.macroApplications);
}
extension on macro.MacroExecutionResult {
diff --git a/pkg/front_end/lib/src/fasta/source/source_loader.dart b/pkg/front_end/lib/src/fasta/source/source_loader.dart
index c3c8539..c98f659 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1600,11 +1600,15 @@
SourceClassBuilder classBuilder = builder;
ClassMacroApplicationData classMacroApplicationData =
new ClassMacroApplicationData();
- classMacroApplicationData.classApplications = prebuildAnnotations(
+ List<MacroApplication>? classMacroApplications = prebuildAnnotations(
enclosingLibrary: libraryBuilder,
scope: classBuilder.scope,
fileUri: classBuilder.fileUri,
metadataBuilders: classBuilder.metadata);
+ if (classMacroApplications != null) {
+ classMacroApplicationData.classApplications = new ApplicationData(
+ libraryBuilder, classBuilder, classMacroApplications);
+ }
classBuilder.forEach((String name, Builder memberBuilder) {
if (memberBuilder is SourceProcedureBuilder) {
List<MacroApplication>? macroApplications = prebuildAnnotations(
@@ -1614,7 +1618,8 @@
metadataBuilders: memberBuilder.metadata);
if (macroApplications != null) {
classMacroApplicationData.memberApplications[memberBuilder] =
- macroApplications;
+ new ApplicationData(
+ libraryBuilder, memberBuilder, macroApplications);
}
} else if (memberBuilder is SourceFieldBuilder) {
List<MacroApplication>? macroApplications = prebuildAnnotations(
@@ -1624,7 +1629,8 @@
metadataBuilders: memberBuilder.metadata);
if (macroApplications != null) {
classMacroApplicationData.memberApplications[memberBuilder] =
- macroApplications;
+ new ApplicationData(
+ libraryBuilder, memberBuilder, macroApplications);
}
} else {
throw new UnsupportedError("Unexpected class member "
@@ -1640,7 +1646,8 @@
metadataBuilders: memberBuilder.metadata);
if (macroApplications != null) {
classMacroApplicationData.memberApplications[memberBuilder] =
- macroApplications;
+ new ApplicationData(
+ libraryBuilder, memberBuilder, macroApplications);
}
} else if (memberBuilder is SourceFactoryBuilder) {
List<MacroApplication>? macroApplications = prebuildAnnotations(
@@ -1650,7 +1657,8 @@
metadataBuilders: memberBuilder.metadata);
if (macroApplications != null) {
classMacroApplicationData.memberApplications[memberBuilder] =
- macroApplications;
+ new ApplicationData(
+ libraryBuilder, memberBuilder, macroApplications);
}
} else {
throw new UnsupportedError("Unexpected constructor "
@@ -1671,7 +1679,7 @@
metadataBuilders: builder.metadata);
if (macroApplications != null) {
libraryMacroApplicationData.memberApplications[builder] =
- macroApplications;
+ new ApplicationData(libraryBuilder, builder, macroApplications);
}
} else if (builder is SourceFieldBuilder) {
List<MacroApplication>? macroApplications = prebuildAnnotations(
@@ -1681,7 +1689,7 @@
metadataBuilders: builder.metadata);
if (macroApplications != null) {
libraryMacroApplicationData.memberApplications[builder] =
- macroApplications;
+ new ApplicationData(libraryBuilder, builder, macroApplications);
}
} else if (builder is PrefixBuilder ||
builder is SourceExtensionBuilder ||
@@ -1997,7 +2005,11 @@
}
}
- List<SourceClassBuilder> checkSemantics(ClassBuilder objectClass) {
+ /// Checks that there are no cycles in the class hierarchy, and if so break
+ /// these cycles by removing supertypes.
+ ///
+ /// Returns a list of all source classes in topological order.
+ List<SourceClassBuilder> checkClassCycles(ClassBuilder objectClass) {
checkObjectClassHierarchy(objectClass);
return handleHierarchyCycles(objectClass);
}
diff --git a/pkg/front_end/test/macros/application/data/pkgs/macro/lib/macro.dart b/pkg/front_end/test/macros/application/data/pkgs/macro/lib/macro.dart
index 3cc37c6..cc1537b 100644
--- a/pkg/front_end/test/macros/application/data/pkgs/macro/lib/macro.dart
+++ b/pkg/front_end/test/macros/application/data/pkgs/macro/lib/macro.dart
@@ -328,12 +328,37 @@
macro
-class SequenceMacro implements ClassDeclarationsMacro {
- const SequenceMacro();
+class SequenceMacro
+ implements
+ ClassDeclarationsMacro,
+ MethodDeclarationsMacro {
+ final int index;
+
+ const SequenceMacro(this.index);
+
+ void _addMethod(ClassDeclaration clazz,
+ ClassMemberDeclarationBuilder builder) async {
+ }
+
+ Future<void> _findAllMethods(ClassMemberDeclarationBuilder builder,
+ ClassDeclaration cls, List<MethodDeclaration> methods) async {
+ ClassDeclaration? superclass = await builder.superclassOf(cls);
+ if (superclass != null) {
+ await _findAllMethods(builder, superclass, methods);
+ }
+ for (ClassDeclaration mixin in await builder.mixinsOf(cls)) {
+ await _findAllMethods(builder, mixin, methods);
+ }
+ for (ClassDeclaration interface in await builder.interfacesOf(cls)) {
+ await _findAllMethods(builder, interface, methods);
+ }
+ methods.addAll(await builder.methodsOf(cls));
+ }
FutureOr<void> buildDeclarationsForClass(ClassDeclaration clazz,
ClassMemberDeclarationBuilder builder) async {
- Iterable<MethodDeclaration> methods = await builder.methodsOf(clazz);
+ List<MethodDeclaration> methods = [];
+ await _findAllMethods(builder, clazz, methods);
int index = 0;
String suffix = '';
while (methods.any((m) => m.identifier.name == 'method$suffix')) {
@@ -343,6 +368,12 @@
builder.declareInClass(new DeclarationCode.fromString('''
method$suffix() {}'''));
}
+
+ FutureOr<void> buildDeclarationsForMethod(MethodDeclaration method,
+ ClassMemberDeclarationBuilder builder) {
+ // Do nothing. The applying of this will show up in the declarations phase
+ // application order.
+ }
}
macro
@@ -398,4 +429,4 @@
'}',
]));
}
-}
\ No newline at end of file
+}
diff --git a/pkg/front_end/test/macros/application/data/tests/data_class.dart b/pkg/front_end/test/macros/application/data/tests/data_class.dart
index 1b70609..e794e81 100644
--- a/pkg/front_end/test/macros/application/data/tests/data_class.dart
+++ b/pkg/front_end/test/macros/application/data/tests/data_class.dart
@@ -3,6 +3,10 @@
// BSD-style license that can be found in the LICENSE file.
/*library:
+Declarations Order:
+ Foo:DataClass.new()
+Definition Order:
+ Foo:DataClass.new()
Definitions:
import 'dart:core' as prefix0;
@@ -17,8 +21,7 @@
augment prefix0.String toString() {
return "Foo(bar=${this.bar},baz=${this.baz})";
}
-}
-*/
+}*/
import 'package:macro/data_class.dart';
diff --git a/pkg/front_end/test/macros/application/data/tests/declarations.dart b/pkg/front_end/test/macros/application/data/tests/declarations.dart
index a172251..7ba5b39 100644
--- a/pkg/front_end/test/macros/application/data/tests/declarations.dart
+++ b/pkg/front_end/test/macros/application/data/tests/declarations.dart
@@ -2,6 +2,33 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+/*library:
+Declarations Order:
+ Class1.instanceMethod1:MethodDeclarationsMacro1.new()
+ Class1.instanceGetter1:MethodDeclarationsMacro1.new()
+ Class1.[]:MethodDeclarationsMacro1.new()
+ Class1.instanceField1:FieldDeclarationsMacro1.new()
+ Class1.instanceField2:FieldDeclarationsMacro1.new()
+ Class1.instanceField3:FieldDeclarationsMacro1.new()
+ Class1.instanceSetter1:MethodDeclarationsMacro1.new()
+ Class1.:ConstructorDeclarationsMacro1.new()
+ Class1.redirect:ConstructorDeclarationsMacro1.new()
+ Class1.fact:ConstructorDeclarationsMacro1.new()
+ Class1:ClassDeclarationsMacro2.new()
+ Class1:ClassDeclarationsMacro1.new()
+ Class2.instanceMethod1:MethodDeclarationsMacro1.new()
+ Class2.instanceField1:FieldDeclarationsMacro1.new()
+ Class2:ClassDeclarationsMacro2.new()
+ Class2:ClassDeclarationsMacro1.new()
+ topLevelFunction1:FunctionDeclarationsMacro1.new()
+ topLevelFunction2:FunctionDeclarationsMacro1.new()
+ topLevelField1:VariableDeclarationsMacro1.new()
+ topLevelField2:VariableDeclarationsMacro1.new()
+ topLevelField3:VariableDeclarationsMacro1.new()
+ topLevelField4:VariableDeclarationsMacro1.new()
+ topLevelGetter1:FunctionDeclarationsMacro1.new()
+ topLevelSetter1:FunctionDeclarationsMacro1.new()*/
+
import 'package:macro/macro.dart';
/*member: topLevelFunction1:
@@ -53,13 +80,13 @@
void set topLevelSetter1(int? value) {}
/*class: Class1:
-void Class1GeneratedMethod_() {}
-
void Class1Introspection() {
print("constructors='','redirect','fact'");
print("fields='instanceField1','instanceField2','instanceField3'");
- print("methods='instanceMethod1','instanceGetter1','[]','instanceSetter1'");
+ print("methods='instanceMethod1','instanceGetter1','[]','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f','instanceSetter1','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f'");
}
+
+void Class1GeneratedMethod_() {}
*/
@ClassDeclarationsMacro1()
@ClassDeclarationsMacro2()
@@ -132,13 +159,13 @@
}
/*class: Class2:
-void Class2GeneratedMethod_a() {}
-
void Class2Introspection() {
print("constructors=");
print("fields='instanceField1'");
print("methods='instanceMethod1'");
}
+
+void Class2GeneratedMethod_a() {}
*/
@ClassDeclarationsMacro1()
@ClassDeclarationsMacro2()
diff --git a/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect b/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect
index 215ac30..5c344e0 100644
--- a/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect
+++ b/pkg/front_end/test/macros/application/data/tests/declarations.dart.expect
@@ -19,9 +19,9 @@
constructor •() → self::Class1
: super core::Object::•()
;
- method /* from org-dartlang-augmentation:/a/b/c/main.dart-17 */ Class1_GeneratedMethod_() → void {}
- method /* from org-dartlang-augmentation:/a/b/c/main.dart-18 */ Class1_redirectGeneratedMethod_f() → void {}
- method /* from org-dartlang-augmentation:/a/b/c/main.dart-19 */ Class1_factGeneratedMethod_f() → void {}
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-7 */ Class1_GeneratedMethod_() → void {}
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-8 */ Class1_redirectGeneratedMethod_f() → void {}
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-9 */ Class1_factGeneratedMethod_f() → void {}
@#C5
static factory redirect() → self::Class1
return new self::Class1::•();
@@ -71,35 +71,35 @@
return null;
@#C8
static set topLevelSetter1(core::int? value) → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-0 */ topLevelFunction1GeneratedMethod_() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-1 */ topLevelFunction2GeneratedMethod_e() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-2 */ topLevelField1GeneratedMethod_() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-3 */ topLevelField2GeneratedMethod_e() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-4 */ topLevelField3GeneratedMethod_f() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-5 */ topLevelField4GeneratedMethod_l() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-6 */ topLevelGetter1GeneratedMethod_g() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-7 */ topLevelSetter1GeneratedMethod_s() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-8 */ Class1GeneratedMethod_() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-9 */ Class1Introspection() → void {
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-0 */ Class1_instanceMethod1GeneratedMethod_() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-1 */ Class1_instanceGetter1GeneratedMethod_g() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-2 */ Class1_operatorGeneratedMethod_o() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-3 */ Class1_instanceField1GeneratedMethod_() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-4 */ Class1_instanceField2GeneratedMethod_f() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-5 */ Class1_instanceField3GeneratedMethod_fl() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-6 */ Class1_instanceSetter1GeneratedMethod_s() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-10 */ Class1Introspection() → void {
core::print("constructors='','redirect','fact'");
core::print("fields='instanceField1','instanceField2','instanceField3'");
- core::print("methods='instanceMethod1','instanceGetter1','[]','instanceSetter1'");
+ core::print("methods='instanceMethod1','instanceGetter1','[]','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f','instanceSetter1','Class1_GeneratedMethod_','Class1_redirectGeneratedMethod_f','Class1_factGeneratedMethod_f'");
}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-10 */ Class1_instanceMethod1GeneratedMethod_() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-11 */ Class1_instanceGetter1GeneratedMethod_g() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-12 */ Class1_operatorGeneratedMethod_o() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-13 */ Class1_instanceField1GeneratedMethod_() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-14 */ Class1_instanceField2GeneratedMethod_f() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-15 */ Class1_instanceField3GeneratedMethod_fl() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-16 */ Class1_instanceSetter1GeneratedMethod_s() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-20 */ Class2GeneratedMethod_a() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-21 */ Class2Introspection() → void {
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-11 */ Class1GeneratedMethod_() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-12 */ Class2_instanceMethod1GeneratedMethod_a() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-13 */ Class2_instanceField1GeneratedMethod_() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-14 */ Class2Introspection() → void {
core::print("constructors=");
core::print("fields='instanceField1'");
core::print("methods='instanceMethod1'");
}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-22 */ Class2_instanceMethod1GeneratedMethod_a() → void {}
-static method /* from org-dartlang-augmentation:/a/b/c/main.dart-23 */ Class2_instanceField1GeneratedMethod_() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-15 */ Class2GeneratedMethod_a() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-16 */ topLevelFunction1GeneratedMethod_() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-17 */ topLevelFunction2GeneratedMethod_e() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-18 */ topLevelField1GeneratedMethod_() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-19 */ topLevelField2GeneratedMethod_e() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-20 */ topLevelField3GeneratedMethod_f() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-21 */ topLevelField4GeneratedMethod_l() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-22 */ topLevelGetter1GeneratedMethod_g() → void {}
+static method /* from org-dartlang-augmentation:/a/b/c/main.dart-23 */ topLevelSetter1GeneratedMethod_s() → void {}
constants {
#C1 = mac::ClassDeclarationsMacro1 {}
diff --git a/pkg/front_end/test/macros/application/data/tests/import_conflict.dart b/pkg/front_end/test/macros/application/data/tests/import_conflict.dart
index 44c42bb..908c3c1 100644
--- a/pkg/front_end/test/macros/application/data/tests/import_conflict.dart
+++ b/pkg/front_end/test/macros/application/data/tests/import_conflict.dart
@@ -3,6 +3,8 @@
// BSD-style license that can be found in the LICENSE file.
/*library:
+Definition Order:
+ function:ImportConflictMacro.new()
Definitions:
import 'dart:core' as prefix2_0;
import 'dart:async' as prefix2_1;
@@ -13,8 +15,7 @@
var prefix = prefix2_0.int;
var prefix0 = prefix2_1.FutureOr<prefix2_2.Random>;
var prefix10 = prefix2_3.JsonCodec;
-}
-*/
+}*/
import 'package:macro/macro.dart';
import 'dart:async';
diff --git a/pkg/front_end/test/macros/application/data/tests/layers.dart b/pkg/front_end/test/macros/application/data/tests/layers.dart
index 8a09eda..69afb5f 100644
--- a/pkg/front_end/test/macros/application/data/tests/layers.dart
+++ b/pkg/front_end/test/macros/application/data/tests/layers.dart
@@ -2,6 +2,11 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+/*library:
+Declarations Order:
+ Class:Macro2.new()
+ Macro2:Macro1.new()*/
+
import 'package:macro/macro2.dart';
@Macro2()
diff --git a/pkg/front_end/test/macros/application/data/tests/parameters.dart b/pkg/front_end/test/macros/application/data/tests/parameters.dart
index dae087e..75d6e1c 100644
--- a/pkg/front_end/test/macros/application/data/tests/parameters.dart
+++ b/pkg/front_end/test/macros/application/data/tests/parameters.dart
@@ -3,6 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
/*library:
+Definition Order:
+ topLevelFunction1:FunctionDefinitionMacro1.new()
+ topLevelFunction2:FunctionDefinitionMacro1.new()
+ topLevelFunction3:FunctionDefinitionMacro1.new()
+ topLevelFunction4:FunctionDefinitionMacro1.new()
Definitions:
import 'dart:core' as prefix0;
@@ -17,8 +22,7 @@
}
augment void topLevelFunction4(prefix0.int a, {prefix0.int? b, prefix0.int? c, }) {
throw 42;
-}
-*/
+}*/
import 'package:macro/macro.dart';
diff --git a/pkg/front_end/test/macros/application/data/tests/sequence.dart b/pkg/front_end/test/macros/application/data/tests/sequence.dart
index b27f58f..0af4289 100644
--- a/pkg/front_end/test/macros/application/data/tests/sequence.dart
+++ b/pkg/front_end/test/macros/application/data/tests/sequence.dart
@@ -2,43 +2,149 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+/*library:
+Declarations Order:
+ Class1:SequenceMacro.new(0)
+ Class2:SequenceMacro.new(1)
+ Class2:SequenceMacro.new(0)
+ Class3.method:SequenceMacro.new(1)
+ Class3:SequenceMacro.new(0)
+ Class4.method:SequenceMacro.new(3)
+ Class4.method2:SequenceMacro.new(5)
+ Class4.method2:SequenceMacro.new(4)
+ Class4:SequenceMacro.new(2)
+ Class4:SequenceMacro.new(1)
+ Class4:SequenceMacro.new(0)
+ Class5a:SequenceMacro.new(0)
+ Class5b:SequenceMacro.new(0)
+ Class5c:SequenceMacro.new(0)
+ Class6c:SequenceMacro.new(0)
+ Class6a:SequenceMacro.new(0)
+ Class6b:SequenceMacro.new(0)
+ Class6d:SequenceMacro.new(0)
+ Class7a:SequenceMacro.new(0)
+ Class7b:SequenceMacro.new(0)
+ Class7c:SequenceMacro.new(0)
+ Class7d:SequenceMacro.new(0)*/
+
import 'package:macro/macro.dart';
-@SequenceMacro()
/*class: Class1:
augment class Class1 {
method() {}
}*/
+@SequenceMacro(0)
class Class1 {}
-@SequenceMacro()
-@SequenceMacro()
/*class: Class2:
augment class Class2 {
method() {}
method1() {}
}*/
+@SequenceMacro(0)
+@SequenceMacro(1)
class Class2 {}
-@SequenceMacro()
/*class: Class3:
augment class Class3 {
method1() {}
}*/
+@SequenceMacro(0)
class Class3 {
+ @SequenceMacro(1)
method() {}
}
-@SequenceMacro()
-@SequenceMacro()
-@SequenceMacro()
/*class: Class4:
augment class Class4 {
method1() {}
method3() {}
method4() {}
}*/
+@SequenceMacro(0)
+@SequenceMacro(1)
+@SequenceMacro(2)
class Class4 {
+ @SequenceMacro(3)
method() {}
+ @SequenceMacro(4)
+ @SequenceMacro(5)
method2() {}
}
+
+/*class: Class5c:
+augment class Class5c {
+ method2() {}
+}*/
+@SequenceMacro(0)
+class Class5c extends Class5b {}
+
+/*class: Class5b:
+augment class Class5b {
+ method1() {}
+}*/
+@SequenceMacro(0)
+class Class5b extends Class5a {}
+
+/*class: Class5a:
+augment class Class5a {
+ method() {}
+}*/
+@SequenceMacro(0)
+class Class5a {}
+
+/*class: Class6d:
+augment class Class6d {
+ method2() {}
+}*/
+@SequenceMacro(0)
+abstract class Class6d implements Class6c, Class6b {}
+
+/*class: Class6c:
+augment class Class6c {
+ method() {}
+}*/
+@SequenceMacro(0)
+class Class6c {}
+
+/*class: Class6b:
+augment class Class6b {
+ method1() {}
+}*/
+@SequenceMacro(0)
+abstract class Class6b implements Class6a {}
+
+/*class: Class6a:
+augment class Class6a {
+ method() {}
+}*/
+@SequenceMacro(0)
+class Class6a {}
+
+/*class: Class7d:
+augment class Class7d {
+ method2() {}
+}*/
+@SequenceMacro(0)
+class Class7d with Class7b, Class7c {}
+
+/*class: Class7c:
+augment class Class7c {
+ method() {}
+}*/
+@SequenceMacro(0)
+class Class7c {}
+
+/*class: Class7b:
+augment class Class7b {
+ method1() {}
+}*/
+@SequenceMacro(0)
+class Class7b with Class7a {}
+
+/*class: Class7a:
+augment class Class7a {
+ method() {}
+}*/
+@SequenceMacro(0)
+class Class7a {}
diff --git a/pkg/front_end/test/macros/application/data/tests/sequence.dart.expect b/pkg/front_end/test/macros/application/data/tests/sequence.dart.expect
index 273f4d9..80e82bb 100644
--- a/pkg/front_end/test/macros/application/data/tests/sequence.dart.expect
+++ b/pkg/front_end/test/macros/application/data/tests/sequence.dart.expect
@@ -5,15 +5,15 @@
import "package:macro/macro.dart";
-@#C1
+@#C2
class Class1 extends core::Object {
synthetic constructor •() → self::Class1
: super core::Object::•()
;
method /* from org-dartlang-augmentation:/a/b/c/main.dart-0 */ method() → dynamic {}
}
-@#C1
-@#C1
+@#C2
+@#C4
class Class2 extends core::Object {
synthetic constructor •() → self::Class2
: super core::Object::•()
@@ -21,17 +21,18 @@
method /* from org-dartlang-augmentation:/a/b/c/main.dart-1 */ method() → dynamic {}
method /* from org-dartlang-augmentation:/a/b/c/main.dart-2 */ method1() → dynamic {}
}
-@#C1
+@#C2
class Class3 extends core::Object {
synthetic constructor •() → self::Class3
: super core::Object::•()
;
method /* from org-dartlang-augmentation:/a/b/c/main.dart-3 */ method1() → dynamic {}
+ @#C4
method method() → dynamic {}
}
-@#C1
-@#C1
-@#C1
+@#C2
+@#C4
+@#C6
class Class4 extends core::Object {
synthetic constructor •() → self::Class4
: super core::Object::•()
@@ -39,10 +40,122 @@
method /* from org-dartlang-augmentation:/a/b/c/main.dart-4 */ method1() → dynamic {}
method /* from org-dartlang-augmentation:/a/b/c/main.dart-5 */ method3() → dynamic {}
method /* from org-dartlang-augmentation:/a/b/c/main.dart-6 */ method4() → dynamic {}
+ @#C8
method method() → dynamic {}
+ @#C10
+ @#C12
method method2() → dynamic {}
}
+@#C2
+class Class5c extends self::Class5b {
+ synthetic constructor •() → self::Class5c
+ : super self::Class5b::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-9 */ method2() → dynamic {}
+}
+@#C2
+class Class5b extends self::Class5a {
+ synthetic constructor •() → self::Class5b
+ : super self::Class5a::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-8 */ method1() → dynamic {}
+}
+@#C2
+class Class5a extends core::Object {
+ synthetic constructor •() → self::Class5a
+ : super core::Object::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-7 */ method() → dynamic {}
+}
+@#C2
+class Class6d extends core::Object implements self::Class6c, self::Class6b {
+ synthetic constructor •() → self::Class6d
+ : super core::Object::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-13 */ method2() → dynamic {}
+}
+@#C2
+class Class6c extends core::Object {
+ synthetic constructor •() → self::Class6c
+ : super core::Object::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-10 */ method() → dynamic {}
+}
+@#C2
+class Class6b extends core::Object implements self::Class6a {
+ synthetic constructor •() → self::Class6b
+ : super core::Object::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-12 */ method1() → dynamic {}
+}
+@#C2
+class Class6a extends core::Object {
+ synthetic constructor •() → self::Class6a
+ : super core::Object::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-11 */ method() → dynamic {}
+}
+abstract class _Class7d&Object&Class7b = core::Object with self::Class7b /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_Class7d&Object&Class7b
+ : super core::Object::•()
+ ;
+ mixin-super-stub method method1() → dynamic
+ return super.{self::Class7b::method1}();
+}
+abstract class _Class7d&Object&Class7b&Class7c = self::_Class7d&Object&Class7b with self::Class7c /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_Class7d&Object&Class7b&Class7c
+ : super self::_Class7d&Object&Class7b::•()
+ ;
+ mixin-super-stub method method() → dynamic
+ return super.{self::Class7c::method}();
+}
+@#C2
+class Class7d extends self::_Class7d&Object&Class7b&Class7c {
+ synthetic constructor •() → self::Class7d
+ : super self::_Class7d&Object&Class7b&Class7c::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-17 */ method2() → dynamic {}
+}
+@#C2
+class Class7c extends core::Object {
+ synthetic constructor •() → self::Class7c
+ : super core::Object::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-16 */ method() → dynamic {}
+}
+abstract class _Class7b&Object&Class7a = core::Object with self::Class7a /*isAnonymousMixin,hasConstConstructor*/ {
+ const synthetic constructor •() → self::_Class7b&Object&Class7a
+ : super core::Object::•()
+ ;
+ mixin-super-stub method method() → dynamic
+ return super.{self::Class7a::method}();
+}
+@#C2
+class Class7b extends self::_Class7b&Object&Class7a {
+ synthetic constructor •() → self::Class7b
+ : super self::_Class7b&Object&Class7a::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-15 */ method1() → dynamic {}
+}
+@#C2
+class Class7a extends core::Object {
+ synthetic constructor •() → self::Class7a
+ : super core::Object::•()
+ ;
+ method /* from org-dartlang-augmentation:/a/b/c/main.dart-14 */ method() → dynamic {}
+}
constants {
- #C1 = mac::SequenceMacro {}
+ #C1 = 0
+ #C2 = mac::SequenceMacro {index:#C1}
+ #C3 = 1
+ #C4 = mac::SequenceMacro {index:#C3}
+ #C5 = 2
+ #C6 = mac::SequenceMacro {index:#C5}
+ #C7 = 3
+ #C8 = mac::SequenceMacro {index:#C7}
+ #C9 = 4
+ #C10 = mac::SequenceMacro {index:#C9}
+ #C11 = 5
+ #C12 = mac::SequenceMacro {index:#C11}
}
diff --git a/pkg/front_end/test/macros/application/data/tests/subtypes.dart b/pkg/front_end/test/macros/application/data/tests/subtypes.dart
index b275017..edd0f6e 100644
--- a/pkg/front_end/test/macros/application/data/tests/subtypes.dart
+++ b/pkg/front_end/test/macros/application/data/tests/subtypes.dart
@@ -3,6 +3,16 @@
// BSD-style license that can be found in the LICENSE file.
/*library:
+Declarations Order:
+ topLevelFunction1:FunctionDeclarationsMacro2.new()
+ topLevelFunction2:FunctionDeclarationsMacro2.new()
+ topLevelFunction3:FunctionDeclarationsMacro2.new()
+ topLevelFunction4:FunctionDeclarationsMacro2.new()
+Definition Order:
+ topLevelFunction1:FunctionDefinitionMacro2.new()
+ topLevelFunction2:FunctionDefinitionMacro2.new()
+ topLevelFunction3:FunctionDefinitionMacro2.new()
+ topLevelFunction4:FunctionDefinitionMacro2.new()
Definitions:
import 'org-dartlang-test:///a/b/c/main.dart' as prefix0;
@@ -25,8 +35,7 @@
print('isExactly=false');
print('isSubtype=false');
throw 42;
-}
-*/
+}*/
import 'package:macro/macro.dart';
diff --git a/pkg/front_end/test/macros/application/data/tests/supertypes.dart b/pkg/front_end/test/macros/application/data/tests/supertypes.dart
index 5bf8b9e..f319df3 100644
--- a/pkg/front_end/test/macros/application/data/tests/supertypes.dart
+++ b/pkg/front_end/test/macros/application/data/tests/supertypes.dart
@@ -3,6 +3,11 @@
// BSD-style license that can be found in the LICENSE file.
/*library:
+Definition Order:
+ A:SupertypesMacro.new()
+ B:SupertypesMacro.new()
+ M:SupertypesMacro.new()
+ C:SupertypesMacro.new()
Definitions:
import 'dart:core' as prefix0;
@@ -25,8 +30,7 @@
augment prefix0.String getSuperClass() {
return "A";
}
-}
-*/
+}*/
import 'package:macro/macro.dart';
diff --git a/pkg/front_end/test/macros/application/data/tests/to_string.dart b/pkg/front_end/test/macros/application/data/tests/to_string.dart
index 7a0be62..5f483c7 100644
--- a/pkg/front_end/test/macros/application/data/tests/to_string.dart
+++ b/pkg/front_end/test/macros/application/data/tests/to_string.dart
@@ -2,6 +2,12 @@
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
+/*library:
+Declarations Order:
+ A:ToStringMacro.new()
+ B:ToStringMacro.new()
+ C:ToStringMacro.new()*/
+
import 'package:macro/macro.dart';
@ToStringMacro()
diff --git a/pkg/front_end/test/macros/application/data/tests/type_annotations.dart b/pkg/front_end/test/macros/application/data/tests/type_annotations.dart
index 0ad8e21..b6a734c 100644
--- a/pkg/front_end/test/macros/application/data/tests/type_annotations.dart
+++ b/pkg/front_end/test/macros/application/data/tests/type_annotations.dart
@@ -3,6 +3,15 @@
// BSD-style license that can be found in the LICENSE file.
/*library:
+Definition Order:
+ topLevelFunction1:FunctionDefinitionMacro1.new()
+ topLevelFunction2:FunctionDefinitionMacro1.new()
+ topLevelFunction3:FunctionDefinitionMacro1.new()
+ topLevelFunction4:FunctionDefinitionMacro1.new()
+ topLevelFunction5:FunctionDefinitionMacro1.new()
+ topLevelFunction6:FunctionDefinitionMacro1.new()
+ topLevelFunction7:FunctionDefinitionMacro1.new()
+ topLevelFunction8:FunctionDefinitionMacro1.new()
Definitions:
import 'dart:core' as prefix0;
import 'dart:math' as prefix1;
@@ -30,8 +39,7 @@
}
augment prefix0.Map<prefix0.int?, prefix0.String>? topLevelFunction8() {
throw 42;
-}
-*/
+}*/
import 'dart:math' as math;
diff --git a/pkg/front_end/test/macros/application/data/tests/types.dart b/pkg/front_end/test/macros/application/data/tests/types.dart
index 6e3dacf..6db0cf4 100644
--- a/pkg/front_end/test/macros/application/data/tests/types.dart
+++ b/pkg/front_end/test/macros/application/data/tests/types.dart
@@ -3,6 +3,12 @@
// BSD-style license that can be found in the LICENSE file.
/*library:
+Types Order:
+ topLevelFunction1:FunctionTypesMacro1.new()
+ topLevelFunction2:FunctionTypesMacro1.new()
+ topLevelFunction3:FunctionTypesMacro1.new()
+ topLevelFunction4:FunctionTypesMacro1.new()
+ topLevelFunction5:FunctionTypesMacro1.new()
Types:
import 'dart:core' as prefix0;
import 'package:macro/macro.dart' as prefix1;
diff --git a/pkg/front_end/test/macros/application/macro_application_test.dart b/pkg/front_end/test/macros/application/macro_application_test.dart
index ca922e9..1ce3c47 100644
--- a/pkg/front_end/test/macros/application/macro_application_test.dart
+++ b/pkg/front_end/test/macros/application/macro_application_test.dart
@@ -140,6 +140,30 @@
.dataForTesting!
.macroApplicationData;
StringBuffer sb = new StringBuffer();
+ if (library.importUri ==
+ testResultData.compilerResult.kernelTargetForTesting!.loader.firstUri) {
+ if (macroApplicationData.typesApplicationOrder.isNotEmpty) {
+ sb.write('\nTypes Order:');
+ for (ApplicationDataForTesting application
+ in macroApplicationData.typesApplicationOrder) {
+ sb.write('\n ${application}');
+ }
+ }
+ if (macroApplicationData.declarationsApplicationOrder.isNotEmpty) {
+ sb.write('\nDeclarations Order:');
+ for (ApplicationDataForTesting application
+ in macroApplicationData.declarationsApplicationOrder) {
+ sb.write('\n ${application}');
+ }
+ }
+ if (macroApplicationData.definitionApplicationOrder.isNotEmpty) {
+ sb.write('\nDefinition Order:');
+ for (ApplicationDataForTesting application
+ in macroApplicationData.definitionApplicationOrder) {
+ sb.write('\n ${application}');
+ }
+ }
+ }
for (SourceLibraryBuilder sourceLibraryBuilder
in macroApplicationData.libraryTypesResult.keys) {
if (sourceLibraryBuilder.library == library) {
diff --git a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
index de7512f..3b906dc 100644
--- a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
+++ b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
@@ -169,12 +169,14 @@
}
List<MacroApplication>? getClassMacroApplications(Class cls) {
- return getClassMacroApplicationData(cls)?.classApplications;
+ return getClassMacroApplicationData(cls)
+ ?.classApplications
+ ?.macroApplications;
}
List<MacroApplication>? getMemberMacroApplications(Member member) {
Class? enclosingClass = member.enclosingClass;
- Map<MemberBuilder, List<MacroApplication>>? memberApplications;
+ Map<MemberBuilder, ApplicationData>? memberApplications;
if (enclosingClass != null) {
memberApplications =
getClassMacroApplicationData(enclosingClass)?.memberApplications;
@@ -184,10 +186,10 @@
?.memberApplications;
}
if (memberApplications != null) {
- for (MapEntry<MemberBuilder, List<MacroApplication>> entry
+ for (MapEntry<MemberBuilder, ApplicationData> entry
in memberApplications.entries) {
if (entry.key.member == member) {
- return entry.value;
+ return entry.value.macroApplications;
}
}
}
@@ -198,12 +200,7 @@
Features features, List<MacroApplication>? macroApplications) {
if (macroApplications != null) {
for (MacroApplication application in macroApplications) {
- StringBuffer sb = new StringBuffer();
- sb.write(application.classBuilder.name);
- sb.write('.');
- sb.write(constructorNameToString(application.constructorName));
- sb.write(application.arguments.toText());
- features.addElement(Tags.appliedMacros, sb.toString());
+ features.addElement(Tags.appliedMacros, application.toString());
}
}
}
diff --git a/pkg/frontend_server/test/frontend_server_flutter.dart b/pkg/frontend_server/test/frontend_server_flutter.dart
index e0132b3..f0d5f2f 100644
--- a/pkg/frontend_server/test/frontend_server_flutter.dart
+++ b/pkg/frontend_server/test/frontend_server_flutter.dart
@@ -29,11 +29,11 @@
await compileTests(flutterDir, flutterPlatformDir, new StdoutLogger());
}
-Future<NnbdMode> _getNNBDMode(Uri script, Uri packagesFileUri) async {
+Future<NnbdMode> _getNNBDMode(Uri script, Uri packageConfigUri) async {
final CompilerOptions compilerOptions = new CompilerOptions()
..sdkRoot = null
..fileSystem = StandardFileSystem.instance
- ..packagesFileUri = packagesFileUri
+ ..packagesFileUri = packageConfigUri
..sdkSummary = null
..nnbdMode = NnbdMode.Weak;
@@ -91,19 +91,20 @@
"platform_strong.dill file.";
}
logger.notice("Using $flutterPlatformDirectory as platform directory.");
- List<File> dotPackagesFiles = new List<File>.from(allFlutterFiles.where((f) =>
- (f.uri.toString().contains("/examples/") ||
- f.uri.toString().contains("/packages/")) &&
- f.uri.toString().endsWith("/.packages")));
+ List<File> packageConfigFiles = new List<File>.from(allFlutterFiles.where(
+ (f) =>
+ (f.uri.toString().contains("/examples/") ||
+ f.uri.toString().contains("/packages/")) &&
+ f.uri.toString().endsWith("/.dart_tool/package_config.json")));
List<String> allCompilationErrors = [];
final Directory systemTempDir = Directory.systemTemp;
List<_QueueEntry> queue = [];
int totalFiles = 0;
- for (int i = 0; i < dotPackagesFiles.length; i++) {
- File dotPackage = dotPackagesFiles[i];
+ for (int i = 0; i < packageConfigFiles.length; i++) {
+ File packageConfig = packageConfigFiles[i];
Directory testDir =
- new Directory.fromUri(dotPackage.parent.uri.resolve("test/"));
+ new Directory.fromUri(packageConfig.parent.uri.resolve("../test/"));
if (!testDir.existsSync()) continue;
if (testDir.toString().contains("packages/flutter_web_plugins/test/")) {
// TODO(jensj): Figure out which tests are web-tests, and compile those
@@ -129,7 +130,7 @@
List<File> weak = [];
List<File> strong = [];
for (File file in testFiles) {
- if (await _getNNBDMode(file.uri, dotPackage.uri) == NnbdMode.Weak) {
+ if (await _getNNBDMode(file.uri, packageConfig.uri) == NnbdMode.Weak) {
weak.add(file);
} else {
strong.add(file);
@@ -137,7 +138,7 @@
}
for (List<File> files in [weak, strong]) {
if (files.isEmpty) continue;
- queue.add(new _QueueEntry(files, dotPackage, testDir));
+ queue.add(new _QueueEntry(files, packageConfig, testDir));
totalFiles += files.length;
}
}
@@ -165,7 +166,7 @@
systemTempDir,
chunk,
flutterPlatformDirectory,
- queueEntry.dotPackage,
+ queueEntry.packageConfig,
queueEntry.testDir,
flutterDirectory,
logger,
@@ -187,17 +188,17 @@
class _QueueEntry {
final List<File> files;
- final File dotPackage;
+ final File packageConfig;
final Directory testDir;
- _QueueEntry(this.files, this.dotPackage, this.testDir);
+ _QueueEntry(this.files, this.packageConfig, this.testDir);
}
Future<void> _processFiles(
Directory systemTempDir,
List<File> files,
Directory flutterPlatformDirectory,
- File dotPackage,
+ File packageConfig,
Directory testDir,
Directory flutterDirectory,
Logger logger,
@@ -209,7 +210,7 @@
files,
tempDir,
flutterPlatformDirectory,
- dotPackage,
+ packageConfig,
testDir,
flutterDirectory,
logger,
@@ -228,7 +229,7 @@
List<File> testFiles,
Directory tempDir,
Directory flutterPlatformDirectory,
- File dotPackage,
+ File packageConfig,
Directory testDir,
Directory flutterDirectory,
Logger logger,
@@ -249,7 +250,7 @@
'--incremental',
'--target=flutter',
'--packages',
- dotPackage.path,
+ packageConfig.path,
'--output-dill=${dillFile.path}',
// '--unsafe-package-serialization',
];
diff --git a/tools/VERSION b/tools/VERSION
index 97e8cda..c4339e4 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
MAJOR 2
MINOR 18
PATCH 0
-PRERELEASE 123
+PRERELEASE 124
PRERELEASE_PATCH 0
\ No newline at end of file