[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); } } }