[cfe] Refactor IdentifierImpl

This moves macro implementation into its own subfolder and refactors
the IdentifierImpl implementation to be split into identifier based on
TypeDeclarationBuidler, TypeBuilder, MemberBuilder and
FormalParameterBuilder.

As part of the refactoring, the resolveTypeAnnotation implementation was
rewritten to use DartType instead of TypeBuilder.

Change-Id: Ie59160f4252627849606169b0210aaa83a27d60c
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/236880
Reviewed-by: Chloe Stefantsova <cstefantsova@google.com>
Commit-Queue: Johnni Winther <johnniwinther@google.com>
diff --git a/pkg/front_end/lib/src/fasta/incremental_compiler.dart b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
index 0f02e2e..897b3d8 100644
--- a/pkg/front_end/lib/src/fasta/incremental_compiler.dart
+++ b/pkg/front_end/lib/src/fasta/incremental_compiler.dart
@@ -116,7 +116,7 @@
 
 import 'incremental_serializer.dart' show IncrementalSerializer;
 
-import 'kernel/macro.dart' show enableMacros, NeededPrecompilations;
+import 'kernel/macro/macro.dart' show enableMacros, NeededPrecompilations;
 
 import 'scope.dart' show Scope;
 
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 730ab5747..09fc019 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -82,7 +82,7 @@
         ConstantEvaluationData;
 import 'kernel_constants.dart' show KernelConstantErrorReporter;
 import 'kernel_helper.dart';
-import 'macro.dart';
+import 'macro/macro.dart';
 import 'verifier.dart' show verifyComponent, verifyGetStaticType;
 
 class KernelTarget extends TargetImplementation {
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
similarity index 98%
rename from pkg/front_end/lib/src/fasta/kernel/macro_annotation_parser.dart
rename to pkg/front_end/lib/src/fasta/kernel/macro/annotation_parser.dart
index aeed256..e177ba8 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
@@ -7,14 +7,14 @@
 import 'package:_fe_analyzer_shared/src/scanner/error_token.dart';
 import 'package:_fe_analyzer_shared/src/scanner/token.dart';
 
-import '../builder/builder.dart';
-import '../builder/class_builder.dart';
-import '../builder/member_builder.dart';
-import '../builder/metadata_builder.dart';
-import '../builder/prefix_builder.dart';
-import '../scope.dart';
-import '../source/diet_parser.dart';
-import '../source/source_library_builder.dart';
+import '../../builder/builder.dart';
+import '../../builder/class_builder.dart';
+import '../../builder/member_builder.dart';
+import '../../builder/metadata_builder.dart';
+import '../../builder/prefix_builder.dart';
+import '../../scope.dart';
+import '../../source/diet_parser.dart';
+import '../../source/source_library_builder.dart';
 
 import 'macro.dart';
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart
new file mode 100644
index 0000000..ad6743a
--- /dev/null
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/identifiers.dart
@@ -0,0 +1,165 @@
+// Copyright (c) 2021, the Dart project authors.  Please see the AUTHORS file
+// 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.
+
+import 'package:_fe_analyzer_shared/src/macros/executor.dart' as macro;
+import 'package:_fe_analyzer_shared/src/macros/executor/introspection_impls.dart'
+    as macro;
+import 'package:kernel/ast.dart';
+
+import '../../builder/class_builder.dart';
+import '../../builder/formal_parameter_builder.dart';
+import '../../builder/library_builder.dart';
+import '../../builder/member_builder.dart';
+import '../../builder/nullability_builder.dart';
+import '../../builder/type_alias_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../builder/type_declaration_builder.dart';
+
+abstract class IdentifierImpl implements macro.IdentifierImpl {
+  macro.ResolvedIdentifier resolveIdentifier();
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments);
+}
+
+class TypeBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final TypeBuilder typeBuilder;
+  final LibraryBuilder libraryBuilder;
+
+  TypeBuilderIdentifier({
+    required this.typeBuilder,
+    required this.libraryBuilder,
+    required int id,
+    required String name,
+  }) : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    TypeDeclarationBuilder? typeDeclarationBuilder = typeBuilder.declaration;
+    if (typeDeclarationBuilder != null) {
+      Uri? uri;
+      if (typeDeclarationBuilder is ClassBuilder) {
+        uri = typeDeclarationBuilder.library.importUri;
+      } else if (typeDeclarationBuilder is TypeAliasBuilder) {
+        uri = typeDeclarationBuilder.library.importUri;
+      } else if (name == 'dynamic') {
+        uri = Uri.parse('dart:core');
+      }
+      return new macro.ResolvedIdentifier(
+          kind: macro.IdentifierKind.topLevelMember,
+          name: name,
+          staticScope: null,
+          uri: uri);
+    } else {
+      throw new StateError('Unable to resolve identifier $this');
+    }
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    return typeBuilder.declaration!.buildTypeWithBuiltArguments(libraryBuilder,
+        nullabilityBuilder.build(libraryBuilder), typeArguments);
+  }
+}
+
+class TypeDeclarationBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final TypeDeclarationBuilder typeDeclarationBuilder;
+  final LibraryBuilder libraryBuilder;
+
+  TypeDeclarationBuilderIdentifier({
+    required this.typeDeclarationBuilder,
+    required this.libraryBuilder,
+    required int id,
+    required String name,
+  }) : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    Uri? uri;
+    if (typeDeclarationBuilder is ClassBuilder) {
+      uri = (typeDeclarationBuilder as ClassBuilder).library.importUri;
+    } else if (typeDeclarationBuilder is TypeAliasBuilder) {
+      uri = (typeDeclarationBuilder as TypeAliasBuilder).library.importUri;
+    } else if (name == 'dynamic') {
+      uri = Uri.parse('dart:core');
+    }
+    return new macro.ResolvedIdentifier(
+        kind: macro.IdentifierKind.topLevelMember,
+        name: name,
+        staticScope: null,
+        uri: uri);
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    return typeDeclarationBuilder.buildTypeWithBuiltArguments(libraryBuilder,
+        nullabilityBuilder.build(libraryBuilder), typeArguments);
+  }
+}
+
+class MemberBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final MemberBuilder memberBuilder;
+
+  MemberBuilderIdentifier(
+      {required this.memberBuilder, required int id, required String name})
+      : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    Uri? uri;
+    String? staticScope;
+    macro.IdentifierKind kind;
+    if (memberBuilder.isStatic || memberBuilder.isConstructor) {
+      ClassBuilder classBuilder = memberBuilder.classBuilder!;
+      staticScope = classBuilder.name;
+      uri = classBuilder.library.importUri;
+      kind = macro.IdentifierKind.staticInstanceMember;
+    } else if (memberBuilder.isTopLevel) {
+      uri = memberBuilder.library.importUri;
+      kind = macro.IdentifierKind.topLevelMember;
+    } else {
+      kind = macro.IdentifierKind.instanceMember;
+    }
+    return new macro.ResolvedIdentifier(
+        kind: kind, name: name, staticScope: staticScope, uri: uri);
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    throw new UnsupportedError('Cannot build type from member.');
+  }
+}
+
+class FormalParameterBuilderIdentifier extends macro.IdentifierImpl
+    implements IdentifierImpl {
+  final LibraryBuilder libraryBuilder;
+  final FormalParameterBuilder parameterBuilder;
+
+  FormalParameterBuilderIdentifier({
+    required this.parameterBuilder,
+    required this.libraryBuilder,
+    required int id,
+    required String name,
+  }) : super(id: id, name: name);
+
+  @override
+  macro.ResolvedIdentifier resolveIdentifier() {
+    return new macro.ResolvedIdentifier(
+        kind: macro.IdentifierKind.local,
+        name: name,
+        staticScope: null,
+        uri: null);
+  }
+
+  @override
+  DartType buildType(
+      NullabilityBuilder nullabilityBuilder, List<DartType> typeArguments) {
+    throw new UnsupportedError('Cannot build type from formal parameter.');
+  }
+}
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
similarity index 83%
rename from pkg/front_end/lib/src/fasta/kernel/macro.dart
rename to pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
index 5a9d010..2b027d9 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro/macro.dart
@@ -12,27 +12,27 @@
 import 'package:kernel/src/types.dart';
 import 'package:kernel/type_environment.dart' show SubtypeCheckMode;
 
-import '../../base/common.dart';
-import '../builder/builder.dart';
-import '../builder/class_builder.dart';
-import '../builder/formal_parameter_builder.dart';
-import '../builder/library_builder.dart';
-import '../builder/member_builder.dart';
-import '../builder/named_type_builder.dart';
-import '../builder/nullability_builder.dart';
-import '../builder/type_alias_builder.dart';
-import '../builder/type_builder.dart';
-import '../builder/type_declaration_builder.dart';
-import '../identifiers.dart';
-import '../source/source_class_builder.dart';
-import '../source/source_constructor_builder.dart';
-import '../source/source_factory_builder.dart';
-import '../source/source_field_builder.dart';
-import '../source/source_library_builder.dart';
-import '../source/source_loader.dart';
-import '../source/source_procedure_builder.dart';
-import 'hierarchy/hierarchy_builder.dart';
-import 'hierarchy/hierarchy_node.dart';
+import '../../../base/common.dart';
+import '../../builder/builder.dart';
+import '../../builder/class_builder.dart';
+import '../../builder/formal_parameter_builder.dart';
+import '../../builder/library_builder.dart';
+import '../../builder/member_builder.dart';
+import '../../builder/named_type_builder.dart';
+import '../../builder/nullability_builder.dart';
+import '../../builder/type_builder.dart';
+import '../../builder/type_declaration_builder.dart';
+import '../../identifiers.dart';
+import '../../source/source_class_builder.dart';
+import '../../source/source_constructor_builder.dart';
+import '../../source/source_factory_builder.dart';
+import '../../source/source_field_builder.dart';
+import '../../source/source_library_builder.dart';
+import '../../source/source_loader.dart';
+import '../../source/source_procedure_builder.dart';
+import '../hierarchy/hierarchy_builder.dart';
+import '../hierarchy/hierarchy_node.dart';
+import 'identifiers.dart';
 
 bool enableMacros = false;
 
@@ -214,55 +214,8 @@
   }
 
   macro.ResolvedIdentifier _resolveIdentifier(macro.Identifier identifier) {
-    if (identifier is _IdentifierImpl) {
-      MemberBuilder? memberBuilder = identifier.memberBuilder;
-      FormalParameterBuilder? parameterBuilder = identifier.parameterBuilder;
-      TypeDeclarationBuilder? typeDeclarationBuilder =
-          identifier.typeDeclarationBuilder ??
-              identifier.typeBuilder?.declaration;
-      if (memberBuilder != null) {
-        Uri? uri;
-        String? staticScope;
-        macro.IdentifierKind kind;
-        if (memberBuilder.isStatic || memberBuilder.isConstructor) {
-          ClassBuilder classBuilder = memberBuilder.classBuilder!;
-          staticScope = classBuilder.name;
-          uri = classBuilder.library.importUri;
-          kind = macro.IdentifierKind.staticInstanceMember;
-        } else if (memberBuilder.isTopLevel) {
-          uri = memberBuilder.library.importUri;
-          kind = macro.IdentifierKind.topLevelMember;
-        } else {
-          kind = macro.IdentifierKind.instanceMember;
-        }
-        return new macro.ResolvedIdentifier(
-            kind: kind,
-            name: identifier.name,
-            staticScope: staticScope,
-            uri: uri);
-      } else if (typeDeclarationBuilder != null) {
-        Uri? uri;
-        if (typeDeclarationBuilder is ClassBuilder) {
-          uri = typeDeclarationBuilder.library.importUri;
-        } else if (typeDeclarationBuilder is TypeAliasBuilder) {
-          uri = typeDeclarationBuilder.library.importUri;
-        } else if (identifier.name == 'dynamic') {
-          uri = Uri.parse('dart:core');
-        }
-        return new macro.ResolvedIdentifier(
-            kind: macro.IdentifierKind.topLevelMember,
-            name: identifier.name,
-            staticScope: null,
-            uri: uri);
-      } else if (parameterBuilder != null) {
-        return new macro.ResolvedIdentifier(
-            kind: macro.IdentifierKind.local,
-            name: identifier.name,
-            staticScope: null,
-            uri: null);
-      } else {
-        throw new StateError('Unable to resolve identifier $identifier');
-      }
+    if (identifier is IdentifierImpl) {
+      return identifier.resolveIdentifier();
     } else {
       // TODO(johnniwinther): Use [_IdentifierImpl] for all identifiers.
       if (identical(identifier, dynamicIdentifier)) {
@@ -522,7 +475,7 @@
   macro.ClassDeclaration _createClassDeclaration(ClassBuilder builder) {
     macro.ClassDeclaration declaration = new macro.ClassDeclarationImpl(
         id: macro.RemoteInstance.uniqueId,
-        identifier: new _IdentifierImpl.forTypeDeclarationBuilder(
+        identifier: new TypeDeclarationBuilderIdentifier(
             typeDeclarationBuilder: builder,
             libraryBuilder: builder.library,
             id: macro.RemoteInstance.uniqueId,
@@ -553,12 +506,11 @@
       for (FormalParameterBuilder formal in formals) {
         macro.TypeAnnotationImpl type =
             computeTypeAnnotation(builder.library, formal.type);
-        macro.IdentifierImpl identifier =
-            new _IdentifierImpl.forParameterBuilder(
-                id: macro.RemoteInstance.uniqueId,
-                name: formal.name,
-                parameterBuilder: formal,
-                libraryBuilder: builder.library);
+        macro.IdentifierImpl identifier = new FormalParameterBuilderIdentifier(
+            id: macro.RemoteInstance.uniqueId,
+            name: formal.name,
+            parameterBuilder: formal,
+            libraryBuilder: builder.library);
         if (formal.isNamed) {
           namedParameters.add(new macro.ParameterDeclarationImpl(
             id: macro.RemoteInstance.uniqueId,
@@ -594,7 +546,7 @@
         _getClassDeclaration(builder.classBuilder as SourceClassBuilder);
     return new macro.ConstructorDeclarationImpl(
       id: macro.RemoteInstance.uniqueId,
-      identifier: new _IdentifierImpl.forMemberBuilder(
+      identifier: new MemberBuilderIdentifier(
           memberBuilder: builder,
           id: macro.RemoteInstance.uniqueId,
           name: builder.name),
@@ -623,7 +575,7 @@
 
     return new macro.ConstructorDeclarationImpl(
       id: macro.RemoteInstance.uniqueId,
-      identifier: new _IdentifierImpl.forMemberBuilder(
+      identifier: new MemberBuilderIdentifier(
           memberBuilder: builder,
           id: macro.RemoteInstance.uniqueId,
           name: builder.name),
@@ -658,7 +610,7 @@
       //  declarations?
       return new macro.MethodDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -678,7 +630,7 @@
     } else {
       return new macro.FunctionDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -708,7 +660,7 @@
       //  declarations?
       return new macro.FieldDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -721,7 +673,7 @@
     } else {
       return new macro.VariableDeclarationImpl(
           id: macro.RemoteInstance.uniqueId,
-          identifier: new _IdentifierImpl.forMemberBuilder(
+          identifier: new MemberBuilderIdentifier(
               memberBuilder: builder,
               id: macro.RemoteInstance.uniqueId,
               name: builder.name),
@@ -752,7 +704,7 @@
         if (name is String) {
           return new macro.NamedTypeAnnotationImpl(
               id: macro.RemoteInstance.uniqueId,
-              identifier: new _IdentifierImpl.forTypeBuilder(
+              identifier: new TypeBuilderIdentifier(
                   typeBuilder: typeBuilder,
                   libraryBuilder: libraryBuilder,
                   id: macro.RemoteInstance.uniqueId,
@@ -763,7 +715,7 @@
           assert(name.qualifier is String);
           return new macro.NamedTypeAnnotationImpl(
               id: macro.RemoteInstance.uniqueId,
-              identifier: new _IdentifierImpl.forTypeBuilder(
+              identifier: new TypeBuilderIdentifier(
                   typeBuilder: typeBuilder,
                   libraryBuilder: libraryBuilder,
                   id: macro.RemoteInstance.uniqueId,
@@ -786,8 +738,7 @@
         _computeTypeAnnotation(libraryBuilder, typeBuilder);
   }
 
-  TypeBuilder _typeBuilderForAnnotation(
-      macro.TypeAnnotationCode typeAnnotation) {
+  DartType _typeForAnnotation(macro.TypeAnnotationCode typeAnnotation) {
     NullabilityBuilder nullabilityBuilder;
     if (typeAnnotation is macro.NullableTypeAnnotationCode) {
       nullabilityBuilder = const NullabilityBuilder.nullable();
@@ -797,35 +748,13 @@
     }
 
     if (typeAnnotation is macro.NamedTypeAnnotationCode) {
-      _IdentifierImpl typeIdentifier = typeAnnotation.name as _IdentifierImpl;
-      TypeDeclarationBuilder? typeDeclarationBuilder =
-          typeIdentifier.typeDeclarationBuilder;
-      InstanceTypeVariableAccessState instanceTypeVariableAccessState =
-          InstanceTypeVariableAccessState.Unexpected;
-      if (typeDeclarationBuilder == null) {
-        TypeBuilder? originalTypeBuilder = typeIdentifier.typeBuilder;
-
-        if (originalTypeBuilder == null) {
-          throw new StateError('No type builder for $typeIdentifier');
-        }
-        if (originalTypeBuilder is! NamedTypeBuilder) {
-          throw new StateError(
-              'Type $typeIdentifier was not a named type as expected!');
-        }
-        typeDeclarationBuilder = originalTypeBuilder.declaration!;
-        instanceTypeVariableAccessState =
-            originalTypeBuilder.instanceTypeVariableAccess;
-      }
-      List<TypeBuilder> arguments = [
-        for (macro.TypeAnnotationCode argumentCode
-            in typeAnnotation.typeArguments)
-          _typeBuilderForAnnotation(argumentCode),
-      ];
-
-      return new NamedTypeBuilder.fromTypeDeclarationBuilder(
-          typeDeclarationBuilder, nullabilityBuilder,
-          instanceTypeVariableAccess: instanceTypeVariableAccessState,
-          arguments: arguments);
+      macro.NamedTypeAnnotationCode namedTypeAnnotation = typeAnnotation;
+      IdentifierImpl typeIdentifier = typeAnnotation.name as IdentifierImpl;
+      List<DartType> arguments = new List<DartType>.generate(
+          namedTypeAnnotation.typeArguments.length,
+          (int index) =>
+              _typeForAnnotation(namedTypeAnnotation.typeArguments[index]));
+      return typeIdentifier.buildType(nullabilityBuilder, arguments);
     }
     // TODO: Implement support for function types.
     throw new UnimplementedError(
@@ -834,12 +763,7 @@
 
   macro.StaticType resolveTypeAnnotation(
       macro.TypeAnnotationCode typeAnnotation) {
-    TypeBuilder typeBuilder = _typeBuilderForAnnotation(typeAnnotation);
-    // TODO: This should probably be passed in instead, possibly attached to the
-    // TypeResolver class?
-    LibraryBuilder libraryBuilder =
-        typeAnnotation.parts.whereType<_IdentifierImpl>().first.libraryBuilder;
-    return createStaticType(typeBuilder.build(libraryBuilder));
+    return createStaticType(_typeForAnnotation(typeAnnotation));
   }
 
   Map<DartType, _StaticTypeImpl> _staticTypeCache = {};
@@ -849,54 +773,6 @@
   }
 }
 
-class _IdentifierImpl extends macro.IdentifierImpl {
-  final TypeDeclarationBuilder? typeDeclarationBuilder;
-  final MemberBuilder? memberBuilder;
-  final TypeBuilder? typeBuilder;
-  final LibraryBuilder libraryBuilder;
-  final FormalParameterBuilder? parameterBuilder;
-
-  _IdentifierImpl.forTypeBuilder({
-    required TypeBuilder this.typeBuilder,
-    required this.libraryBuilder,
-    required int id,
-    required String name,
-  })  : typeDeclarationBuilder = null,
-        memberBuilder = null,
-        parameterBuilder = null,
-        super(id: id, name: name);
-
-  _IdentifierImpl.forTypeDeclarationBuilder({
-    required TypeDeclarationBuilder this.typeDeclarationBuilder,
-    required this.libraryBuilder,
-    required int id,
-    required String name,
-  })  : typeBuilder = null,
-        memberBuilder = null,
-        parameterBuilder = null,
-        super(id: id, name: name);
-
-  _IdentifierImpl.forMemberBuilder(
-      {required MemberBuilder this.memberBuilder,
-      required int id,
-      required String name})
-      : typeBuilder = null,
-        typeDeclarationBuilder = null,
-        parameterBuilder = null,
-        libraryBuilder = memberBuilder.library,
-        super(id: id, name: name);
-
-  _IdentifierImpl.forParameterBuilder({
-    required FormalParameterBuilder this.parameterBuilder,
-    required this.libraryBuilder,
-    required int id,
-    required String name,
-  })  : typeBuilder = null,
-        typeDeclarationBuilder = null,
-        memberBuilder = null,
-        super(id: id, name: name);
-}
-
 class _StaticTypeImpl extends macro.StaticType {
   final MacroApplications macroApplications;
   final DartType type;
@@ -942,13 +818,13 @@
               'Unable to find top level identifier "$name" in $library'),
           StackTrace.current);
     } else if (builder is TypeDeclarationBuilder) {
-      return new Future.value(new _IdentifierImpl.forTypeDeclarationBuilder(
+      return new Future.value(new TypeDeclarationBuilderIdentifier(
           typeDeclarationBuilder: builder,
           libraryBuilder: libraryBuilder,
           id: macro.RemoteInstance.uniqueId,
           name: name));
     } else if (builder is MemberBuilder) {
-      return new Future.value(new _IdentifierImpl.forMemberBuilder(
+      return new Future.value(new MemberBuilderIdentifier(
           memberBuilder: builder,
           id: macro.RemoteInstance.uniqueId,
           name: name));
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 17257de..181c94b 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
@@ -66,7 +66,7 @@
 import '../kernel/internal_ast.dart';
 import '../kernel/kernel_helper.dart';
 import '../kernel/load_library_builder.dart';
-import '../kernel/macro.dart';
+import '../kernel/macro/macro.dart';
 import '../kernel/type_algorithms.dart'
     show
         NonSimplicityIssue,
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 a281736..fb53047 100644
--- a/pkg/front_end/lib/src/fasta/source/source_loader.dart
+++ b/pkg/front_end/lib/src/fasta/source/source_loader.dart
@@ -74,8 +74,8 @@
 import '../kernel/kernel_helper.dart'
     show SynthesizedFunctionNode, TypeDependency;
 import '../kernel/kernel_target.dart' show KernelTarget;
-import '../kernel/macro.dart';
-import '../kernel/macro_annotation_parser.dart';
+import '../kernel/macro/macro.dart';
+import '../kernel/macro/annotation_parser.dart';
 import '../kernel/transform_collections.dart' show CollectionTransformer;
 import '../kernel/transform_set_literals.dart' show SetLiteralTransformer;
 import '../kernel/type_builder_computer.dart' show TypeBuilderComputer;
diff --git a/pkg/front_end/lib/src/kernel_generator_impl.dart b/pkg/front_end/lib/src/kernel_generator_impl.dart
index 6a02262..cfb4145 100644
--- a/pkg/front_end/lib/src/kernel_generator_impl.dart
+++ b/pkg/front_end/lib/src/kernel_generator_impl.dart
@@ -24,7 +24,7 @@
 import 'fasta/fasta_codes.dart' show LocatedMessage;
 import 'fasta/hybrid_file_system.dart';
 import 'fasta/kernel/kernel_target.dart' show BuildResult, KernelTarget;
-import 'fasta/kernel/macro.dart';
+import 'fasta/kernel/macro/macro.dart';
 import 'fasta/kernel/utils.dart' show printComponentText, serializeComponent;
 import 'fasta/kernel/verifier.dart' show verifyComponent;
 import 'fasta/source/source_loader.dart' show SourceLoader;
diff --git a/pkg/front_end/lib/src/testing/id_testing_helper.dart b/pkg/front_end/lib/src/testing/id_testing_helper.dart
index 102912e..4be720bd 100644
--- a/pkg/front_end/lib/src/testing/id_testing_helper.dart
+++ b/pkg/front_end/lib/src/testing/id_testing_helper.dart
@@ -25,7 +25,7 @@
 import '../api_prototype/terminal_color_support.dart'
     show printDiagnosticMessage;
 import '../base/common.dart';
-import '../fasta/kernel/macro.dart';
+import '../fasta/kernel/macro/macro.dart';
 import '../fasta/messages.dart' show FormattedMessage;
 import '../kernel_generator_impl.dart' show InternalCompilerResult;
 import 'compiler_common.dart' show compileScript, toTestUri;
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 731f92d..69ae9c6 100644
--- a/pkg/front_end/test/macros/application/macro_application_test.dart
+++ b/pkg/front_end/test/macros/application/macro_application_test.dart
@@ -16,7 +16,7 @@
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/fasta/builder/field_builder.dart';
 import 'package:front_end/src/fasta/builder/member_builder.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/fasta/source/source_class_builder.dart';
 import 'package:front_end/src/fasta/source/source_library_builder.dart';
 import 'package:front_end/src/macro_serializer.dart';
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 175c4f3..27aa722 100644
--- a/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
+++ b/pkg/front_end/test/macros/declaration/macro_declaration_test.dart
@@ -15,7 +15,7 @@
 import 'package:front_end/src/fasta/builder/class_builder.dart';
 import 'package:front_end/src/fasta/builder/library_builder.dart';
 import 'package:front_end/src/fasta/builder/member_builder.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
 import 'package:front_end/src/testing/id_testing_utils.dart';
 import 'package:kernel/ast.dart' hide Arguments;
diff --git a/pkg/front_end/test/macros/incremental/incremental_macro_test.dart b/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
index 2213b4c..6e38046 100644
--- a/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
+++ b/pkg/front_end/test/macros/incremental/incremental_macro_test.dart
@@ -16,7 +16,7 @@
 import 'package:front_end/src/fasta/compiler_context.dart';
 import 'package:front_end/src/fasta/hybrid_file_system.dart';
 import 'package:front_end/src/fasta/incremental_compiler.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/isolate_macro_serializer.dart';
 import 'package:front_end/src/macro_serializer.dart';
 import 'package:front_end/src/testing/compiler_common.dart';
diff --git a/pkg/front_end/test/macros/macro_api_test.dart b/pkg/front_end/test/macros/macro_api_test.dart
index 768d1d1..1392e5f 100644
--- a/pkg/front_end/test/macros/macro_api_test.dart
+++ b/pkg/front_end/test/macros/macro_api_test.dart
@@ -11,7 +11,7 @@
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/api_prototype/front_end.dart';
 import 'package:front_end/src/compute_platform_binaries_location.dart';
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:front_end/src/isolate_macro_serializer.dart';
 import 'package:front_end/src/macro_serializer.dart';
 import 'package:front_end/src/testing/id_testing_helper.dart';
diff --git a/pkg/frontend_server/lib/compute_kernel.dart b/pkg/frontend_server/lib/compute_kernel.dart
index f16b938..3754d31 100644
--- a/pkg/frontend_server/lib/compute_kernel.dart
+++ b/pkg/frontend_server/lib/compute_kernel.dart
@@ -24,7 +24,7 @@
 import 'package:front_end/src/api_prototype/incremental_kernel_generator.dart';
 import 'package:front_end/src/api_prototype/experimental_flags.dart';
 import 'package:front_end/src/api_unstable/bazel_worker.dart' as fe;
-import 'package:front_end/src/fasta/kernel/macro.dart';
+import 'package:front_end/src/fasta/kernel/macro/macro.dart';
 import 'package:kernel/ast.dart' show Component, Library, Reference;
 import 'package:kernel/target/targets.dart';
 import 'package:vm/target/flutter.dart';