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
