Version 2.16.0-138.0.dev

Merge commit 'ccffa7e9ad9b19a452faf455f5dc2bacb7dd41fd' into 'dev'
diff --git a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
index 9c60578..a72ac97 100644
--- a/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/enum_builder.dart
@@ -514,8 +514,8 @@
       }
     }
 
-    ProcedureBuilder toStringBuilder =
-        firstMemberNamed("toString") as ProcedureBuilder;
+    SourceProcedureBuilder toStringBuilder =
+        firstMemberNamed("toString") as SourceProcedureBuilder;
 
     TypeBuilder supertypeBuilder = this.supertypeBuilder!;
     ClassBuilder enumClass = supertypeBuilder.declaration as ClassBuilder;
diff --git a/pkg/front_end/lib/src/fasta/builder/function_builder.dart b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
index 9bd4714..40c21f0 100644
--- a/pkg/front_end/lib/src/fasta/builder/function_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/function_builder.dart
@@ -45,6 +45,11 @@
 
 /// Common base class for constructor and procedure builders.
 abstract class FunctionBuilder implements MemberBuilder {
+  FunctionNode get function;
+}
+
+abstract class SourceFunctionBuilder
+    implements FunctionBuilder, SourceMemberBuilder {
   List<MetadataBuilder>? get metadata;
 
   TypeBuilder? get returnType;
@@ -94,8 +99,6 @@
 
   String? get nativeMethodName;
 
-  FunctionNode get function;
-
   Statement? get body;
 
   void set body(Statement? newBody);
@@ -135,7 +138,7 @@
 
 /// Common base class for constructor and procedure builders.
 abstract class FunctionBuilderImpl extends MemberBuilderImpl
-    implements FunctionBuilder {
+    implements SourceFunctionBuilder {
   @override
   final List<MetadataBuilder>? metadata;
 
diff --git a/pkg/front_end/lib/src/fasta/builder/member_builder.dart b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
index 5fc860b..9108f06 100644
--- a/pkg/front_end/lib/src/fasta/builder/member_builder.dart
+++ b/pkg/front_end/lib/src/fasta/builder/member_builder.dart
@@ -98,8 +98,10 @@
   List<ClassMember> get localSetters;
 }
 
+abstract class SourceMemberBuilder implements MemberBuilder {}
+
 abstract class MemberBuilderImpl extends ModifierBuilderImpl
-    implements MemberBuilder {
+    implements SourceMemberBuilder {
   /// For top-level members, the parent is set correctly during
   /// construction. However, for class members, the parent is initially the
   /// library and updated later.
diff --git a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
index 0753eef..d8fbe1d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -939,7 +939,7 @@
   }
 
   void prepareInitializers() {
-    FunctionBuilder member = this.member as FunctionBuilder;
+    SourceFunctionBuilder member = this.member as SourceFunctionBuilder;
     scope = member.computeFormalParameterInitializerScope(scope);
     if (member is SourceConstructorBuilder) {
       member.prepareInitializers();
@@ -1054,7 +1054,7 @@
   }
 
   DartType _computeReturnTypeContext(MemberBuilder member) {
-    if (member is ProcedureBuilder) {
+    if (member is SourceProcedureBuilder) {
       final bool isReturnTypeUndeclared = member.returnType == null &&
           member.function.returnType is DynamicType;
       return isReturnTypeUndeclared && libraryBuilder.isNonNullableByDefault
@@ -1073,7 +1073,7 @@
     debugEvent("finishFunction");
     typeInferrer.assignedVariables.finish();
 
-    final FunctionBuilder builder = member as FunctionBuilder;
+    final SourceFunctionBuilder builder = member as SourceFunctionBuilder;
     if (extensionThis != null) {
       typeInferrer.flowAnalysis.declare(extensionThis!, true);
     }
@@ -1126,7 +1126,7 @@
     }
     if (builder is SourceConstructorBuilder) {
       finishConstructor(builder, asyncModifier, body);
-    } else if (builder is ProcedureBuilder) {
+    } else if (builder is SourceProcedureBuilder) {
       builder.asyncModifier = asyncModifier;
     } else if (builder is SourceFactoryBuilder) {
       builder.asyncModifier = asyncModifier;
@@ -4163,7 +4163,7 @@
     if (!inCatchClause &&
         functionNestingLevel == 0 &&
         memberKind != MemberKind.GeneralizedFunctionType) {
-      FunctionBuilder member = this.member as FunctionBuilder;
+      SourceFunctionBuilder member = this.member as SourceFunctionBuilder;
       parameter = member.getFormal(name!);
       if (parameter == null) {
         // This happens when the list of formals (originally) contains a
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 4cf5f7e..437924c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -386,6 +386,7 @@
       await loader.buildOutlines();
       loader.coreLibrary.becomeCoreLibrary();
       loader.resolveParts();
+      loader.computeMacroDeclarations();
       loader.computeLibraryScopes();
       setupTopAndBottomTypes();
       loader.resolveTypes();
@@ -394,7 +395,6 @@
           dynamicType, nullType, bottomType, objectClassBuilder);
       List<SourceClassBuilder> sourceClassBuilders =
           loader.checkSemantics(objectClassBuilder);
-      loader.computeMacroDeclarations(sourceClassBuilders);
       loader.computeMacroApplications();
       loader.finishTypeVariables(objectClassBuilder, dynamicType);
       loader.createTypeInferenceEngine();
diff --git a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
index 6c5157d..213a84e 100644
--- a/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_class_builder.dart
@@ -550,7 +550,7 @@
         // Check fields.
         checkVarianceInField(builder, typeEnvironment, cls.typeParameters);
         library.checkTypesInField(builder, typeEnvironment);
-      } else if (builder is ProcedureBuilder) {
+      } else if (builder is SourceProcedureBuilder) {
         // Check procedures
         checkVarianceInFunction(
             builder.procedure, typeEnvironment, cls.typeParameters);
@@ -562,7 +562,7 @@
     });
 
     forEachConstructor((String name, MemberBuilder builder) {
-      if (builder is ConstructorBuilder) {
+      if (builder is SourceConstructorBuilder) {
         library.checkTypesInConstructorBuilder(builder, typeEnvironment);
       } else if (builder is RedirectingFactoryBuilder) {
         library.checkTypesInRedirectingFactoryBuilder(builder, typeEnvironment);
diff --git a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
index 4760e58..29e8ce8 100644
--- a/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_extension_builder.dart
@@ -262,7 +262,7 @@
       if (builder is SourceFieldBuilder) {
         // Check fields.
         library.checkTypesInField(builder, typeEnvironment);
-      } else if (builder is ProcedureBuilder) {
+      } else if (builder is SourceProcedureBuilder) {
         // Check procedures
         library.checkTypesInFunctionBuilder(builder, typeEnvironment);
         if (builder.isGetter) {
diff --git a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
index 701382f..6f3c22a 100644
--- a/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_library_builder.dart
@@ -186,7 +186,7 @@
 
   final SourceLibraryBuilder? _origin;
 
-  final List<FunctionBuilder> nativeMethods = <FunctionBuilder>[];
+  final List<SourceFunctionBuilder> nativeMethods = <SourceFunctionBuilder>[];
 
   final List<TypeVariableBuilder> unboundTypeVariables =
       <TypeVariableBuilder>[];
@@ -2657,7 +2657,7 @@
         }
       }
     }
-    ProcedureBuilder procedureBuilder = new SourceProcedureBuilder(
+    SourceProcedureBuilder procedureBuilder = new SourceProcedureBuilder(
         metadata,
         modifiers,
         returnType,
@@ -3302,7 +3302,7 @@
     return count;
   }
 
-  void addNativeMethod(FunctionBuilder method) {
+  void addNativeMethod(SourceFunctionBuilder method) {
     nativeMethods.add(method);
   }
 
@@ -3316,7 +3316,7 @@
       }
     }
 
-    for (FunctionBuilder method in nativeMethods) {
+    for (SourceFunctionBuilder method in nativeMethods) {
       method.becomeNative(loader);
     }
     count += nativeMethods.length;
@@ -3678,9 +3678,9 @@
                   inErrorRecovery: issues.isNotEmpty);
               formals = member.formals;
             } else {
-              assert(member is ConstructorBuilder,
+              assert(member is SourceConstructorBuilder,
                   "Unexpected constructor member (${member.runtimeType}).");
-              formals = (member as ConstructorBuilder).formals;
+              formals = (member as SourceConstructorBuilder).formals;
             }
             if (formals != null && formals.isNotEmpty) {
               for (FormalParameterBuilder formal in formals) {
@@ -3694,7 +3694,7 @@
           });
         }
         declaration.forEach((String name, Builder member) {
-          if (member is ProcedureBuilder) {
+          if (member is SourceProcedureBuilder) {
             List<NonSimplicityIssue> issues =
                 getNonSimplicityIssuesForTypeVariables(member.typeVariables);
             if (member.formals != null && member.formals!.isNotEmpty) {
@@ -3733,7 +3733,7 @@
         count += computeDefaultTypesForVariables(declaration.typeVariables,
             inErrorRecovery: issues.isNotEmpty);
         _recursivelyReportGenericFunctionTypesAsBoundsForType(declaration.type);
-      } else if (declaration is FunctionBuilder) {
+      } else if (declaration is SourceFunctionBuilder) {
         List<NonSimplicityIssue> issues =
             getNonSimplicityIssuesForTypeVariables(declaration.typeVariables);
         if (declaration.formals != null && declaration.formals!.isNotEmpty) {
@@ -3761,7 +3761,7 @@
               inErrorRecovery: issues.isNotEmpty);
         }
         declaration.forEach((String name, Builder member) {
-          if (member is ProcedureBuilder) {
+          if (member is SourceProcedureBuilder) {
             List<NonSimplicityIssue> issues =
                 getNonSimplicityIssuesForTypeVariables(member.typeVariables);
             if (member.formals != null && member.formals!.isNotEmpty) {
@@ -3809,10 +3809,10 @@
     for (Builder declaration
         in _libraryTypeParameterScopeBuilder.setters!.values) {
       assert(
-          declaration is ProcedureBuilder,
+          declaration is SourceProcedureBuilder,
           "Expected setter to be a ProcedureBuilder, "
           "but got '${declaration.runtimeType}'");
-      if (declaration is ProcedureBuilder &&
+      if (declaration is SourceProcedureBuilder &&
           declaration.formals != null &&
           declaration.formals!.isNotEmpty) {
         for (FormalParameterBuilder formal in declaration.formals!) {
@@ -4235,7 +4235,7 @@
   }
 
   void checkTypesInFunctionBuilder(
-      FunctionBuilder procedureBuilder, TypeEnvironment typeEnvironment) {
+      SourceFunctionBuilder procedureBuilder, TypeEnvironment typeEnvironment) {
     checkBoundsInFunctionNode(
         procedureBuilder.function, typeEnvironment, procedureBuilder.fileUri!);
     if (procedureBuilder.formals != null &&
@@ -4245,7 +4245,8 @@
   }
 
   void checkTypesInConstructorBuilder(
-      ConstructorBuilder constructorBuilder, TypeEnvironment typeEnvironment) {
+      SourceConstructorBuilder constructorBuilder,
+      TypeEnvironment typeEnvironment) {
     checkBoundsInFunctionNode(
         constructorBuilder.constructor.function, typeEnvironment, fileUri);
     if (!constructorBuilder.isExternal && constructorBuilder.formals != null) {
@@ -4549,7 +4550,7 @@
       Builder declaration = iterator.current;
       if (declaration is FieldBuilder) {
         checkTypesInField(declaration, typeEnvironment);
-      } else if (declaration is ProcedureBuilder) {
+      } else if (declaration is SourceProcedureBuilder) {
         checkTypesInFunctionBuilder(declaration, typeEnvironment);
         if (declaration.isGetter) {
           Builder? setterDeclaration =
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 6c12705..48f3241 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -1303,7 +1303,7 @@
     ticker.logMs("Resolved $typeCount types");
   }
 
-  void computeMacroDeclarations(List<SourceClassBuilder> sourceClassBuilders) {
+  void computeMacroDeclarations() {
     if (!enableMacros) return;
 
     LibraryBuilder? macroLibraryBuilder = lookupLibraryBuilder(macroLibraryUri);
@@ -1325,14 +1325,18 @@
     Set<ClassBuilder> macroClasses = {macroClassBuilder};
     Set<Uri> macroLibraries = {macroLibraryBuilder.importUri};
 
-    for (SourceClassBuilder sourceClassBuilder in sourceClassBuilders) {
-      if (sourceClassBuilder.isMacro) {
-        macroClasses.add(sourceClassBuilder);
-        macroLibraries.add(sourceClassBuilder.library.importUri);
-        if (retainDataForTesting) {
-          (dataForTesting!.macroDeclarationData.macroDeclarations[
-                  sourceClassBuilder.library.importUri] ??= [])
-              .add(sourceClassBuilder.name);
+    for (SourceLibraryBuilder sourceLibraryBuilder in sourceLibraryBuilders) {
+      Iterator<Builder> iterator = sourceLibraryBuilder.iterator;
+      while (iterator.moveNext()) {
+        Builder builder = iterator.current;
+        if (builder is SourceClassBuilder && builder.isMacro) {
+          macroClasses.add(builder);
+          macroLibraries.add(builder.library.importUri);
+          if (retainDataForTesting) {
+            (dataForTesting!.macroDeclarationData
+                    .macroDeclarations[builder.library.importUri] ??= [])
+                .add(builder.name);
+          }
         }
       }
     }
diff --git a/pkg/front_end/test/extensions/extensions_test.dart b/pkg/front_end/test/extensions/extensions_test.dart
index 2bb86f3..82e937b 100644
--- a/pkg/front_end/test/extensions/extensions_test.dart
+++ b/pkg/front_end/test/extensions/extensions_test.dart
@@ -240,7 +240,7 @@
     MemberBuilder memberBuilder = lookupMemberBuilder(compilerResult, member)!;
     Features features = new Features();
     features[Tags.builderName] = memberBuilder.name;
-    if (memberBuilder is FunctionBuilder) {
+    if (memberBuilder is SourceFunctionBuilder) {
       if (memberBuilder.formals != null) {
         for (FormalParameterBuilder parameter in memberBuilder.formals!) {
           if (parameter.isRequired) {
diff --git a/tools/VERSION b/tools/VERSION
index 52d9513..9a1c513 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 16
 PATCH 0
-PRERELEASE 137
+PRERELEASE 138
 PRERELEASE_PATCH 0
\ No newline at end of file