Version 3.9.0-188.0.dev

Merge 2b59598defdbbcc7e06d507ad74cf225c615d6b5 into dev
diff --git a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
index 443f7fa..c076622 100644
--- a/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
+++ b/pkg/analysis_server/lib/plugin/protocol/protocol_dart.dart
@@ -27,7 +27,7 @@
       isPrivate: element.isPrivate,
       isDeprecated:
           (element is engine.Annotatable) &&
-          (element as engine.Annotatable).metadata2.hasDeprecated,
+          (element as engine.Annotatable).metadata.hasDeprecated,
       isAbstract: _isAbstract(element),
       isConst: _isConst(element),
       isFinal: _isFinal(element),
@@ -139,7 +139,7 @@
     path.basename(fragment.source.fullName),
     Element.makeFlags(
       isPrivate: fragment.isPrivate,
-      isDeprecated: fragment.library.metadata2.hasDeprecated,
+      isDeprecated: fragment.library.metadata.hasDeprecated,
     ),
     location: newLocation_fromFragment(fragment),
   );
@@ -193,7 +193,7 @@
     }
     if (parameter.isRequiredNamed) {
       sb.write('required ');
-    } else if (parameter.metadata2.hasDeprecated) {
+    } else if (parameter.metadata.hasDeprecated) {
       sb.write('@required ');
     }
     parameter.appendToWithoutDelimiters(sb);
@@ -261,13 +261,13 @@
   engine.FormalParameterElement e2,
 ) {
   var rank1 =
-      (e1.isRequiredNamed || e1.metadata2.hasRequired)
+      (e1.isRequiredNamed || e1.metadata.hasRequired)
           ? 0
           : !e1.isNamed
           ? -1
           : 1;
   var rank2 =
-      (e2.isRequiredNamed || e2.metadata2.hasRequired)
+      (e2.isRequiredNamed || e2.metadata.hasRequired)
           ? 0
           : !e2.isNamed
           ? -1
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index 3c9bded..5a50788 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -27,6 +27,7 @@
     show MessageType;
 import 'package:analysis_server/src/protocol_server.dart' as server;
 import 'package:analysis_server/src/scheduler/message_scheduler.dart';
+import 'package:analysis_server/src/scheduler/scheduler_tracking_listener.dart';
 import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
 import 'package:analysis_server/src/server/diagnostic_server.dart';
 import 'package:analysis_server/src/services/completion/completion_performance.dart';
@@ -296,8 +297,12 @@
          httpClient,
          Platform.environment['PUB_HOSTED_URL'],
        ),
-       messageScheduler = MessageScheduler(listener: messageSchedulerListener) {
-    messageScheduler.setServer(this);
+       messageScheduler = MessageScheduler(
+         listener:
+             messageSchedulerListener ??
+             SchedulerTrackingListener(analyticsManager),
+       ) {
+    messageScheduler.server = this;
     // Set the default URI converter. This uses the resource providers path
     // context (unlike the initialized value) which allows tests to override it.
     uriConverter = ClientUriConverter.noop(baseResourceProvider.pathContext);
diff --git a/pkg/analysis_server/lib/src/computer/computer_hover.dart b/pkg/analysis_server/lib/src/computer/computer_hover.dart
index 7a5fdfe..899bbdf 100644
--- a/pkg/analysis_server/lib/src/computer/computer_hover.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_hover.dart
@@ -68,7 +68,7 @@
         hover.elementDescription = _elementDisplayString(node, element);
         hover.elementKind = element.kind.displayName;
         if (element case Annotatable a) {
-          hover.isDeprecated = a.metadata2.hasDeprecated;
+          hover.isDeprecated = a.metadata.hasDeprecated;
         }
         // not local element
         if (element.enclosingElement is! ExecutableElement) {
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 9497efa..4495e8a 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -535,7 +535,7 @@
   /// Return `true` if the given [element] is the method 'group' defined in the
   /// test package.
   bool isGroup(engine.ExecutableElement? element) {
-    if (element != null && element.metadata2.hasIsTestGroup) {
+    if (element != null && element.metadata.hasIsTestGroup) {
       return true;
     }
     return element is engine.TopLevelFunctionElement &&
@@ -546,7 +546,7 @@
   /// Return `true` if the given [element] is the method 'test' defined in the
   /// test package.
   bool isTest(engine.ExecutableElement? element) {
-    if (element != null && element.metadata2.hasIsTest) {
+    if (element != null && element.metadata.hasIsTest) {
       return true;
     }
     return element is engine.TopLevelFunctionElement &&
diff --git a/pkg/analysis_server/lib/src/lsp/completion_utils.dart b/pkg/analysis_server/lib/src/lsp/completion_utils.dart
index 4035637..3b4415a 100644
--- a/pkg/analysis_server/lib/src/lsp/completion_utils.dart
+++ b/pkg/analysis_server/lib/src/lsp/completion_utils.dart
@@ -620,7 +620,7 @@
   var detail = fullSignature;
   if (element != null &&
       (element is Annotatable &&
-          (element as Annotatable).metadata2.hasDeprecated) &&
+          (element as Annotatable).metadata.hasDeprecated) &&
       !supportsDeprecated) {
     // If the item is deprecated and we don't support the native deprecated flag
     // then include it in the details.
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/editable_arguments_mixin.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/editable_arguments_mixin.dart
index 7d2acdb..1a80814 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/editable_arguments_mixin.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/editable_arguments_mixin.dart
@@ -188,8 +188,8 @@
     };
 
     return switch (element) {
-      FragmentedAnnotatableElementMixin(:var metadata2) =>
-        metadata2.hasWidgetFactory,
+      FragmentedAnnotatableElementMixin(:var metadata) =>
+        metadata.hasWidgetFactory,
       _ => false,
     };
   }
diff --git a/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/handler_editable_arguments.dart b/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/handler_editable_arguments.dart
index 8c124fa..7394ae8 100644
--- a/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/handler_editable_arguments.dart
+++ b/pkg/analysis_server/lib/src/lsp/handlers/custom/editable_arguments/handler_editable_arguments.dart
@@ -245,7 +245,7 @@
       isRequired: parameter.isRequired,
       isNullable:
           parameter.type.nullabilitySuffix == NullabilitySuffix.question,
-      isDeprecated: parameter.metadata2.hasDeprecated,
+      isDeprecated: parameter.metadata.hasDeprecated,
       isEditable: notEditableReason == null,
       notEditableReason: notEditableReason,
     );
diff --git a/pkg/analysis_server/lib/src/scheduler/message_scheduler.dart b/pkg/analysis_server/lib/src/scheduler/message_scheduler.dart
index 08091e7..7024f24 100644
--- a/pkg/analysis_server/lib/src/scheduler/message_scheduler.dart
+++ b/pkg/analysis_server/lib/src/scheduler/message_scheduler.dart
@@ -29,10 +29,10 @@
   static bool allowOverlappingHandlers = true;
 
   /// A listener that can be used to watch the scheduler as it manages messages.
-  final MessageSchedulerListener? _listener;
+  final MessageSchedulerListener? listener;
 
   /// The [AnalysisServer] associated with the scheduler.
-  late final AnalysisServer _server;
+  late final AnalysisServer server;
 
   /// The messages that have been received and are waiting to be handled.
   final ListQueue<ScheduledMessage> _pendingMessages =
@@ -50,13 +50,13 @@
 
   /// Initialize a newly created message scheduler.
   ///
-  /// The caller is expected to set the [_server] immediately after creating the
+  /// The caller is expected to set the [server] immediately after creating the
   /// instance. The only reason the server isn't initialized by the constructor
   /// is because the analysis server and the message scheduler can't be created
   /// atomically and it was decided that it was cleaner for the scheduler to
   /// have the nullable reference to the server rather than the other way
   /// around.
-  MessageScheduler({MessageSchedulerListener? listener}) : _listener = listener;
+  MessageScheduler({required this.listener});
 
   /// Add the [message] to the end of the pending messages queue.
   ///
@@ -81,7 +81,7 @@
   /// - The incoming [legacy.ANALYSIS_REQUEST_UPDATE_CONTENT] message cancels
   ///   any rename files request that is in progress.
   void add(ScheduledMessage message) {
-    _listener?.addPendingMessage(message);
+    listener?.addPendingMessage(message);
     if (message is LegacyMessage) {
       var request = message.request;
       var method = request.method;
@@ -89,10 +89,10 @@
         var id =
             legacy.ServerCancelRequestParams.fromRequest(
               request,
-              clientUriConverter: _server.uriConverter,
+              clientUriConverter: server.uriConverter,
             ).id;
-        _listener?.addActiveMessage(message);
-        (_server as LegacyAnalysisServer).cancelRequest(id);
+        listener?.addActiveMessage(message);
+        (server as LegacyAnalysisServer).cancelRequest(id);
         // The message needs to be added to the queue of pending messages, but
         // it seems like it shouldn't be necessary and that we ought to return
         // at this point. However, doing so causes some tests to timeout.
@@ -107,7 +107,7 @@
                   code: lsp.ErrorCodes.ContentModified.toJson(),
                   reason: 'File content was modified',
                 );
-                _listener?.cancelActiveMessage(activeMessage);
+                listener?.cancelActiveMessage(activeMessage);
               }
             }
           }
@@ -121,8 +121,8 @@
         // Responses don't go on the queue because there might be an active
         // message that can't complete until the response is received. If the
         // response was added to the queue then this process could deadlock.
-        _listener?.addActiveMessage(message);
-        (_server as LspAnalysisServer).handleMessage(msg, null);
+        listener?.addActiveMessage(message);
+        (server as LspAnalysisServer).handleMessage(msg, null);
         return;
       } else if (msg is lsp.NotificationMessage) {
         var method = msg.method;
@@ -133,7 +133,7 @@
           // by removing the request from the queue. It's done this way to allow
           // a response to be sent back to the client saying that the results
           // aren't provided because the request was cancelled.
-          _listener?.addActiveMessage(message);
+          listener?.addActiveMessage(message);
           _processCancellation(msg);
           return;
         } else if (method == lsp.Method.textDocument_didChange) {
@@ -155,7 +155,7 @@
               var message = activeMessage.message as lsp.RequestMessage;
               if (message.method == incomingMsgMethod) {
                 activeMessage.cancellationToken?.cancel(reason: reason);
-                _listener?.cancelActiveMessage(activeMessage);
+                listener?.cancelActiveMessage(activeMessage);
               }
             }
           }
@@ -164,7 +164,7 @@
               var message = pendingMessage.message as lsp.RequestMessage;
               if (message.method == msg.method) {
                 pendingMessage.cancellationToken?.cancel(reason: reason);
-                _listener?.cancelPendingMessage(pendingMessage);
+                listener?.cancelPendingMessage(pendingMessage);
               }
             }
           }
@@ -180,12 +180,12 @@
   /// Dispatch the first message in the queue to be executed.
   void processMessages() async {
     _isProcessing = true;
-    _listener?.startProcessingMessages();
+    listener?.startProcessingMessages();
     try {
       while (_pendingMessages.isNotEmpty) {
         var currentMessage = _pendingMessages.removeFirst();
         _activeMessages.addLast(currentMessage);
-        _listener?.addActiveMessage(currentMessage);
+        listener?.addActiveMessage(currentMessage);
         _completer = Completer<void>();
         unawaited(
           _completer.future.then((_) {
@@ -195,27 +195,27 @@
         switch (currentMessage) {
           case LspMessage():
             var lspMessage = currentMessage.message;
-            (_server as LspAnalysisServer).handleMessage(
+            (server as LspAnalysisServer).handleMessage(
               lspMessage,
               cancellationToken: currentMessage.cancellationToken,
               _completer,
             );
           case LegacyMessage():
             var request = currentMessage.request;
-            (_server as LegacyAnalysisServer).handleRequest(
+            (server as LegacyAnalysisServer).handleRequest(
               request,
               _completer,
               currentMessage.cancellationToken,
             );
           case DtdMessage():
-            _server.dtd!.processMessage(
+            server.dtd!.processMessage(
               currentMessage.message,
               currentMessage.performance,
               currentMessage.responseCompleter,
               _completer,
             );
           case WatcherMessage():
-            _server.contextManager.handleWatchEvent(currentMessage.event);
+            server.contextManager.handleWatchEvent(currentMessage.event);
             // Handling a watch event is a synchronous process, so there's
             // nothing to wait for.
             _completer.complete();
@@ -236,24 +236,17 @@
         // TODO(pq): if not awaited, consider adding a `then` so we can track
         // when the future completes. But note that we may see some flakiness in
         // tests as message handling gets non-deterministically interleaved.
-        _listener?.messageCompleted(currentMessage);
+        listener?.messageCompleted(currentMessage);
       }
     } catch (error, stackTrace) {
-      _server.instrumentationService.logException(
+      server.instrumentationService.logException(
         FatalException('Failed to process message', error, stackTrace),
         null,
-        _server.crashReportingAttachmentsBuilder.forException(error),
+        server.crashReportingAttachmentsBuilder.forException(error),
       );
     }
     _isProcessing = false;
-    _listener?.endProcessingMessages();
-  }
-
-  /// Set the [AnalysisServer].
-  ///
-  /// Throws an exception if the server has already been set.
-  void setServer(AnalysisServer analysisServer) {
-    _server = analysisServer;
+    listener?.endProcessingMessages();
   }
 
   /// Returns the parameters of a cancellation [message].
@@ -269,7 +262,7 @@
           ? cancelJsonHandler.convertParams(paramsJson)
           : null;
     } catch (error, stackTrace) {
-      (_server as LspAnalysisServer).logException(
+      (server as LspAnalysisServer).logException(
         'An error occured while parsing cancel parameters',
         error,
         stackTrace,
@@ -309,7 +302,7 @@
   Map<String, Object?>? _getLspOverLegacyParams(legacy.Request request) {
     var params = legacy.LspHandleParams.fromRequest(
       request,
-      clientUriConverter: _server.uriConverter,
+      clientUriConverter: server.uriConverter,
     );
     return params.lspMessage as Map<String, Object?>;
   }
@@ -352,7 +345,7 @@
         var request = activeMessage.message as lsp.RequestMessage;
         if (request.id == params.id) {
           activeMessage.cancellationToken?.cancel();
-          _listener?.cancelActiveMessage(activeMessage);
+          listener?.cancelActiveMessage(activeMessage);
           return;
         }
       }
@@ -362,7 +355,7 @@
         var request = pendingMessage.message as lsp.RequestMessage;
         if (request.id == params.id) {
           pendingMessage.cancellationToken?.cancel();
-          _listener?.cancelPendingMessage(pendingMessage);
+          listener?.cancelPendingMessage(pendingMessage);
           return;
         }
       }
@@ -410,9 +403,9 @@
             code: lsp.ErrorCodes.ContentModified.toJson(),
           );
           if (isActive) {
-            _listener?.cancelActiveMessage(lspMessage);
+            listener?.cancelActiveMessage(lspMessage);
           } else {
-            _listener?.cancelPendingMessage(lspMessage);
+            listener?.cancelPendingMessage(lspMessage);
           }
         }
       }
@@ -428,9 +421,9 @@
             code: lsp.ErrorCodes.ContentModified.toJson(),
           );
           if (isActive) {
-            _listener?.cancelActiveMessage(lspMessage);
+            listener?.cancelActiveMessage(lspMessage);
           } else {
-            _listener?.cancelPendingMessage(lspMessage);
+            listener?.cancelPendingMessage(lspMessage);
           }
         }
       }
@@ -461,9 +454,13 @@
 
 abstract class MessageSchedulerListener {
   /// Report that the [message] was added to the active message queue.
+  ///
+  /// This implies that the message is no longer on the pending message queue.
   void addActiveMessage(ScheduledMessage message);
 
   /// Report that the [message] was added to the pending message queue.
+  ///
+  /// This is always the first notification for the [message].
   void addPendingMessage(ScheduledMessage message);
 
   /// Report that an active [message] was cancelled.
@@ -476,6 +473,8 @@
   void endProcessingMessages();
 
   /// Report that the [message] has been completed.
+  ///
+  /// This implies that the message was active and wasn't cancelled.
   void messageCompleted(ScheduledMessage message);
 
   /// Report that the loop that processes messages has started to run.
diff --git a/pkg/analysis_server/lib/src/scheduler/scheduled_message.dart b/pkg/analysis_server/lib/src/scheduler/scheduled_message.dart
index e44747b..ec0b6f2 100644
--- a/pkg/analysis_server/lib/src/scheduler/scheduled_message.dart
+++ b/pkg/analysis_server/lib/src/scheduler/scheduled_message.dart
@@ -30,7 +30,7 @@
   });
 
   @override
-  String toString() => message.method.toString();
+  String get id => 'dtd:${message.method}';
 }
 
 /// Represents a message in the Legacy protocol format.
@@ -45,7 +45,7 @@
   LegacyMessage({required this.request, this.cancellationToken});
 
   @override
-  String toString() => request.method;
+  String get id => 'legacy:${request.method}';
 }
 
 /// Represents a message in the LSP protocol format.
@@ -59,18 +59,18 @@
 
   LspMessage({required this.message, this.cancellationToken});
 
-  bool get isRequest => message is lsp.RequestMessage;
-
   @override
-  String toString() {
+  String get id {
     var msg = message;
     return switch (msg) {
-      RequestMessage() => msg.method.toString(),
-      NotificationMessage() => msg.method.toString(),
-      ResponseMessage() => 'ResponseMessage',
-      Message() => 'Message',
+      RequestMessage() => 'lsp:${msg.method}',
+      NotificationMessage() => 'lsp:${msg.method}',
+      ResponseMessage() => 'lsp:ResponseMessage',
+      Message() => 'lsp:Message',
     };
   }
+
+  bool get isRequest => message is lsp.RequestMessage;
 }
 
 /// A message from a client.
@@ -78,7 +78,13 @@
 /// The message can be either a request, a notification, or a response.
 ///
 /// The client can be an IDE, a command-line tool, or DTD.
-sealed class ScheduledMessage {}
+sealed class ScheduledMessage {
+  /// An identifier that identifies this particular kind of message.
+  String get id;
+
+  @override
+  String toString() => id;
+}
 
 /// Represents a message from the file watcher.
 ///
@@ -90,5 +96,5 @@
   WatcherMessage(this.event);
 
   @override
-  String toString() => '${event.type} ${event.path}';
+  String get id => 'watch:${event.type} ${event.path}';
 }
diff --git a/pkg/analysis_server/lib/src/scheduler/scheduler_tracking_listener.dart b/pkg/analysis_server/lib/src/scheduler/scheduler_tracking_listener.dart
new file mode 100644
index 0000000..bfcfc0b
--- /dev/null
+++ b/pkg/analysis_server/lib/src/scheduler/scheduler_tracking_listener.dart
@@ -0,0 +1,182 @@
+// Copyright (c) 2025, 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 'dart:convert';
+
+import 'package:analysis_server/src/analytics/analytics_manager.dart';
+import 'package:analysis_server/src/scheduler/message_scheduler.dart';
+import 'package:analysis_server/src/scheduler/scheduled_message.dart';
+
+/// The current time represented as milliseconds since the beginning of the
+/// epoch.
+int get _now => DateTime.now().millisecondsSinceEpoch;
+
+/// Information about a scheduled message's journey through the message
+/// scheduler.
+class MessageData {
+  /// The message for which data is being collected.
+  final ScheduledMessage message;
+
+  /// The number of pending messages already on the queue when the [message] was
+  /// added to the queue.
+  final int pendingMessageCount;
+
+  /// The number of active messages already on the queue when the [message] was
+  /// added to the queue.
+  final int activeMessageCount;
+
+  /// The time at which the [message] was added to the pending queue.
+  final int pendingTime;
+
+  /// The time at which the [message] was added to the active queue.
+  int? activeTime;
+
+  /// Whether the [message] was cancelled.
+  bool wasCancelled = false;
+
+  /// The time at which the [message] was completed.
+  int? completeTime;
+
+  MessageData({
+    required this.message,
+    required this.pendingMessageCount,
+    required this.activeMessageCount,
+  }) : pendingTime = _now;
+}
+
+/// A message scheduler listener that will gather data for reporting purposes.
+///
+/// The data will be included in the reports sent to track down performance
+/// issues, and aggregated data will be reported to the analytics manager.
+class SchedulerTrackingListener extends MessageSchedulerListener {
+  /// The number of lines of data to be kept in the [completedMessageLog].
+  static const int logLength = 100;
+
+  /// The analytics manager through which analytics are to be sent.
+  final AnalyticsManager analyticsManager;
+
+  /// A map from scheduled messages to the data being collected about them.
+  final Map<ScheduledMessage, MessageData> _messageDataMap = {};
+
+  /// The number of messages in the active message queue.
+  int _activeMessageCount = 0;
+
+  /// The number of messages in the pending message queue.
+  int _pendingMessageCount = 0;
+
+  /// The time at which processing last started.
+  int processingStartTime = 0;
+
+  /// The time at which processing last ended, or `-1` if processing hasn't yet
+  /// ended.
+  int processingEndTime = -1;
+
+  /// A list of data about the [logLength] most recently completed messages.
+  List<String> completedMessageLog = [];
+
+  /// Returns a newly created listener that will report to the
+  /// [analyticsManager].
+  SchedulerTrackingListener(this.analyticsManager);
+
+  ({List<MessageData> pending, List<MessageData> active})
+  get pendingAndActiveMessages {
+    var pendingMessages = <MessageData>[];
+    var activeMessages = <MessageData>[];
+    for (var messageData in _messageDataMap.values) {
+      if (messageData.activeTime != null) {
+        activeMessages.add(messageData);
+      } else {
+        pendingMessages.add(messageData);
+      }
+    }
+    return (pending: pendingMessages, active: activeMessages);
+  }
+
+  @override
+  void addActiveMessage(ScheduledMessage message) {
+    var messageData = _messageDataMap[message]!;
+    messageData.activeTime = _now;
+    _pendingMessageCount--;
+    _activeMessageCount++;
+  }
+
+  @override
+  void addPendingMessage(ScheduledMessage message) {
+    _messageDataMap[message] = MessageData(
+      message: message,
+      pendingMessageCount: _pendingMessageCount,
+      activeMessageCount: _activeMessageCount,
+    );
+    _pendingMessageCount++;
+  }
+
+  @override
+  void cancelActiveMessage(ScheduledMessage message) {
+    var messageData = _messageDataMap.remove(message);
+    if (messageData == null) {
+      return;
+    }
+    messageData.completeTime = _now;
+    messageData.wasCancelled = true;
+    _activeMessageCount--;
+    _reportMessageData(messageData);
+  }
+
+  @override
+  void cancelPendingMessage(ScheduledMessage message) {
+    var messageData = _messageDataMap.remove(message)!;
+    messageData.completeTime = _now;
+    messageData.wasCancelled = true;
+    _pendingMessageCount--;
+    _reportMessageData(messageData);
+  }
+
+  /// Report that the loop that processes messages has stopped running.
+  @override
+  void endProcessingMessages() {
+    processingEndTime = _now;
+    // var processingDuration = processingEndTime - processingStartTime;
+    // TODO(brianwilkerson): Record [processingDuration].
+  }
+
+  @override
+  void messageCompleted(ScheduledMessage message) {
+    var messageData = _messageDataMap.remove(message)!;
+    messageData.completeTime = _now;
+    _activeMessageCount--;
+    _reportMessageData(messageData);
+  }
+
+  @override
+  void startProcessingMessages() {
+    processingStartTime = _now;
+    // var idleDuration = processingStartTime - processingEndTime;
+    // TODO(brianwilkerson): Record [idleDuration].
+  }
+
+  /// Reports information about a completed message.
+  void _reportMessageData(MessageData messageData) {
+    var now = _now;
+    var pendingTime = messageData.pendingTime;
+    var activeTime = messageData.activeTime ?? now;
+    var completeTime = messageData.completeTime ?? now;
+
+    var jsonData = {
+      'message': messageData.message.id,
+      'pendingMessageCount': messageData.pendingMessageCount,
+      'activeMessageCount': messageData.activeMessageCount,
+      'pendingDuration': activeTime - pendingTime,
+      'activeDuration': completeTime - activeTime,
+      'wasCancelled': messageData.wasCancelled,
+    };
+
+    if (completedMessageLog.length >= logLength) {
+      completedMessageLog.removeAt(0);
+    }
+    completedMessageLog.add(jsonEncode(jsonData));
+
+    // TODO(brianwilkerson): Report the [messageDataData] to the analytics manager.
+    // analyticsManager;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
index c7428b8..7437c91 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/declaration_helper.dart
@@ -399,7 +399,10 @@
       return;
     }
     AstNode? parent = containingMember.parent ?? containingMember;
-    if (parent is ClassMember) {
+    if (parent is EnumConstantDeclaration) {
+      assert(node is CommentReference);
+      parent = parent.parent;
+    } else if (parent is ClassMember) {
       assert(node is CommentReference);
       parent = parent.parent;
     } else if (parent is Directive) {
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart b/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
index 9d110da..524ba04 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/override_helper.dart
@@ -66,11 +66,11 @@
   bool _hasNonVirtualAnnotation(ExecutableElement element) {
     if (element is GetterElement && element.isSynthetic) {
       var variable = element.variable3;
-      if (variable != null && variable.metadata2.hasNonVirtual) {
+      if (variable != null && variable.metadata.hasNonVirtual) {
         return true;
       }
     }
-    return element.metadata2.hasNonVirtual;
+    return element.metadata.hasNonVirtual;
   }
 
   /// Returns the list of names that belong to [interfaceElement], but are not
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart b/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart
index ac8798b..2a5547f 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/relevance_computer.dart
@@ -209,7 +209,7 @@
         );
       case NamedArgumentSuggestion():
         var parameter = suggestion.parameter;
-        if (parameter.isRequiredNamed || parameter.metadata2.hasRequired) {
+        if (parameter.isRequiredNamed || parameter.metadata.hasRequired) {
           return Relevance.requiredNamedArgument;
         } else {
           return Relevance.namedArgument;
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
index 17185d8..c7c5eb0 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/suggestion_builder.dart
@@ -842,7 +842,7 @@
       completion,
       selectionRange.offset - offsetDelta,
       selectionRange.length,
-      element.metadata2.hasDeprecated,
+      element.metadata.hasDeprecated,
       false,
       displayText: displayText,
       requiredImports: overrideImports.toList(),
diff --git a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
index d945df0..6aee213 100644
--- a/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
+++ b/pkg/analysis_server/lib/src/services/completion/dart/utilities.dart
@@ -110,7 +110,7 @@
   }
 
   for (var param in namedParams) {
-    if (param.metadata2.hasRequired || param.isRequiredNamed) {
+    if (param.metadata.hasRequired || param.isRequiredNamed) {
       if (sb.isNotEmpty) {
         sb.write(', ');
       }
diff --git a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
index 4e53a66..c959a04 100644
--- a/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
+++ b/pkg/analysis_server/lib/src/services/correction/fix/data_driven/rename_parameter.dart
@@ -55,8 +55,8 @@
                 type: parameterElement.type,
               );
               builder.write(', ');
-              if (overriddenParameter.metadata2.hasDeprecated &&
-                  !parameterElement.metadata2.hasDeprecated) {
+              if (overriddenParameter.metadata.hasDeprecated &&
+                  !parameterElement.metadata.hasDeprecated) {
                 builder.write('@deprecated ');
               }
             });
diff --git a/pkg/analysis_server/lib/src/services/flutter/class_description.dart b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
index be7c779..e9b8d6f 100644
--- a/pkg/analysis_server/lib/src/services/flutter/class_description.dart
+++ b/pkg/analysis_server/lib/src/services/flutter/class_description.dart
@@ -65,7 +65,7 @@
     if (constructor == null) return null;
 
     for (var parameter in constructor.formalParameters) {
-      if (parameter.isRequired || parameter.metadata2.hasRequired) {
+      if (parameter.isRequired || parameter.metadata.hasRequired) {
         return null;
       }
     }
diff --git a/pkg/analysis_server/lib/src/status/diagnostics.dart b/pkg/analysis_server/lib/src/status/diagnostics.dart
index fdbbe9f..550ce7a 100644
--- a/pkg/analysis_server/lib/src/status/diagnostics.dart
+++ b/pkg/analysis_server/lib/src/status/diagnostics.dart
@@ -24,6 +24,7 @@
 import 'package:analysis_server/src/socket_server.dart';
 import 'package:analysis_server/src/status/ast_writer.dart';
 import 'package:analysis_server/src/status/element_writer.dart';
+import 'package:analysis_server/src/status/message_scheduler_page.dart';
 import 'package:analysis_server/src/status/pages.dart';
 import 'package:analysis_server/src/utilities/profiling.dart';
 import 'package:analysis_server/src/utilities/stream_string_stink.dart';
@@ -1554,6 +1555,7 @@
     pages.add(ByteStoreTimingPage(this));
     pages.add(CompletionPage(this));
     pages.add(FixesPage(this));
+    pages.add(MessageSchedulerPage(this));
     pages.add(RefactoringsPage(this));
   }
 
diff --git a/pkg/analysis_server/lib/src/status/element_writer.dart b/pkg/analysis_server/lib/src/status/element_writer.dart
index 1ab8820..624d98e 100644
--- a/pkg/analysis_server/lib/src/status/element_writer.dart
+++ b/pkg/analysis_server/lib/src/status/element_writer.dart
@@ -38,7 +38,7 @@
 
     var firstFragment = element.firstFragment;
     if (element case Annotatable element) {
-      properties['annotations'] = element.metadata2.annotations;
+      properties['annotations'] = element.metadata.annotations;
     }
     if (element is InterfaceElement) {
       properties['interfaces'] = element.interfaces;
diff --git a/pkg/analysis_server/lib/src/status/message_scheduler_page.dart b/pkg/analysis_server/lib/src/status/message_scheduler_page.dart
new file mode 100644
index 0000000..660da67
--- /dev/null
+++ b/pkg/analysis_server/lib/src/status/message_scheduler_page.dart
@@ -0,0 +1,85 @@
+// Copyright (c) 2025, 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 'dart:async';
+
+import 'package:analysis_server/src/scheduler/message_scheduler.dart';
+import 'package:analysis_server/src/scheduler/scheduler_tracking_listener.dart';
+import 'package:analysis_server/src/status/diagnostics.dart';
+
+class MessageSchedulerPage extends DiagnosticPageWithNav {
+  MessageSchedulerPage(DiagnosticsSite site)
+    : super(
+        site,
+        'messageScheduler',
+        'Message Scheduler',
+        description: 'The state of the message scheduler.',
+        indentInNav: true,
+      );
+
+  @override
+  Future<void> generateContent(Map<String, String> params) async {
+    var listener = server.messageScheduler.listener;
+
+    h3('Status');
+    buf.writeln(
+      writeOption(
+        'Allows overlapping message handlers:',
+        MessageScheduler.allowOverlappingHandlers,
+      ),
+    );
+    if (listener is! SchedulerTrackingListener) {
+      buf.writeln(writeOption('Tracking listener:', 'none'));
+      return;
+    }
+
+    void writeData(MessageData data, {required bool isActive}) {
+      p(data.message.id);
+      buf.write('<blockquote>');
+      p('Pending messages ahead of this: ${data.pendingMessageCount}');
+      p(
+        'Time spent on pending queue: ${(data.activeTime ?? DateTime.now().millisecondsSinceEpoch) - data.pendingTime}',
+      );
+      if (isActive) {
+        p('Active messages ahead of this: ${data.activeMessageCount}');
+        p(
+          'Time spent running: ${DateTime.now().millisecondsSinceEpoch - data.activeTime!}',
+        );
+      }
+      buf.write('</blockquote>');
+    }
+
+    var (:pending, :active) = listener.pendingAndActiveMessages;
+
+    h3('Pending messages');
+    if (pending.isEmpty) {
+      p('none');
+    } else {
+      pending.sort(
+        (first, second) => first.pendingTime.compareTo(second.pendingTime),
+      );
+      for (var data in pending) {
+        writeData(data, isActive: false);
+      }
+    }
+
+    h3('Active messages');
+    if (active.isEmpty) {
+      p('none');
+    } else {
+      active.sort(
+        (first, second) => first.activeTime!.compareTo(second.activeTime!),
+      );
+      for (var data in active) {
+        writeData(data, isActive: true);
+      }
+    }
+
+    var lines = listener.completedMessageLog;
+    if (lines.isNotEmpty) {
+      h3('Completed messages');
+      p(lines.join('\n'), style: 'white-space: pre');
+    }
+  }
+}
diff --git a/pkg/analysis_server/lib/src/status/pages.dart b/pkg/analysis_server/lib/src/status/pages.dart
index 0045724..651cc4d 100644
--- a/pkg/analysis_server/lib/src/status/pages.dart
+++ b/pkg/analysis_server/lib/src/status/pages.dart
@@ -60,9 +60,7 @@
 
   Future<String> generate(Map<String, String> params) async {
     buf.clear();
-    // TODO(brianwilkerson): Determine if await is necessary, if so, change the
-    // return type of [generatePage] to `Future<void>`.
-    await (generatePage(params) as dynamic);
+    await generatePage(params);
     return buf.toString();
   }
 
diff --git a/pkg/analysis_server/lib/src/utilities/extensions/element.dart b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
index 34240de..2402174 100644
--- a/pkg/analysis_server/lib/src/utilities/extensions/element.dart
+++ b/pkg/analysis_server/lib/src/utilities/extensions/element.dart
@@ -43,19 +43,19 @@
   /// annotation.
   bool get hasOrInheritsDeprecated {
     if (this case Annotatable annotatable) {
-      if (annotatable.metadata2.hasDeprecated) {
+      if (annotatable.metadata.hasDeprecated) {
         return true;
       }
     }
 
     var ancestor = enclosingElement;
     if (ancestor is InterfaceElement) {
-      if (ancestor.metadata2.hasDeprecated) {
+      if (ancestor.metadata.hasDeprecated) {
         return true;
       }
       ancestor = ancestor.enclosingElement;
     }
-    return ancestor is LibraryElement && ancestor.metadata2.hasDeprecated;
+    return ancestor is LibraryElement && ancestor.metadata.hasDeprecated;
   }
 
   /// Return this element and all its enclosing elements.
diff --git a/pkg/analysis_server/test/integration/server/message_scheduler_test.dart b/pkg/analysis_server/test/integration/server/message_scheduler_test.dart
index 3bbe2154..d4d9966 100644
--- a/pkg/analysis_server/test/integration/server/message_scheduler_test.dart
+++ b/pkg/analysis_server/test/integration/server/message_scheduler_test.dart
@@ -60,10 +60,10 @@
     await setRoots(included: [workspaceRootPath], excluded: []);
     await waitForTasksFinished();
     _assertLogContents(testView!, r'''
-Incoming LegacyMessage: analysis.setAnalysisRoots
+Incoming LegacyMessage: legacy:analysis.setAnalysisRoots
 Entering process messages loop
-  Start LegacyMessage: analysis.setAnalysisRoots
-  Complete LegacyMessage: analysis.setAnalysisRoots
+  Start LegacyMessage: legacy:analysis.setAnalysisRoots
+  Complete LegacyMessage: legacy:analysis.setAnalysisRoots
 Exit process messages loop
 ''');
   }
@@ -80,13 +80,13 @@
     await Future.wait(futures);
     await waitForTasksFinished();
     _assertLogContents(testView!, r'''
-Incoming LegacyMessage: analysis.setAnalysisRoots
+Incoming LegacyMessage: legacy:analysis.setAnalysisRoots
 Entering process messages loop
-  Start LegacyMessage: analysis.setAnalysisRoots
-Incoming LegacyMessage: execution.createContext
-  Complete LegacyMessage: analysis.setAnalysisRoots
-  Start LegacyMessage: execution.createContext
-  Complete LegacyMessage: execution.createContext
+  Start LegacyMessage: legacy:analysis.setAnalysisRoots
+Incoming LegacyMessage: legacy:execution.createContext
+  Complete LegacyMessage: legacy:analysis.setAnalysisRoots
+  Start LegacyMessage: legacy:execution.createContext
+  Complete LegacyMessage: legacy:execution.createContext
 Exit process messages loop
 ''');
   }
@@ -147,34 +147,34 @@
     }
 
     _assertLogContents(testView!, r'''
-Incoming RequestMessage: initialize
+Incoming RequestMessage: lsp:initialize
 Entering process messages loop
-  Start LspMessage: initialize
-  Complete LspMessage: initialize
+  Start LspMessage: lsp:initialize
+  Complete LspMessage: lsp:initialize
 Exit process messages loop
-Incoming NotificationMessage: initialized
+Incoming NotificationMessage: lsp:initialized
 Entering process messages loop
-  Start LspMessage: initialized
-  Complete LspMessage: initialized
+  Start LspMessage: lsp:initialized
+  Complete LspMessage: lsp:initialized
 Exit process messages loop
-Incoming NotificationMessage: textDocument/didOpen
+Incoming NotificationMessage: lsp:textDocument/didOpen
 Entering process messages loop
-  Start LspMessage: textDocument/didOpen
-  Complete LspMessage: textDocument/didOpen
+  Start LspMessage: lsp:textDocument/didOpen
+  Complete LspMessage: lsp:textDocument/didOpen
 Exit process messages loop
-Incoming RequestMessage: textDocument/codeAction
+Incoming RequestMessage: lsp:textDocument/codeAction
 Entering process messages loop
-  Start LspMessage: textDocument/codeAction
-  Complete LspMessage: textDocument/codeAction
+  Start LspMessage: lsp:textDocument/codeAction
+  Complete LspMessage: lsp:textDocument/codeAction
 Exit process messages loop
-Incoming RequestMessage: workspace/executeCommand
+Incoming RequestMessage: lsp:workspace/executeCommand
 Entering process messages loop
-  Start LspMessage: workspace/executeCommand
-Incoming NotificationMessage: textDocument/didChange
-Canceled in progress request workspace/executeCommand
-  Complete LspMessage: workspace/executeCommand
-  Start LspMessage: textDocument/didChange
-  Complete LspMessage: textDocument/didChange
+  Start LspMessage: lsp:workspace/executeCommand
+Incoming NotificationMessage: lsp:textDocument/didChange
+Canceled in progress request lsp:workspace/executeCommand
+  Complete LspMessage: lsp:workspace/executeCommand
+  Start LspMessage: lsp:textDocument/didChange
+  Complete LspMessage: lsp:textDocument/didChange
 Exit process messages loop
 ''');
   }
@@ -207,34 +207,34 @@
     await pumpEventQueue(times: 5000);
 
     _assertLogContents(testView!, r'''
-Incoming RequestMessage: initialize
+Incoming RequestMessage: lsp:initialize
 Entering process messages loop
-  Start LspMessage: initialize
-  Complete LspMessage: initialize
+  Start LspMessage: lsp:initialize
+  Complete LspMessage: lsp:initialize
 Exit process messages loop
-Incoming NotificationMessage: initialized
+Incoming NotificationMessage: lsp:initialized
 Entering process messages loop
-  Start LspMessage: initialized
-  Complete LspMessage: initialized
+  Start LspMessage: lsp:initialized
+  Complete LspMessage: lsp:initialized
 Exit process messages loop
-Incoming NotificationMessage: textDocument/didOpen
+Incoming NotificationMessage: lsp:textDocument/didOpen
 Entering process messages loop
-  Start LspMessage: textDocument/didOpen
-  Complete LspMessage: textDocument/didOpen
+  Start LspMessage: lsp:textDocument/didOpen
+  Complete LspMessage: lsp:textDocument/didOpen
 Exit process messages loop
-Incoming RequestMessage: textDocument/completion
+Incoming RequestMessage: lsp:textDocument/completion
 Entering process messages loop
-  Start LspMessage: textDocument/completion
-Incoming RequestMessage: textDocument/completion
-Canceled in progress request textDocument/completion
-Incoming RequestMessage: textDocument/completion
-Canceled in progress request textDocument/completion
-Canceled request on queue textDocument/completion
-  Complete LspMessage: textDocument/completion
-  Start LspMessage: textDocument/completion
-  Complete LspMessage: textDocument/completion
-  Start LspMessage: textDocument/completion
-  Complete LspMessage: textDocument/completion
+  Start LspMessage: lsp:textDocument/completion
+Incoming RequestMessage: lsp:textDocument/completion
+Canceled in progress request lsp:textDocument/completion
+Incoming RequestMessage: lsp:textDocument/completion
+Canceled in progress request lsp:textDocument/completion
+Canceled request on queue lsp:textDocument/completion
+  Complete LspMessage: lsp:textDocument/completion
+  Start LspMessage: lsp:textDocument/completion
+  Complete LspMessage: lsp:textDocument/completion
+  Start LspMessage: lsp:textDocument/completion
+  Complete LspMessage: lsp:textDocument/completion
 Exit process messages loop
 ''');
   }
@@ -244,15 +244,15 @@
     await initialAnalysis;
     await pumpEventQueue(times: 5000);
     _assertLogContents(testView!, r'''
-Incoming RequestMessage: initialize
+Incoming RequestMessage: lsp:initialize
 Entering process messages loop
-  Start LspMessage: initialize
-  Complete LspMessage: initialize
+  Start LspMessage: lsp:initialize
+  Complete LspMessage: lsp:initialize
 Exit process messages loop
-Incoming NotificationMessage: initialized
+Incoming NotificationMessage: lsp:initialized
 Entering process messages loop
-  Start LspMessage: initialized
-  Complete LspMessage: initialized
+  Start LspMessage: lsp:initialized
+  Complete LspMessage: lsp:initialized
 Exit process messages loop
 ''');
   }
@@ -274,23 +274,23 @@
     await pumpEventQueue(times: 5000);
 
     _assertLogContents(testView!, r'''
-Incoming RequestMessage: initialize
+Incoming RequestMessage: lsp:initialize
 Entering process messages loop
-  Start LspMessage: initialize
-  Complete LspMessage: initialize
+  Start LspMessage: lsp:initialize
+  Complete LspMessage: lsp:initialize
 Exit process messages loop
-Incoming NotificationMessage: initialized
+Incoming NotificationMessage: lsp:initialized
 Entering process messages loop
-  Start LspMessage: initialized
-  Complete LspMessage: initialized
+  Start LspMessage: lsp:initialized
+  Complete LspMessage: lsp:initialized
 Exit process messages loop
-Incoming RequestMessage: textDocument/documentSymbol
+Incoming RequestMessage: lsp:textDocument/documentSymbol
 Entering process messages loop
-  Start LspMessage: textDocument/documentSymbol
-Incoming RequestMessage: textDocument/documentLink
-  Complete LspMessage: textDocument/documentSymbol
-  Start LspMessage: textDocument/documentLink
-  Complete LspMessage: textDocument/documentLink
+  Start LspMessage: lsp:textDocument/documentSymbol
+Incoming RequestMessage: lsp:textDocument/documentLink
+  Complete LspMessage: lsp:textDocument/documentSymbol
+  Start LspMessage: lsp:textDocument/documentLink
+  Complete LspMessage: lsp:textDocument/documentLink
 Exit process messages loop
 ''');
   }
@@ -325,26 +325,26 @@
     await pumpEventQueue(times: 5000);
 
     _assertLogContents(testView!, r'''
-Incoming RequestMessage: initialize
+Incoming RequestMessage: lsp:initialize
 Entering process messages loop
-  Start LspMessage: initialize
-  Complete LspMessage: initialize
+  Start LspMessage: lsp:initialize
+  Complete LspMessage: lsp:initialize
 Exit process messages loop
-Incoming NotificationMessage: initialized
+Incoming NotificationMessage: lsp:initialized
 Entering process messages loop
-  Start LspMessage: initialized
-  Complete LspMessage: initialized
+  Start LspMessage: lsp:initialized
+  Complete LspMessage: lsp:initialized
 Exit process messages loop
-Incoming RequestMessage: textDocument/codeAction
+Incoming RequestMessage: lsp:textDocument/codeAction
 Entering process messages loop
-  Start LspMessage: textDocument/codeAction
-  Complete LspMessage: textDocument/codeAction
+  Start LspMessage: lsp:textDocument/codeAction
+  Complete LspMessage: lsp:textDocument/codeAction
 Exit process messages loop
-Incoming RequestMessage: workspace/executeCommand
+Incoming RequestMessage: lsp:workspace/executeCommand
 Entering process messages loop
-  Start LspMessage: workspace/executeCommand
+  Start LspMessage: lsp:workspace/executeCommand
 Incoming ResponseMessage: ResponseMessage
-  Complete LspMessage: workspace/executeCommand
+  Complete LspMessage: lsp:workspace/executeCommand
 Exit process messages loop
 ''');
   }
diff --git a/pkg/analysis_server/test/lsp/document_highlights_test.dart b/pkg/analysis_server/test/lsp/document_highlights_test.dart
index 995b22b..fc30285 100644
--- a/pkg/analysis_server/test/lsp/document_highlights_test.dart
+++ b/pkg/analysis_server/test/lsp/document_highlights_test.dart
@@ -66,6 +66,43 @@
 var b = /*[1*/a/*1]*/;
 ''');
 
+  Future<void> test_dotShorthand_class() => _testMarkedContent('''
+A topA = ./*[0*/^a/*0]*/;
+class A {
+  static A get /*[1*/a/*1]*/ => A();
+}
+void fn(A a) => print(a);
+void f() {
+  A a = ./*[2*/a/*2]*/;
+  fn(./*[3*/a/*3]*/);
+  A aa = A./*[4*/a/*4]*/;
+}
+''');
+
+  Future<void> test_dotShorthand_enum() => _testMarkedContent('''
+const A constA = ./*[0*/^a/*0]*/;
+enum A { /*[1*/a/*1]*/ }
+void fn(A a) => print(a);
+void f() {
+  A a = ./*[2*/a/*2]*/;
+  fn(./*[3*/a/*3]*/);
+  A aa = A./*[4*/a/*4]*/;
+}
+''');
+
+  Future<void> test_dotShorthand_extensionType() => _testMarkedContent('''
+A topA = ./*[0*/^a/*0]*/;
+extension type A(int x) {
+  static A get /*[1*/a/*1]*/ => A(1);
+}
+void fn(A a) => print(a);
+void f() {
+  A a = ./*[2*/a/*2]*/;
+  fn(./*[3*/a/*3]*/);
+  A aa = A./*[4*/a/*4]*/;
+}
+''');
+
   Future<void> test_forInLoop() => _testMarkedContent('''
 void f() {
   for (final /*[0*/x^/*0]*/ in []) {
diff --git a/pkg/analysis_server/test/lsp/type_definition_test.dart b/pkg/analysis_server/test/lsp/type_definition_test.dart
index 3933c81..c1c4a6c 100644
--- a/pkg/analysis_server/test/lsp/type_definition_test.dart
+++ b/pkg/analysis_server/test/lsp/type_definition_test.dart
@@ -47,6 +47,76 @@
     expect(result.targetRange, rangeOfString(code, 'class A {}'));
   }
 
+  Future<void> test_dotShorthand_class() async {
+    var code = TestCode.parse('''
+void f() {
+  A a = ./*[0*/gett^er/*0]*/;
+}
+
+class /*[1*/A/*1]*/ {
+  static A get getter => A();
+}
+  ''');
+
+    var ranges = code.ranges.ranges;
+    var originRange = ranges[0];
+    var targetRange = ranges[1];
+    var result = await _getResult(code);
+    expect(result.originSelectionRange, originRange);
+    expect(result.targetUri, mainFileUri);
+    expect(result.targetSelectionRange, targetRange);
+    expect(
+      result.targetRange,
+      rangeOfPattern(code, RegExp(r'class A \{.*\}', dotAll: true)),
+    );
+  }
+
+  Future<void> test_dotShorthand_enum() async {
+    var code = TestCode.parse('''
+void f() {
+  A a = ./*[0*/on^e/*0]*/;
+}
+
+enum /*[1*/A/*1]*/ { one }
+  ''');
+
+    var ranges = code.ranges.ranges;
+    var originRange = ranges[0];
+    var targetRange = ranges[1];
+    var result = await _getResult(code);
+    expect(result.originSelectionRange, originRange);
+    expect(result.targetUri, mainFileUri);
+    expect(result.targetSelectionRange, targetRange);
+    expect(result.targetRange, rangeOfString(code, 'enum A { one }'));
+  }
+
+  Future<void> test_dotShorthand_extensionType() async {
+    var code = TestCode.parse('''
+void f() {
+  A a = ./*[0*/gett^er/*0]*/;
+}
+
+extension type /*[1*/A/*1]*/(int x) {
+  static A get getter => A(1);
+}
+  ''');
+
+    var ranges = code.ranges.ranges;
+    var originRange = ranges[0];
+    var targetRange = ranges[1];
+    var result = await _getResult(code);
+    expect(result.originSelectionRange, originRange);
+    expect(result.targetUri, mainFileUri);
+    expect(result.targetSelectionRange, targetRange);
+    expect(
+      result.targetRange,
+      rangeOfPattern(
+        code,
+        RegExp(r'extension type A\(int x\) \{.*\}', dotAll: true),
+      ),
+    );
+  }
+
   Future<void> test_doubleLiteral() async {
     var code = TestCode.parse('''
 const a = [!12^.3!];
diff --git a/pkg/analysis_server/test/plugin/protocol_dart_test.dart b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
index 403ccfa..933379f 100644
--- a/pkg/analysis_server/test/plugin/protocol_dart_test.dart
+++ b/pkg/analysis_server/test/plugin/protocol_dart_test.dart
@@ -157,7 +157,7 @@
 enum E2 { three, four }''');
     {
       var engineElement = findElement2.enum_('_E1');
-      expect(engineElement.metadata2.hasDeprecated, isTrue);
+      expect(engineElement.metadata.hasDeprecated, isTrue);
       // create notification Element
       var element = convertElement(engineElement);
       expect(element.kind, ElementKind.ENUM);
@@ -174,7 +174,7 @@
       expect(element.parameters, isNull);
       expect(
         element.flags,
-        (engineElement.metadata2.hasDeprecated ? Element.FLAG_DEPRECATED : 0) |
+        (engineElement.metadata.hasDeprecated ? Element.FLAG_DEPRECATED : 0) |
             Element.FLAG_PRIVATE,
       );
     }
@@ -211,7 +211,7 @@
       expect(element.parameters, isNull);
       expect(element.returnType, '_E1');
       var classElement = engineElement.enclosingElement;
-      expect(classElement.metadata2.hasDeprecated, isTrue);
+      expect(classElement.metadata.hasDeprecated, isTrue);
       expect(
         element.flags,
         // Element.FLAG_DEPRECATED |
diff --git a/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart b/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart
index 0805e8e..e444707 100644
--- a/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart
+++ b/pkg/analysis_server/test/services/completion/dart/location/dart_doc_test.dart
@@ -76,6 +76,23 @@
 ''');
   }
 
+  Future<void> test_enumConstant() async {
+    allowedIdentifiers = const {'value1'};
+    await computeSuggestions('''
+enum MyEnum {
+  /// This doc should suggest the commented enum constant name [val^].
+  value1
+}
+''');
+    assertResponse(r'''
+replacement
+  left: 3
+suggestions
+  value1
+    kind: enumConstant
+''');
+  }
+
   Future<void> test_extension() async {
     allowedIdentifiers = const {'MyExt'};
     await computeSuggestions('''
diff --git a/pkg/analyzer/CHANGELOG.md b/pkg/analyzer/CHANGELOG.md
index 43d5bac..0639019 100644
--- a/pkg/analyzer/CHANGELOG.md
+++ b/pkg/analyzer/CHANGELOG.md
@@ -36,6 +36,7 @@
 * Deprecate `InterfaceElement.constructors2`, use `constructors` instead.
 * Deprecate `InterfaceFragment.constructors2`, use `constructors` instead.
 * Deprecate `JoinPatternVariableElement.variables2`, use `variables` instead.
+* Deprecate `Annotatable.metadata2`, use `metadata` instead.
 
 ## 7.4.1
 * Restore `InstanceElement.augmented` getter.
diff --git a/pkg/analyzer/api.txt b/pkg/analyzer/api.txt
index c294f41..6269a79 100644
--- a/pkg/analyzer/api.txt
+++ b/pkg/analyzer/api.txt
@@ -2989,7 +2989,8 @@
   Annotatable (class extends Object):
     new (constructor: Annotatable Function())
     documentationComment (getter: String?)
-    metadata2 (getter: Metadata)
+    metadata (getter: Metadata)
+    metadata2 (getter: Metadata, deprecated)
   BindPatternVariableElement (class extends Object implements PatternVariableElement):
     new (constructor: BindPatternVariableElement Function())
     firstFragment (getter: BindPatternVariableFragment)
diff --git a/pkg/analyzer/lib/dart/element/element.dart b/pkg/analyzer/lib/dart/element/element.dart
index add008c..d4c8586 100644
--- a/pkg/analyzer/lib/dart/element/element.dart
+++ b/pkg/analyzer/lib/dart/element/element.dart
@@ -186,6 +186,16 @@
   ///
   /// The list will be empty if the receiver does not have any metadata or if
   /// the library containing this element has not yet been fully resolved.
+  Metadata get metadata;
+
+  /// The metadata associated with the element or fragment.
+  ///
+  /// If the receiver is an element that has fragments, the list will include
+  /// all of the metadata from all of the fragments.
+  ///
+  /// The list will be empty if the receiver does not have any metadata or if
+  /// the library containing this element has not yet been fully resolved.
+  @Deprecated('Use metadata instead')
   Metadata get metadata2;
 }
 
diff --git a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
index 3f65159..c30c1e7 100644
--- a/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/ast/to_source_visitor.dart
@@ -227,7 +227,10 @@
   void visitComment(Comment node) {}
 
   @override
-  void visitCommentReference(CommentReference node) {}
+  void visitCommentReference(CommentReference node) {
+    sink.write(node.newKeyword?.lexeme ?? '');
+    _visitNode(prefix: '[', node.expression, suffix: ']');
+  }
 
   @override
   void visitCompilationUnit(CompilationUnit node) {
diff --git a/pkg/analyzer/lib/src/dart/element/element.dart b/pkg/analyzer/lib/src/dart/element/element.dart
index df0fd9b..90ce2ae 100644
--- a/pkg/analyzer/lib/src/dart/element/element.dart
+++ b/pkg/analyzer/lib/src/dart/element/element.dart
@@ -62,7 +62,7 @@
 
 abstract class AnnotatableElementImpl implements ElementImpl2, Annotatable {
   @override
-  MetadataImpl get metadata2;
+  MetadataImpl get metadata;
 }
 
 /// Shared implementation for an augmentable [Fragment].
@@ -1497,10 +1497,14 @@
   Null get library2 => null;
 
   @override
-  Metadata get metadata2 {
+  MetadataImpl get metadata {
     return MetadataImpl(const []);
   }
 
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
   @override
   String get name3 => 'dynamic';
 
@@ -1543,6 +1547,13 @@
   Null get libraryFragment => null;
 
   @override
+  MetadataImpl get metadata => MetadataImpl(metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   String get name2 => 'dynamic';
 
   @override
@@ -1998,9 +2009,13 @@
   Null get documentationComment => null;
 
   @override
-  MetadataImpl get metadata2 {
+  MetadataImpl get metadata {
     return MetadataImpl(annotations);
   }
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
 }
 
 abstract class ElementImpl2 implements Element {
@@ -2250,7 +2265,7 @@
   List<FormalParameterElementMixin> get formalParameters;
 
   @override
-  MetadataImpl get metadata2;
+  MetadataImpl get metadata;
 
   @override
   TypeImpl get returnType;
@@ -2509,9 +2524,9 @@
   bool get isSynchronous => !isAsynchronous;
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   @override
@@ -2674,9 +2689,9 @@
   ElementKind get kind => ElementKind.EXTENSION;
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   @override
@@ -3129,9 +3144,9 @@
   LibraryElementImpl get library2 => library;
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   @override
@@ -3486,6 +3501,13 @@
   }
 
   @override
+  MetadataImpl get metadata => MetadataImpl(metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   // TODO(augmentations): Support chaining between the fragments.
   FormalParameterFragmentImpl? get nextFragment => null;
 
@@ -3551,14 +3573,17 @@
     return buffer.toString();
   }
 
-  MetadataImpl get metadata2 {
+  MetadataImpl get metadata {
     var annotations = <ElementAnnotationImpl>[];
     for (var fragment in _fragments) {
-      annotations.addAll((fragment as FragmentImpl).metadata);
+      annotations.addAll((fragment as FragmentImpl).metadata3);
     }
     return MetadataImpl(annotations);
   }
 
+  @Deprecated('Use metadata instead')
+  MetadataImpl get metadata2 => metadata;
+
   Version? get sinceSdkVersion {
     if (this is Element) {
       return SinceSdkVersionComputer().compute(this as Element);
@@ -3828,16 +3853,14 @@
   Source? get librarySource => library?.source;
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     return _metadata;
   }
 
-  set metadata(List<ElementAnnotationImpl> metadata) {
+  set metadata3(List<ElementAnnotationImpl> metadata) {
     _metadata = metadata;
   }
 
-  MetadataImpl get metadata2 => MetadataImpl(metadata);
-
   @override
   String? get name => _name;
 
@@ -4007,7 +4030,8 @@
   ///
   /// The array will be empty if the element does not have any metadata or if
   /// the library containing this element has not yet been resolved.
-  List<ElementAnnotation> get metadata;
+  // TODO(scheglov): replace with `metadata` in [Annotatable] fragments.
+  List<ElementAnnotation> get metadata3;
 
   /// The name of this element, or `null` if this element does not have a name.
   String? get name;
@@ -4195,7 +4219,11 @@
   LibraryElementImpl get library2 => _wrappedElement.library;
 
   @override
-  Metadata get metadata2 => _wrappedElement.metadata2;
+  MetadataImpl get metadata => _wrappedElement.metadata;
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
 
   @override
   String? get name3 => _wrappedElement.name;
@@ -4554,7 +4582,11 @@
   LibraryElementImpl get library2 => firstFragment.library;
 
   @override
-  MetadataImpl get metadata2 => firstFragment.metadata2;
+  MetadataImpl get metadata => firstFragment.metadata;
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
 
   @override
   @trackedDirectlyExpensive
@@ -4947,9 +4979,9 @@
   }
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   @override
@@ -6021,10 +6053,14 @@
   String? get lookupName => null;
 
   @override
-  MetadataImpl get metadata2 {
+  MetadataImpl get metadata {
     return MetadataImpl(annotations);
   }
 
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
   @override
   String? get name3 => name;
 
@@ -6192,7 +6228,7 @@
     if (reference is ExportedReferenceExported) {
       for (var location in reference.locations) {
         var export = location.exportOf(this);
-        if (!export.metadata2.hasDeprecated) {
+        if (!export.metadata.hasDeprecated) {
           return false;
         }
       }
@@ -6524,9 +6560,16 @@
   Source get librarySource => library.source;
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  MetadataImpl get metadata => MetadataImpl(metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   List<MixinFragmentImpl> get mixins {
@@ -6883,7 +6926,11 @@
   bool get isStatic => _wrappedElement.isStatic;
 
   @override
-  MetadataImpl get metadata2 => _wrappedElement.metadata2;
+  MetadataImpl get metadata => _wrappedElement.metadata;
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
 
   @override
   TypeImpl get returnType => _wrappedElement.returnType;
@@ -6978,7 +7025,11 @@
   }
 
   @override
-  Metadata get metadata2 => wrappedElement.metadata2;
+  MetadataImpl get metadata => MetadataImpl(_wrappedElement.metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
 
   @override
   TypeImpl get type => _wrappedElement.type;
@@ -8081,10 +8132,14 @@
   Null get library2 => null;
 
   @override
-  Metadata get metadata2 {
+  MetadataImpl get metadata {
     return MetadataImpl(const []);
   }
 
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
   @override
   String get name3 => 'Never';
 
@@ -8138,6 +8193,13 @@
   Null get libraryFragment => null;
 
   @override
+  MetadataImpl get metadata => MetadataImpl(metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   String get name2 => 'Never';
 
   @override
@@ -8907,9 +8969,9 @@
   }
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   @override
@@ -8950,7 +9012,7 @@
   GetterElement2OrMember? get getter2;
 
   @override
-  MetadataImpl get metadata2;
+  MetadataImpl get metadata;
 
   @override
   SetterElement2OrMember? get setter2;
@@ -9047,6 +9109,13 @@
   }
 
   @override
+  MetadataImpl get metadata => MetadataImpl(metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   FragmentImpl get nonSynthetic {
     if (isSynthetic) {
       if (enclosingElement3 is EnumFragmentImpl) {
@@ -9703,9 +9772,9 @@
   LibraryElementImpl get library2 => library;
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   @override
@@ -10031,9 +10100,9 @@
   }
 
   @override
-  List<ElementAnnotationImpl> get metadata {
+  List<ElementAnnotationImpl> get metadata3 {
     linkedData?.read(this);
-    return super.metadata;
+    return super.metadata3;
   }
 
   @override
@@ -10269,6 +10338,13 @@
   }
 
   @override
+  MetadataImpl get metadata => MetadataImpl(metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   String get name {
     return super.name!;
   }
@@ -10370,6 +10446,13 @@
 
   ElementLinkedData? get linkedData;
 
+  @override
+  MetadataImpl get metadata => MetadataImpl(metadata3);
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
   /// The type parameters declared by this element directly.
   ///
   /// This does not include type parameters that are declared by any enclosing
diff --git a/pkg/analyzer/lib/src/dart/element/extensions.dart b/pkg/analyzer/lib/src/dart/element/extensions.dart
index 1552e79..0521b46 100644
--- a/pkg/analyzer/lib/src/dart/element/extensions.dart
+++ b/pkg/analyzer/lib/src/dart/element/extensions.dart
@@ -9,7 +9,6 @@
 import 'package:analyzer/src/dart/element/element.dart';
 import 'package:analyzer/src/dart/element/type.dart';
 import 'package:analyzer/src/generated/utilities_dart.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:analyzer/src/utilities/extensions/string.dart';
 import 'package:meta/meta_meta.dart';
 
@@ -33,25 +32,25 @@
   /// annotation.
   bool get hasOrInheritsDoNotStore {
     if (this case Annotatable annotatable) {
-      if (annotatable.metadata2.hasDoNotStore) {
+      if (annotatable.metadata.hasDoNotStore) {
         return true;
       }
     }
 
     var ancestor = enclosingElement;
     if (ancestor is InterfaceElement) {
-      if (ancestor.metadata2.hasDoNotStore) {
+      if (ancestor.metadata.hasDoNotStore) {
         return true;
       }
       ancestor = ancestor.enclosingElement;
     } else if (ancestor is ExtensionElement) {
-      if (ancestor.metadata2.hasDoNotStore) {
+      if (ancestor.metadata.hasDoNotStore) {
         return true;
       }
       ancestor = ancestor.enclosingElement;
     }
 
-    return ancestor is LibraryElement && ancestor.metadata2.hasDoNotStore;
+    return ancestor is LibraryElement && ancestor.metadata.hasDoNotStore;
   }
 
   /// Return `true` if this element is an instance member of a class or mixin.
@@ -120,7 +119,7 @@
     if (interfaceElement == null) {
       return const <TargetKind>{};
     }
-    for (var annotation in interfaceElement.metadata) {
+    for (var annotation in interfaceElement.metadata.annotations) {
       if (annotation.isTarget) {
         var value = annotation.computeConstantValue();
         if (value == null) {
diff --git a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
index 6fe73d0..3a10358 100644
--- a/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
+++ b/pkg/analyzer/lib/src/dart/element/generic_inferrer.dart
@@ -796,7 +796,7 @@
     if (errorEntity is ConstructorName &&
         !(errorEntity.type.type as InterfaceType)
             .element3
-            .metadata2
+            .metadata
             .hasOptionalTypeArgs) {
       String constructorName =
           errorEntity.name == null
@@ -831,12 +831,12 @@
           var type = element.type;
           var typeElement = type is InterfaceType ? type.element3 : null;
           if (typeElement != null &&
-              typeElement.metadata2.hasOptionalTypeArgs) {
+              typeElement.metadata.hasOptionalTypeArgs) {
             return;
           }
           var typeAliasElement = type.alias?.element2;
           if (typeAliasElement != null &&
-              typeAliasElement.metadata2.hasOptionalTypeArgs) {
+              typeAliasElement.metadata.hasOptionalTypeArgs) {
             return;
           }
         }
@@ -977,7 +977,7 @@
 extension on Element {
   bool get hasOptionalTypeArgs {
     if (this case Annotatable annotatable) {
-      return annotatable.metadata2.hasOptionalTypeArgs;
+      return annotatable.metadata.hasOptionalTypeArgs;
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/dart/element/member.dart b/pkg/analyzer/lib/src/dart/element/member.dart
index e047cd8..2d4cebe 100644
--- a/pkg/analyzer/lib/src/dart/element/member.dart
+++ b/pkg/analyzer/lib/src/dart/element/member.dart
@@ -284,6 +284,13 @@
   Source get librarySource => _declaration.librarySource!;
 
   @override
+  MetadataImpl get metadata => baseElement.metadata;
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   int get nameOffset => declaration.nameOffset;
 
   @override
@@ -478,7 +485,7 @@
   });
 
   @override
-  FieldElement get baseElement => _element2;
+  FieldElementImpl2 get baseElement => _element2;
 
   @override
   List<Element> get children2 => const [];
@@ -554,6 +561,13 @@
   String? get lookupName => _element2.lookupName;
 
   @override
+  MetadataImpl get metadata => baseElement.metadata;
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   String get name => declaration.name;
 
   @override
@@ -579,7 +593,7 @@
   Source? get source => _declaration.source;
 
   @override
-  FieldElement get _element2 => declaration.asElement2;
+  FieldElementImpl2 get _element2 => declaration.asElement2;
 
   @override
   T? accept2<T>(ElementVisitor2<T> visitor) {
@@ -788,9 +802,7 @@
   Source? get librarySource => _declaration.librarySource;
 
   @override
-  List<ElementAnnotation> get metadata => _declaration.metadata;
-
-  MetadataImpl get metadata2 => declaration.metadata2;
+  List<ElementAnnotation> get metadata3 => _declaration.metadata3;
 
   @override
   String? get name => _declaration.name;
@@ -1041,6 +1053,13 @@
   String? get lookupName => _element2.lookupName;
 
   @override
+  MetadataImpl get metadata => baseElement.metadata;
+
+  @Deprecated('Use metadata instead')
+  @override
+  MetadataImpl get metadata2 => metadata;
+
+  @override
   String get name => declaration.name;
 
   @override
diff --git a/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart b/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart
index e3d9651..c1cfbb1 100644
--- a/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart
+++ b/pkg/analyzer/lib/src/dart/element/since_sdk_version.dart
@@ -57,7 +57,7 @@
   /// Returns the maximal specified `@Since()` version, `null` if none.
   static Version? _specifiedVersion(Annotatable element) {
     var annotations =
-        element.metadata2.annotations.cast<ElementAnnotationImpl>();
+        element.metadata.annotations.cast<ElementAnnotationImpl>();
     Version? result;
     for (var annotation in annotations) {
       if (annotation.isDartInternalSince) {
diff --git a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
index 49f3964..e626d63 100644
--- a/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/exit_detector.dart
@@ -715,7 +715,7 @@
   static bool _elementExits(Element? element) {
     if (element is ExecutableElement) {
       var declaration = element.baseElement;
-      return declaration.metadata2.hasAlwaysThrows ||
+      return declaration.metadata.hasAlwaysThrows ||
           identical(declaration.returnType, NeverTypeImpl.instance);
     }
 
diff --git a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
index 747672d..a9bdb9f 100644
--- a/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
+++ b/pkg/analyzer/lib/src/dart/resolver/resolution_visitor.dart
@@ -551,7 +551,7 @@
   void visitExportDirective(covariant ExportDirectiveImpl node) {
     var element = node.libraryExport;
     if (element != null) {
-      _setElementAnnotations(node.metadata, element.metadata2.annotations);
+      _setElementAnnotations(node.metadata, element.metadata.annotations);
     }
 
     _withElementWalker(null, () {
@@ -961,7 +961,7 @@
   void visitImportDirective(covariant ImportDirectiveImpl node) {
     var element = node.libraryImport;
     if (element != null) {
-      _setElementAnnotations(node.metadata, element.metadata2.annotations);
+      _setElementAnnotations(node.metadata, element.metadata.annotations);
     }
 
     _withElementWalker(null, () {
@@ -1024,7 +1024,7 @@
     ++_libraryDirectiveIndex;
     var element = node.element2;
     if (element is LibraryElementImpl && _libraryDirectiveIndex == 1) {
-      _setElementAnnotations(node.metadata, element.metadata2.annotations);
+      _setElementAnnotations(node.metadata, element.metadata.annotations);
     }
 
     _withElementWalker(null, () {
@@ -1132,7 +1132,7 @@
   void visitPartDirective(covariant PartDirectiveImpl node) {
     var partInclude = node.partInclude;
     if (partInclude != null) {
-      _setElementAnnotations(node.metadata, partInclude.metadata2.annotations);
+      _setElementAnnotations(node.metadata, partInclude.metadata.annotations);
     }
 
     _withElementWalker(null, () {
@@ -1824,9 +1824,9 @@
       annotations.accept(this);
     }
     if (_elementWalker != null) {
-      _setElementAnnotations(annotations, element.metadata);
+      _setElementAnnotations(annotations, element.metadata3);
     } else if (annotations.isNotEmpty) {
-      element.metadata =
+      element.metadata3 =
           annotations.map((annotation) {
             return annotation.elementAnnotation!;
           }).toList();
diff --git a/pkg/analyzer/lib/src/error/annotation_verifier.dart b/pkg/analyzer/lib/src/error/annotation_verifier.dart
index 94c3727..edb240f 100644
--- a/pkg/analyzer/lib/src/error/annotation_verifier.dart
+++ b/pkg/analyzer/lib/src/error/annotation_verifier.dart
@@ -475,7 +475,7 @@
       return;
     }
 
-    for (var annotation in declaredElement.metadata2.annotations) {
+    for (var annotation in declaredElement.metadata.annotations) {
       if (annotation.isVisibleForTemplate) {
         return;
       }
diff --git a/pkg/analyzer/lib/src/error/best_practices_verifier.dart b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
index 51698a8..b1360ee 100644
--- a/pkg/analyzer/lib/src/error/best_practices_verifier.dart
+++ b/pkg/analyzer/lib/src/error/best_practices_verifier.dart
@@ -129,9 +129,9 @@
        _widgetPreviewVerifier = WidgetPreviewVerifier(_errorReporter),
        _workspacePackage = workspacePackage {
     _deprecatedVerifier.pushInDeprecatedValue(
-      _currentLibrary.metadata2.hasDeprecated,
+      _currentLibrary.metadata.hasDeprecated,
     );
-    _inDoNotStoreMember = _currentLibrary.metadata2.hasDoNotStore;
+    _inDoNotStoreMember = _currentLibrary.metadata.hasDoNotStore;
   }
 
   @override
@@ -203,8 +203,8 @@
     _invalidAccessVerifier._enclosingClass = element;
 
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
-    _deprecatedVerifier.pushInDeprecatedValue(element.metadata2.hasDeprecated);
-    if (element.metadata2.hasDoNotStore) {
+    _deprecatedVerifier.pushInDeprecatedValue(element.metadata.hasDeprecated);
+    if (element.metadata.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
 
@@ -225,7 +225,7 @@
     _checkForImmutable(node);
     _checkForInvalidSealedSuperclass(node);
     _deprecatedVerifier.pushInDeprecatedValue(
-      node.declaredFragment!.element.metadata2.hasDeprecated,
+      node.declaredFragment!.element.metadata.hasDeprecated,
     );
 
     try {
@@ -275,7 +275,7 @@
       body: node.body,
       initializers: node.initializers,
     );
-    _deprecatedVerifier.pushInDeprecatedValue(element.metadata2.hasDeprecated);
+    _deprecatedVerifier.pushInDeprecatedValue(element.metadata.hasDeprecated);
     try {
       super.visitConstructorDeclaration(node);
     } finally {
@@ -310,7 +310,7 @@
       }
     }
     _deprecatedVerifier.pushInDeprecatedValue(
-      node.declaredFragment!.element.metadata2.hasDeprecated,
+      node.declaredFragment!.element.metadata.hasDeprecated,
     );
 
     try {
@@ -323,7 +323,7 @@
   @override
   void visitEnumDeclaration(EnumDeclaration node) {
     _deprecatedVerifier.pushInDeprecatedValue(
-      node.declaredFragment!.element.metadata2.hasDeprecated,
+      node.declaredFragment!.element.metadata.hasDeprecated,
     );
 
     try {
@@ -351,7 +351,7 @@
   @override
   void visitExtensionDeclaration(ExtensionDeclaration node) {
     _deprecatedVerifier.pushInDeprecatedValue(
-      node.declaredFragment!.element.metadata2.hasDeprecated,
+      node.declaredFragment!.element.metadata.hasDeprecated,
     );
 
     try {
@@ -370,7 +370,7 @@
   @override
   void visitExtensionTypeDeclaration(ExtensionTypeDeclaration node) {
     _deprecatedVerifier.pushInDeprecatedValue(
-      node.declaredFragment!.element.metadata2.hasDeprecated,
+      node.declaredFragment!.element.metadata.hasDeprecated,
     );
 
     try {
@@ -443,8 +443,8 @@
   void visitFunctionDeclaration(FunctionDeclaration node) {
     bool wasInDoNotStoreMember = _inDoNotStoreMember;
     var element = node.declaredFragment!.element;
-    _deprecatedVerifier.pushInDeprecatedValue(element.metadata2.hasDeprecated);
-    if (element.metadata2.hasDoNotStore) {
+    _deprecatedVerifier.pushInDeprecatedValue(element.metadata.hasDeprecated);
+    if (element.metadata.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
     try {
@@ -495,7 +495,7 @@
     _checkStrictInferenceReturnType(node.returnType, node, node.name.lexeme);
     _checkStrictInferenceInParameters(node.parameters);
     _deprecatedVerifier.pushInDeprecatedValue(
-      node.declaredFragment!.element.metadata2.hasDeprecated,
+      node.declaredFragment!.element.metadata.hasDeprecated,
     );
 
     try {
@@ -532,7 +532,7 @@
       );
     }
     _deprecatedVerifier.pushInDeprecatedValue(
-      node.declaredFragment!.element.metadata2.hasDeprecated,
+      node.declaredFragment!.element.metadata.hasDeprecated,
     );
 
     try {
@@ -581,8 +581,8 @@
     var element = node.declaredFragment!.element;
     var enclosingElement = element.enclosingElement;
 
-    _deprecatedVerifier.pushInDeprecatedValue(element.metadata2.hasDeprecated);
-    if (element.metadata2.hasDoNotStore) {
+    _deprecatedVerifier.pushInDeprecatedValue(element.metadata.hasDeprecated);
+    if (element.metadata.hasDoNotStore) {
       _inDoNotStoreMember = true;
     }
     try {
@@ -655,7 +655,7 @@
     _enclosingClass = element;
     _invalidAccessVerifier._enclosingClass = _enclosingClass;
 
-    _deprecatedVerifier.pushInDeprecatedValue(element.metadata2.hasDeprecated);
+    _deprecatedVerifier.pushInDeprecatedValue(element.metadata.hasDeprecated);
 
     try {
       _checkForImmutable(node);
@@ -900,7 +900,7 @@
       Set<InterfaceElement> visited,
     ) {
       if (visited.add(element)) {
-        if (element.metadata2.hasImmutable) {
+        if (element.metadata.hasImmutable) {
           return true;
         }
         for (InterfaceType interface in element.mixins) {
@@ -981,7 +981,7 @@
     var libraryElement = libraryExport.exportedLibrary2;
     if (libraryElement == null) return;
 
-    if (libraryElement.metadata2.hasInternal) {
+    if (libraryElement.metadata.hasInternal) {
       _errorReporter.atNode(
         node,
         WarningCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT,
@@ -993,7 +993,7 @@
     );
     exportNamespace.definedNames2.forEach((String name, Element element) {
       if (element case Annotatable annotatable) {
-        if (annotatable.metadata2.hasInternal) {
+        if (annotatable.metadata.hasInternal) {
           _errorReporter.atNode(
             node,
             WarningCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT,
@@ -1010,7 +1010,7 @@
         ];
         for (var type in signatureTypes) {
           var aliasElement = type?.alias?.element2;
-          if (aliasElement != null && aliasElement.metadata2.hasInternal) {
+          if (aliasElement != null && aliasElement.metadata.hasInternal) {
             _errorReporter.atNode(
               node,
               WarningCode.INVALID_EXPORT_OF_INTERNAL_ELEMENT_INDIRECTLY,
@@ -1036,7 +1036,7 @@
     // `Element.hasOrInheritsSealed`?
     for (InterfaceType supertype in element.allSupertypes) {
       var superclass = supertype.element3;
-      if (superclass.metadata2.hasSealed) {
+      if (superclass.metadata.hasSealed) {
         if (!currentPackageContains(superclass)) {
           if (element is MixinElement &&
               element.superclassConstraints.contains(supertype)) {
@@ -1132,7 +1132,7 @@
     if (constructor == null) {
       return;
     }
-    if (!node.isConst && constructor.metadata2.hasLiteral && node.canBeConst) {
+    if (!node.isConst && constructor.metadata.hasLiteral && node.canBeConst) {
       // Echoing jwren's `TODO` from _checkForDeprecatedMemberUse:
       // TODO(jwren): We should modify ConstructorElement.getDisplayName(), or
       // have the logic centralized elsewhere, instead of doing this logic
@@ -1361,7 +1361,7 @@
 
   void _checkRequiredParameter(FormalParameterList node) {
     var requiredParameters = node.parameters.where(
-      (p) => p.declaredFragment?.element.metadata2.hasRequired == true,
+      (p) => p.declaredFragment?.element.metadata.hasRequired == true,
     );
     var nonNamedParamsWithRequired = requiredParameters.where(
       (p) => p.isPositional,
@@ -1564,11 +1564,11 @@
   static bool _hasNonVirtualAnnotation(ExecutableElement element) {
     if (element is PropertyAccessorElement && element.isSynthetic) {
       var variable = element.variable3;
-      if (variable != null && variable.metadata2.hasNonVirtual) {
+      if (variable != null && variable.metadata.hasNonVirtual) {
         return true;
       }
     }
-    return element.metadata2.hasNonVirtual;
+    return element.metadata.hasNonVirtual;
   }
 
   /// Checks for the passed as expression for the [WarningCode.UNNECESSARY_CAST]
@@ -1999,13 +1999,13 @@
 
   bool _hasDoNotSubmit(Element element) {
     if (element case Annotatable annotatable) {
-      if (annotatable.metadata2.hasDoNotSubmit) {
+      if (annotatable.metadata.hasDoNotSubmit) {
         return true;
       }
     }
     if (element is PropertyAccessorElement) {
       var variable = element.variable3;
-      return variable != null && variable.metadata2.hasDoNotSubmit;
+      return variable != null && variable.metadata.hasDoNotSubmit;
     }
     return false;
   }
@@ -2022,14 +2022,14 @@
 
   bool _hasVisibleForOverriding(Element element) {
     if (element case Annotatable annotatable) {
-      if (annotatable.metadata2.hasVisibleForOverriding) {
+      if (annotatable.metadata.hasVisibleForOverriding) {
         return true;
       }
     }
 
     if (element is PropertyAccessorElement) {
       var variable = element.variable3;
-      return variable != null && variable.metadata2.hasVisibleForOverriding;
+      return variable != null && variable.metadata.hasVisibleForOverriding;
     }
 
     return false;
@@ -2040,13 +2040,13 @@
       return false;
     }
     if (element case Annotatable annotatable) {
-      if (annotatable.metadata2.hasVisibleForTemplate) {
+      if (annotatable.metadata.hasVisibleForTemplate) {
         return true;
       }
     }
     if (element is PropertyAccessorElement) {
       var variable = element.variable3;
-      if (variable != null && variable.metadata2.hasVisibleForTemplate) {
+      if (variable != null && variable.metadata.hasVisibleForTemplate) {
         return true;
       }
     }
@@ -2059,13 +2059,13 @@
 
   bool _hasVisibleOutsideTemplate(Element element) {
     if (element case Annotatable annotatable) {
-      if (annotatable.metadata2.hasVisibleOutsideTemplate) {
+      if (annotatable.metadata.hasVisibleOutsideTemplate) {
         return true;
       }
     }
     if (element is PropertyAccessorElement) {
       var variable = element.variable3;
-      if (variable != null && variable.metadata2.hasVisibleOutsideTemplate) {
+      if (variable != null && variable.metadata.hasVisibleOutsideTemplate) {
         return true;
       }
     }
diff --git a/pkg/analyzer/lib/src/error/const_argument_verifier.dart b/pkg/analyzer/lib/src/error/const_argument_verifier.dart
index 5fb2cc8..2ca2afd 100644
--- a/pkg/analyzer/lib/src/error/const_argument_verifier.dart
+++ b/pkg/analyzer/lib/src/error/const_argument_verifier.dart
@@ -26,7 +26,7 @@
     } else if (node
             .rightHandSide
             .correspondingParameter
-            ?.metadata2
+            ?.metadata
             .hasMustBeConst ??
         false) {
       // If the operator is not `=`, then the argument cannot be const, as it
@@ -103,7 +103,7 @@
         continue;
       }
 
-      if (parameter.metadata2.hasMustBeConst) {
+      if (parameter.metadata.hasMustBeConst) {
         Expression resolvedArgument;
         if (parameter.isNamed) {
           resolvedArgument = (argument as NamedExpression).expression;
diff --git a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
index 8491022..e97b66c 100644
--- a/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
+++ b/pkg/analyzer/lib/src/error/deprecated_member_use_verifier.dart
@@ -258,7 +258,9 @@
       }
       element = variable;
     }
-    var annotation = element.metadata.firstWhereOrNull((e) => e.isDeprecated);
+    var annotation = element.metadataAnnotations.firstWhereOrNull(
+      (e) => e.isDeprecated,
+    );
     if (annotation == null || annotation.element2 is PropertyAccessorElement) {
       return null;
     }
@@ -284,10 +286,10 @@
     if (element is PropertyAccessorElement && element.isSynthetic) {
       // TODO(brianwilkerson): Why isn't this the implementation for PropertyAccessorElement?
       var variable = element.variable3;
-      return variable != null && variable.metadata2.hasDeprecated;
+      return variable != null && variable.metadata.hasDeprecated;
     }
     if (element is Annotatable) {
-      return (element as Annotatable).metadata2.hasDeprecated;
+      return (element as Annotatable).metadata.hasDeprecated;
     }
     return false;
   }
diff --git a/pkg/analyzer/lib/src/error/inheritance_override.dart b/pkg/analyzer/lib/src/error/inheritance_override.dart
index 7b0e5bd..542026d 100644
--- a/pkg/analyzer/lib/src/error/inheritance_override.dart
+++ b/pkg/analyzer/lib/src/error/inheritance_override.dart
@@ -983,7 +983,7 @@
         if (method.isStatic) {
           continue;
         }
-        if (method.metadata2.hasMustBeOverridden) {
+        if (method.metadata.hasMustBeOverridden) {
           var methodDeclaration = classElement.getMethod(method.name3!);
           if (methodDeclaration == null || methodDeclaration.isAbstract) {
             notOverridden.add(method.baseElement);
@@ -997,8 +997,8 @@
         if (getter.isStatic) {
           continue;
         }
-        if (getter.metadata2.hasMustBeOverridden ||
-            (getter.variable3?.metadata2.hasMustBeOverridden ?? false)) {
+        if (getter.metadata.hasMustBeOverridden ||
+            (getter.variable3?.metadata.hasMustBeOverridden ?? false)) {
           var declaration = classElement.getGetter(getter.name3!);
           if (declaration == null || declaration.isAbstract) {
             notOverridden.add(getter);
@@ -1012,8 +1012,8 @@
         if (setter.isStatic) {
           continue;
         }
-        if (setter.metadata2.hasMustBeOverridden ||
-            (setter.variable3?.metadata2.hasMustBeOverridden ?? false)) {
+        if (setter.metadata.hasMustBeOverridden ||
+            (setter.variable3?.metadata.hasMustBeOverridden ?? false)) {
           var declaration = classElement.getSetter(setter.name3!);
           if (declaration == null || declaration.isAbstract) {
             notOverridden.add(setter);
diff --git a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
index 050aacb..cdc98df 100644
--- a/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
+++ b/pkg/analyzer/lib/src/error/must_call_super_verifier.dart
@@ -127,11 +127,11 @@
           member = ancestor.getSetter(name);
       }
 
-      if (member is MethodElement && member.metadata2.hasMustCallSuper) {
+      if (member is MethodElement && member.metadata.hasMustCallSuper) {
         return member;
       }
       if (member is PropertyAccessorElement &&
-          member.metadata2.hasMustCallSuper) {
+          member.metadata.hasMustCallSuper) {
         return member;
       }
       // TODO(srawlins): What about a field annotated with `@mustCallSuper`?
diff --git a/pkg/analyzer/lib/src/error/override_verifier.dart b/pkg/analyzer/lib/src/error/override_verifier.dart
index 04c37ea..afa859c 100644
--- a/pkg/analyzer/lib/src/error/override_verifier.dart
+++ b/pkg/analyzer/lib/src/error/override_verifier.dart
@@ -42,7 +42,7 @@
   void visitFieldDeclaration(FieldDeclaration node) {
     for (VariableDeclaration field in node.fields.variables) {
       var fieldElement = field.declaredFragment?.element as FieldElement;
-      if (fieldElement.metadata2.hasOverride) {
+      if (fieldElement.metadata.hasOverride) {
         var getter = fieldElement.getter2;
         if (getter != null && _isOverride(getter)) continue;
 
@@ -60,7 +60,7 @@
   @override
   void visitMethodDeclaration(MethodDeclaration node) {
     var element = node.declaredFragment!.element;
-    if (element.metadata2.hasOverride && !_isOverride(element)) {
+    if (element.metadata.hasOverride && !_isOverride(element)) {
       switch (element) {
         case MethodElement():
           _errorReporter.atToken(
diff --git a/pkg/analyzer/lib/src/error/redeclare_verifier.dart b/pkg/analyzer/lib/src/error/redeclare_verifier.dart
index 9b7c646..ce07ad3 100644
--- a/pkg/analyzer/lib/src/error/redeclare_verifier.dart
+++ b/pkg/analyzer/lib/src/error/redeclare_verifier.dart
@@ -37,7 +37,7 @@
     // Static members can't redeclare.
     if (element.isStatic) return;
 
-    if (element.metadata2.hasRedeclare && !_redeclaresMember(element)) {
+    if (element.metadata.hasRedeclare && !_redeclaresMember(element)) {
       switch (element) {
         case MethodElement():
           _errorReporter.atToken(
diff --git a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
index 654cb31..a61dea4 100644
--- a/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
+++ b/pkg/analyzer/lib/src/error/required_parameters_verifier.dart
@@ -226,7 +226,7 @@
     FormalParameterElement element,
   ) {
     var annotation =
-        element.metadata2.annotations.firstWhereOrNull((e) => e.isRequired)
+        element.metadata.annotations.firstWhereOrNull((e) => e.isRequired)
             as ElementAnnotationImpl?;
     if (annotation != null) {
       return _RequiredAnnotation(annotation);
diff --git a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
index 8ec777c..1f10412 100644
--- a/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
+++ b/pkg/analyzer/lib/src/error/type_arguments_verifier.dart
@@ -633,7 +633,7 @@
   /// - [type] does not have any `dynamic` type arguments.
   /// - the element is marked with `@optionalTypeArgs` from "package:meta".
   bool _isMissingTypeArguments(AstNode node, DartType type, Element? element) {
-    var elementMetadata = element.ifTypeOrNull<Annotatable>()?.metadata2;
+    var elementMetadata = element.ifTypeOrNull<Annotatable>()?.metadata;
     if (elementMetadata == null) {
       return false;
     }
diff --git a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
index 5e8586e..754702a 100644
--- a/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
+++ b/pkg/analyzer/lib/src/error/unused_local_elements_verifier.dart
@@ -78,7 +78,7 @@
   void visitClassDeclaration(ClassDeclaration node) {
     var element = node.declaredFragment?.element;
     if (element != null) {
-      if (element.metadata2.hasJS) {
+      if (element.metadata.hasJS) {
         usedElements.addElement(element);
       }
     }
@@ -1128,7 +1128,7 @@
 
   static bool _hasPragmaVmEntryPoint(Element element) {
     return element is Annotatable &&
-        ((element as Annotatable).metadata2 as MetadataImpl)
+        ((element as Annotatable).metadata as MetadataImpl)
             .hasPragmaVmEntryPoint;
   }
 }
diff --git a/pkg/analyzer/lib/src/error/use_result_verifier.dart b/pkg/analyzer/lib/src/error/use_result_verifier.dart
index 2123379..31dffd6 100644
--- a/pkg/analyzer/lib/src/error/use_result_verifier.dart
+++ b/pkg/analyzer/lib/src/error/use_result_verifier.dart
@@ -185,7 +185,7 @@
     }
 
     if (element case Annotatable annotatable) {
-      return annotatable.metadata2.annotations.firstWhereOrNull(
+      return annotatable.metadata.annotations.firstWhereOrNull(
         (e) => e.isUseResult,
       );
     }
diff --git a/pkg/analyzer/lib/src/fine/manifest_item.dart b/pkg/analyzer/lib/src/fine/manifest_item.dart
index db56880..c82e71b 100644
--- a/pkg/analyzer/lib/src/fine/manifest_item.dart
+++ b/pkg/analyzer/lib/src/fine/manifest_item.dart
@@ -43,7 +43,7 @@
     ) {
       return ClassItem(
         id: id,
-        metadata: ManifestMetadata.encode(context, element.metadata2),
+        metadata: ManifestMetadata.encode(context, element.metadata),
         typeParameters: typeParameters,
         declaredConflicts: {},
         declaredFields: {},
@@ -108,7 +108,7 @@
     ) {
       return EnumItem(
         id: id,
-        metadata: ManifestMetadata.encode(context, element.metadata2),
+        metadata: ManifestMetadata.encode(context, element.metadata),
         typeParameters: typeParameters,
         declaredConflicts: {},
         declaredFields: {},
@@ -173,7 +173,7 @@
     ) {
       return ExtensionItem(
         id: id,
-        metadata: ManifestMetadata.encode(context, element.metadata2),
+        metadata: ManifestMetadata.encode(context, element.metadata),
         typeParameters: typeParameters,
         declaredConflicts: {},
         declaredFields: {},
@@ -244,7 +244,7 @@
     ) {
       return ExtensionTypeItem(
         id: id,
-        metadata: ManifestMetadata.encode(context, element.metadata2),
+        metadata: ManifestMetadata.encode(context, element.metadata),
         typeParameters: typeParameters,
         declaredConflicts: {},
         declaredFields: {},
@@ -522,7 +522,7 @@
   }) {
     return InstanceItemFieldItem(
       id: id,
-      metadata: ManifestMetadata.encode(context, element.metadata2),
+      metadata: ManifestMetadata.encode(context, element.metadata),
       isStatic: element.isStatic,
       type: element.type.encode(context),
       constInitializer: element.constantInitializer2?.expression.encode(
@@ -715,7 +715,7 @@
   }) {
     return InstanceItemMethodItem(
       id: id,
-      metadata: ManifestMetadata.encode(context, element.metadata2),
+      metadata: ManifestMetadata.encode(context, element.metadata),
       isStatic: element.isStatic,
       functionType: element.type.encode(context),
     );
@@ -891,7 +891,7 @@
     return context.withFormalParameters(element.formalParameters, () {
       return InterfaceItemConstructorItem(
         id: id,
-        metadata: ManifestMetadata.encode(context, element.metadata2),
+        metadata: ManifestMetadata.encode(context, element.metadata),
         isStatic: false,
         isConst: element.isConst,
         isFactory: element.isFactory,
@@ -1159,7 +1159,7 @@
     ) {
       return MixinItem(
         id: id,
-        metadata: ManifestMetadata.encode(context, element.metadata2),
+        metadata: ManifestMetadata.encode(context, element.metadata),
         typeParameters: typeParameters,
         declaredConflicts: {},
         declaredFields: {},
@@ -1226,7 +1226,7 @@
   }) {
     return TopLevelFunctionItem(
       id: id,
-      metadata: ManifestMetadata.encode(context, element.metadata2),
+      metadata: ManifestMetadata.encode(context, element.metadata),
       functionType: element.type.encode(context),
     );
   }
@@ -1365,7 +1365,7 @@
   }) {
     return TopLevelVariableItem(
       id: id,
-      metadata: ManifestMetadata.encode(context, element.metadata2),
+      metadata: ManifestMetadata.encode(context, element.metadata),
       type: element.type.encode(context),
       constInitializer: element.constantInitializer2?.expression.encode(
         context,
@@ -1421,7 +1421,7 @@
     ) {
       return TypeAliasItem(
         id: id,
-        metadata: ManifestMetadata.encode(context, element.metadata2),
+        metadata: ManifestMetadata.encode(context, element.metadata),
         typeParameters: typeParameters,
         aliasedType: element.aliasedType.encode(context),
       );
@@ -1492,7 +1492,7 @@
     if (this case PropertyAccessorElementImpl2 accessor) {
       return accessor.thisOrVariableMetadata;
     }
-    return metadata2;
+    return metadata;
   }
 }
 
@@ -1560,9 +1560,9 @@
 extension _PropertyAccessExtension on PropertyAccessorElementImpl2 {
   MetadataImpl get thisOrVariableMetadata {
     if (isSynthetic) {
-      return variable3!.metadata2;
+      return variable3!.metadata;
     } else {
-      return metadata2;
+      return metadata;
     }
   }
 }
diff --git a/pkg/analyzer/lib/src/generated/error_verifier.dart b/pkg/analyzer/lib/src/generated/error_verifier.dart
index a681826..9724141 100644
--- a/pkg/analyzer/lib/src/generated/error_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/error_verifier.dart
@@ -6156,7 +6156,7 @@
             if (typeSystem.isPotentiallyNonNullable(type)) {
               var parameterName = _parameterName(parameter);
               var errorTarget = parameterName ?? parameter;
-              if (parameterElement.metadata2.hasRequired) {
+              if (parameterElement.metadata.hasRequired) {
                 errorReporter.atEntity(
                   errorTarget,
                   CompileTimeErrorCode
diff --git a/pkg/analyzer/lib/src/generated/ffi_verifier.dart b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
index ed0238e..6e19d54 100644
--- a/pkg/analyzer/lib/src/generated/ffi_verifier.dart
+++ b/pkg/analyzer/lib/src/generated/ffi_verifier.dart
@@ -305,12 +305,12 @@
     // Ensure there is at most one @DefaultAsset annotation per library
     var hasDefaultAsset = false;
 
-    if (node.element2 case LibraryElement library) {
-      for (var metadata in library.metadata) {
-        var annotationValue = metadata.computeConstantValue();
+    if (node.element2 case LibraryElementImpl library) {
+      for (var annotation in library.metadata.annotations) {
+        var annotationValue = annotation.computeConstantValue();
         if (annotationValue != null && annotationValue.isDefaultAsset) {
           if (hasDefaultAsset) {
-            var name = (metadata as ElementAnnotationImpl).annotationAst.name;
+            var name = annotation.annotationAst.name;
             _errorReporter.atNode(
               name,
               FfiCode.FFI_NATIVE_INVALID_DUPLICATE_DEFAULT_ASSET,
@@ -454,7 +454,7 @@
         formalParameterList?.parameters ?? <FormalParameter>[];
     var hadNativeAnnotation = false;
 
-    for (var annotation in declarationElement.metadata) {
+    for (var annotation in declarationElement.metadataAnnotations) {
       var annotationValue = annotation.computeConstantValue();
       var annotationType = annotationValue?.type; // Native<T>
 
@@ -1738,7 +1738,7 @@
     };
 
     if (referencedElement != null) {
-      for (var annotation in referencedElement.metadata) {
+      for (var annotation in referencedElement.metadataAnnotations) {
         var value = annotation.computeConstantValue();
         var annotationType = value?.type;
 
@@ -2279,7 +2279,7 @@
 extension on TopLevelFunctionElement {
   /// @Native(isLeaf: true) external function.
   bool get isNativeLeaf {
-    for (var annotation in metadata2.annotations) {
+    for (var annotation in metadata.annotations) {
       if (annotation.isNativeLeaf) {
         return true;
       }
@@ -2291,7 +2291,7 @@
 extension on MethodElement {
   /// @Native(isLeaf: true) external function.
   bool get isNativeLeaf {
-    for (var annotation in metadata2.annotations) {
+    for (var annotation in metadata.annotations) {
       if (annotation.isNativeLeaf) {
         return true;
       }
diff --git a/pkg/analyzer/lib/src/summary2/bundle_reader.dart b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
index 90ed963..f5ead46 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_reader.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_reader.dart
@@ -129,7 +129,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
     _readTypeParameters(reader, element.typeParameters);
     element.supertype = reader._readOptionalInterfaceType();
     element.mixins = reader._readInterfaceTypeList();
@@ -217,7 +217,7 @@
   void _read(element, reader) {
     _addEnclosingElementTypeParameters(reader, element);
 
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
     reader._addFormalParameters(element.parameters);
     _readFormalParameters(reader, element.parameters);
     element.superConstructor =
@@ -302,7 +302,7 @@
     List<FormalParameterFragmentImpl> parameters,
   ) {
     for (var parameter in parameters) {
-      parameter.metadata = reader._readAnnotationList(unitElement: unitElement);
+      parameter.metadata3 = reader._readAnnotationList(unitElement: unitElement);
       _readTypeParameters(reader, parameter.typeParameters);
       _readFormalParameters(reader, parameter.parameters);
       parameter.type = reader.readRequiredType();
@@ -325,7 +325,7 @@
   ) {
     reader._addTypeParameters(typeParameters);
     for (var typeParameter in typeParameters) {
-      typeParameter.metadata = reader._readAnnotationList(
+      typeParameter.metadata3 = reader._readAnnotationList(
         unitElement: unitElement,
       );
       typeParameter.bound = reader.readType();
@@ -351,7 +351,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(
+    element.metadata3 = reader._readAnnotationList(
       unitElement: element.enclosingElement3,
     );
     _readTypeParameters(reader, element.typeParameters);
@@ -380,7 +380,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(
+    element.metadata3 = reader._readAnnotationList(
       unitElement: element.enclosingElement3,
     );
     _readTypeParameters(reader, element.typeParameters);
@@ -410,7 +410,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(
+    element.metadata3 = reader._readAnnotationList(
       unitElement: element.enclosingElement3,
     );
     _readTypeParameters(reader, element.typeParameters);
@@ -438,7 +438,7 @@
   @override
   void _read(element, reader) {
     _addEnclosingElementTypeParameters(reader, element);
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
     element.type = reader.readRequiredType();
 
     if (element is ConstFieldFragmentImpl) {
@@ -470,7 +470,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
     _readTypeParameters(reader, element.typeParameters);
     element.returnType = reader.readRequiredType();
     _readFormalParameters(reader, element.parameters);
@@ -1862,7 +1862,7 @@
   @override
   void _read(element, reader) {
     _addEnclosingElementTypeParameters(reader, element);
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
     _readTypeParameters(reader, element.typeParameters);
     _readFormalParameters(reader, element.parameters);
     element.returnType = reader.readRequiredType();
@@ -1887,7 +1887,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(
+    element.metadata3 = reader._readAnnotationList(
       unitElement: element.enclosingElement3,
     );
     _readTypeParameters(reader, element.typeParameters);
@@ -1918,7 +1918,7 @@
   void _read(element, reader) {
     _addEnclosingElementTypeParameters(reader, element);
 
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
 
     element.returnType = reader.readRequiredType();
     _readFormalParameters(reader, element.parameters);
@@ -2303,7 +2303,7 @@
         // TODO(scheglov): reuse for formal parameters
         _localElements.length -= typeParameters.length;
         if (unitElement != null) {
-          element.metadata = _readAnnotationList(unitElement: unitElement);
+          element.metadata3 = _readAnnotationList(unitElement: unitElement);
         }
         return element;
       } else {
@@ -2320,7 +2320,7 @@
         // TODO(scheglov): reuse for formal parameters
         _localElements.length -= typeParameters.length;
         if (unitElement != null) {
-          element.metadata = _readAnnotationList(unitElement: unitElement);
+          element.metadata3 = _readAnnotationList(unitElement: unitElement);
         }
         return element;
       }
@@ -2435,7 +2435,7 @@
     for (var typeParameter in typeParameters) {
       typeParameter.bound = readType();
       if (unitElement != null) {
-        typeParameter.metadata = _readAnnotationList(unitElement: unitElement);
+        typeParameter.metadata3 = _readAnnotationList(unitElement: unitElement);
       }
     }
     return typeParameters;
@@ -2474,7 +2474,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
     element.type = reader.readRequiredType();
 
     if (element is ConstTopLevelVariableFragmentImpl) {
@@ -2506,7 +2506,7 @@
 
   @override
   void _read(element, reader) {
-    element.metadata = reader._readAnnotationList(unitElement: unitElement);
+    element.metadata3 = reader._readAnnotationList(unitElement: unitElement);
     _readTypeParameters(reader, element.typeParameters);
     element.aliasedElement = reader._readAliasedElement(unitElement);
     element.aliasedType = reader.readRequiredType();
diff --git a/pkg/analyzer/lib/src/summary2/bundle_writer.dart b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
index b2ceb56..8ec1327 100644
--- a/pkg/analyzer/lib/src/summary2/bundle_writer.dart
+++ b/pkg/analyzer/lib/src/summary2/bundle_writer.dart
@@ -110,7 +110,7 @@
 
     // Write resolution data for the library.
     _sink.writeUInt30(_resolutionSink.offset);
-    _resolutionSink._writeAnnotationList(libraryElement.metadata);
+    _resolutionSink._writeAnnotationList(libraryElement.metadata.annotations);
     _resolutionSink.writeElement(libraryElement.entryPoint2);
     _writeFieldNameNonPromotabilityInfo(
       libraryElement.fieldNameNonPromotabilityInfo,
@@ -133,7 +133,7 @@
     _writeFragmentName(fragment);
     ClassElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       _resolutionSink.writeType(fragment.supertype);
@@ -163,7 +163,7 @@
     _sink._writeOptionalStringReference(element.typeName);
     _sink._writeStringReference(element.name2);
     ConstructorElementFlags.write(_sink, element);
-    _resolutionSink._writeAnnotationList(element.metadata);
+    _resolutionSink._writeAnnotationList(element.metadata3);
 
     _resolutionSink.localElements.withElements(element.parameters, () {
       _writeList(element.parameters, _writeParameterElement);
@@ -216,7 +216,7 @@
     _writeFragmentName(fragment);
     EnumElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       _resolutionSink.writeType(fragment.supertype);
@@ -267,7 +267,7 @@
     _writeFragmentName(fragment);
     ExtensionElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       var element = fragment.element;
@@ -292,7 +292,7 @@
     _writeFragmentName(fragment);
     ExtensionTypeElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       _resolutionSink._writeTypeList(fragment.interfaces);
@@ -327,7 +327,7 @@
     _sink.writeBool(element is ConstFieldFragmentImpl);
     FieldElementFlags.write(_sink, element);
     _sink._writeTopLevelInferenceError(element.typeInferenceError);
-    _resolutionSink._writeAnnotationList(element.metadata);
+    _resolutionSink._writeAnnotationList(element.metadata3);
     _resolutionSink.writeType(element.type);
     _resolutionSink._writeOptionalNode(element.constantInitializer);
   }
@@ -364,7 +364,7 @@
     _writeFragmentName(fragment);
     FunctionElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       _resolutionSink.writeType(fragment.returnType);
@@ -428,7 +428,7 @@
     _sink._writeStringReference(fragment.name);
     MethodElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       _writeList(fragment.parameters, _writeParameterElement);
@@ -445,7 +445,7 @@
     _writeFragmentName(fragment);
     MixinElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       _resolutionSink._writeTypeList(fragment.superclassConstraints);
@@ -498,7 +498,7 @@
     _sink._writeFormalParameterKind(element);
     ParameterElementFlags.write(_sink, element);
 
-    _resolutionSink._writeAnnotationList(element.metadata);
+    _resolutionSink._writeAnnotationList(element.metadata3);
 
     _writeTypeParameters(element.typeParameters, () {
       _writeList(element.parameters, _writeParameterElement);
@@ -534,7 +534,7 @@
     _writeFragmentName(fragment);
     PropertyAccessorElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
     _resolutionSink.writeType(fragment.returnType);
     _writeList(fragment.parameters, _writeParameterElement);
 
@@ -577,7 +577,7 @@
     _sink.writeBool(fragment.isConst);
     TopLevelVariableElementFlags.write(_sink, fragment);
     _sink._writeTopLevelInferenceError(fragment.typeInferenceError);
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
     _resolutionSink.writeType(fragment.type);
 
     _resolutionSink._writeOptionalNode(fragment.constantInitializer);
@@ -593,7 +593,7 @@
     _sink.writeBool(fragment.isFunctionTypeAliasBased);
     TypeAliasElementFlags.write(_sink, fragment);
 
-    _resolutionSink._writeAnnotationList(fragment.metadata);
+    _resolutionSink._writeAnnotationList(fragment.metadata3);
 
     _writeTypeParameters(fragment.typeParameters, () {
       _resolutionSink._writeAliasedElement(fragment.aliasedElement);
@@ -605,7 +605,7 @@
     _sink._writeStringReference(element.name);
     _writeFragmentName(element);
     _sink.writeByte(_encodeVariance(element).index);
-    _resolutionSink._writeAnnotationList(element.metadata);
+    _resolutionSink._writeAnnotationList(element.metadata3);
     _resolutionSink.writeType(element.bound);
     _resolutionSink.writeType(element.defaultType);
   }
@@ -921,7 +921,7 @@
         );
       }, withAnnotations: withAnnotations);
       if (withAnnotations) {
-        _writeAnnotationList(parameter.metadata);
+        _writeAnnotationList(parameter.metadata3);
       }
     }
   }
@@ -1014,7 +1014,7 @@
       for (var typeParameter in typeParameters) {
         writeType(typeParameter.bound);
         if (withAnnotations) {
-          _writeAnnotationList(typeParameter.metadata);
+          _writeAnnotationList(typeParameter.metadata3);
         }
       }
       f();
diff --git a/pkg/analyzer/lib/src/summary2/detach_nodes.dart b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
index 3a328d4..f922b66 100644
--- a/pkg/analyzer/lib/src/summary2/detach_nodes.dart
+++ b/pkg/analyzer/lib/src/summary2/detach_nodes.dart
@@ -62,7 +62,7 @@
   @override
   void visitElement(Element element) {
     if (element case Annotatable annotatable) {
-      for (var annotation in annotatable.metadata2.annotations) {
+      for (var annotation in annotatable.metadata.annotations) {
         var ast = (annotation as ElementAnnotationImpl).annotationAst;
         _detachNode(ast);
         _sanitizeArguments(ast.arguments?.arguments);
diff --git a/pkg/analyzer/lib/src/summary2/element_builder.dart b/pkg/analyzer/lib/src/summary2/element_builder.dart
index 51f5872..19ef6cc 100644
--- a/pkg/analyzer/lib/src/summary2/element_builder.dart
+++ b/pkg/analyzer/lib/src/summary2/element_builder.dart
@@ -90,13 +90,13 @@
       switch (firstDirective) {
         case ExportDirectiveImpl():
           firstDirectiveMetadata =
-              firstDirective.libraryExport?.metadata2.annotations;
+              firstDirective.libraryExport?.metadata.annotations;
         case ImportDirectiveImpl():
           firstDirectiveMetadata =
-              firstDirective.libraryImport?.metadata2.annotations;
+              firstDirective.libraryImport?.metadata.annotations;
         case PartDirectiveImpl():
           firstDirectiveMetadata =
-              firstDirective.partInclude?.metadata2.annotations;
+              firstDirective.partInclude?.metadata.annotations;
         case LibraryDirectiveImpl():
           // Impossible, since there is no library directive.
           break;
@@ -131,7 +131,7 @@
       fragment.isSealed = true;
     }
     fragment.hasExtendsClause = node.extendsClause != null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -203,7 +203,7 @@
       fragment.isAbstract = true;
       fragment.isSealed = true;
     }
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -265,7 +265,7 @@
     element.isConst = node.constKeyword != null;
     element.isExternal = node.externalKeyword != null;
     element.isFactory = node.factoryKeyword != null;
-    element.metadata = _buildAnnotations(node.metadata);
+    element.metadata3 = _buildAnnotations(node.metadata);
     element.typeName = node.returnType.name;
     element.typeNameOffset = node.returnType.offset;
     element.periodOffset = node.period?.offset;
@@ -310,7 +310,7 @@
     fragment.name2 = name2;
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isAugmentation = node.augmentKeyword != null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -366,7 +366,7 @@
       field.nameOffset2 = _getFragmentNameOffset(nameToken);
       _setCodeRange(field, constant);
       _setDocumentation(field, constant);
-      field.metadata = _buildAnnotationsWithUnit(
+      field.metadata3 = _buildAnnotationsWithUnit(
         _unitElement,
         constant.metadata,
       );
@@ -538,7 +538,7 @@
     fragment.name2 = name2;
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isAugmentation = node.augmentKeyword != null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -624,7 +624,7 @@
     fragment.name2 = name2;
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isAugmentation = node.augmentKeyword != null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -724,7 +724,7 @@
       fragment.isFinal = node.fields.isFinal;
       fragment.isLate = node.fields.isLate;
       fragment.isStatic = node.isStatic;
-      fragment.metadata = metadata;
+      fragment.metadata3 = metadata;
       _setCodeRange(fragment, variable);
       _setDocumentation(fragment, node);
 
@@ -775,7 +775,7 @@
     fragment.name2 = _getFragmentName(nameToken);
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.hasImplicitType = node.type == null && node.parameters == null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
 
     node.declaredFragment = fragment;
@@ -937,7 +937,7 @@
     executableFragment.isAsynchronous = body.isAsynchronous;
     executableFragment.isExternal = node.externalKeyword != null;
     executableFragment.isGenerator = body.isGenerator;
-    executableFragment.metadata = _buildAnnotations(node.metadata);
+    executableFragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(executableFragment, node);
     _setDocumentation(executableFragment, node);
 
@@ -972,7 +972,7 @@
     fragment.name2 = name2;
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isFunctionTypeAliasBased = true;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -1057,7 +1057,7 @@
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isExplicitlyCovariant = node.covariantKeyword != null;
     fragment.isFinal = node.isFinal;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
 
     node.declaredFragment = fragment;
@@ -1124,7 +1124,7 @@
     fragment.name2 = name2;
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isAugmentation = node.augmentKeyword != null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -1270,7 +1270,7 @@
     executableFragment.isExternal =
         node.externalKeyword != null || node.body is NativeFunctionBody;
     executableFragment.isGenerator = node.body.isGenerator;
-    executableFragment.metadata = _buildAnnotations(node.metadata);
+    executableFragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(executableFragment, node);
     _setDocumentation(executableFragment, node);
 
@@ -1298,7 +1298,7 @@
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.isAugmentation = node.augmentKeyword != null;
     fragment.isBase = node.baseKeyword != null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
     _setDocumentation(fragment, node);
 
@@ -1439,7 +1439,7 @@
     fragment.hasImplicitType = node.type == null;
     fragment.isExplicitlyCovariant = node.covariantKeyword != null;
     fragment.isFinal = node.isFinal;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
 
     node.declaredFragment = fragment;
@@ -1480,7 +1480,7 @@
     fragment.name2 = _getFragmentName(nameToken);
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
     fragment.hasImplicitType = node.type == null && node.parameters == null;
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
 
     node.declaredFragment = fragment;
@@ -1541,7 +1541,7 @@
       fragment.isExternal = node.externalKeyword != null;
       fragment.isFinal = node.variables.isFinal;
       fragment.isLate = node.variables.isLate;
-      fragment.metadata = metadata;
+      fragment.metadata3 = metadata;
       _setCodeRange(fragment, variable);
       _setDocumentation(fragment, node);
 
@@ -1627,7 +1627,7 @@
     );
     fragment.name2 = _getFragmentName(nameToken);
     fragment.nameOffset2 = _getFragmentNameOffset(nameToken);
-    fragment.metadata = _buildAnnotations(node.metadata);
+    fragment.metadata3 = _buildAnnotations(node.metadata);
     _setCodeRange(fragment, node);
 
     node.declaredFragment = fragment;
@@ -1776,7 +1776,7 @@
     fieldFragment.name2 = _getFragmentName(fieldNameToken);
     fieldFragment.nameOffset2 = _getFragmentNameOffset(fieldNameToken);
     fieldFragment.isFinal = true;
-    fieldFragment.metadata = _buildAnnotations(representation.fieldMetadata);
+    fieldFragment.metadata3 = _buildAnnotations(representation.fieldMetadata);
 
     var fieldBeginToken =
         representation.fieldMetadata.beginToken ?? representation.fieldType;
diff --git a/pkg/analyzer/lib/src/summary2/informative_data.dart b/pkg/analyzer/lib/src/summary2/informative_data.dart
index 5639c72..9476a8b 100644
--- a/pkg/analyzer/lib/src/summary2/informative_data.dart
+++ b/pkg/analyzer/lib/src/summary2/informative_data.dart
@@ -2013,7 +2013,7 @@
 
   void applyToExports(List<LibraryExportImpl> elements) {
     for (var element in elements) {
-      applyToMetadataList(element.metadata2.annotations);
+      applyToMetadataList(element.metadata.annotations);
     }
   }
 
@@ -2029,12 +2029,12 @@
 
   void applyToImports(List<LibraryImportImpl> elements) {
     for (var element in elements) {
-      applyToMetadataList(element.metadata2.annotations);
+      applyToMetadataList(element.metadata.annotations);
     }
   }
 
   void applyToMetadata(FragmentImpl element) {
-    applyToMetadataList(element.metadata);
+    applyToMetadataList(element.metadata3);
   }
 
   void applyToMetadataList(List<ElementAnnotationImpl> metadata) {
@@ -2046,7 +2046,7 @@
 
   void applyToParts(List<PartIncludeImpl> elements) {
     for (var element in elements) {
-      applyToMetadataList(element.metadata2.annotations);
+      applyToMetadataList(element.metadata.annotations);
     }
   }
 
diff --git a/pkg/analyzer/lib/src/utilities/extensions/element.dart b/pkg/analyzer/lib/src/utilities/extensions/element.dart
index 7917667..c74ddb5 100644
--- a/pkg/analyzer/lib/src/utilities/extensions/element.dart
+++ b/pkg/analyzer/lib/src/utilities/extensions/element.dart
@@ -114,13 +114,13 @@
   /// Whether the element is effectively [internal].
   bool get isInternal {
     if (this case Annotatable annotatable) {
-      if (annotatable.metadata2.hasInternal) {
+      if (annotatable.metadata.hasInternal) {
         return true;
       }
     }
     if (this case PropertyAccessorElement accessor) {
       var variable = accessor.variable3;
-      if (variable != null && variable.metadata2.hasInternal) {
+      if (variable != null && variable.metadata.hasInternal) {
         return true;
       }
     }
@@ -132,17 +132,17 @@
     var self = this;
     if (self is PropertyAccessorElement &&
         self.enclosingElement is InterfaceElement) {
-      if (self.metadata2.hasProtected) {
+      if (self.metadata.hasProtected) {
         return true;
       }
       var variable = self.variable3;
-      if (variable != null && variable.metadata2.hasProtected) {
+      if (variable != null && variable.metadata.hasProtected) {
         return true;
       }
     }
     if (self is MethodElement &&
         self.enclosingElement is InterfaceElement &&
-        self.metadata2.hasProtected) {
+        self.metadata.hasProtected) {
       return true;
     }
     return false;
@@ -151,22 +151,22 @@
   /// Whether the element is effectively [visibleForTesting].
   bool get isVisibleForTesting {
     if (this case Annotatable annotatable) {
-      if (annotatable.metadata2.hasVisibleForTesting) {
+      if (annotatable.metadata.hasVisibleForTesting) {
         return true;
       }
     }
     if (this case PropertyAccessorElement accessor) {
       var variable = accessor.variable3;
-      if (variable != null && variable.metadata2.hasVisibleForTesting) {
+      if (variable != null && variable.metadata.hasVisibleForTesting) {
         return true;
       }
     }
     return false;
   }
 
-  List<ElementAnnotation> get metadata {
+  List<ElementAnnotation> get metadataAnnotations {
     if (this case Annotatable annotatable) {
-      return annotatable.metadata2.annotations;
+      return annotatable.metadata.annotations;
     }
     return [];
   }
@@ -176,7 +176,7 @@
   FragmentImpl? get enclosingElementImpl => enclosingElement3;
 
   AnnotationImpl annotationAst(int index) {
-    return metadata[index].annotationAst;
+    return metadata3[index].annotationAst;
   }
 }
 
diff --git a/pkg/analyzer/test/generated/simple_resolver_test.dart b/pkg/analyzer/test/generated/simple_resolver_test.dart
index b5b3301..a22aeff7 100644
--- a/pkg/analyzer/test/generated/simple_resolver_test.dart
+++ b/pkg/analyzer/test/generated/simple_resolver_test.dart
@@ -866,7 +866,7 @@
 const A = null;
 @A class C<A> {}''');
 
-    var annotations = findElement2.class_('C').metadata2.annotations;
+    var annotations = findElement2.class_('C').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var cDeclaration = findNode.classDeclaration('C<A>');
@@ -889,7 +889,7 @@
 mixin E {}
 ''');
 
-    var annotations = findElement2.class_('C').metadata2.annotations;
+    var annotations = findElement2.class_('C').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var cDeclaration = findNode.classTypeAlias('C<A>');
@@ -910,7 +910,7 @@
 @A enum E { A, B }
 ''');
 
-    var annotations = findElement2.enum_('E').metadata2.annotations;
+    var annotations = findElement2.enum_('E').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var eDeclaration = findNode.enumDeclaration('E');
@@ -930,7 +930,7 @@
 const A = null;
 @A extension E<A> on List<A> {}''');
 
-    var annotations = findElement2.extension_('E').metadata2.annotations;
+    var annotations = findElement2.extension_('E').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var cDeclaration = findNode.extensionDeclaration('E<A>');
@@ -952,7 +952,7 @@
   @A int f = 1;
 }''');
 
-    var metadata = findElement2.field('f').metadata2.annotations;
+    var metadata = findElement2.field('f').metadata.annotations;
     expect(metadata, hasLength(1));
   }
 
@@ -964,7 +964,7 @@
   C(@A this.f);
 }''');
 
-    var metadata = findElement2.fieldFormalParameter('f').metadata2.annotations;
+    var metadata = findElement2.fieldFormalParameter('f').metadata.annotations;
     expect(metadata, hasLength(1));
   }
 
@@ -973,7 +973,7 @@
 const A = null;
 @A f() {}''');
 
-    var annotations = findElement2.topFunction('f').metadata2.annotations;
+    var annotations = findElement2.topFunction('f').metadata.annotations;
     expect(annotations, hasLength(1));
   }
 
@@ -982,7 +982,7 @@
 const A = null;
 @A f<A>() {}''');
 
-    var annotations = findElement2.topFunction('f').metadata2.annotations;
+    var annotations = findElement2.topFunction('f').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var fDeclaration = findNode.functionDeclaration('f<A>');
@@ -1003,7 +1003,7 @@
 @A typedef F<A>(int A);
 ''');
 
-    var annotations = findElement2.typeAlias('F').metadata2.annotations;
+    var annotations = findElement2.typeAlias('F').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var fDeclaration = findNode.functionTypeAlias('F');
@@ -1023,7 +1023,7 @@
 const A = null;
 f(@A int p(int x)) {}''');
 
-    var metadata = findElement2.parameter('p').metadata2.annotations;
+    var metadata = findElement2.parameter('p').metadata.annotations;
     expect(metadata, hasLength(1));
   }
 
@@ -1032,7 +1032,7 @@
 const A = null;
 f(@A int p<A>(int x)) {}''');
 
-    var annotations = findElement2.parameter('p').metadata2.annotations;
+    var annotations = findElement2.parameter('p').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var pDeclaration = findNode.functionTypedFormalParameter('p<A>');
@@ -1053,7 +1053,7 @@
 @A typedef F<A> = A Function();
 ''');
 
-    var annotations = findElement2.typeAlias('F').metadata2.annotations;
+    var annotations = findElement2.typeAlias('F').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var fDeclaration = findNode.genericTypeAlias('F<A>');
@@ -1073,7 +1073,7 @@
 @A library lib;
 const A = null;''');
 
-    var metadata = result.libraryElement2.metadata2.annotations;
+    var metadata = result.libraryElement2.metadata.annotations;
     expect(metadata, hasLength(1));
   }
 
@@ -1084,7 +1084,7 @@
   @A void m() {}
 }''');
 
-    var metadata = findElement2.method('m').metadata2.annotations;
+    var metadata = findElement2.method('m').metadata.annotations;
     expect(metadata, hasLength(1));
   }
 
@@ -1095,7 +1095,7 @@
   @A void m<A>() {}
 }''');
 
-    var annotations = findElement2.method('m').metadata2.annotations;
+    var annotations = findElement2.method('m').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var mDeclaration = findNode.methodDeclaration('m<A>');
@@ -1115,7 +1115,7 @@
 const A = null;
 @A mixin M<A> on Object {}''');
 
-    var annotations = findElement2.mixin('M').metadata2.annotations;
+    var annotations = findElement2.mixin('M').metadata.annotations;
     expect(annotations, hasLength(1));
 
     var mDeclaration = findNode.mixinDeclaration('M<A>');
@@ -1135,7 +1135,7 @@
 const A = null;
 f({@A int p = 0}) {}''');
 
-    var metadata = findElement2.parameter('p').metadata2.annotations;
+    var metadata = findElement2.parameter('p').metadata.annotations;
     expect(metadata, hasLength(1));
   }
 
@@ -1144,7 +1144,7 @@
 const A = null;
 f([@A int p = 0]) {}''');
 
-    var metadata = findElement2.parameter('p').metadata2.annotations;
+    var metadata = findElement2.parameter('p').metadata.annotations;
     expect(metadata, hasLength(1));
   }
 
@@ -1153,8 +1153,8 @@
 const A = null;
 f(@A p1, @A int p2) {}''');
 
-    expect(findElement2.parameter('p1').metadata2.annotations, hasLength(1));
-    expect(findElement2.parameter('p2').metadata2.annotations, hasLength(1));
+    expect(findElement2.parameter('p1').metadata.annotations, hasLength(1));
+    expect(findElement2.parameter('p2').metadata.annotations, hasLength(1));
   }
 
   test_metadata_typedef() async {
@@ -1162,7 +1162,7 @@
 const A = null;
 @A typedef F<A>();''');
 
-    expect(findElement2.typeAlias('F').metadata2.annotations, hasLength(1));
+    expect(findElement2.typeAlias('F').metadata.annotations, hasLength(1));
 
     var annotation = findNode.annotation('@A');
     assertResolvedNodeText(annotation, r'''
diff --git a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
index 7ed687d..2776945 100644
--- a/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
+++ b/pkg/analyzer/test/src/dart/ast/to_source_visitor_test.dart
@@ -634,7 +634,7 @@
 /// [$code]
 void f() {}
 ''');
-    _assertSource('', findNode.commentReference(code));
+    _assertSource('[x]', findNode.commentReference(code));
   }
 
   void test_visitCompilationUnit_declaration() {
diff --git a/pkg/analyzer/test/src/dart/element/element_test.dart b/pkg/analyzer/test/src/dart/element/element_test.dart
index 3dd29f4..4cc1a70 100644
--- a/pkg/analyzer/test/src/dart/element/element_test.dart
+++ b/pkg/analyzer/test/src/dart/element/element_test.dart
@@ -6,7 +6,6 @@
 import 'package:analyzer/dart/element/element.dart';
 import 'package:analyzer/dart/element/type.dart';
 import 'package:analyzer/src/dart/element/type.dart';
-import 'package:analyzer/src/utilities/extensions/element.dart';
 import 'package:test/test.dart';
 import 'package:test_reflective_loader/test_reflective_loader.dart';
 
@@ -43,7 +42,7 @@
     var argument = findNode.integerLiteral('3');
     var parameter = argument.correspondingParameter!;
 
-    ElementAnnotation annotation = parameter.metadata[0];
+    ElementAnnotation annotation = parameter.metadata.annotations[0];
 
     DartObject value = annotation.computeConstantValue()!;
     expect(value.getField('f')!.toStringValue(), 'x');
diff --git a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
index c6e2a01..111764f 100644
--- a/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/local_variable_test.dart
@@ -28,13 +28,13 @@
 
     var x = findElement2.localVar('x');
     assertElement(
-      x.metadata2.annotations.single.element2,
+      x.metadata.annotations.single.element2,
       declaration: findElement2.topGet('a'),
     );
 
     var y = findElement2.localVar('y');
     assertElement(
-      y.metadata2.annotations.single.element2,
+      y.metadata.annotations.single.element2,
       declaration: findElement2.topGet('a'),
     );
   }
diff --git a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
index d2fa99a..260a7f1 100644
--- a/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
+++ b/pkg/analyzer/test/src/dart/resolution/metadata_test.dart
@@ -254,7 +254,7 @@
 ''');
 
     var localVariable = findElement2.localVar('x');
-    var annotationOnElement = localVariable.metadata2.annotations.first;
+    var annotationOnElement = localVariable.metadata.annotations.first;
     _assertElementAnnotationValueText(annotationOnElement, '''
 A
   a: int 3
@@ -1475,7 +1475,7 @@
 ''');
 
     var classC = findNode.namedType('C c').element2 as ClassElement;
-    var annotation = classC.metadata2.annotations.first;
+    var annotation = classC.metadata.annotations.first;
     _assertElementAnnotationValueText(annotation, r'''
 B
   a: A
@@ -1505,7 +1505,7 @@
 ''');
 
     var classB = findNode.namedType('B b').element2! as ClassElement;
-    var annotation = classB.metadata2.annotations.first;
+    var annotation = classB.metadata.annotations.first;
     _assertElementAnnotationValueText(annotation, r'''
 A
   f: int 42
@@ -1534,7 +1534,7 @@
 ''');
 
     var classB = findNode.namedType('B b').element2 as ClassElement;
-    var annotation = classB.metadata2.annotations.first;
+    var annotation = classB.metadata.annotations.first;
     _assertElementAnnotationValueText(annotation, r'''
 A
   f: int 42
diff --git a/pkg/analyzer/test/src/summary/element_text.dart b/pkg/analyzer/test/src/summary/element_text.dart
index 14c197b..6305890 100644
--- a/pkg/analyzer/test/src/summary/element_text.dart
+++ b/pkg/analyzer/test/src/summary/element_text.dart
@@ -249,7 +249,7 @@
       }
 
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
 
       // _writeList(
@@ -364,7 +364,7 @@
     _sink.withIndent(() {
       _writeFragmentReference('firstFragment', e.firstFragment);
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
       // _writeDisplayName(e);
 
@@ -423,7 +423,7 @@
       _writeFragmentReference('reference', f);
       _writeElementReference('element', f.element);
       _writeDocumentation(f.documentationComment);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       _writeFragmentCodeRange(f);
       // _writeDisplayName(f);
 
@@ -702,7 +702,7 @@
     _sink.withIndent(() {
       _writeFragmentReference('firstFragment', e.firstFragment);
       _writeType('type', e.type);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
       // _writeCodeRange(e);
       _writeElementList(
@@ -764,7 +764,7 @@
       _writeFragmentReference('reference', f);
       _writeElementReference('element', f.element);
       // _writeType('type', f.type);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       // _writeCodeRange(f);
       // _writeTypeParameterElements(e.typeParameters);
       // _writeFragmentList('parameters', f, f.parameters2, _writeFormalParameterFragments);
@@ -984,7 +984,7 @@
         _sink.writelnWithIndent('hasEnclosingTypeParameterReference: true');
       }
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
 
       expect(e.typeParameters2, isEmpty);
@@ -1045,7 +1045,7 @@
       _writeFragmentReference('reference', f);
       _writeElementReference('element', f.element);
       _writeDocumentation(f.documentationComment);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       // _writeCodeRange(f);
 
       // expect(f.typeParameters2, isEmpty);
@@ -1273,7 +1273,7 @@
     });
 
     _sink.withIndent(() {
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeNamespaceCombinators(e.combinators);
     });
   }
@@ -1291,7 +1291,7 @@
       _writeFragmentReference('previousFragment', f.previousFragment);
       _writeFragmentReference('nextFragment', f.nextFragment);
 
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
 
       if (configuration.withImports) {
         var imports =
@@ -1351,7 +1351,7 @@
     });
 
     _sink.withIndent(() {
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeNamespaceCombinators(e.combinators);
     });
   }
@@ -1405,7 +1405,7 @@
         _sink.writelnWithIndent('hasEnclosingTypeParameterReference: true');
       }
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
       // _writeTypeInferenceError(e);
 
@@ -1451,7 +1451,7 @@
       _writeFragmentReference('previousFragment', f.previousFragment);
       _writeFragmentReference('nextFragment', f.nextFragment);
       _writeDocumentation(f.documentationComment);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       _writeFragmentCodeRange(f);
       // _writeTypeInferenceError(f);
 
@@ -1505,7 +1505,7 @@
         _writeDirectiveUri(e.uri);
       });
 
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
 
       if (uri is DirectiveUriWithUnitImpl) {
         _elementPrinter.writeNamedFragment('unit', uri.libraryFragment);
@@ -1589,7 +1589,7 @@
         _sink.writelnWithIndent('hasEnclosingTypeParameterReference: true');
       }
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
 
       expect(e.typeParameters2, isEmpty);
@@ -1650,7 +1650,7 @@
       _writeFragmentReference('reference', f);
       _writeElementReference('element', f.element);
       _writeDocumentation(f.documentationComment);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       // _writeCodeRange(f);
 
       expect(f.typeParameters2, isEmpty);
@@ -1691,7 +1691,7 @@
       _writeReference(e);
       _writeFragmentReference('firstFragment', e.firstFragment);
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
       // _writeCodeRange(e);
       _writeElementList(
@@ -1728,7 +1728,7 @@
       _writeFragmentReference('reference', f);
       _writeElementReference('element', f.element);
       _writeDocumentation(f.documentationComment);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       // _writeCodeRange(e);
       _writeFragmentList(
         'typeParameters',
@@ -1789,7 +1789,7 @@
       _writeReference(e);
       _writeFragmentReference('firstFragment', e.firstFragment);
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
       // _writeTypeInferenceError(e);
       _writeType('type', e.type);
@@ -1845,7 +1845,7 @@
       _writeFragmentReference('reference', f);
       _writeElementReference('element', f.element);
       _writeDocumentation(f.documentationComment);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       // _writeCodeRange(f);
       // _writeTypeInferenceError(f);
       // _writeType('type', f.type);
@@ -1885,7 +1885,7 @@
     _sink.withIndent(() {
       _writeFragmentReference('firstFragment', e.firstFragment);
       _writeDocumentation(e.documentationComment);
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
       _writeSinceSdkVersion(e);
       // _writeCodeRange(e);
       _writeElementList(
@@ -1927,7 +1927,7 @@
       _writeFragmentReference('reference', f);
       _writeElementReference('element', f.element);
       _writeDocumentation(f.documentationComment);
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
       // _writeCodeRange(e);
       _writeFragmentList(
         'typeParameters',
@@ -1973,7 +1973,7 @@
       //   _writeType('defaultType', defaultType);
       // }
 
-      _writeMetadata(e.metadata2);
+      _writeMetadata(e.metadata);
     });
 
     _assertNonSyntheticElementSelf(e);
@@ -1999,7 +1999,7 @@
       //   _writeType('defaultType', defaultType);
       // }
 
-      _writeMetadata(f.metadata2);
+      _writeMetadata(f.metadata);
     });
 
     // _assertNonSyntheticElementSelf(f);
diff --git a/pkg/analyzer/test/src/summary/elements/metadata_test.dart b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
index f464d54..f63397f 100644
--- a/pkg/analyzer/test/src/summary/elements/metadata_test.dart
+++ b/pkg/analyzer/test/src/summary/elements/metadata_test.dart
@@ -214,7 +214,7 @@
 ''');
     // Check metadata without asking any other properties.
     var x = library.getClass2('C')!.getField('x')!;
-    expect(x.metadata2.annotations, hasLength(1));
+    expect(x.metadata.annotations, hasLength(1));
     // Check details.
     checkElementText(library, r'''
 library
@@ -5513,7 +5513,7 @@
     // The difference with the test above is that we ask the part first.
     // There was a bug that we were not loading library directives.
     expect(
-      library.definingCompilationUnit.parts[0].metadata2.annotations,
+      library.definingCompilationUnit.parts[0].metadata.annotations,
       isEmpty,
     );
   }
@@ -6554,7 +6554,7 @@
 ''');
     // Check metadata without asking any other properties.
     var x = library.getTopLevelVariable('x')!;
-    expect(x.metadata2.annotations, hasLength(1));
+    expect(x.metadata.annotations, hasLength(1));
     // Check details.
     checkElementText(library, r'''
 library
diff --git a/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart b/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart
index 753a5cf..63148ed 100644
--- a/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart
+++ b/pkg/analyzer/tool/benchmark/heap/flutter_elements.dart
@@ -317,7 +317,7 @@
   void visitElement(Element element) {
     // This triggers lazy reading.
     if (element case Annotatable element) {
-      element.metadata2;
+      element.metadata;
     }
     super.visitElement(element);
   }
diff --git a/pkg/analyzer/tool/generators/ast_generator.dart b/pkg/analyzer/tool/generators/ast_generator.dart
index a560c89..45aa773 100644
--- a/pkg/analyzer/tool/generators/ast_generator.dart
+++ b/pkg/analyzer/tool/generators/ast_generator.dart
@@ -51,7 +51,7 @@
   Future<_ImplClass?> _buildImplClass(ClassDeclarationImpl nodeImpl) async {
     var classElement = nodeImpl.declaredFragment!.element;
     var generateObject =
-        classElement.metadata2.annotations
+        classElement.metadata.annotations
             .map((annotation) {
               var generateObject = annotation.computeConstantValue();
               var generateObjectType = generateObject?.type;
@@ -675,14 +675,14 @@
           case ConstructorDeclarationImpl():
             var element = member.declaredFragment!.element;
             memberName = element.lookupName!;
-            if (element.metadata2.hasDoNotGenerate) {
+            if (element.metadata.hasDoNotGenerate) {
               implClass.doNotGenerateLookupNames.add(memberName);
               continue;
             }
           case MethodDeclarationImpl():
             var element = member.declaredFragment!.element;
             memberName = element.lookupName!;
-            if (element.metadata2.hasDoNotGenerate) {
+            if (element.metadata.hasDoNotGenerate) {
               implClass.doNotGenerateLookupNames.add(memberName);
               continue;
             }
diff --git a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
index 8bfedc0..f2b0921 100644
--- a/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
+++ b/pkg/analyzer_plugin/lib/src/utilities/completion/suggestion_builder.dart
@@ -46,7 +46,7 @@
     }
 
     for (var param in namedParams) {
-      if (param.metadata2.hasRequired || param.isRequiredNamed) {
+      if (param.metadata.hasRequired || param.isRequiredNamed) {
         if (buffer.isNotEmpty) {
           buffer.write(', ');
         }
@@ -84,7 +84,7 @@
       annotatable = annotatable2;
     }
 
-    var isDeprecated = annotatable?.metadata2.hasDeprecated ?? false;
+    var isDeprecated = annotatable?.metadata.hasDeprecated ?? false;
     var suggestion = CompletionSuggestion(
         kind ?? CompletionSuggestionKind.INVOCATION,
         isDeprecated ? DART_RELEVANCE_LOW : relevance,
diff --git a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
index 56c218c..f34eb57 100644
--- a/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
+++ b/pkg/analyzer_plugin/lib/utilities/analyzer_converter.dart
@@ -136,7 +136,7 @@
       Element.makeFlags(
         isPrivate: element.isPrivate,
         isDeprecated: (element is analyzer.Annotatable) &&
-            (element as analyzer.Annotatable).metadata2.hasDeprecated,
+            (element as analyzer.Annotatable).metadata.hasDeprecated,
         isAbstract: _isAbstract(element),
         isConst: _isConst(element),
         isFinal: _isFinal(element),
@@ -257,7 +257,7 @@
       }
       if (parameter.isRequiredNamed) {
         sb.write('required ');
-      } else if (parameter.metadata2.hasDeprecated) {
+      } else if (parameter.metadata.hasDeprecated) {
         sb.write('@required ');
       }
       parameter.appendToWithoutDelimiters2(sb);
@@ -374,12 +374,12 @@
     analyzer.FormalParameterElement e1,
     analyzer.FormalParameterElement e2,
   ) {
-    var rank1 = (e1.isRequiredNamed || e1.metadata2.hasRequired)
+    var rank1 = (e1.isRequiredNamed || e1.metadata.hasRequired)
         ? 0
         : !e1.isNamed
             ? -1
             : 1;
-    var rank2 = (e2.isRequiredNamed || e2.metadata2.hasRequired)
+    var rank2 = (e2.isRequiredNamed || e2.metadata.hasRequired)
         ? 0
         : !e2.isNamed
             ? -1
diff --git a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
index 42efd82..de22eb2 100644
--- a/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
+++ b/pkg/analyzer_plugin/test/utilities/analyzer_converter_test.dart
@@ -290,7 +290,7 @@
 enum E2 { three, four }''');
     {
       var engineElement = findElement2.enum_('_E1');
-      expect(engineElement.metadata2.hasDeprecated, isTrue);
+      expect(engineElement.metadata.hasDeprecated, isTrue);
       // create notification Element
       var element = converter.convertElement(engineElement);
       expect(element.kind, plugin.ElementKind.ENUM);
@@ -307,7 +307,7 @@
       expect(element.parameters, isNull);
       expect(
           element.flags,
-          (engineElement.metadata2.hasDeprecated
+          (engineElement.metadata.hasDeprecated
                   ? plugin.Element.FLAG_DEPRECATED
                   : 0) |
               plugin.Element.FLAG_PRIVATE);
diff --git a/pkg/analyzer_utilities/lib/tool/api.dart b/pkg/analyzer_utilities/lib/tool/api.dart
index 98c2eee..1c4cd13 100644
--- a/pkg/analyzer_utilities/lib/tool/api.dart
+++ b/pkg/analyzer_utilities/lib/tool/api.dart
@@ -396,10 +396,10 @@
     }
 
     if (element case Annotatable element) {
-      if (element.metadata2.hasDeprecated) {
+      if (element.metadata.hasDeprecated) {
         parentheticals.add(['deprecated']);
       }
-      if (element.metadata2.hasExperimental) {
+      if (element.metadata.hasExperimental) {
         parentheticals.add(['experimental']);
       }
     }
@@ -661,7 +661,7 @@
       // Any element annotated with `@analyzerPublicApi` is considered to be
       // part of the public API of the analyzer package.
       if (this case Annotatable(
-        metadata2: Metadata(:var annotations),
+        metadata: Metadata(:var annotations),
       ) when annotations.any(_isPublicApiAnnotation)) {
         return true;
       }
diff --git a/pkg/compiler/lib/src/ssa/codegen.dart b/pkg/compiler/lib/src/ssa/codegen.dart
index 9be7a50..8a7efbe 100644
--- a/pkg/compiler/lib/src/ssa/codegen.dart
+++ b/pkg/compiler/lib/src/ssa/codegen.dart
@@ -2480,7 +2480,7 @@
     if (superElement is FieldEntity) {
       // TODO(sra): We can lower these in the simplifier.
       js.Name fieldName = _namer.instanceFieldPropertyName(superElement);
-      use(node.getDartReceiver(_closedWorld));
+      use(node.getDartReceiver());
       js.PropertyAccess access =
           js.PropertyAccess(
                 pop(),
diff --git a/pkg/compiler/lib/src/ssa/codegen_helpers.dart b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
index b0a2214..cc0d880 100644
--- a/pkg/compiler/lib/src/ssa/codegen_helpers.dart
+++ b/pkg/compiler/lib/src/ssa/codegen_helpers.dart
@@ -111,7 +111,7 @@
       // The instructionType of [nullCheck] is not nullable (since it is the
       // (not) null check!) This means that if we do need to check the type, we
       // should test against nullCheck.checkedInput, not the direct input.
-      if (current!.getDartReceiver(_closedWorld) == nullCheck) {
+      if (current!.getDartReceiver() == nullCheck) {
         if (current is HFieldGet) return current;
         if (current is HFieldSet) return current;
         if (current is HGetLength) return current;
diff --git a/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart b/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart
index fa4df4c..c429a5e 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_finalizer.dart
@@ -62,8 +62,8 @@
   }
 
   /// Returns `true` if [element] is an instance method that uses the
-  /// interceptor calling convention but the instance and interceptor arguments
-  /// will always be the same value.
+  /// interceptor calling convention but the interceptor argument will always be
+  /// the instance.
   bool usesSelfInterceptor(MemberEntity element) {
     if (!_interceptorData.isInterceptedMethod(element)) return false;
     ClassEntity cls = element.enclosingClass!;
@@ -101,6 +101,12 @@
     thisParameter!.instructionType = receiverParameter!.instructionType;
     receiverParameter.block!.rewrite(receiverParameter, thisParameter);
     receiverParameter.sourceElement = const _RenameToUnderscore();
+
+    for (final instruction in thisParameter.usedBy) {
+      if (instruction is HInvoke) {
+        instruction.updateIsCallOnInterceptor();
+      }
+    }
   }
 
   @override
@@ -262,6 +268,7 @@
   }
 
   void _replaceReceiverArgumentWithDummy(HInvoke node, int receiverIndex) {
+    assert(!node.isCallOnInterceptor, 'node: $node');
     ConstantValue constant = DummyInterceptorConstantValue();
     HConstant dummy = _graph.addConstant(constant, _closedWorld);
     node.replaceInput(receiverIndex, dummy);
diff --git a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
index e3a6282..96a9bac 100644
--- a/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
+++ b/pkg/compiler/lib/src/ssa/interceptor_simplifier.dart
@@ -266,7 +266,7 @@
     // If there is a call that dominates all other uses, we can use just the
     // selector of that instruction.
     if (dominator is HInvokeDynamic &&
-        dominator.isCallOnInterceptor(_closedWorld) &&
+        dominator.isCallOnInterceptor &&
         node == dominator.receiver &&
         useCount(dominator, node) == 1) {
       interceptedClasses = _interceptorData.getInterceptedClassesOn(
@@ -303,7 +303,7 @@
       interceptedClasses = {};
       for (HInstruction user in node.usedBy) {
         if (user is HInvokeDynamic &&
-            user.isCallOnInterceptor(_closedWorld) &&
+            user.isCallOnInterceptor &&
             node == user.receiver &&
             useCount(user, node) == 1) {
           interceptedClasses.addAll(
@@ -313,7 +313,7 @@
             ),
           );
         } else if (user is HInvokeSuper &&
-            user.isCallOnInterceptor(_closedWorld) &&
+            user.isCallOnInterceptor &&
             node == user.receiver &&
             useCount(user, node) == 1) {
           interceptedClasses.addAll(
@@ -402,7 +402,7 @@
     //     }
 
     void finishInvoke(HInvoke invoke, Selector selector) {
-      HInstruction callReceiver = invoke.getDartReceiver(_closedWorld)!;
+      HInstruction callReceiver = invoke.getDartReceiver()!;
       if (receiver.nonCheck() == callReceiver.nonCheck()) {
         Set<ClassEntity> interceptedClasses = _interceptorData
             .getInterceptedClassesOn(selector.name, _closedWorld);
@@ -412,19 +412,20 @@
           interceptedClasses: interceptedClasses,
         )) {
           invoke.changeUse(node, callReceiver);
+          invoke.updateIsCallOnInterceptor();
         }
       }
     }
 
     for (HInstruction user in node.usedBy.toList()) {
       if (user is HInvokeDynamic) {
-        if (user.isCallOnInterceptor(_closedWorld) &&
+        if (user.isCallOnInterceptor &&
             node == user.inputs[0] &&
             useCount(user, node) == 1) {
           finishInvoke(user, user.selector);
         }
       } else if (user is HInvokeSuper) {
-        if (user.isCallOnInterceptor(_closedWorld) &&
+        if (user.isCallOnInterceptor &&
             node == user.inputs[0] &&
             useCount(user, node) == 1) {
           finishInvoke(user, user.selector);
diff --git a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
index 300749e..5cd54c1 100644
--- a/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
+++ b/pkg/compiler/lib/src/ssa/invoke_dynamic_specializers.dart
@@ -361,7 +361,7 @@
     JClosedWorld closedWorld,
     OptimizationTestLog? log,
   ) {
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     var abstractValueDomain = closedWorld.abstractValueDomain;
     if (receiver.isIndexablePrimitive(abstractValueDomain).isPotentiallyFalse) {
       return null;
@@ -419,7 +419,7 @@
     OptimizationTestLog? log,
   ) {
     final abstractValueDomain = closedWorld.abstractValueDomain;
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     if (receiver.isStringOrNull(abstractValueDomain).isPotentiallyFalse) {
       return null;
     }
@@ -460,7 +460,7 @@
     JClosedWorld closedWorld,
     OptimizationTestLog? log,
   ) {
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     final abstractValueDomain = closedWorld.abstractValueDomain;
     if (receiver.isGrowableArray(abstractValueDomain).isPotentiallyFalse) {
       return null;
@@ -876,7 +876,7 @@
     // track -0.0 precisely, we have to syntactically filter inputs that cannot
     // generate -0.0.
 
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     if (inputsArePositiveIntegers(instruction, closedWorld) &&
         !canBeNegativeZero(receiver)) {
       return HRemainder(
@@ -1840,7 +1840,7 @@
     JClosedWorld closedWorld,
     OptimizationTestLog? log,
   ) {
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     // `compareTo` has no side-effect (other than throwing) and can be GVN'ed
     // for some known types.
     if (receiver
@@ -1890,7 +1890,7 @@
     JClosedWorld closedWorld,
     OptimizationTestLog? log,
   ) {
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     if (receiver
         .isStringOrNull(closedWorld.abstractValueDomain)
         .isDefinitelyTrue) {
@@ -1937,7 +1937,7 @@
     JClosedWorld closedWorld,
     OptimizationTestLog? log,
   ) {
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     HInstruction pattern = instruction.inputs[2];
     if (receiver
             .isStringOrNull(closedWorld.abstractValueDomain)
@@ -1969,7 +1969,7 @@
     JClosedWorld closedWorld,
     OptimizationTestLog? log,
   ) {
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
     if (receiver
         .isNumberOrNull(closedWorld.abstractValueDomain)
         .isDefinitelyTrue) {
@@ -1997,7 +1997,7 @@
     JClosedWorld closedWorld,
     OptimizationTestLog? log,
   ) {
-    HInstruction receiver = instruction.getDartReceiver(closedWorld);
+    HInstruction receiver = instruction.getDartReceiver();
 
     // We would like to reduce `x.toInt()` to `x`. The web platform considers
     // infinities to be `int` values, but it is too hard to tell if an input is
diff --git a/pkg/compiler/lib/src/ssa/nodes.dart b/pkg/compiler/lib/src/ssa/nodes.dart
index 73faa76..636be70 100644
--- a/pkg/compiler/lib/src/ssa/nodes.dart
+++ b/pkg/compiler/lib/src/ssa/nodes.dart
@@ -1334,7 +1334,7 @@
   AbstractBool isPrimitiveOrNull(AbstractValueDomain domain) =>
       domain.isPrimitiveOrNull(instructionType);
 
-  HInstruction? getDartReceiver(JClosedWorld closedWorld) => null;
+  HInstruction? getDartReceiver() => null;
   bool onlyThrowsNSM() => false;
 
   bool isInBasicBlock() => block != null;
@@ -1481,8 +1481,6 @@
   bool isConstantFalse() => false;
   bool isConstantTrue() => false;
 
-  bool isInterceptor(JClosedWorld closedWorld) => false;
-
   bool isValid() {
     HValidator validator = HValidator();
     validator.currentBlock = block;
@@ -1914,6 +1912,12 @@
   /// input is the Dart receiver.
   bool isInterceptedCall = false;
 
+  /// [_isCallOnInterceptor] is true if this invocation uses the interceptor
+  /// calling convention *and* the interceptor input is an interceptor, and not
+  /// the receiver. A call has `isInterceptedCall == true` and
+  /// `_isCallOnInterceptor == false` after the 'self interceptor' optimization.
+  bool _isCallOnInterceptor = false;
+
   HInvoke(super.inputs, super.type) : super() {
     sideEffects.setAllSideEffects();
     sideEffects.setDependsOnSomething();
@@ -1929,6 +1933,30 @@
   void setAllocation(bool value) {
     _isAllocation = value;
   }
+
+  bool get isCallOnInterceptor => _isCallOnInterceptor;
+
+  /// Update 'isCallOnInterceptor'. An intercepted call can go through
+  /// refinements that drop references to unneeded values or arguments:
+  ///
+  ///     interceptor.foo(receiver, ...); // isCallOnInterceptor = true
+  /// -->
+  ///     receiver.foo(receiver, ...);    // isCallOnInterceptor = false
+  /// -->
+  ///     receiver.foo(dummy, ...);       // isCallOnInterceptor = false
+  void updateIsCallOnInterceptor() {
+    if (isInterceptedCall && _isCallOnInterceptor) {
+      final interceptor = inputs[0].nonCheck();
+      final receiver = inputs[1].nonCheck();
+      if (interceptor == receiver) {
+        _isCallOnInterceptor = false;
+      } else if (receiver case HConstant(
+        constant: DummyInterceptorConstantValue(),
+      )) {
+        _isCallOnInterceptor = false;
+      }
+    }
+  }
 }
 
 abstract class HInvokeDynamic extends HInvoke implements InstructionContext {
@@ -1978,6 +2006,8 @@
           : const InvokeDynamicSpecializer(),
       super(inputs, resultType) {
     isInterceptedCall = isIntercepted;
+    _isCallOnInterceptor = isIntercepted;
+    updateIsCallOnInterceptor();
   }
 
   Selector get selector => _selector;
@@ -2047,18 +2077,13 @@
   HInstruction get receiver => inputs[0];
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) {
-    return isCallOnInterceptor(closedWorld) ? inputs[1] : inputs[0];
+  HInstruction getDartReceiver() {
+    return _isCallOnInterceptor ? inputs[1] : inputs[0];
   }
 
   /// The type arguments passed in this dynamic invocation.
   List<DartType> get typeArguments;
 
-  /// Returns whether this call is on an interceptor object.
-  bool isCallOnInterceptor(JClosedWorld closedWorld) {
-    return isInterceptedCall && receiver.isInterceptor(closedWorld);
-  }
-
   @override
   _GvnType get _gvnType => _GvnType.invokeDynamic;
 
@@ -2238,6 +2263,8 @@
     bool isIntercepted = false,
   }) : super(inputs, type) {
     isInterceptedCall = isIntercepted;
+    _isCallOnInterceptor = isIntercepted;
+    updateIsCallOnInterceptor();
   }
 
   @override
@@ -2282,13 +2309,8 @@
 
   HInstruction get receiver => inputs[0];
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) {
-    return isCallOnInterceptor(closedWorld) ? inputs[1] : inputs[0];
-  }
-
-  /// Returns whether this call is on an interceptor object.
-  bool isCallOnInterceptor(JClosedWorld closedWorld) {
-    return isInterceptedCall && receiver.isInterceptor(closedWorld);
+  HInstruction getDartReceiver() {
+    return isCallOnInterceptor ? inputs[1] : inputs[0];
   }
 
   @override
@@ -2375,27 +2397,11 @@
   }
 
   @override
-  bool isInterceptor(JClosedWorld closedWorld) {
-    final entity = sourceElement;
-    // In case of a closure inside an interceptor class, JavaScript `this`, the
-    // interceptor, is stored in the generated closure class, and accessed
-    // through a [HFieldGet].
-    // TODO(sra): It would be better to track this as an explicit property
-    // rather than recover it from `sourceElement`.
-    if (entity is ThisLocal) {
-      return closedWorld.interceptorData.isInterceptedClass(
-        entity.enclosingClass,
-      );
-    }
-    return false;
-  }
-
-  @override
   bool canThrow(AbstractValueDomain domain) =>
       receiver.isNull(domain).isPotentiallyTrue;
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
+  HInstruction getDartReceiver() => receiver;
   @override
   bool onlyThrowsNSM() => true;
 
@@ -2425,7 +2431,7 @@
       receiver.isNull(domain).isPotentiallyTrue;
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
+  HInstruction getDartReceiver() => receiver;
   @override
   bool onlyThrowsNSM() => true;
 
@@ -2478,7 +2484,7 @@
       receiver.isNull(domain).isPotentiallyTrue;
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
+  HInstruction getDartReceiver() => receiver;
   @override
   bool onlyThrowsNSM() => true;
 
@@ -2553,7 +2559,7 @@
       receiver.isNull(domain).isPotentiallyTrue;
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
+  HInstruction getDartReceiver() => receiver;
   @override
   bool onlyThrowsNSM() => true;
 
@@ -3253,10 +3259,6 @@
   @override
   bool isConstantTrue() => constant is TrueConstantValue;
 
-  @override
-  bool isInterceptor(JClosedWorld closedWorld) =>
-      constant is InterceptorConstantValue;
-
   // Maybe avoid this if the literal is big?
   @override
   bool isCodeMotionInvariant() => true;
@@ -3338,27 +3340,12 @@
   HThis(ThisLocal? element, AbstractValue type) : super(element, type);
 
   @override
-  ThisLocal? get sourceElement => super.sourceElement as ThisLocal?;
-
-  @override
-  set sourceElement(covariant ThisLocal? local) {
-    super.sourceElement = local;
-  }
-
-  @override
   R accept<R>(HVisitor<R> visitor) => visitor.visitThis(this);
 
   @override
   bool isCodeMotionInvariant() => true;
 
   @override
-  bool isInterceptor(JClosedWorld closedWorld) {
-    return closedWorld.interceptorData.isInterceptedClass(
-      sourceElement!.enclosingClass,
-    );
-  }
-
-  @override
   String toString() => 'this';
 }
 
@@ -3634,9 +3621,6 @@
   }
 
   @override
-  bool isInterceptor(JClosedWorld closedWorld) => true;
-
-  @override
   _GvnType get _gvnType => _GvnType.interceptor;
   @override
   bool typeEquals(other) => other is HInterceptor;
@@ -3670,9 +3654,8 @@
   ) : super(selector, receiverType, null, inputs, true, resultType) {
     assert(inputs[0].isConstantNull());
     assert(selector.callStructure.typeArgumentCount == typeArguments.length);
+    _isCallOnInterceptor = true;
   }
-  @override
-  bool isCallOnInterceptor(JClosedWorld closedWorld) => true;
 
   @override
   String toString() =>
@@ -3767,7 +3750,7 @@
   bool get isMovable => false;
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
+  HInstruction getDartReceiver() => receiver;
   @override
   bool onlyThrowsNSM() => true;
   @override
@@ -3806,7 +3789,7 @@
   bool get isMovable => false;
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
+  HInstruction getDartReceiver() => receiver;
   @override
   bool onlyThrowsNSM() => true;
   @override
@@ -3832,7 +3815,7 @@
   bool get isMovable => false;
 
   @override
-  HInstruction getDartReceiver(JClosedWorld closedWorld) => receiver;
+  HInstruction getDartReceiver() => receiver;
   @override
   bool onlyThrowsNSM() => true;
   @override
diff --git a/pkg/compiler/lib/src/ssa/optimize.dart b/pkg/compiler/lib/src/ssa/optimize.dart
index 4936e8a..7eebfbf 100644
--- a/pkg/compiler/lib/src/ssa/optimize.dart
+++ b/pkg/compiler/lib/src/ssa/optimize.dart
@@ -1042,7 +1042,7 @@
       if (folded != node) return folded;
     }
 
-    HInstruction receiver = node.getDartReceiver(_closedWorld);
+    HInstruction receiver = node.getDartReceiver();
     AbstractValue receiverType = receiver.instructionType;
     final element = _closedWorld.locateSingleMember(
       node.selector,
@@ -1090,8 +1090,7 @@
 
     if (element is FieldEntity && element.name == node.selector.name) {
       FieldEntity field = element;
-      if (!_nativeData.isNativeMember(field) &&
-          !node.isCallOnInterceptor(_closedWorld)) {
+      if (!_nativeData.isNativeMember(field) && !node.isCallOnInterceptor) {
         // Insertion point for the closure call.
         HInstruction insertionPoint = node;
         HInstruction load;
@@ -1991,7 +1990,7 @@
       HInstruction folded = handleInterceptedCall(node);
       if (folded != node) return folded;
     }
-    HInstruction receiver = node.getDartReceiver(_closedWorld);
+    HInstruction receiver = node.getDartReceiver();
     AbstractValue receiverType = receiver.instructionType;
 
     Selector selector = node.selector;
@@ -2102,7 +2101,7 @@
       if (folded != node) return folded;
     }
 
-    HInstruction receiver = node.getDartReceiver(_closedWorld);
+    HInstruction receiver = node.getDartReceiver();
     AbstractValue receiverType = receiver.instructionType;
     final member = node.element ??= _closedWorld.locateSingleMember(
       node.selector,
@@ -2175,7 +2174,7 @@
 
   @override
   HInstruction visitInvokeClosure(HInvokeClosure node) {
-    HInstruction closure = node.getDartReceiver(_closedWorld);
+    HInstruction closure = node.getDartReceiver();
 
     // Replace indirect call to static method tear-off closure with direct call
     // to static method.
@@ -3169,10 +3168,10 @@
 
     if (!instruction.onlyThrowsNSM()) return false;
 
-    final receiver = instruction.getDartReceiver(closedWorld);
+    final receiver = instruction.getDartReceiver();
     HInstruction? current = instruction.next;
     do {
-      if ((current!.getDartReceiver(closedWorld) == receiver) &&
+      if ((current!.getDartReceiver() == receiver) &&
           current.canThrow(_abstractValueDomain)) {
         return true;
       }
@@ -3218,9 +3217,9 @@
       if (use is HFieldSet) {
         // The use must be the receiver.  Even if the use is also the argument,
         // i.e.  a.x = a, the store is still dead if all other uses are dead.
-        if (use.getDartReceiver(closedWorld) == instruction) return true;
+        if (use.getDartReceiver() == instruction) return true;
       } else if (use is HFieldGet) {
-        assert(use.getDartReceiver(closedWorld) == instruction);
+        assert(use.getDartReceiver() == instruction);
         if (isDeadCode(use)) return true;
       }
       return false;
@@ -3236,7 +3235,7 @@
 
   bool isTrivialDeadStore(HInstruction instruction) {
     return instruction is HFieldSet &&
-        isTrivialDeadStoreReceiver(instruction.getDartReceiver(closedWorld));
+        isTrivialDeadStoreReceiver(instruction.getDartReceiver());
   }
 
   bool isDeadCode(HInstruction instruction) {
@@ -3335,11 +3334,7 @@
         final phiBlock = phi.block!;
         phiBlock.rewrite(phi, replacement);
         phiBlock.removePhi(phi);
-        if (replacement.sourceElement == null &&
-            phi.sourceElement != null &&
-            replacement is! HThis) {
-          replacement.sourceElement = phi.sourceElement;
-        }
+        replacement.sourceElement ??= phi.sourceElement;
         return;
       }
     }
@@ -3714,11 +3709,7 @@
       final phiBlock = phi.block!;
       phiBlock.rewrite(phi, candidate);
       phiBlock.removePhi(phi);
-      if (candidate.sourceElement == null &&
-          phi.sourceElement != null &&
-          candidate is! HThis) {
-        candidate.sourceElement = phi.sourceElement;
-      }
+      candidate.sourceElement ??= phi.sourceElement;
     }
   }
 
@@ -4508,7 +4499,7 @@
   @override
   void visitFieldGet(HFieldGet node) {
     FieldEntity element = node.element;
-    HInstruction receiver = node.getDartReceiver(_closedWorld).nonCheck();
+    HInstruction receiver = node.getDartReceiver().nonCheck();
     _visitFieldGet(element, receiver, node);
   }
 
@@ -4545,7 +4536,7 @@
   @override
   void visitFieldSet(HFieldSet node) {
     FieldEntity element = node.element;
-    HInstruction receiver = node.getDartReceiver(_closedWorld).nonCheck();
+    HInstruction receiver = node.getDartReceiver().nonCheck();
     if (memorySet.registerFieldValueUpdate(element, receiver, node.value)) {
       node.block!.remove(node);
     }
diff --git a/pkg/compiler/lib/src/ssa/types_propagation.dart b/pkg/compiler/lib/src/ssa/types_propagation.dart
index f6692b9..8921a96 100644
--- a/pkg/compiler/lib/src/ssa/types_propagation.dart
+++ b/pkg/compiler/lib/src/ssa/types_propagation.dart
@@ -438,7 +438,7 @@
       pendingOptimizations.putIfAbsent(node, () => checkInputs);
     }
 
-    HInstruction receiver = node.getDartReceiver(closedWorld);
+    HInstruction receiver = node.getDartReceiver();
     AbstractValue receiverType = receiver.instructionType;
     node.updateReceiverType(abstractValueDomain, receiverType);
 
diff --git a/pkg/linter/lib/src/extensions.dart b/pkg/linter/lib/src/extensions.dart
index bdaedc9..d3e240a 100644
--- a/pkg/linter/lib/src/extensions.dart
+++ b/pkg/linter/lib/src/extensions.dart
@@ -79,7 +79,7 @@
     if (self is VariableDeclaration) {
       var element = self.declaredFragment?.element;
       if (element is TopLevelVariableElement) {
-        return element.metadata2.hasInternal;
+        return element.metadata.hasInternal;
       }
     }
 
@@ -87,7 +87,7 @@
     if (parent == null) return false;
 
     return switch (parent.declaredFragment?.element) {
-      Annotatable(:var metadata2) => metadata2.hasInternal,
+      Annotatable(:var metadata) => metadata.hasInternal,
       _ => false,
     };
   }
@@ -156,7 +156,7 @@
       this,
     ];
 
-    return inheritedAndSelfElements.any((e) => e.metadata2.hasImmutable);
+    return inheritedAndSelfElements.any((e) => e.metadata.hasImmutable);
 
     // TODO(pq): update when implemented or replace w/ a better has{*} call
     // https://github.com/dart-lang/linter/issues/4939
@@ -340,7 +340,7 @@
     if (self == null || self is! Annotatable) {
       return false;
     }
-    return (self as Annotatable).metadata2.hasAwaitNotRequired ||
+    return (self as Annotatable).metadata.hasAwaitNotRequired ||
         (self is PropertyAccessorElement && self.variable3.hasAwaitNotRequired);
   }
 
@@ -536,7 +536,7 @@
 extension InstanceElementExtension on InstanceElement {
   bool get isReflectiveTest =>
       this is ClassElement &&
-      metadata2.annotations.any((a) => a.isReflectiveTest);
+      metadata.annotations.any((a) => a.isReflectiveTest);
 }
 
 extension InterfaceElementExtension on InterfaceElement {
diff --git a/pkg/linter/lib/src/rules/always_put_required_named_parameters_first.dart b/pkg/linter/lib/src/rules/always_put_required_named_parameters_first.dart
index f29e55d..3ab031c 100644
--- a/pkg/linter/lib/src/rules/always_put_required_named_parameters_first.dart
+++ b/pkg/linter/lib/src/rules/always_put_required_named_parameters_first.dart
@@ -42,7 +42,7 @@
     for (var param in node.parameters.where((p) => p.isNamed)) {
       var element = param.declaredFragment?.element;
       if (element != null &&
-          (element.metadata2.hasRequired || element.isRequiredNamed)) {
+          (element.metadata.hasRequired || element.isRequiredNamed)) {
         if (nonRequiredSeen) {
           var name = param.name;
           if (name != null) {
diff --git a/pkg/linter/lib/src/rules/always_specify_types.dart b/pkg/linter/lib/src/rules/always_specify_types.dart
index 9b66ecb..1b0afb2 100644
--- a/pkg/linter/lib/src/rules/always_specify_types.dart
+++ b/pkg/linter/lib/src/rules/always_specify_types.dart
@@ -123,7 +123,7 @@
           element.typeParameters2.isNotEmpty &&
           namedType.typeArguments == null &&
           namedType.parent is! IsExpression &&
-          !element.metadata2.hasOptionalTypeArgs) {
+          !element.metadata.hasOptionalTypeArgs) {
         rule.reportAtNode(
           namedType,
           diagnosticCode: LinterLintCode.always_specify_types_add_type,
diff --git a/pkg/linter/lib/src/rules/analyzer_public_api.dart b/pkg/linter/lib/src/rules/analyzer_public_api.dart
index 95edf93..e9b88a0 100644
--- a/pkg/linter/lib/src/rules/analyzer_public_api.dart
+++ b/pkg/linter/lib/src/rules/analyzer_public_api.dart
@@ -387,7 +387,7 @@
       return true;
     }
     if (this case Annotatable(
-      metadata2: Metadata(:var annotations),
+      metadata: Metadata(:var annotations),
     ) when annotations.any(_isPublicApiAnnotation)) {
       return true;
     }
diff --git a/pkg/linter/lib/src/rules/annotate_overrides.dart b/pkg/linter/lib/src/rules/annotate_overrides.dart
index 2a1b5df..fd3bfc7 100644
--- a/pkg/linter/lib/src/rules/annotate_overrides.dart
+++ b/pkg/linter/lib/src/rules/annotate_overrides.dart
@@ -39,7 +39,7 @@
 
   void check(Element? element, Token target) {
     if (element == null) return;
-    if (element case Annotatable a when a.metadata2.hasOverride) return;
+    if (element case Annotatable a when a.metadata.hasOverride) return;
 
     var member = element.overriddenMember;
     if (member != null) {
diff --git a/pkg/linter/lib/src/rules/annotate_redeclares.dart b/pkg/linter/lib/src/rules/annotate_redeclares.dart
index 0dbdca9..b9fb2d1 100644
--- a/pkg/linter/lib/src/rules/annotate_redeclares.dart
+++ b/pkg/linter/lib/src/rules/annotate_redeclares.dart
@@ -50,7 +50,7 @@
     if (parent is! ExtensionTypeDeclaration) return;
 
     var element = node.declaredFragment?.element;
-    if (element == null || element.metadata2.hasRedeclare) return;
+    if (element == null || element.metadata.hasRedeclare) return;
 
     var parentElement = parent.declaredFragment?.element;
     var extensionType = parentElement?.firstFragment.element;
diff --git a/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart b/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart
index 1fd3b06..9ab9700 100644
--- a/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart
+++ b/pkg/linter/lib/src/rules/avoid_redundant_argument_values.dart
@@ -67,7 +67,7 @@
   void checkArgument(Expression arg, FormalParameterElement? param) {
     if (param == null ||
         param.isRequired ||
-        param.metadata2.hasRequired ||
+        param.metadata.hasRequired ||
         !param.isOptional) {
       return;
     }
diff --git a/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart b/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart
index e22306f..a9d5c99 100644
--- a/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart
+++ b/pkg/linter/lib/src/rules/avoid_unused_constructor_parameters.dart
@@ -45,7 +45,7 @@
             return element != null &&
                 element is! FieldFormalParameterElement &&
                 element is! SuperFormalParameterElement &&
-                !element.metadata2.hasDeprecated &&
+                !element.metadata.hasDeprecated &&
                 !(element.name3 ?? '').isJustUnderscores;
           }).toSet();
 
diff --git a/pkg/linter/lib/src/rules/deprecated_consistency.dart b/pkg/linter/lib/src/rules/deprecated_consistency.dart
index d85bb62..d449a01 100644
--- a/pkg/linter/lib/src/rules/deprecated_consistency.dart
+++ b/pkg/linter/lib/src/rules/deprecated_consistency.dart
@@ -83,5 +83,5 @@
 }
 
 extension on Annotatable {
-  bool get hasDeprecated => metadata2.hasDeprecated;
+  bool get hasDeprecated => metadata.hasDeprecated;
 }
diff --git a/pkg/linter/lib/src/rules/deprecated_member_use_from_same_package.dart b/pkg/linter/lib/src/rules/deprecated_member_use_from_same_package.dart
index 4a5545d..f8ffa5d 100644
--- a/pkg/linter/lib/src/rules/deprecated_member_use_from_same_package.dart
+++ b/pkg/linter/lib/src/rules/deprecated_member_use_from_same_package.dart
@@ -133,7 +133,7 @@
     if (library == null) {
       return;
     }
-    _deprecatedVerifier.pushInDeprecatedValue(library.metadata2.hasDeprecated);
+    _deprecatedVerifier.pushInDeprecatedValue(library.metadata.hasDeprecated);
 
     super.visitCompilationUnit(node);
   }
@@ -347,7 +347,7 @@
   void _withDeprecatedFragment(Fragment? fragment, void Function() recurse) {
     var isDeprecated = false;
     if (fragment?.element case Annotatable annotatable) {
-      isDeprecated = annotatable.metadata2.hasDeprecated;
+      isDeprecated = annotatable.metadata.hasDeprecated;
     }
 
     _deprecatedVerifier.pushInDeprecatedValue(isDeprecated);
diff --git a/pkg/linter/lib/src/rules/exhaustive_cases.dart b/pkg/linter/lib/src/rules/exhaustive_cases.dart
index 973bcd9..c9e7768 100644
--- a/pkg/linter/lib/src/rules/exhaustive_cases.dart
+++ b/pkg/linter/lib/src/rules/exhaustive_cases.dart
@@ -82,7 +82,7 @@
         var end = statement.rightParenthesis.end;
         var elements = enumConstants[constant]!;
         var preferredElement = elements.firstWhere(
-          (element) => !element.metadata2.hasDeprecated,
+          (element) => !element.metadata.hasDeprecated,
           orElse: () => elements.first,
         );
         if (preferredElement.name3 case var name?) {
diff --git a/pkg/linter/lib/src/rules/implicit_reopen.dart b/pkg/linter/lib/src/rules/implicit_reopen.dart
index 95ce5dd..0925689 100644
--- a/pkg/linter/lib/src/rules/implicit_reopen.dart
+++ b/pkg/linter/lib/src/rules/implicit_reopen.dart
@@ -45,7 +45,7 @@
     required String type,
   }) {
     if (element is! ClassElement) return;
-    if (element.metadata2.hasReopen) return;
+    if (element.metadata.hasReopen) return;
     if (element.isSealed) return;
     if (element.isMixinClass) return;
 
diff --git a/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart b/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
index 2ee90de..06ce5e2 100644
--- a/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
+++ b/pkg/linter/lib/src/rules/invalid_runtime_check_with_js_interop_types.dart
@@ -84,7 +84,7 @@
   var element = type.element3;
   // `hasJS` only checks for the `dart:_js_annotations` definition, which is
   // what we want here.
-  if (element.metadata2.hasJS) return true;
+  if (element.metadata.hasJS) return true;
   return _sdkWebLibraries.any((uri) => element.isFromLibrary(uri)) ||
       // While a type test with types from this library is very rare, we should
       // still ignore it for consistency.
@@ -102,7 +102,7 @@
 DartType? _jsTypeForStaticInterop(InterfaceType type) {
   var element = type.element3;
   if (element is! ClassElement) return null;
-  var metadata = element.metadata2;
+  var metadata = element.metadata;
   var hasJS = false;
   var hasStaticInterop = false;
   LibraryElement? dartJsInterop;
diff --git a/pkg/linter/lib/src/rules/prefer_const_constructors.dart b/pkg/linter/lib/src/rules/prefer_const_constructors.dart
index 1f3dbee..4fa6571 100644
--- a/pkg/linter/lib/src/rules/prefer_const_constructors.dart
+++ b/pkg/linter/lib/src/rules/prefer_const_constructors.dart
@@ -46,7 +46,7 @@
     if (!element.isConst) return;
 
     // Handled by an analyzer warning.
-    if (element.metadata2.hasLiteral) return;
+    if (element.metadata.hasLiteral) return;
 
     var enclosingElement = element.enclosingElement;
     if (enclosingElement is ClassElement && enclosingElement.isDartCoreObject) {
diff --git a/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart b/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart
index 87ef005..b4fb12f 100644
--- a/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart
+++ b/pkg/linter/lib/src/rules/prefer_const_constructors_in_immutables.dart
@@ -67,7 +67,7 @@
     if (node.constKeyword != null) return;
     var element = node.declaredFragment?.element;
     if (element == null) return;
-    if (element.metadata2.hasImmutable) {
+    if (element.metadata.hasImmutable) {
       rule.reportAtToken(node.name);
     }
   }
@@ -116,6 +116,6 @@
   /// `@immutable`.
   static bool _hasImmutableAnnotation(InterfaceElement clazz) {
     var selfAndInheritedClasses = _getSelfAndSuperClasses(clazz);
-    return selfAndInheritedClasses.any((cls) => cls.metadata2.hasImmutable);
+    return selfAndInheritedClasses.any((cls) => cls.metadata.hasImmutable);
   }
 }
diff --git a/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart b/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart
index fcab6d9..9d42da5 100644
--- a/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart
+++ b/pkg/linter/lib/src/rules/prefer_const_literals_to_create_immutables.dart
@@ -82,7 +82,7 @@
 
     InterfaceType? current = type;
     while (current != null) {
-      if (current.element3.metadata2.hasImmutable) return true;
+      if (current.element3.metadata.hasImmutable) return true;
       current = current.superclass;
     }
 
diff --git a/pkg/linter/lib/src/rules/unnecessary_getters_setters.dart b/pkg/linter/lib/src/rules/unnecessary_getters_setters.dart
index 311f88f..8697e7e 100644
--- a/pkg/linter/lib/src/rules/unnecessary_getters_setters.dart
+++ b/pkg/linter/lib/src/rules/unnecessary_getters_setters.dart
@@ -78,8 +78,8 @@
     if (getterElement == null || setterElement == null) return;
     if (isSimpleSetter(setter) &&
         isSimpleGetter(getter) &&
-        getterElement.metadata2.annotations.isEmpty &&
-        setterElement.metadata2.annotations.isEmpty) {
+        getterElement.metadata.annotations.isEmpty &&
+        setterElement.metadata.annotations.isEmpty) {
       // Just flag the getter (https://github.com/dart-lang/linter/issues/2851)
       rule.reportAtToken(getter.name);
     }
diff --git a/pkg/linter/lib/src/rules/unnecessary_overrides.dart b/pkg/linter/lib/src/rules/unnecessary_overrides.dart
index ea550a1..7e39db5 100644
--- a/pkg/linter/lib/src/rules/unnecessary_overrides.dart
+++ b/pkg/linter/lib/src/rules/unnecessary_overrides.dart
@@ -112,11 +112,11 @@
   /// Returns whether [declaration] is annotated with any metadata (other than
   /// `@override` or `@Override`).
   bool _addsMetadata() {
-    var metadata = declaration.declaredFragment?.element.metadata2;
+    var metadata = declaration.declaredFragment?.element.metadata;
     if (metadata != null) {
       for (var annotation in metadata.annotations) {
         if (annotation.isOverride) continue;
-        if (annotation.isProtected && _inheritedMethod.metadata2.hasProtected) {
+        if (annotation.isProtected && _inheritedMethod.metadata.hasProtected) {
           continue;
         }
 
@@ -159,10 +159,10 @@
   bool _makesPublicFromProtected() {
     var declaredElement = declaration.declaredFragment?.element;
     if (declaredElement == null) return false;
-    if (declaredElement.metadata2.hasProtected) {
+    if (declaredElement.metadata.hasProtected) {
       return false;
     }
-    return _inheritedMethod.metadata2.hasProtected;
+    return _inheritedMethod.metadata.hasProtected;
   }
 
   bool _sameKind(FormalParameterElement first, FormalParameterElement second) {
diff --git a/pkg/linter/lib/src/rules/unreachable_from_main.dart b/pkg/linter/lib/src/rules/unreachable_from_main.dart
index 839a1a3..1d047c7 100644
--- a/pkg/linter/lib/src/rules/unreachable_from_main.dart
+++ b/pkg/linter/lib/src/rules/unreachable_from_main.dart
@@ -184,7 +184,7 @@
         _addDefaultSuperConstructorDeclaration(node);
       }
 
-      var metadata = element.metadata2;
+      var metadata = element.metadata;
       // This for-loop style is copied from analyzer's `hasX` getters on
       // [Element].
       for (var i = 0; i < metadata.annotations.length; i++) {
@@ -613,11 +613,11 @@
 
 extension on Element {
   bool get hasVisibleForTesting => switch (this) {
-    Annotatable(:var metadata2) => metadata2.hasVisibleForTesting,
+    Annotatable(:var metadata) => metadata.hasVisibleForTesting,
     _ => false,
   };
   bool get hasWidgetPreview => switch (this) {
-    Annotatable(:var metadata2) =>
+    Annotatable(:var metadata) =>
       // Widget previews can be applied to public:
       //   - Constructors (generative and factory)
       //   - Top-level functions
@@ -627,7 +627,7 @@
               (this is ExecutableElement &&
                   (this as ExecutableElement).isStatic)) &&
           !isPrivate &&
-          metadata2.hasWidgetPreview,
+          metadata.hasWidgetPreview,
     _ => false,
   };
   bool get isPragma => (library2?.isDartCore ?? false) && name3 == 'pragma';
diff --git a/tests/web/regress/issue/60793_test.dart b/tests/web/regress/issue/60793_test.dart
new file mode 100644
index 0000000..bdfdd19
--- /dev/null
+++ b/tests/web/regress/issue/60793_test.dart
@@ -0,0 +1,14 @@
+// Copyright (c) 2025, 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.
+
+void main() {
+  void foo() {
+    final f = switch (null) {
+      _ => foo,
+    };
+    print(f);
+  }
+
+  foo();
+}
diff --git a/tools/VERSION b/tools/VERSION
index f4caa29..880cc33 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -27,5 +27,5 @@
 MAJOR 3
 MINOR 9
 PATCH 0
-PRERELEASE 187
+PRERELEASE 188
 PRERELEASE_PATCH 0