[cfe] Include phase-specific source in macro application test

Change-Id: I91b655170adaa567679a872ed6fe32f587b99c00
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/247550
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
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 7805bbb..a86795c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
@@ -104,21 +104,60 @@
   Map<SourceLibraryBuilder, LibraryMacroApplicationData> libraryData = {};
   Map<SourceLibraryBuilder, String> libraryTypesResult = {};
   Map<SourceLibraryBuilder, String> libraryDefinitionResult = {};
+
   Map<SourceClassBuilder, List<macro.MacroExecutionResult>> classTypesResults =
       {};
+
   Map<SourceClassBuilder, List<macro.MacroExecutionResult>>
       classDeclarationsResults = {};
+  Map<SourceClassBuilder, List<String>> classDeclarationsSources = {};
+
   Map<SourceClassBuilder, List<macro.MacroExecutionResult>>
       classDefinitionsResults = {};
+
   Map<MemberBuilder, List<macro.MacroExecutionResult>> memberTypesResults = {};
+  Map<MemberBuilder, List<String>> memberTypesSources = {};
+
   Map<MemberBuilder, List<macro.MacroExecutionResult>>
       memberDeclarationsResults = {};
+  Map<MemberBuilder, List<String>> memberDeclarationsSources = {};
+
   Map<MemberBuilder, List<macro.MacroExecutionResult>>
       memberDefinitionsResults = {};
 
   List<ApplicationDataForTesting> typesApplicationOrder = [];
   List<ApplicationDataForTesting> declarationsApplicationOrder = [];
   List<ApplicationDataForTesting> definitionApplicationOrder = [];
+
+  void registerTypesResults(
+      Builder builder, List<macro.MacroExecutionResult> results) {
+    if (builder is SourceClassBuilder) {
+      (classTypesResults[builder] ??= []).addAll(results);
+    } else {
+      (memberTypesResults[builder as MemberBuilder] ??= []).addAll(results);
+    }
+  }
+
+  void registerDeclarationsResult(
+      Builder builder, macro.MacroExecutionResult result, String source) {
+    if (builder is SourceClassBuilder) {
+      (classDeclarationsResults[builder] ??= []).add(result);
+      (classDeclarationsSources[builder] ??= []).add(source);
+    } else {
+      (memberDeclarationsResults[builder as MemberBuilder] ??= []).add(result);
+      (memberDeclarationsSources[builder] ??= []).add(source);
+    }
+  }
+
+  void registerDefinitionsResults(
+      Builder builder, List<macro.MacroExecutionResult> results) {
+    if (builder is SourceClassBuilder) {
+      (classDefinitionsResults[builder] ??= []).addAll(results);
+    } else {
+      (memberDefinitionsResults[builder as MemberBuilder] ??= [])
+          .addAll(results);
+    }
+  }
 }
 
 class ApplicationDataForTesting {
@@ -347,12 +386,7 @@
     }
 
     if (retainDataForTesting) {
-      Builder builder = applicationData.builder;
-      if (builder is SourceClassBuilder) {
-        dataForTesting?.classTypesResults[builder] = results;
-      } else {
-        dataForTesting?.memberTypesResults[builder as MemberBuilder] = results;
-      }
+      dataForTesting?.registerTypesResults(applicationData.builder, results);
     }
     return results;
   }
@@ -429,6 +463,10 @@
         if (result.isNotEmpty) {
           String source = _macroExecutor.buildAugmentationLibrary(
               [result], _resolveIdentifier, _inferOmittedType);
+          if (retainDataForTesting) {
+            dataForTesting?.registerDeclarationsResult(
+                applicationData.builder, result, source);
+          }
           SourceLibraryBuilder augmentationLibrary = await applicationData
               .libraryBuilder
               .createAugmentationLibrary(source);
@@ -518,13 +556,8 @@
       }
     }
     if (retainDataForTesting) {
-      Builder builder = applicationData.builder;
-      if (builder is SourceClassBuilder) {
-        dataForTesting?.classDefinitionsResults[builder] = results;
-      } else {
-        dataForTesting?.memberDefinitionsResults[builder as MemberBuilder] =
-            results;
-      }
+      dataForTesting?.registerDefinitionsResults(
+          applicationData.builder, results);
     }
     return results;
   }
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 e794e81..70c6e50 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
@@ -27,11 +27,17 @@
 
 @DataClass()
 /*class: Foo:
+declarations:
+import 'dart:core' as prefix0;
+
 augment class Foo {
 const Foo({required this.bar, required this.baz});
-external int get hashCode;
-external bool operator ==(Object other);
-external String toString();
+external prefix0.int get hashCode;
+external prefix0.bool operator ==(prefix0.Object other);
+external prefix0.String toString();
+}
+definitions:
+augment class Foo {
 augment int hashCode() {
     return bar.hashCode ^ baz.hashCode;
   }
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 7ba5b39..77b616e 100644
--- a/pkg/front_end/test/macros/application/data/tests/declarations.dart
+++ b/pkg/front_end/test/macros/application/data/tests/declarations.dart
@@ -31,154 +31,224 @@
 
 import 'package:macro/macro.dart';
 
-/*member: topLevelFunction1:
-void topLevelFunction1GeneratedMethod_() {}
-*/
 @FunctionDeclarationsMacro1()
+/*member: topLevelFunction1:
+declarations:
+
+void topLevelFunction1GeneratedMethod_() {}
+
+*/
 void topLevelFunction1() {}
 
-/*member: topLevelFunction2:
-void topLevelFunction2GeneratedMethod_e() {}
-*/
 @FunctionDeclarationsMacro1()
+/*member: topLevelFunction2:
+declarations:
+
+void topLevelFunction2GeneratedMethod_e() {}
+
+*/
 external void topLevelFunction2();
 
-/*member: topLevelField1:
-void topLevelField1GeneratedMethod_() {}
-*/
 @VariableDeclarationsMacro1()
+/*member: topLevelField1:
+declarations:
+
+void topLevelField1GeneratedMethod_() {}
+
+*/
 int? topLevelField1;
 
-/*member: topLevelField2:
-void topLevelField2GeneratedMethod_e() {}
-*/
 @VariableDeclarationsMacro1()
+/*member: topLevelField2:
+declarations:
+
+void topLevelField2GeneratedMethod_e() {}
+
+*/
 external int? topLevelField2;
 
-/*member: topLevelField3:
-void topLevelField3GeneratedMethod_f() {}
-*/
 @VariableDeclarationsMacro1()
+/*member: topLevelField3:
+declarations:
+
+void topLevelField3GeneratedMethod_f() {}
+
+*/
 final int? topLevelField3 = null;
 
-/*member: topLevelField4:
-void topLevelField4GeneratedMethod_l() {}
-*/
 @VariableDeclarationsMacro1()
+/*member: topLevelField4:
+declarations:
+
+void topLevelField4GeneratedMethod_l() {}
+
+*/
 late int? topLevelField4;
 
-/*member: topLevelGetter1:
-void topLevelGetter1GeneratedMethod_g() {}
-*/
 @FunctionDeclarationsMacro1()
+/*member: topLevelGetter1:
+declarations:
+
+void topLevelGetter1GeneratedMethod_g() {}
+
+*/
 int? get topLevelGetter1 => null;
 
-/*member: topLevelSetter1=:
-void topLevelSetter1GeneratedMethod_s() {}
-*/
 @FunctionDeclarationsMacro1()
+/*member: topLevelSetter1=:
+declarations:
+
+void topLevelSetter1GeneratedMethod_s() {}
+
+*/
 void set topLevelSetter1(int? value) {}
 
+@ClassDeclarationsMacro1()
+@ClassDeclarationsMacro2()
 /*class: Class1:
+declarations:
+
 void Class1Introspection() {
   print("constructors='','redirect','fact'");
   print("fields='instanceField1','instanceField2','instanceField3'");
   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()
 class Class1 {
+  @ConstructorDeclarationsMacro1()
   /*member: Class1.:
+declarations:
+
 augment class Class1 {
 void Class1_GeneratedMethod_() {}
 
-}*/
-  @ConstructorDeclarationsMacro1()
+}
+*/
   Class1();
 
+  @ConstructorDeclarationsMacro1()
   /*member: Class1.redirect:
+declarations:
+
 augment class Class1 {
 void Class1_redirectGeneratedMethod_f() {}
 
-}*/
-  @ConstructorDeclarationsMacro1()
+}
+*/
   factory Class1.redirect() = Class1;
 
+  @ConstructorDeclarationsMacro1()
   /*member: Class1.fact:
+declarations:
+
 augment class Class1 {
 void Class1_factGeneratedMethod_f() {}
 
-}*/
-  @ConstructorDeclarationsMacro1()
+}
+*/
   factory Class1.fact() => new Class1();
 
-  /*member: Class1.instanceMethod1:
-void Class1_instanceMethod1GeneratedMethod_() {}
-*/
   @MethodDeclarationsMacro1()
+  /*member: Class1.instanceMethod1:
+declarations:
+
+void Class1_instanceMethod1GeneratedMethod_() {}
+
+*/
   void instanceMethod1() {}
 
-  /*member: Class1.instanceGetter1:
-void Class1_instanceGetter1GeneratedMethod_g() {}
-*/
   @MethodDeclarationsMacro1()
+  /*member: Class1.instanceGetter1:
+declarations:
+
+void Class1_instanceGetter1GeneratedMethod_g() {}
+
+*/
   int? get instanceGetter1 => null;
 
-  /*member: Class1.instanceSetter1=:
-void Class1_instanceSetter1GeneratedMethod_s() {}
-*/
   @MethodDeclarationsMacro1()
+  /*member: Class1.instanceSetter1=:
+declarations:
+
+void Class1_instanceSetter1GeneratedMethod_s() {}
+
+*/
   void set instanceSetter1(int? value) {}
 
-  /*member: Class1.[]:
-void Class1_operatorGeneratedMethod_o() {}
-*/
   @MethodDeclarationsMacro1()
+  /*member: Class1.[]:
+declarations:
+
+void Class1_operatorGeneratedMethod_o() {}
+
+*/
   int operator [](int i) => i;
 
-  /*member: Class1.instanceField1:
-void Class1_instanceField1GeneratedMethod_() {}
-*/
   @FieldDeclarationsMacro1()
+  /*member: Class1.instanceField1:
+declarations:
+
+void Class1_instanceField1GeneratedMethod_() {}
+
+*/
   int? instanceField1;
 
-  /*member: Class1.instanceField2:
-void Class1_instanceField2GeneratedMethod_f() {}
-*/
   @FieldDeclarationsMacro1()
+  /*member: Class1.instanceField2:
+declarations:
+
+void Class1_instanceField2GeneratedMethod_f() {}
+
+*/
   final int? instanceField2 = null;
 
-  /*member: Class1.instanceField3:
-void Class1_instanceField3GeneratedMethod_fl() {}
-*/
   @FieldDeclarationsMacro1()
+  /*member: Class1.instanceField3:
+declarations:
+
+void Class1_instanceField3GeneratedMethod_fl() {}
+
+*/
   late final int? instanceField3 = null;
 }
 
+@ClassDeclarationsMacro1()
+@ClassDeclarationsMacro2()
 /*class: Class2:
+declarations:
+
 void Class2Introspection() {
   print("constructors=");
   print("fields='instanceField1'");
   print("methods='instanceMethod1'");
 }
 
+
+
 void Class2GeneratedMethod_a() {}
+
 */
-@ClassDeclarationsMacro1()
-@ClassDeclarationsMacro2()
 abstract class Class2 {
-  /*member: Class2.instanceMethod1:
-void Class2_instanceMethod1GeneratedMethod_a() {}
-*/
   @MethodDeclarationsMacro1()
+  /*member: Class2.instanceMethod1:
+declarations:
+
+void Class2_instanceMethod1GeneratedMethod_a() {}
+
+*/
   void instanceMethod1();
 
-  /*member: Class2.instanceField1:
-void Class2_instanceField1GeneratedMethod_() {}
-*/
   @FieldDeclarationsMacro1()
+  /*member: Class2.instanceField1:
+declarations:
+
+void Class2_instanceField1GeneratedMethod_() {}
+
+*/
   abstract int? instanceField1;
 }
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 908c3c1..9d4d622 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
@@ -24,6 +24,7 @@
 
 @ImportConflictMacro()
 /*member: function:
+definitions:
 augment void function(int i, FutureOr<Random> f, JsonCodec c, ) {
   var prefix = int;
   var prefix0 = FutureOr<Random>;
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 69afb5f..a526269 100644
--- a/pkg/front_end/test/macros/application/data/tests/layers.dart
+++ b/pkg/front_end/test/macros/application/data/tests/layers.dart
@@ -11,8 +11,11 @@
 
 @Macro2()
 /*class: Class:
+declarations:
+
 augment class Class {
   hasMacro() => true;
 
-}*/
+}
+*/
 class Class {}
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 75d6e1c..20f83ff 100644
--- a/pkg/front_end/test/macros/application/data/tests/parameters.dart
+++ b/pkg/front_end/test/macros/application/data/tests/parameters.dart
@@ -27,6 +27,7 @@
 import 'package:macro/macro.dart';
 
 /*member: topLevelFunction1:
+definitions:
 augment void topLevelFunction1(int a, ) {
   throw 42;
 }*/
@@ -34,6 +35,7 @@
 external void topLevelFunction1(int a);
 
 /*member: topLevelFunction2:
+definitions:
 augment void topLevelFunction2(int a, int b, ) {
   throw 42;
 }*/
@@ -41,6 +43,7 @@
 external void topLevelFunction2(int a, int b);
 
 /*member: topLevelFunction3:
+definitions:
 augment void topLevelFunction3(int a, [int? b, ]) {
   throw 42;
 }*/
@@ -48,6 +51,7 @@
 external void topLevelFunction3(int a, [int? b]);
 
 /*member: topLevelFunction4:
+definitions:
 augment void topLevelFunction4(int a, {int? b, int? c, }) {
   throw 42;
 }*/
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 0af4289..0318ffd 100644
--- a/pkg/front_end/test/macros/application/data/tests/sequence.dart
+++ b/pkg/front_end/test/macros/application/data/tests/sequence.dart
@@ -29,41 +29,65 @@
 
 import 'package:macro/macro.dart';
 
+@SequenceMacro(0)
 /*class: Class1:
+declarations:
+
 augment class Class1 {
   method() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class1 {}
 
-/*class: Class2:
-augment class Class2 {
-  method() {}
-  method1() {}
-}*/
 @SequenceMacro(0)
 @SequenceMacro(1)
+/*class: Class2:
+declarations:
+
+augment class Class2 {
+  method() {}
+}
+
+
+augment class Class2 {
+  method1() {}
+}
+*/
 class Class2 {}
 
+@SequenceMacro(0)
 /*class: Class3:
+declarations:
+
 augment class Class3 {
   method1() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class3 {
   @SequenceMacro(1)
   method() {}
 }
 
-/*class: Class4:
-augment class Class4 {
-  method1() {}
-  method3() {}
-  method4() {}
-}*/
 @SequenceMacro(0)
 @SequenceMacro(1)
 @SequenceMacro(2)
+/*class: Class4:
+declarations:
+
+augment class Class4 {
+  method1() {}
+}
+
+
+augment class Class4 {
+  method3() {}
+}
+
+
+augment class Class4 {
+  method4() {}
+}
+*/
 class Class4 {
   @SequenceMacro(3)
   method() {}
@@ -72,79 +96,112 @@
   method2() {}
 }
 
+@SequenceMacro(0)
 /*class: Class5c:
+declarations:
+
 augment class Class5c {
   method2() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class5c extends Class5b {}
 
+@SequenceMacro(0)
 /*class: Class5b:
+declarations:
+
 augment class Class5b {
   method1() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class5b extends Class5a {}
 
+@SequenceMacro(0)
 /*class: Class5a:
+declarations:
+
 augment class Class5a {
   method() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class5a {}
 
+@SequenceMacro(0)
 /*class: Class6d:
+declarations:
+
 augment class Class6d {
   method2() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 abstract class Class6d implements Class6c, Class6b {}
 
+@SequenceMacro(0)
 /*class: Class6c:
+declarations:
+
 augment class Class6c {
   method() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class6c {}
 
+@SequenceMacro(0)
 /*class: Class6b:
+declarations:
+
 augment class Class6b {
   method1() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 abstract class Class6b implements Class6a {}
 
+@SequenceMacro(0)
 /*class: Class6a:
+declarations:
+
 augment class Class6a {
   method() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class6a {}
 
+@SequenceMacro(0)
 /*class: Class7d:
+declarations:
+
 augment class Class7d {
   method2() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class7d with Class7b, Class7c {}
 
+@SequenceMacro(0)
 /*class: Class7c:
+declarations:
+
 augment class Class7c {
   method() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class7c {}
 
+@SequenceMacro(0)
 /*class: Class7b:
+declarations:
+
 augment class Class7b {
   method1() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class7b with Class7a {}
 
+@SequenceMacro(0)
 /*class: Class7a:
+declarations:
+
 augment class Class7a {
   method() {}
-}*/
-@SequenceMacro(0)
+}
+*/
 class Class7a {}
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 edd0f6e..d62139a 100644
--- a/pkg/front_end/test/macros/application/data/tests/subtypes.dart
+++ b/pkg/front_end/test/macros/application/data/tests/subtypes.dart
@@ -54,8 +54,11 @@
 class D2 {}
 
 /*member: topLevelFunction1:
+declarations:
+
 void topLevelFunction1GeneratedMethod_es() {}
 
+definitions:
 augment A topLevelFunction1(A a, ) {
   print('isExactly=true');
   print('isSubtype=true');
@@ -66,8 +69,11 @@
 external A topLevelFunction1(A a);
 
 /*member: topLevelFunction2:
+declarations:
+
 void topLevelFunction2GeneratedMethod_s() {}
 
+definitions:
 augment B2 topLevelFunction2(B1 a, ) {
   print('isExactly=false');
   print('isSubtype=true');
@@ -78,8 +84,11 @@
 external B2 topLevelFunction2(B1 a);
 
 /*member: topLevelFunction3:
+declarations:
+
 void topLevelFunction3GeneratedMethod_() {}
 
+definitions:
 augment C2 topLevelFunction3(C1 a, ) {
   print('isExactly=false');
   print('isSubtype=false');
@@ -90,8 +99,11 @@
 external C2 topLevelFunction3(C1 a);
 
 /*member: topLevelFunction4:
+declarations:
+
 void topLevelFunction4GeneratedMethod_() {}
 
+definitions:
 augment D2 topLevelFunction4(D1 a, ) {
   print('isExactly=false');
   print('isSubtype=false');
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 f319df3..b236bc0 100644
--- a/pkg/front_end/test/macros/application/data/tests/supertypes.dart
+++ b/pkg/front_end/test/macros/application/data/tests/supertypes.dart
@@ -35,6 +35,7 @@
 import 'package:macro/macro.dart';
 
 /*class: A:
+definitions:
 augment class A {
 augment String getSuperClass() {
     return "Object";
@@ -46,6 +47,7 @@
 }
 
 /*class: B:
+definitions:
 augment class B {
 augment String getSuperClass() {
     return "A";
@@ -57,6 +59,7 @@
 }
 
 /*class: M:
+definitions:
 augment class M {
 augment String getSuperClass() {
     return "Object";
@@ -68,6 +71,7 @@
 }
 
 /*class: C:
+definitions:
 augment class C {
 augment String getSuperClass() {
     return "A";
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 5f483c7..5cba268 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
@@ -12,11 +12,14 @@
 
 @ToStringMacro()
 /*class: A:
+declarations:
+
 augment class A {
   toString() {
     return "A(a=${a},b=${b})";
   }
-}*/
+}
+*/
 class A {
   var a;
   var b;
@@ -24,11 +27,14 @@
 
 @ToStringMacro()
 /*class: B:
+declarations:
+
 augment class B {
   toString() {
     return "B(c=${c},d=${d},e=${e})";
   }
-}*/
+}
+*/
 class B {
   var c, d;
   var e;
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 b6a734c..3b5a13a 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
@@ -46,6 +46,7 @@
 import 'package:macro/macro.dart';
 
 /*member: topLevelFunction1:
+definitions:
 augment void topLevelFunction1() {
   throw 42;
 }*/
@@ -53,6 +54,7 @@
 external void topLevelFunction1();
 
 /*member: topLevelFunction2:
+definitions:
 augment dynamic topLevelFunction2() {
   throw 42;
 }*/
@@ -60,6 +62,7 @@
 external dynamic topLevelFunction2();
 
 /*member: topLevelFunction3:
+definitions:
 augment int topLevelFunction3() {
   throw 42;
 }*/
@@ -67,6 +70,7 @@
 external int topLevelFunction3();
 
 /*member: topLevelFunction4:
+definitions:
 augment dynamic topLevelFunction4() {
   throw 42;
 }*/
@@ -74,6 +78,7 @@
 external topLevelFunction4();
 
 /*member: topLevelFunction5:
+definitions:
 augment Random topLevelFunction5() {
   throw 42;
 }*/
@@ -81,6 +86,7 @@
 external math.Random topLevelFunction5();
 
 /*member: topLevelFunction6:
+definitions:
 augment List<int> topLevelFunction6() {
   throw 42;
 }*/
@@ -88,6 +94,7 @@
 external List<int> topLevelFunction6();
 
 /*member: topLevelFunction7:
+definitions:
 augment Map<Random, List<int>> topLevelFunction7() {
   throw 42;
 }*/
@@ -95,6 +102,7 @@
 external Map<math.Random, List<int>> topLevelFunction7();
 
 /*member: topLevelFunction8:
+definitions:
 augment Map<int?, String>? topLevelFunction8() {
   throw 42;
 }*/
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 6db0cf4..f6c2702 100644
--- a/pkg/front_end/test/macros/application/data/tests/types.dart
+++ b/pkg/front_end/test/macros/application/data/tests/types.dart
@@ -32,6 +32,7 @@
 import 'package:macro/macro.dart';
 
 /*member: topLevelFunction1:
+types:
 class topLevelFunction1GeneratedClass {
   external void method();
 }*/
@@ -39,6 +40,7 @@
 void topLevelFunction1() {}
 
 /*member: topLevelFunction2:
+types:
 class topLevelFunction2GeneratedClass {
   external dynamic method();
 }*/
@@ -46,6 +48,7 @@
 dynamic topLevelFunction2() {}
 
 /*member: topLevelFunction3:
+types:
 class topLevelFunction3GeneratedClass {
   external int method();
 }*/
@@ -53,6 +56,7 @@
 int topLevelFunction3() => 0;
 
 /*member: topLevelFunction4:
+types:
 class topLevelFunction4GeneratedClass {
   external FunctionTypesMacro1? method();
 }*/
@@ -60,6 +64,7 @@
 FunctionTypesMacro1? topLevelFunction4() => null;
 
 /*member: topLevelFunction5:
+types:
 class topLevelFunction5GeneratedClass {
   external dynamic method();
 }*/
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 1ce3c47..cf08dda 100644
--- a/pkg/front_end/test/macros/application/macro_application_test.dart
+++ b/pkg/front_end/test/macros/application/macro_application_test.dart
@@ -202,54 +202,82 @@
         .dataForTesting!
         .macroApplicationData;
     StringBuffer sb = new StringBuffer();
-    List<DeclarationCode> mergedClassAugmentations = [];
+
+    StringBuffer typesSources = new StringBuffer();
+    List<DeclarationCode> mergedClassTypes = [];
     for (MapEntry<SourceClassBuilder, List<MacroExecutionResult>> entry
         in macroApplicationData.classTypesResults.entries) {
       if (entry.key.cls == cls) {
         for (MacroExecutionResult result in entry.value) {
           if (result.libraryAugmentations.isNotEmpty) {
-            sb.write('\n${codeToString(result.libraryAugmentations.single)}');
+            if (result.libraryAugmentations.isNotEmpty) {
+              typesSources.write(
+                  '\n${codeToString(result.libraryAugmentations.single)}');
+            }
+            mergedClassTypes
+                .addAll(result.classAugmentations[entry.key.name] ?? const []);
           }
-          mergedClassAugmentations
-              .addAll(result.classAugmentations[entry.key.name] ?? const []);
         }
       }
     }
-    for (MapEntry<SourceClassBuilder, List<MacroExecutionResult>> entry
-        in macroApplicationData.classDeclarationsResults.entries) {
+    if (mergedClassTypes.isNotEmpty) {
+      typesSources.write('\naugment class ${cls.name} {');
+      for (var result in mergedClassTypes) {
+        typesSources.write('\n${codeToString(result)}');
+      }
+      typesSources.write('\n}');
+    }
+    if (typesSources.isNotEmpty) {
+      sb.write('types:');
+      sb.write(typesSources);
+    }
+
+    StringBuffer declarationsSources = new StringBuffer();
+    for (MapEntry<SourceClassBuilder, List<String>> entry
+        in macroApplicationData.classDeclarationsSources.entries) {
       if (entry.key.cls == cls) {
-        for (MacroExecutionResult result in entry.value) {
-          if (result.libraryAugmentations.isNotEmpty) {
-            sb.write('\n${codeToString(result.libraryAugmentations.single)}');
+        for (String result in entry.value) {
+          if (result.isNotEmpty) {
+            declarationsSources.write('\n${result}');
           }
-          mergedClassAugmentations
-              .addAll(result.classAugmentations[entry.key.name] ?? const []);
         }
       }
     }
+    if (declarationsSources.isNotEmpty) {
+      sb.write('declarations:');
+      sb.write(declarationsSources);
+    }
+
+    StringBuffer definitionsSources = new StringBuffer();
+    List<DeclarationCode> mergedClassDefinitions = [];
     for (MapEntry<SourceClassBuilder, List<MacroExecutionResult>> entry
         in macroApplicationData.classDefinitionsResults.entries) {
       if (entry.key.cls == cls) {
         for (MacroExecutionResult result in entry.value) {
           if (result.libraryAugmentations.isNotEmpty) {
-            sb.write('\n${codeToString(result.libraryAugmentations.single)}');
+            definitionsSources
+                .write('\n${codeToString(result.libraryAugmentations.single)}');
           }
-          mergedClassAugmentations
+          mergedClassDefinitions
               .addAll(result.classAugmentations[entry.key.name] ?? const []);
         }
       }
     }
-    if (mergedClassAugmentations.isNotEmpty) {
-      sb.write('\naugment class ${cls.name} {');
-      for (var result in mergedClassAugmentations) {
-        sb.write('\n${codeToString(result)}');
+    if (mergedClassDefinitions.isNotEmpty) {
+      definitionsSources.write('\naugment class ${cls.name} {');
+      for (var result in mergedClassDefinitions) {
+        definitionsSources.write('\n${codeToString(result)}');
       }
-      sb.write('\n}');
+      definitionsSources.write('\n}');
     }
+    if (definitionsSources.isNotEmpty) {
+      sb.write('definitions:');
+      sb.write(definitionsSources);
+    }
+
     if (sb.isNotEmpty) {
       Id id = new ClassId(cls.name);
-      registry.registerValue(
-          cls.fileUri, cls.fileOffset, id, sb.toString(), cls);
+      registry.registerValue(cls.fileUri, cls.fileOffset, id, '\n$sb', cls);
     }
   }
 
@@ -266,69 +294,64 @@
         .dataForTesting!
         .macroApplicationData;
     StringBuffer sb = StringBuffer();
-    List<DeclarationCode> mergedAugmentations = [];
+
+    StringBuffer typesSources = new StringBuffer();
     for (MapEntry<MemberBuilder, List<MacroExecutionResult>> entry
         in macroApplicationData.memberTypesResults.entries) {
       if (_isMember(entry.key, member)) {
         for (MacroExecutionResult result in entry.value) {
           if (result.libraryAugmentations.isNotEmpty) {
-            sb.write('\n${codeToString(result.libraryAugmentations.single)}');
-          }
-          if (member.enclosingClass != null) {
-            mergedAugmentations.addAll(
-                result.classAugmentations[member.enclosingClass!.name] ??
-                    const []);
+            if (result.libraryAugmentations.isNotEmpty) {
+              typesSources.write(
+                  '\n${codeToString(result.libraryAugmentations.single)}');
+            }
           }
         }
       }
     }
-    for (MapEntry<MemberBuilder, List<MacroExecutionResult>> entry
-        in macroApplicationData.memberDeclarationsResults.entries) {
+    if (typesSources.isNotEmpty) {
+      sb.write('types:');
+      sb.write(typesSources);
+    }
+
+    StringBuffer declarationsSources = new StringBuffer();
+    for (MapEntry<MemberBuilder, List<String>> entry
+        in macroApplicationData.memberDeclarationsSources.entries) {
       if (_isMember(entry.key, member)) {
-        for (MacroExecutionResult result in entry.value) {
-          if (result.libraryAugmentations.isNotEmpty) {
-            sb.write('\n${codeToString(result.libraryAugmentations.single)}');
-          }
-          if (member.enclosingClass != null) {
-            mergedAugmentations.addAll(
-                result.classAugmentations[member.enclosingClass!.name] ??
-                    const []);
+        for (String result in entry.value) {
+          if (result.isNotEmpty) {
+            declarationsSources.write('\n${result}');
           }
         }
       }
     }
+    if (declarationsSources.isNotEmpty) {
+      sb.write('declarations:');
+      sb.write(declarationsSources);
+    }
+
+    StringBuffer definitionsSources = new StringBuffer();
     for (MapEntry<MemberBuilder, List<MacroExecutionResult>> entry
         in macroApplicationData.memberDefinitionsResults.entries) {
       if (_isMember(entry.key, member)) {
         for (MacroExecutionResult result in entry.value) {
           if (result.libraryAugmentations.isNotEmpty) {
-            sb.write('\n${codeToString(result.libraryAugmentations.single)}');
-          }
-          if (member.enclosingClass != null) {
-            mergedAugmentations.addAll(
-                result.classAugmentations[member.enclosingClass!.name] ??
-                    const []);
+            definitionsSources
+                .write('\n${codeToString(result.libraryAugmentations.single)}');
           }
         }
       }
     }
-    if (mergedAugmentations.isNotEmpty) {
-      if (member.enclosingClass != null) {
-        sb.write('\naugment class ${member.enclosingClass!.name} {');
-      }
-      for (DeclarationCode augmentation in mergedAugmentations) {
-        sb.write('\n${codeToString(augmentation)}');
-      }
-      if (member.enclosingClass != null) {
-        sb.write('\n}');
-      }
+    if (definitionsSources.isNotEmpty) {
+      sb.write('definitions:');
+      sb.write(definitionsSources);
     }
     if (sb.isNotEmpty) {
       Id id = computeMemberId(member);
       MemberBuilder memberBuilder =
           lookupMemberBuilder(testResultData.compilerResult, member)!;
       registry.registerValue(memberBuilder.fileUri!, memberBuilder.charOffset,
-          id, sb.toString(), member);
+          id, '\n$sb', member);
     }
   }
 }