Version 2.17.0-170.0.dev

Merge commit 'bd8ed80309714c00e306a270844e912d81cfe19b' into 'dev'
diff --git a/DEPS b/DEPS
index 276e2bd..f9788c5 100644
--- a/DEPS
+++ b/DEPS
@@ -142,7 +142,7 @@
   "process_rev": "56ece43b53b64c63ae51ec184b76bd5360c28d0b",
   "protobuf_rev": "c1eb6cb51af39ccbaa1a8e19349546586a5c8e31",
   "pub_rev": "8f5ab7b1aba3b9f66b56246d77e167990339d317",
-  "pub_semver_rev": "a43ad72fb6b7869607581b5fedcb186d1e74276a",
+  "pub_semver_rev": "ea6c54019948dc03042c595ce9413e17aaf7aa38",
   "root_certificates_rev": "692f6d6488af68e0121317a9c2c9eb393eb0ee50",
   "rust_revision": "b7856f695d65a8ebc846754f97d15814bcb1c244",
   "shelf_static_rev": "202ec1a53c9a830c17cf3b718d089cf7eba568ad",
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
index 36b560b..03669ef 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/api/builders.dart
@@ -8,9 +8,23 @@
 /// as augment existing ones.
 abstract class Builder {}
 
+/// Allows you to resolve arbitrary [Identifier]s.
+///
+/// This class will likely disappear entirely once we have a different
+/// mechanism.
+abstract class IdentifierResolver {
+  /// Returns an [Identifier] for a top level [name] in [library].
+  ///
+  /// You should only do this for libraries that are definitely in the
+  /// transitive import graph of the library you are generating code into.
+  @Deprecated(
+      'This api should eventually be replaced with a different, safer API.')
+  Future<Identifier> resolveIdentifier(Uri library, String name);
+}
+
 /// The api used by [Macro]s to contribute new type declarations to the
 /// current library, and get [TypeAnnotation]s from runtime [Type] objects.
-abstract class TypeBuilder implements Builder {
+abstract class TypeBuilder implements Builder, IdentifierResolver {
   /// Adds a new type declaration to the surrounding library.
   ///
   /// The [name] must match the name of the new [typeDeclaration] (this does
@@ -75,7 +89,7 @@
 ///
 /// Can also be used to do subtype checks on types.
 abstract class DeclarationBuilder
-    implements Builder, TypeResolver, ClassIntrospector {
+    implements Builder, IdentifierResolver, TypeResolver, ClassIntrospector {
   /// Adds a new regular declaration to the surrounding library.
   ///
   /// Note that type declarations are not supported.
@@ -106,6 +120,7 @@
 abstract class DefinitionBuilder
     implements
         Builder,
+        IdentifierResolver,
         TypeResolver,
         ClassIntrospector,
         TypeDeclarationResolver {}
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart b/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
index ed29787..a645eae 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/bootstrap.dart
@@ -202,8 +202,13 @@
       throw new StateError('Unrecognized macro instance \${request.macro}\\n'
           'Known instances: \$_macroInstances)');
     }
+    var identifierResolver = ClientIdentifierResolver(
+        sendRequest,
+        remoteInstance: request.identifierResolver,
+        serializationZoneId: request.serializationZoneId);
 
-    var result = await executeTypesMacro(instance, request.declaration);
+    var result = await executeTypesMacro(
+        instance, request.declaration, identifierResolver);
     return new SerializableResponse(
         responseType: MessageType.macroExecutionResult,
         response: result,
@@ -228,6 +233,10 @@
       throw new StateError('Unrecognized macro instance \${request.macro}\\n'
           'Known instances: \$_macroInstances)');
     }
+    var identifierResolver = ClientIdentifierResolver(
+        sendRequest,
+        remoteInstance: request.identifierResolver,
+        serializationZoneId: request.serializationZoneId);
     var classIntrospector = ClientClassIntrospector(
         sendRequest,
         remoteInstance: request.classIntrospector,
@@ -238,7 +247,8 @@
         serializationZoneId: request.serializationZoneId);
 
     var result = await executeDeclarationsMacro(
-        instance, request.declaration, classIntrospector, typeResolver);
+        instance, request.declaration, identifierResolver, classIntrospector,
+        typeResolver);
     return new SerializableResponse(
         responseType: MessageType.macroExecutionResult,
         response: result,
@@ -263,6 +273,10 @@
       throw new StateError('Unrecognized macro instance \${request.macro}\\n'
           'Known instances: \$_macroInstances)');
     }
+    var identifierResolver = ClientIdentifierResolver(
+        sendRequest,
+        remoteInstance: request.identifierResolver,
+        serializationZoneId: request.serializationZoneId);
     var typeResolver = ClientTypeResolver(
         sendRequest,
         remoteInstance: request.typeResolver,
@@ -277,8 +291,8 @@
         serializationZoneId: request.serializationZoneId);
 
     var result = await executeDefinitionMacro(
-        instance, request.declaration, classIntrospector, typeResolver,
-        typeDeclarationResolver);
+        instance, request.declaration, identifierResolver, classIntrospector,
+        typeResolver, typeDeclarationResolver);
     return new SerializableResponse(
         responseType: MessageType.macroExecutionResult,
         response: result,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
index 8fde94e..c80c9a5 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor.dart
@@ -44,8 +44,8 @@
   /// Runs the type phase for [macro] on a given [declaration].
   ///
   /// Throws an exception if there is an error executing the macro.
-  Future<MacroExecutionResult> executeTypesPhase(
-      MacroInstanceIdentifier macro, covariant Declaration declaration);
+  Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+      covariant Declaration declaration, IdentifierResolver identifierResolver);
 
   /// Runs the declarations phase for [macro] on a given [declaration].
   ///
@@ -53,6 +53,7 @@
   Future<MacroExecutionResult> executeDeclarationsPhase(
       MacroInstanceIdentifier macro,
       covariant Declaration declaration,
+      IdentifierResolver identifierResolver,
       TypeResolver typeResolver,
       ClassIntrospector classIntrospector);
 
@@ -62,6 +63,7 @@
   Future<MacroExecutionResult> executeDefinitionsPhase(
       MacroInstanceIdentifier macro,
       covariant Declaration declaration,
+      IdentifierResolver identifierResolver,
       TypeResolver typeResolver,
       ClassIntrospector classIntrospector,
       TypeDeclarationResolver typeDeclarationResolver);
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
index 5225d79..6f522e0 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/builder_impls.dart
@@ -10,7 +10,7 @@
 import '../api.dart';
 import 'response_impls.dart';
 
-class TypeBuilderBase {
+class TypeBuilderBase implements IdentifierResolver {
   /// The final result, will be built up over `augment` calls.
   final List<DeclarationCode> _libraryAugmentations;
 
@@ -20,6 +20,8 @@
   /// The names of any new types added in [_libraryAugmentations].
   final List<String> _newTypeNames = [];
 
+  final IdentifierResolver identifierResolver;
+
   /// Creates and returns a [MacroExecutionResult] out of the [_augmentations]
   /// created by this builder.
   MacroExecutionResult get result => new MacroExecutionResultImpl(
@@ -28,14 +30,22 @@
         newTypeNames: _newTypeNames,
       );
 
-  TypeBuilderBase(
+  TypeBuilderBase(this.identifierResolver,
       {Map<String, List<DeclarationCode>>? parentClassAugmentations,
       List<DeclarationCode>? parentLibraryAugmentations})
       : _classAugmentations = parentClassAugmentations ?? {},
         _libraryAugmentations = parentLibraryAugmentations ?? [];
+
+  @override
+  Future<Identifier> resolveIdentifier(Uri library, String identifier) =>
+      // ignore: deprecated_member_use_from_same_package
+      identifierResolver.resolveIdentifier(library, identifier);
 }
 
 class TypeBuilderImpl extends TypeBuilderBase implements TypeBuilder {
+  TypeBuilderImpl(IdentifierResolver identifierResolver)
+      : super(identifierResolver);
+
   @override
   void declareType(String name, DeclarationCode typeDeclaration) {
     _newTypeNames.add(name);
@@ -49,10 +59,11 @@
   final ClassIntrospector classIntrospector;
   final TypeResolver typeResolver;
 
-  DeclarationBuilderBase(this.classIntrospector, this.typeResolver,
+  DeclarationBuilderBase(IdentifierResolver identifierResolver,
+      this.classIntrospector, this.typeResolver,
       {Map<String, List<DeclarationCode>>? parentClassAugmentations,
       List<DeclarationCode>? parentLibraryAugmentations})
-      : super(
+      : super(identifierResolver,
             parentClassAugmentations: parentClassAugmentations,
             parentLibraryAugmentations: parentLibraryAugmentations);
 
@@ -87,9 +98,9 @@
 
 class DeclarationBuilderImpl extends DeclarationBuilderBase
     implements DeclarationBuilder {
-  DeclarationBuilderImpl(
+  DeclarationBuilderImpl(IdentifierResolver identifierResolver,
       ClassIntrospector classIntrospector, TypeResolver typeResolver)
-      : super(classIntrospector, typeResolver);
+      : super(identifierResolver, classIntrospector, typeResolver);
 
   @override
   void declareInLibrary(DeclarationCode declaration) {
@@ -101,9 +112,12 @@
     implements ClassMemberDeclarationBuilder {
   final Identifier definingClass;
 
-  ClassMemberDeclarationBuilderImpl(this.definingClass,
-      ClassIntrospector classIntrospector, TypeResolver typeResolver)
-      : super(classIntrospector, typeResolver);
+  ClassMemberDeclarationBuilderImpl(
+      this.definingClass,
+      IdentifierResolver identifierResolver,
+      ClassIntrospector classIntrospector,
+      TypeResolver typeResolver)
+      : super(identifierResolver, classIntrospector, typeResolver);
 
   @override
   void declareInClass(DeclarationCode declaration) {
@@ -118,11 +132,14 @@
     implements TypeDeclarationResolver {
   final TypeDeclarationResolver typeDeclarationResolver;
 
-  DefinitionBuilderBase(ClassIntrospector classIntrospector,
-      TypeResolver typeResolver, this.typeDeclarationResolver,
+  DefinitionBuilderBase(
+      IdentifierResolver identifierResolver,
+      ClassIntrospector classIntrospector,
+      TypeResolver typeResolver,
+      this.typeDeclarationResolver,
       {Map<String, List<DeclarationCode>>? parentClassAugmentations,
       List<DeclarationCode>? parentLibraryAugmentations})
-      : super(classIntrospector, typeResolver,
+      : super(identifierResolver, classIntrospector, typeResolver,
             parentClassAugmentations: parentClassAugmentations,
             parentLibraryAugmentations: parentLibraryAugmentations);
 
@@ -138,12 +155,14 @@
 
   ClassDefinitionBuilderImpl(
       this.declaration,
+      IdentifierResolver identifierResolver,
       ClassIntrospector classIntrospector,
       TypeResolver typeResolver,
       TypeDeclarationResolver typeDeclarationResolver,
       {Map<String, List<DeclarationCode>>? parentClassAugmentations,
       List<DeclarationCode>? parentLibraryAugmentations})
-      : super(classIntrospector, typeResolver, typeDeclarationResolver,
+      : super(identifierResolver, classIntrospector, typeResolver,
+            typeDeclarationResolver,
             parentClassAugmentations: parentClassAugmentations,
             parentLibraryAugmentations: parentLibraryAugmentations);
 
@@ -153,8 +172,8 @@
     ConstructorDeclaration constructor =
         (await classIntrospector.constructorsOf(declaration))
             .firstWhere((constructor) => constructor.identifier == identifier);
-    return new ConstructorDefinitionBuilderImpl(
-        constructor, classIntrospector, typeResolver, typeDeclarationResolver,
+    return new ConstructorDefinitionBuilderImpl(constructor, identifierResolver,
+        classIntrospector, typeResolver, typeDeclarationResolver,
         parentClassAugmentations: _classAugmentations,
         parentLibraryAugmentations: _libraryAugmentations);
   }
@@ -163,8 +182,8 @@
   Future<VariableDefinitionBuilder> buildField(Identifier identifier) async {
     FieldDeclaration field = (await classIntrospector.fieldsOf(declaration))
         .firstWhere((field) => field.identifier == identifier);
-    return new VariableDefinitionBuilderImpl(
-        field, classIntrospector, typeResolver, typeDeclarationResolver,
+    return new VariableDefinitionBuilderImpl(field, identifierResolver,
+        classIntrospector, typeResolver, typeDeclarationResolver,
         parentClassAugmentations: _classAugmentations,
         parentLibraryAugmentations: _libraryAugmentations);
   }
@@ -173,8 +192,8 @@
   Future<FunctionDefinitionBuilder> buildMethod(Identifier identifier) async {
     MethodDeclaration method = (await classIntrospector.methodsOf(declaration))
         .firstWhere((method) => method.identifier == identifier);
-    return new FunctionDefinitionBuilderImpl(
-        method, classIntrospector, typeResolver, typeDeclarationResolver,
+    return new FunctionDefinitionBuilderImpl(method, identifierResolver,
+        classIntrospector, typeResolver, typeDeclarationResolver,
         parentClassAugmentations: _classAugmentations,
         parentLibraryAugmentations: _libraryAugmentations);
   }
@@ -187,12 +206,14 @@
 
   FunctionDefinitionBuilderImpl(
       this.declaration,
+      IdentifierResolver identifierResolver,
       ClassIntrospector classIntrospector,
       TypeResolver typeResolver,
       TypeDeclarationResolver typeDeclarationResolver,
       {Map<String, List<DeclarationCode>>? parentClassAugmentations,
       List<DeclarationCode>? parentLibraryAugmentations})
-      : super(classIntrospector, typeResolver, typeDeclarationResolver,
+      : super(identifierResolver, classIntrospector, typeResolver,
+            typeDeclarationResolver,
             parentClassAugmentations: parentClassAugmentations,
             parentLibraryAugmentations: parentLibraryAugmentations);
 
@@ -217,12 +238,14 @@
 
   ConstructorDefinitionBuilderImpl(
       this.declaration,
+      IdentifierResolver identifierResolver,
       ClassIntrospector classIntrospector,
       TypeResolver typeResolver,
       TypeDeclarationResolver typeDeclarationResolver,
       {Map<String, List<DeclarationCode>>? parentClassAugmentations,
       List<DeclarationCode>? parentLibraryAugmentations})
-      : super(classIntrospector, typeResolver, typeDeclarationResolver,
+      : super(identifierResolver, classIntrospector, typeResolver,
+            typeDeclarationResolver,
             parentClassAugmentations: parentClassAugmentations,
             parentLibraryAugmentations: parentLibraryAugmentations);
 
@@ -245,12 +268,14 @@
 
   VariableDefinitionBuilderImpl(
       this.declaration,
+      IdentifierResolver identifierResolver,
       ClassIntrospector classIntrospector,
       TypeResolver typeResolver,
       TypeDeclarationResolver typeDeclarationResolver,
       {Map<String, List<DeclarationCode>>? parentClassAugmentations,
       List<DeclarationCode>? parentLibraryAugmentations})
-      : super(classIntrospector, typeResolver, typeDeclarationResolver,
+      : super(identifierResolver, classIntrospector, typeResolver,
+            typeDeclarationResolver,
             parentClassAugmentations: parentClassAugmentations,
             parentLibraryAugmentations: parentLibraryAugmentations);
 
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart
index 13ec76e..af3224f 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/execute_macro.dart
@@ -7,9 +7,9 @@
 import 'package:_fe_analyzer_shared/src/macros/api.dart';
 
 /// Runs [macro] in the types phase and returns a  [MacroExecutionResult].
-Future<MacroExecutionResult> executeTypesMacro(
-    Macro macro, Declaration declaration) async {
-  TypeBuilderImpl builder = new TypeBuilderImpl();
+Future<MacroExecutionResult> executeTypesMacro(Macro macro,
+    Declaration declaration, IdentifierResolver identifierResolver) async {
+  TypeBuilderImpl builder = new TypeBuilderImpl(identifierResolver);
   if (declaration is FunctionDeclaration) {
     if (macro is ConstructorTypesMacro &&
         declaration is ConstructorDeclaration) {
@@ -42,18 +42,19 @@
 Future<MacroExecutionResult> executeDeclarationsMacro(
     Macro macro,
     Declaration declaration,
+    IdentifierResolver identifierResolver,
     ClassIntrospector classIntrospector,
     TypeResolver typeResolver) async {
   if (declaration is ClassDeclaration && macro is ClassDeclarationsMacro) {
     ClassMemberDeclarationBuilderImpl builder =
-        new ClassMemberDeclarationBuilderImpl(
-            declaration.identifier, classIntrospector, typeResolver);
+        new ClassMemberDeclarationBuilderImpl(declaration.identifier,
+            identifierResolver, classIntrospector, typeResolver);
     await macro.buildDeclarationsForClass(declaration, builder);
     return builder.result;
   } else if (declaration is ClassMemberDeclaration) {
     ClassMemberDeclarationBuilderImpl builder =
-        new ClassMemberDeclarationBuilderImpl(
-            declaration.definingClass, classIntrospector, typeResolver);
+        new ClassMemberDeclarationBuilderImpl(declaration.definingClass,
+            identifierResolver, classIntrospector, typeResolver);
     if (declaration is FunctionDeclaration) {
       if (macro is ConstructorDeclarationsMacro &&
           declaration is ConstructorDeclaration) {
@@ -73,16 +74,16 @@
         await macro.buildDeclarationsForField(declaration, builder);
         return builder.result;
       } else if (macro is VariableDeclarationsMacro) {
-        DeclarationBuilderImpl builder =
-            new DeclarationBuilderImpl(classIntrospector, typeResolver);
+        DeclarationBuilderImpl builder = new DeclarationBuilderImpl(
+            identifierResolver, classIntrospector, typeResolver);
         await macro.buildDeclarationsForVariable(
             declaration as VariableDeclaration, builder);
         return builder.result;
       }
     }
   } else {
-    DeclarationBuilderImpl builder =
-        new DeclarationBuilderImpl(classIntrospector, typeResolver);
+    DeclarationBuilderImpl builder = new DeclarationBuilderImpl(
+        identifierResolver, classIntrospector, typeResolver);
     if (declaration is FunctionDeclaration &&
         macro is FunctionDeclarationsMacro) {
       await macro.buildDeclarationsForFunction(declaration, builder);
@@ -101,6 +102,7 @@
 Future<MacroExecutionResult> executeDefinitionMacro(
     Macro macro,
     Declaration declaration,
+    IdentifierResolver identifierResolver,
     ClassIntrospector classIntrospector,
     TypeResolver typeResolver,
     TypeDeclarationResolver typeDeclarationResolver) async {
@@ -108,13 +110,14 @@
     if (macro is ConstructorDefinitionMacro &&
         declaration is ConstructorDeclaration) {
       ConstructorDefinitionBuilderImpl builder =
-          new ConstructorDefinitionBuilderImpl(declaration, classIntrospector,
-              typeResolver, typeDeclarationResolver);
+          new ConstructorDefinitionBuilderImpl(declaration, identifierResolver,
+              classIntrospector, typeResolver, typeDeclarationResolver);
       await macro.buildDefinitionForConstructor(declaration, builder);
       return builder.result;
     } else {
       FunctionDefinitionBuilderImpl builder = new FunctionDefinitionBuilderImpl(
           declaration,
+          identifierResolver,
           classIntrospector,
           typeResolver,
           typeDeclarationResolver);
@@ -128,7 +131,11 @@
     }
   } else if (declaration is VariableDeclaration) {
     VariableDefinitionBuilderImpl builder = new VariableDefinitionBuilderImpl(
-        declaration, classIntrospector, typeResolver, typeDeclarationResolver);
+        declaration,
+        identifierResolver,
+        classIntrospector,
+        typeResolver,
+        typeDeclarationResolver);
     if (macro is FieldDefinitionMacro && declaration is FieldDeclaration) {
       await macro.buildDefinitionForField(declaration, builder);
       return builder.result;
@@ -138,7 +145,11 @@
     }
   } else if (macro is ClassDefinitionMacro && declaration is ClassDeclaration) {
     ClassDefinitionBuilderImpl builder = new ClassDefinitionBuilderImpl(
-        declaration, classIntrospector, typeResolver, typeDeclarationResolver);
+        declaration,
+        identifierResolver,
+        classIntrospector,
+        typeResolver,
+        typeDeclarationResolver);
     await macro.buildDefinitionForClass(declaration, builder);
     return builder.result;
   }
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart
index 018b47a..940fa5a 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/executor_base.dart
@@ -64,6 +64,34 @@
               }
               completer.complete(response);
               break;
+            case MessageType.resolveIdentifierRequest:
+              ResolveIdentifierRequest request =
+                  new ResolveIdentifierRequest.deserialize(
+                      deserializer, zoneId);
+              SerializableResponse response;
+              try {
+                IdentifierImpl identifier = await (request
+                            .identifierResolver.instance as IdentifierResolver)
+                        // ignore: deprecated_member_use_from_same_package
+                        .resolveIdentifier(request.library, request.name)
+                    as IdentifierImpl;
+                response = new SerializableResponse(
+                    response: identifier,
+                    requestId: request.id,
+                    responseType: MessageType.remoteInstance,
+                    serializationZoneId: zoneId);
+              } catch (error, stackTrace) {
+                response = new SerializableResponse(
+                    error: '$error',
+                    stackTrace: '$stackTrace',
+                    requestId: request.id,
+                    responseType: MessageType.error,
+                    serializationZoneId: zoneId);
+              }
+              Serializer serializer = serializerFactory();
+              response.serialize(serializer);
+              sendResult(serializer);
+              break;
             case MessageType.resolveTypeRequest:
               ResolveTypeRequest request =
                   new ResolveTypeRequest.deserialize(deserializer, zoneId);
@@ -258,12 +286,17 @@
   Future<MacroExecutionResult> executeDeclarationsPhase(
           MacroInstanceIdentifier macro,
           DeclarationImpl declaration,
+          IdentifierResolver identifierResolver,
           TypeResolver typeResolver,
           ClassIntrospector classIntrospector) =>
       _sendRequest((zoneId) => new ExecuteDeclarationsPhaseRequest(
           macro,
           declaration,
           new RemoteInstanceImpl(
+              instance: identifierResolver,
+              id: RemoteInstance.uniqueId,
+              kind: RemoteInstanceKind.identifierResolver),
+          new RemoteInstanceImpl(
               instance: typeResolver,
               id: RemoteInstance.uniqueId,
               kind: RemoteInstanceKind.typeResolver),
@@ -277,6 +310,7 @@
   Future<MacroExecutionResult> executeDefinitionsPhase(
           MacroInstanceIdentifier macro,
           DeclarationImpl declaration,
+          IdentifierResolver identifierResolver,
           TypeResolver typeResolver,
           ClassIntrospector classIntrospector,
           TypeDeclarationResolver typeDeclarationResolver) =>
@@ -284,6 +318,10 @@
           macro,
           declaration,
           new RemoteInstanceImpl(
+              instance: identifierResolver,
+              id: RemoteInstance.uniqueId,
+              kind: RemoteInstanceKind.identifierResolver),
+          new RemoteInstanceImpl(
               instance: typeResolver,
               id: RemoteInstance.uniqueId,
               kind: RemoteInstanceKind.typeResolver),
@@ -298,9 +336,15 @@
           serializationZoneId: zoneId));
 
   @override
-  Future<MacroExecutionResult> executeTypesPhase(
-          MacroInstanceIdentifier macro, DeclarationImpl declaration) =>
-      _sendRequest((zoneId) => new ExecuteTypesPhaseRequest(macro, declaration,
+  Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+          DeclarationImpl declaration, IdentifierResolver identifierResolver) =>
+      _sendRequest((zoneId) => new ExecuteTypesPhaseRequest(
+          macro,
+          declaration,
+          new RemoteInstanceImpl(
+              instance: identifierResolver,
+              id: RemoteInstance.uniqueId,
+              kind: RemoteInstanceKind.identifierResolver),
           serializationZoneId: zoneId));
 
   @override
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart
index 81b8107..aa7c907 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/multi_executor.dart
@@ -36,25 +36,33 @@
   Future<MacroExecutionResult> executeDeclarationsPhase(
           MacroInstanceIdentifier macro,
           DeclarationImpl declaration,
+          IdentifierResolver identifierResolver,
           TypeResolver typeResolver,
           ClassIntrospector classIntrospector) =>
-      _executors[macro]!.executeDeclarationsPhase(
-          macro, declaration, typeResolver, classIntrospector);
+      _executors[macro]!.executeDeclarationsPhase(macro, declaration,
+          identifierResolver, typeResolver, classIntrospector);
 
   @override
   Future<MacroExecutionResult> executeDefinitionsPhase(
           MacroInstanceIdentifier macro,
           DeclarationImpl declaration,
+          IdentifierResolver identifierResolver,
           TypeResolver typeResolver,
           ClassIntrospector classIntrospector,
           TypeDeclarationResolver typeDeclarationResolver) =>
-      _executors[macro]!.executeDefinitionsPhase(macro, declaration,
-          typeResolver, classIntrospector, typeDeclarationResolver);
+      _executors[macro]!.executeDefinitionsPhase(
+          macro,
+          declaration,
+          identifierResolver,
+          typeResolver,
+          classIntrospector,
+          typeDeclarationResolver);
 
   @override
-  Future<MacroExecutionResult> executeTypesPhase(
-          MacroInstanceIdentifier macro, DeclarationImpl declaration) =>
-      _executors[macro]!.executeTypesPhase(macro, declaration);
+  Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+          DeclarationImpl declaration, IdentifierResolver identifierResolver) =>
+      _executors[macro]!
+          .executeTypesPhase(macro, declaration, identifierResolver);
 
   @override
   Future<MacroInstanceIdentifier> instantiateMacro(
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
index fa6d608..73d051c6 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/protocol.dart
@@ -248,8 +248,10 @@
 class ExecuteTypesPhaseRequest extends Request {
   final MacroInstanceIdentifier macro;
   final DeclarationImpl declaration;
+  final RemoteInstanceImpl identifierResolver;
 
-  ExecuteTypesPhaseRequest(this.macro, this.declaration,
+  ExecuteTypesPhaseRequest(
+      this.macro, this.declaration, this.identifierResolver,
       {required int serializationZoneId})
       : super(serializationZoneId: serializationZoneId);
 
@@ -259,12 +261,14 @@
       Deserializer deserializer, int serializationZoneId)
       : macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
         declaration = RemoteInstance.deserialize(deserializer),
+        identifierResolver = RemoteInstance.deserialize(deserializer),
         super.deserialize(deserializer, serializationZoneId);
 
   void serialize(Serializer serializer) {
     serializer.addInt(MessageType.executeTypesPhaseRequest.index);
     macro.serialize(serializer);
     declaration.serialize(serializer);
+    identifierResolver.serialize(serializer);
 
     super.serialize(serializer);
   }
@@ -276,11 +280,12 @@
   final MacroInstanceIdentifier macro;
   final DeclarationImpl declaration;
 
+  final RemoteInstanceImpl identifierResolver;
   final RemoteInstanceImpl typeResolver;
   final RemoteInstanceImpl classIntrospector;
 
-  ExecuteDeclarationsPhaseRequest(
-      this.macro, this.declaration, this.typeResolver, this.classIntrospector,
+  ExecuteDeclarationsPhaseRequest(this.macro, this.declaration,
+      this.identifierResolver, this.typeResolver, this.classIntrospector,
       {required int serializationZoneId})
       : super(serializationZoneId: serializationZoneId);
 
@@ -290,6 +295,7 @@
       Deserializer deserializer, int serializationZoneId)
       : macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
         declaration = RemoteInstance.deserialize(deserializer),
+        identifierResolver = RemoteInstance.deserialize(deserializer),
         typeResolver = RemoteInstance.deserialize(deserializer),
         classIntrospector = RemoteInstance.deserialize(deserializer),
         super.deserialize(deserializer, serializationZoneId);
@@ -298,6 +304,7 @@
     serializer.addInt(MessageType.executeDeclarationsPhaseRequest.index);
     macro.serialize(serializer);
     declaration.serialize(serializer);
+    identifierResolver.serialize(serializer);
     typeResolver.serialize(serializer);
     classIntrospector.serialize(serializer);
 
@@ -311,12 +318,18 @@
   final MacroInstanceIdentifier macro;
   final DeclarationImpl declaration;
 
+  final RemoteInstanceImpl identifierResolver;
   final RemoteInstanceImpl typeResolver;
   final RemoteInstanceImpl classIntrospector;
   final RemoteInstanceImpl typeDeclarationResolver;
 
-  ExecuteDefinitionsPhaseRequest(this.macro, this.declaration,
-      this.typeResolver, this.classIntrospector, this.typeDeclarationResolver,
+  ExecuteDefinitionsPhaseRequest(
+      this.macro,
+      this.declaration,
+      this.identifierResolver,
+      this.typeResolver,
+      this.classIntrospector,
+      this.typeDeclarationResolver,
       {required int serializationZoneId})
       : super(serializationZoneId: serializationZoneId);
 
@@ -326,6 +339,7 @@
       Deserializer deserializer, int serializationZoneId)
       : macro = new MacroInstanceIdentifierImpl.deserialize(deserializer),
         declaration = RemoteInstance.deserialize(deserializer),
+        identifierResolver = RemoteInstance.deserialize(deserializer),
         typeResolver = RemoteInstance.deserialize(deserializer),
         classIntrospector = RemoteInstance.deserialize(deserializer),
         typeDeclarationResolver = RemoteInstance.deserialize(deserializer),
@@ -335,6 +349,7 @@
     serializer.addInt(MessageType.executeDefinitionsPhaseRequest.index);
     macro.serialize(serializer);
     declaration.serialize(serializer);
+    identifierResolver.serialize(serializer);
     typeResolver.serialize(serializer);
     classIntrospector.serialize(serializer);
     typeDeclarationResolver.serialize(serializer);
@@ -343,6 +358,37 @@
   }
 }
 
+/// A request to create a resolved identifier.
+class ResolveIdentifierRequest extends Request {
+  final Uri library;
+  final String name;
+
+  final RemoteInstanceImpl identifierResolver;
+
+  /// When deserializing we have already consumed the message type, so we don't
+  /// consume it again.
+  ResolveIdentifierRequest(this.library, this.name, this.identifierResolver,
+      {required int serializationZoneId})
+      : super(serializationZoneId: serializationZoneId);
+
+  ResolveIdentifierRequest.deserialize(
+      Deserializer deserializer, int serializationZoneId)
+      : library = Uri.parse((deserializer..moveNext()).expectString()),
+        name = (deserializer..moveNext()).expectString(),
+        identifierResolver = RemoteInstance.deserialize(deserializer),
+        super.deserialize(deserializer, serializationZoneId);
+
+  void serialize(Serializer serializer) {
+    serializer
+      ..addInt(MessageType.resolveIdentifierRequest.index)
+      ..addString(library.toString())
+      ..addString(name);
+    identifierResolver.serialize(serializer);
+
+    super.serialize(serializer);
+  }
+}
+
 /// A request to resolve on a type annotation code object
 class ResolveTypeRequest extends Request {
   final TypeAnnotationCode typeAnnotationCode;
@@ -473,6 +519,32 @@
   }
 }
 
+/// Client side implementation of an [IdentifierResolver], which creates a
+/// [ResolveIdentifierRequest] and passes it to a given [sendRequest] function
+/// which can return the [Response].
+class ClientIdentifierResolver implements IdentifierResolver {
+  /// The actual remote instance of this type resolver.
+  final RemoteInstanceImpl remoteInstance;
+
+  /// The ID of the zone in which to find the original type resolver.
+  final int serializationZoneId;
+
+  /// A function that can send a request and return a response using an
+  /// arbitrary communication channel.
+  final Future<Response> Function(Request request) _sendRequest;
+
+  ClientIdentifierResolver(this._sendRequest,
+      {required this.remoteInstance, required this.serializationZoneId});
+
+  @override
+  Future<Identifier> resolveIdentifier(Uri library, String name) async {
+    ResolveIdentifierRequest request = new ResolveIdentifierRequest(
+        library, name, remoteInstance,
+        serializationZoneId: serializationZoneId);
+    return _handleResponse(await _sendRequest(request));
+  }
+}
+
 /// Client side implementation of a [TypeResolver], which creates a
 /// [ResolveTypeRequest] and passes it to a given [sendRequest] function which
 /// can return the [Response].
@@ -699,6 +771,7 @@
   executeDefinitionsPhaseRequest,
   executeTypesPhaseRequest,
   instantiateMacroRequest,
+  resolveIdentifierRequest,
   resolveTypeRequest,
   isExactlyTypeRequest,
   isSubtypeOfRequest,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart
index 3940b7e..fc45704 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/remote_instance.dart
@@ -96,6 +96,7 @@
   functionDeclaration,
   functionTypeAnnotation,
   identifier,
+  identifierResolver,
   namedStaticType,
   methodDeclaration,
   namedTypeAnnotation,
diff --git a/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart b/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart
index cf3ff21..d039f7d 100644
--- a/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/macros/executor/serialization_extensions.dart
@@ -17,6 +17,7 @@
     RemoteInstanceKind kind = RemoteInstanceKind.values[expectInt()];
     switch (kind) {
       case RemoteInstanceKind.classIntrospector:
+      case RemoteInstanceKind.identifierResolver:
       case RemoteInstanceKind.namedStaticType:
       case RemoteInstanceKind.staticType:
       case RemoteInstanceKind.typeDeclarationResolver:
diff --git a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
index 779de84..a9ec81e 100644
--- a/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
+++ b/pkg/_fe_analyzer_shared/lib/src/messages/codes_generated.dart
@@ -1902,15 +1902,6 @@
 }
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const Code<Null> codeContinueLabelNotTarget = messageContinueLabelNotTarget;
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
-const MessageCode messageContinueLabelNotTarget = const MessageCode(
-    "ContinueLabelNotTarget",
-    analyzerCodes: <String>["LABEL_UNDEFINED"],
-    problemMessage: r"""Target of continue must be a label.""");
-
-// DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
 const Code<Null> codeContinueOutsideOfLoop = messageContinueOutsideOfLoop;
 
 // DO NOT EDIT. THIS FILE IS GENERATED. SEE TOP OF FILE.
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
index b0fca36..5a96c10 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_data.dart
@@ -6,6 +6,10 @@
 
 main() {}
 
+var field;
+get getter => null;
+set setter(_) => null;
+
 @ClassMacro()
 class Class1 {}
 
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
index 388a6cc..c826563 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_expectations.dart
@@ -44,6 +44,15 @@
   }
 }
 
+Future<void> throws(Future<void> Function() f, property) async {
+  try {
+    await f();
+  } catch (_) {
+    return;
+  }
+  throw 'Expected throws on $property';
+}
+
 void checkTypeAnnotation(
     TypeData expected, TypeAnnotation typeAnnotation, String context) {
   expect(expected.isNullable, typeAnnotation.isNullable, '$context.isNullable');
@@ -121,6 +130,37 @@
   }
 }
 
+Future<void> checkIdentifierResolver(
+    IdentifierResolver identifierResolver) async {
+  Uri dartCore = Uri.parse('dart:core');
+  Uri macroApiData = Uri.parse('package:macro_api_test/api_test_data.dart');
+
+  Future<void> check(Uri uri, String name, {bool expectThrows: false}) async {
+    if (expectThrows) {
+      await throws(() async {
+        await identifierResolver.resolveIdentifier(uri, name);
+      }, '$name from $uri');
+    } else {
+      Identifier result = await identifierResolver.resolveIdentifier(uri, name);
+      expect(name, result.name, '$name from $uri');
+    }
+  }
+
+  await check(dartCore, 'Object');
+  await check(dartCore, 'String');
+  await check(dartCore, 'override');
+
+  await check(macroApiData, 'Class1');
+  await check(macroApiData, 'getter');
+  await check(macroApiData, 'setter=');
+  await check(macroApiData, 'field');
+
+  await check(macroApiData, 'non-existing', expectThrows: true);
+  await check(macroApiData, 'getter=', expectThrows: true);
+  await check(macroApiData, 'setter', expectThrows: true);
+  await check(macroApiData, 'field=', expectThrows: true);
+}
+
 class ClassData {
   final bool isAbstract;
   final bool isExternal;
diff --git a/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart b/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
index de593f8..d54db3b 100644
--- a/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/api/api_test_macro.dart
@@ -36,17 +36,20 @@
   const FunctionMacro();
 
   FutureOr<void> buildTypesForFunction(
-      FunctionDeclaration function, TypeBuilder builder) {
+      FunctionDeclaration function, TypeBuilder builder) async {
     checkFunctionDeclaration(function);
+    await checkIdentifierResolver(builder);
   }
 
   FutureOr<void> buildDeclarationsForFunction(
-      FunctionDeclaration function, DeclarationBuilder builder) {
+      FunctionDeclaration function, DeclarationBuilder builder) async {
     checkFunctionDeclaration(function);
+    await checkIdentifierResolver(builder);
   }
 
   FutureOr<void> buildDefinitionForFunction(
-      FunctionDeclaration function, FunctionDefinitionBuilder builder) {
+      FunctionDeclaration function, FunctionDefinitionBuilder builder) async {
     checkFunctionDeclaration(function);
+    await checkIdentifierResolver(builder);
   }
 }
diff --git a/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart b/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart
index f4e5601..13b54ac 100644
--- a/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/executor/executor_test.dart
@@ -109,7 +109,7 @@
             group('in the types phase', () {
               test('on functions', () async {
                 var result = await executor.executeTypesPhase(
-                    instanceId, Fixtures.myFunction);
+                    instanceId, Fixtures.myFunction, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -118,7 +118,7 @@
 
               test('on methods', () async {
                 var result = await executor.executeTypesPhase(
-                    instanceId, Fixtures.myMethod);
+                    instanceId, Fixtures.myMethod, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -126,10 +126,8 @@
               });
 
               test('on getters', () async {
-                var result = await executor.executeTypesPhase(
-                  instanceId,
-                  Fixtures.myVariableGetter,
-                );
+                var result = await executor.executeTypesPhase(instanceId,
+                    Fixtures.myVariableGetter, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -138,10 +136,8 @@
               });
 
               test('on setters', () async {
-                var result = await executor.executeTypesPhase(
-                  instanceId,
-                  Fixtures.myVariableSetter,
-                );
+                var result = await executor.executeTypesPhase(instanceId,
+                    Fixtures.myVariableSetter, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -151,9 +147,7 @@
 
               test('on variables', () async {
                 var result = await executor.executeTypesPhase(
-                  instanceId,
-                  Fixtures.myVariable,
-                );
+                    instanceId, Fixtures.myVariable, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -162,8 +156,8 @@
               });
 
               test('on constructors', () async {
-                var result = await executor.executeTypesPhase(
-                    instanceId, Fixtures.myConstructor);
+                var result = await executor.executeTypesPhase(instanceId,
+                    Fixtures.myConstructor, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -173,7 +167,7 @@
 
               test('on fields', () async {
                 var result = await executor.executeTypesPhase(
-                    instanceId, Fixtures.myField);
+                    instanceId, Fixtures.myField, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -182,7 +176,7 @@
 
               test('on classes', () async {
                 var result = await executor.executeTypesPhase(
-                    instanceId, Fixtures.myClass);
+                    instanceId, Fixtures.myClass, FakeIdentifierResolver());
                 expect(result.classAugmentations, isEmpty);
                 expect(
                     result.libraryAugmentations.single.debugString().toString(),
@@ -196,6 +190,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myFunction,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, isEmpty);
@@ -209,6 +204,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myMethod,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, isEmpty);
@@ -222,6 +218,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myConstructor,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, hasLength(1));
@@ -239,6 +236,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myVariableGetter,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, isEmpty);
@@ -252,6 +250,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myVariableSetter,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, isEmpty);
@@ -265,6 +264,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myVariable,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, isEmpty);
@@ -278,6 +278,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myField,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, hasLength(1));
@@ -295,6 +296,7 @@
                 var result = await executor.executeDeclarationsPhase(
                     instanceId,
                     Fixtures.myClass,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector);
                 expect(result.classAugmentations, hasLength(1));
@@ -314,6 +316,7 @@
                 var result = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myFunction,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
@@ -335,6 +338,7 @@
                 var definitionResult = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myMethod,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
@@ -352,6 +356,7 @@
                 var definitionResult = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myConstructor,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
@@ -368,6 +373,7 @@
                 var result = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myVariableGetter,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
@@ -389,6 +395,7 @@
                 var result = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myVariableSetter,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
@@ -411,6 +418,7 @@
                 var result = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myVariable,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
@@ -441,6 +449,7 @@
                 var definitionResult = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myField,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
@@ -456,6 +465,7 @@
                 var definitionResult = await executor.executeDefinitionsPhase(
                     instanceId,
                     Fixtures.myClass,
+                    FakeIdentifierResolver(),
                     Fixtures.testTypeResolver,
                     Fixtures.testClassIntrospector,
                     Fixtures.testTypeDeclarationResolver);
diff --git a/pkg/_fe_analyzer_shared/test/macros/util.dart b/pkg/_fe_analyzer_shared/test/macros/util.dart
index 0907c70..edb0788 100644
--- a/pkg/_fe_analyzer_shared/test/macros/util.dart
+++ b/pkg/_fe_analyzer_shared/test/macros/util.dart
@@ -62,6 +62,8 @@
       superclass[clazz];
 }
 
+class FakeIdentifierResolver extends Fake implements IdentifierResolver {}
+
 class FakeTypeDeclarationResolver extends Fake
     implements TypeDeclarationResolver {}
 
diff --git a/pkg/dart2wasm/lib/target.dart b/pkg/dart2wasm/lib/target.dart
index a7827e1..fa68680 100644
--- a/pkg/dart2wasm/lib/target.dart
+++ b/pkg/dart2wasm/lib/target.dart
@@ -9,7 +9,7 @@
 import 'package:kernel/reference_from_index.dart';
 import 'package:kernel/target/changed_structure_notifier.dart';
 import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/mixin_full_resolution.dart'
+import 'package:vm/transformations/mixin_full_resolution.dart'
     as transformMixins show transformLibraries;
 
 import 'package:dart2wasm/constants_backend.dart';
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 6ac5cec..5d7f537 100644
--- a/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/body_builder.dart
@@ -6596,8 +6596,7 @@
       SwitchCase current = cases[i] = pop() as SwitchCase;
       if (labels != null) {
         for (Label label in labels) {
-          JumpTarget? target =
-              switchScope!.lookupLabel(label.name) as JumpTarget?;
+          JumpTarget? target = switchScope!.lookupLabel(label.name);
           if (target != null) {
             target.resolveGotos(forest, current);
           }
@@ -6656,7 +6655,7 @@
     if (hasTarget) {
       identifier = pop() as Identifier;
       name = identifier.name;
-      target = scope.lookupLabel(name) as JumpTarget?;
+      target = scope.lookupLabel(name);
     }
     if (target == null && name == null) {
       push(problemInLoopOrSwitch = buildProblemStatement(
@@ -6709,15 +6708,7 @@
     if (hasTarget) {
       identifier = pop() as Identifier;
       name = identifier.name;
-      Builder? namedTarget = scope.lookupLabel(identifier.name);
-      if (namedTarget != null && namedTarget is! JumpTarget) {
-        Token labelToken = continueKeyword.next!;
-        push(problemInLoopOrSwitch = buildProblemStatement(
-            fasta.messageContinueLabelNotTarget, labelToken.charOffset,
-            length: labelToken.length));
-        return;
-      }
-      target = namedTarget as JumpTarget?;
+      target = scope.lookupLabel(identifier.name);
       if (target == null) {
         if (switchScope == null) {
           push(buildProblemStatement(
@@ -7527,23 +7518,20 @@
   String toString() => "operator($name)";
 }
 
-class JumpTarget extends BuilderImpl {
+class JumpTarget {
   final List<Statement> users = <Statement>[];
 
   final JumpTargetKind kind;
 
   final int functionNestingLevel;
 
-  @override
   final MemberBuilder parent;
 
-  @override
   final int charOffset;
 
   JumpTarget(
       this.kind, this.functionNestingLevel, this.parent, this.charOffset);
 
-  @override
   Uri get fileUri => parent.fileUri!;
 
   bool get isBreakTarget => kind == JumpTargetKind.Break;
@@ -7603,11 +7591,10 @@
     users.clear();
   }
 
-  @override
   String get fullNameForErrors => "<jump-target>";
 }
 
-class LabelTarget extends BuilderImpl implements JumpTarget {
+class LabelTarget implements JumpTarget {
   @override
   final MemberBuilder parent;
 
diff --git a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
index 0cbb45a..f456a4d 100644
--- a/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/constructor_tearoff_lowering.dart
@@ -326,7 +326,7 @@
 Procedure _createTearOffProcedure(SourceLibraryBuilder libraryBuilder,
     Name name, Uri fileUri, int fileOffset, Reference? reference) {
   return new Procedure(name, ProcedureKind.Method, new FunctionNode(null),
-      fileUri: fileUri, isStatic: true, reference: reference)
+      fileUri: fileUri, isStatic: true, isSynthetic: true, reference: reference)
     ..startFileOffset = fileOffset
     ..fileOffset = fileOffset
     ..fileEndOffset = fileOffset
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 0c41ecf..342dd2c 100644
--- a/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/kernel_target.dart
@@ -496,7 +496,7 @@
       if (macroApplications != null) {
         benchmarker?.enterPhase(BenchmarkPhases.outline_applyTypeMacros);
         List<SourceLibraryBuilder> augmentationLibraries =
-            await macroApplications.applyTypeMacros();
+            await macroApplications.applyTypeMacros(loader);
         benchmarker
             ?.enterPhase(BenchmarkPhases.outline_buildMacroTypesForPhase1);
         await _buildForPhase1(augmentationLibraries);
diff --git a/pkg/front_end/lib/src/fasta/kernel/macro.dart b/pkg/front_end/lib/src/fasta/kernel/macro.dart
index 85449b2..0b2bb54 100644
--- a/pkg/front_end/lib/src/fasta/kernel/macro.dart
+++ b/pkg/front_end/lib/src/fasta/kernel/macro.dart
@@ -29,6 +29,7 @@
 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';
@@ -348,7 +349,9 @@
           .shouldExecute(_declarationKind(declaration), macro.Phase.types)) {
         macro.MacroExecutionResult result =
             await _macroExecutor.executeTypesPhase(
-                macroApplication.instanceIdentifier, declaration);
+                macroApplication.instanceIdentifier,
+                declaration,
+                identifierResolver);
         if (result.isNotEmpty) {
           results.add(result);
         }
@@ -366,7 +369,12 @@
     return results;
   }
 
-  Future<List<SourceLibraryBuilder>> applyTypeMacros() async {
+  late macro.IdentifierResolver identifierResolver;
+  late SourceLoader sourceLoader;
+
+  Future<List<SourceLibraryBuilder>> applyTypeMacros(
+      SourceLoader sourceLoader) async {
+    identifierResolver = new _IdentifierResolver(sourceLoader);
     List<SourceLibraryBuilder> augmentationLibraries = [];
     Map<SourceLibraryBuilder, List<macro.MacroExecutionResult>> results = {};
     for (_ApplicationData macroApplication in _applicationData) {
@@ -411,6 +419,7 @@
             await _macroExecutor.executeDeclarationsPhase(
                 macroApplication.instanceIdentifier,
                 declaration,
+                identifierResolver,
                 typeResolver,
                 classIntrospector);
         if (result.isNotEmpty) {
@@ -463,6 +472,7 @@
             await _macroExecutor.executeDefinitionsPhase(
                 macroApplication.instanceIdentifier,
                 declaration,
+                identifierResolver,
                 typeResolver,
                 classIntrospector,
                 typeDeclarationResolver);
@@ -914,6 +924,51 @@
   }
 }
 
+class _IdentifierResolver implements macro.IdentifierResolver {
+  final SourceLoader sourceLoader;
+
+  _IdentifierResolver(this.sourceLoader);
+
+  @override
+  Future<macro.Identifier> resolveIdentifier(Uri library, String name) {
+    LibraryBuilder? libraryBuilder = sourceLoader.lookupLibraryBuilder(library);
+    if (libraryBuilder == null) {
+      return new Future.error(
+          new ArgumentError('Library at uri $library could not be resolved.'),
+          StackTrace.current);
+    }
+    bool isSetter = false;
+    String memberName = name;
+    if (name.endsWith('=')) {
+      memberName = name.substring(0, name.length - 1);
+      isSetter = true;
+    }
+    Builder? builder =
+        libraryBuilder.scope.lookupLocalMember(memberName, setter: isSetter);
+    if (builder == null) {
+      return new Future.error(
+          new ArgumentError(
+              'Unable to find top level identifier "$name" in $library'),
+          StackTrace.current);
+    } else if (builder is TypeDeclarationBuilder) {
+      return new Future.value(new _IdentifierImpl.forTypeDeclarationBuilder(
+          typeDeclarationBuilder: builder,
+          libraryBuilder: libraryBuilder,
+          id: macro.RemoteInstance.uniqueId,
+          name: name));
+    } else if (builder is MemberBuilder) {
+      return new Future.value(new _IdentifierImpl.forMemberBuilder(
+          memberBuilder: builder,
+          id: macro.RemoteInstance.uniqueId,
+          name: name));
+    } else {
+      return new Future.error(
+          new UnsupportedError('Unsupported identifier kind $builder'),
+          StackTrace.current);
+    }
+  }
+}
+
 class _TypeResolver implements macro.TypeResolver {
   final MacroApplications macroApplications;
 
diff --git a/pkg/front_end/lib/src/fasta/scope.dart b/pkg/front_end/lib/src/fasta/scope.dart
index c431fd6..300080b 100644
--- a/pkg/front_end/lib/src/fasta/scope.dart
+++ b/pkg/front_end/lib/src/fasta/scope.dart
@@ -469,7 +469,7 @@
     return forwardDeclaredLabels;
   }
 
-  Builder? lookupLabel(String name) {
+  JumpTarget? lookupLabel(String name) {
     return labels?[name] ?? _parent?.lookupLabel(name);
   }
 
diff --git a/pkg/front_end/messages.yaml b/pkg/front_end/messages.yaml
index 1c92e8b..8f83875 100644
--- a/pkg/front_end/messages.yaml
+++ b/pkg/front_end/messages.yaml
@@ -1153,10 +1153,6 @@
       }
     }
 
-ContinueLabelNotTarget:
-  problemMessage: "Target of continue must be a label."
-  analyzerCode: LABEL_UNDEFINED
-
 ContinueWithoutLabelInCase:
   index: 64
   problemMessage: "A continue statement in a switch statement must have a label as a target."
diff --git a/pkg/front_end/test/macros/macro_test.dart b/pkg/front_end/test/macros/macro_test.dart
index 7ee8ddf..01f9653 100644
--- a/pkg/front_end/test/macros/macro_test.dart
+++ b/pkg/front_end/test/macros/macro_test.dart
@@ -308,6 +308,7 @@
   Future<MacroExecutionResult> executeDeclarationsPhase(
       MacroInstanceIdentifier macro,
       Declaration declaration,
+      IdentifierResolver identifierResolver,
       TypeResolver typeResolver,
       ClassIntrospector classIntrospector) async {
     return new _MacroExecutionResult();
@@ -317,6 +318,7 @@
   Future<MacroExecutionResult> executeDefinitionsPhase(
       MacroInstanceIdentifier macro,
       Declaration declaration,
+      IdentifierResolver identifierResolver,
       TypeResolver typeResolver,
       ClassIntrospector classIntrospector,
       TypeDeclarationResolver typeDeclarationResolver) async {
@@ -324,8 +326,8 @@
   }
 
   @override
-  Future<MacroExecutionResult> executeTypesPhase(
-      MacroInstanceIdentifier macro, Declaration declaration) async {
+  Future<MacroExecutionResult> executeTypesPhase(MacroInstanceIdentifier macro,
+      Declaration declaration, IdentifierResolver identifierResolver) async {
     return new _MacroExecutionResult();
   }
 
diff --git a/pkg/front_end/test/spell_checking_list_code.txt b/pkg/front_end/test/spell_checking_list_code.txt
index cc0957e..f1532f1 100644
--- a/pkg/front_end/test/spell_checking_list_code.txt
+++ b/pkg/front_end/test/spell_checking_list_code.txt
@@ -1100,6 +1100,7 @@
 rs
 runnable
 s
+safer
 sandboxed
 sanitizing
 saw
diff --git a/pkg/vm/lib/target/vm.dart b/pkg/vm/lib/target/vm.dart
index 79d5d64..16571c0 100644
--- a/pkg/vm/lib/target/vm.dart
+++ b/pkg/vm/lib/target/vm.dart
@@ -9,15 +9,15 @@
 import 'package:kernel/reference_from_index.dart';
 import 'package:kernel/target/changed_structure_notifier.dart';
 import 'package:kernel/target/targets.dart';
-import 'package:kernel/transformations/mixin_full_resolution.dart'
-    as transformMixins show transformLibraries;
-import 'package:kernel/transformations/continuation.dart' as transformAsync
-    show transformLibraries, transformProcedure;
 import 'package:kernel/type_environment.dart';
 
 import '../transformations/call_site_annotator.dart' as callSiteAnnotator;
+import '../transformations/continuation.dart' as transformAsync
+    show transformLibraries, transformProcedure;
 import '../transformations/lowering.dart' as lowering
     show transformLibraries, transformProcedure;
+import '../transformations/mixin_full_resolution.dart' as transformMixins
+    show transformLibraries;
 import '../transformations/ffi/common.dart' as ffiHelper
     show calculateTransitiveImportsOfDartFfiIfUsed;
 import '../transformations/ffi/definitions.dart' as transformFfiDefinitions
diff --git a/pkg/kernel/lib/transformations/async.dart b/pkg/vm/lib/transformations/async.dart
similarity index 99%
rename from pkg/kernel/lib/transformations/async.dart
rename to pkg/vm/lib/transformations/async.dart
index a9d5f6a..e117bc6 100644
--- a/pkg/kernel/lib/transformations/async.dart
+++ b/pkg/vm/lib/transformations/async.dart
@@ -2,10 +2,8 @@
 // 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.
 
-library kernel.transformations.async;
-
-import '../kernel.dart';
-import '../type_environment.dart';
+import 'package:kernel/kernel.dart';
+import 'package:kernel/type_environment.dart';
 import 'continuation.dart';
 
 /// A transformer that introduces temporary variables for all subexpressions
diff --git a/pkg/kernel/lib/transformations/continuation.dart b/pkg/vm/lib/transformations/continuation.dart
similarity index 99%
rename from pkg/kernel/lib/transformations/continuation.dart
rename to pkg/vm/lib/transformations/continuation.dart
index 3fb6474..b5c3949 100644
--- a/pkg/kernel/lib/transformations/continuation.dart
+++ b/pkg/vm/lib/transformations/continuation.dart
@@ -2,14 +2,12 @@
 // 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.
 
-library kernel.transformations.continuation;
-
 import 'dart:math' as math;
 
-import '../ast.dart';
-import '../core_types.dart';
-import '../type_algebra.dart' show Substitution;
-import '../type_environment.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/type_algebra.dart' show Substitution;
+import 'package:kernel/type_environment.dart';
 
 import 'async.dart';
 
diff --git a/pkg/vm/lib/transformations/lowering.dart b/pkg/vm/lib/transformations/lowering.dart
index f9e8fe3..4242ff4 100644
--- a/pkg/vm/lib/transformations/lowering.dart
+++ b/pkg/vm/lib/transformations/lowering.dart
@@ -5,13 +5,15 @@
 import 'package:kernel/ast.dart';
 import 'package:kernel/class_hierarchy.dart' show ClassHierarchy;
 import 'package:kernel/core_types.dart' show CoreTypes;
-import 'package:kernel/transformations/type_casts_optimizer.dart'
-    as typeCastsOptimizer show transformAsExpression;
 import 'package:kernel/type_environment.dart'
     show StaticTypeContext, TypeEnvironment;
+
 import 'package:vm/transformations/specializer/factory_specializer.dart';
+
 import 'late_var_init_transformer.dart' show LateVarInitTransformer;
 import 'list_literals_lowering.dart' show ListLiteralsLowering;
+import 'type_casts_optimizer.dart' as typeCastsOptimizer
+    show transformAsExpression;
 
 /// VM-specific lowering transformations and optimizations combined into a
 /// single transformation pass.
diff --git a/pkg/kernel/lib/transformations/mixin_full_resolution.dart b/pkg/vm/lib/transformations/mixin_full_resolution.dart
similarity index 96%
rename from pkg/kernel/lib/transformations/mixin_full_resolution.dart
rename to pkg/vm/lib/transformations/mixin_full_resolution.dart
index 5af5475..27b156a 100644
--- a/pkg/kernel/lib/transformations/mixin_full_resolution.dart
+++ b/pkg/vm/lib/transformations/mixin_full_resolution.dart
@@ -2,15 +2,13 @@
 // 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.
 
-library kernel.transformations.mixin_full_resolution;
-
-import '../ast.dart';
-import '../class_hierarchy.dart';
-import '../clone.dart';
-import '../core_types.dart';
-import '../reference_from_index.dart';
-import '../target/targets.dart' show Target;
-import '../type_algebra.dart';
+import 'package:kernel/ast.dart';
+import 'package:kernel/class_hierarchy.dart';
+import 'package:kernel/clone.dart';
+import 'package:kernel/core_types.dart';
+import 'package:kernel/reference_from_index.dart';
+import 'package:kernel/target/targets.dart' show Target;
+import 'package:kernel/type_algebra.dart';
 
 /// Transforms the libraries in [libraries].
 /// Note that [referenceFromIndex] can be null, and is generally only needed
diff --git a/pkg/kernel/lib/transformations/type_casts_optimizer.dart b/pkg/vm/lib/transformations/type_casts_optimizer.dart
similarity index 100%
rename from pkg/kernel/lib/transformations/type_casts_optimizer.dart
rename to pkg/vm/lib/transformations/type_casts_optimizer.dart
diff --git a/runtime/bin/platform_macos.cc b/runtime/bin/platform_macos.cc
index 0c22675..b78112e 100644
--- a/runtime/bin/platform_macos.cc
+++ b/runtime/bin/platform_macos.cc
@@ -13,6 +13,7 @@
 #if !DART_HOST_OS_IOS
 #include <crt_externs.h>  // NOLINT
 #endif                    // !DART_HOST_OS_IOS
+#include <dlfcn.h>        // NOLINT
 #include <errno.h>        // NOLINT
 #include <mach-o/dyld.h>
 #include <signal.h>        // NOLINT
@@ -251,7 +252,98 @@
   return path_size;
 }
 
-void Platform::SetProcessName(const char* name) {}
+void Platform::SetProcessName(const char* name) {
+  pthread_setname_np(name);
+
+#if !defined(DART_HOST_OS_IOS) && !defined(DART_PRECOMPILED_RUNTIME)
+  // Attempt to set the name displayed in ActivityMonitor.
+  // https://codereview.chromium.org/659007/
+
+  class ScopedDLHandle : public ValueObject {
+   public:
+    explicit ScopedDLHandle(void* handle) : handle_(handle) {}
+    ~ScopedDLHandle() {
+      if (handle_ != NULL) dlclose(handle_);
+    }
+    void* get() const { return handle_; }
+
+   private:
+    void* handle_;
+    DISALLOW_COPY_AND_ASSIGN(ScopedDLHandle);
+  };
+
+  class ScopedCFStringRef : public ValueObject {
+   public:
+    explicit ScopedCFStringRef(const char* s)
+        : ref_(CFStringCreateWithCString(NULL, (s), kCFStringEncodingUTF8)) {}
+    ~ScopedCFStringRef() {
+      if (ref_ != NULL) CFRelease(ref_);
+    }
+    CFStringRef get() const { return ref_; }
+
+   private:
+    CFStringRef ref_;
+    DISALLOW_COPY_AND_ASSIGN(ScopedCFStringRef);
+  };
+
+  ScopedDLHandle application_services_handle(
+      dlopen("/System/Library/Frameworks/ApplicationServices.framework/"
+             "Versions/A/ApplicationServices",
+             RTLD_LAZY | RTLD_LOCAL));
+  if (application_services_handle.get() == NULL) return;
+
+  ScopedCFStringRef launch_services_bundle_name("com.apple.LaunchServices");
+  CFBundleRef launch_services_bundle =
+      CFBundleGetBundleWithIdentifier(launch_services_bundle_name.get());
+  if (launch_services_bundle == NULL) return;
+
+#define GET_FUNC(name, cstr)                                                   \
+  ScopedCFStringRef name##_id(cstr);                                           \
+  *reinterpret_cast<void**>(&name) = CFBundleGetFunctionPointerForName(        \
+      launch_services_bundle, name##_id.get());                                \
+  if (name == NULL) return;
+
+#define GET_DATA(name, cstr)                                                   \
+  ScopedCFStringRef name##_id(cstr);                                           \
+  *reinterpret_cast<void**>(&name) =                                           \
+      CFBundleGetDataPointerForName(launch_services_bundle, name##_id.get());  \
+  if (name == NULL) return;
+
+  CFTypeRef (*_LSGetCurrentApplicationASN)(void);
+  GET_FUNC(_LSGetCurrentApplicationASN, "_LSGetCurrentApplicationASN");
+
+  OSStatus (*_LSSetApplicationInformationItem)(int, CFTypeRef, CFStringRef,
+                                               CFStringRef, CFDictionaryRef*);
+  GET_FUNC(_LSSetApplicationInformationItem,
+           "_LSSetApplicationInformationItem");
+
+  CFDictionaryRef (*_LSApplicationCheckIn)(int, CFDictionaryRef);
+  GET_FUNC(_LSApplicationCheckIn, "_LSApplicationCheckIn");
+
+  void (*_LSSetApplicationLaunchServicesServerConnectionStatus)(uint64_t,
+                                                                void*);
+  GET_FUNC(_LSSetApplicationLaunchServicesServerConnectionStatus,
+           "_LSSetApplicationLaunchServicesServerConnectionStatus");
+
+  CFStringRef* _kLSDisplayNameKey;
+  GET_DATA(_kLSDisplayNameKey, "_kLSDisplayNameKey");
+  if (*_kLSDisplayNameKey == NULL) return;
+
+  _LSSetApplicationLaunchServicesServerConnectionStatus(0, NULL);
+
+  _LSApplicationCheckIn(-2, CFBundleGetInfoDictionary(CFBundleGetMainBundle()));
+
+  CFTypeRef asn;
+  asn = _LSGetCurrentApplicationASN();
+  if (asn == NULL) return;
+
+  ScopedCFStringRef cf_name(name);
+  _LSSetApplicationInformationItem(-2, asn, *_kLSDisplayNameKey, cf_name.get(),
+                                   NULL);
+#undef GET_DATA
+#undef GET_FUNC
+#endif  // !defined(DART_HOST_OS_IOS)
+}
 
 void Platform::Exit(int exit_code) {
   Console::RestoreConfig();
diff --git a/tools/VERSION b/tools/VERSION
index c4a61b5..f2a49b1 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 2
 MINOR 17
 PATCH 0
-PRERELEASE 169
+PRERELEASE 170
 PRERELEASE_PATCH 0
\ No newline at end of file