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