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