Skip to content

Commit

Permalink
Version 3.6.0-221.0.dev
Browse files Browse the repository at this point in the history
Merge 005c121 into dev
  • Loading branch information
Dart CI committed Sep 6, 2024
2 parents 62faf3f + 005c121 commit 597bb26
Show file tree
Hide file tree
Showing 152 changed files with 26,036 additions and 2,597 deletions.
2 changes: 1 addition & 1 deletion DEPS
Original file line number Diff line number Diff line change
Expand Up @@ -144,7 +144,7 @@ vars = {
#
# For more details, see https://github.com/dart-lang/sdk/issues/30164.
"dart_style_rev": "003cb15b8d27e4a72eb25dba6f695cd2c7a6f4fb", # disable tools/rev_sdk_deps.dart
"dartdoc_rev": "b4449742c0f7d7fa0179897cac163388e03236c2",
"dartdoc_rev": "8100ccf1c1b8a462fd08adcc0cfd8db0f941f44a",
"ecosystem_rev": "8626bffad30d08792f0acbc813391800838e8207",
"file_rev": "855831c242a17c2dee163828d52710d9043c7c8d",
"fixnum_rev": "6c19e60366ce3d5edfaed51a7c12c98e7977977e",
Expand Down
9 changes: 8 additions & 1 deletion pkg/analysis_server/lib/src/analysis_server.dart
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ import 'package:analysis_server/src/protocol_server.dart' as legacy
import 'package:analysis_server/src/protocol_server.dart' as server;
import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
import 'package:analysis_server/src/server/diagnostic_server.dart';
import 'package:analysis_server/src/server/message_scheduler.dart';
import 'package:analysis_server/src/server/performance.dart';
import 'package:analysis_server/src/services/completion/completion_performance.dart';
import 'package:analysis_server/src/services/correction/assist_internal.dart';
Expand Down Expand Up @@ -250,6 +251,10 @@ abstract class AnalysisServer {
/// A completer for [lspUninitialized].
final Completer<void> _lspUninitializedCompleter = Completer<void>();

/// A scheduler that keeps track of all incoming messages and schedules them
/// for processing.
final MessageScheduler messageScheduler;

AnalysisServer(
this.options,
this.sdkManager,
Expand All @@ -269,7 +274,9 @@ abstract class AnalysisServer {
}) : resourceProvider = OverlayResourceProvider(baseResourceProvider),
pubApi = PubApi(instrumentationService, httpClient,
Platform.environment['PUB_HOSTED_URL']),
producerGeneratorsForLintRules = AssistProcessor.computeLintRuleMap() {
producerGeneratorsForLintRules = AssistProcessor.computeLintRuleMap(),
messageScheduler = MessageScheduler() {
messageScheduler.setServer(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);
Expand Down
19 changes: 0 additions & 19 deletions pkg/analysis_server/lib/src/computer/computer_highlights.dart
Original file line number Diff line number Diff line change
Expand Up @@ -637,15 +637,6 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
super.visitAssignedVariablePattern(node);
}

@override
void visitAugmentationImportDirective(AugmentationImportDirective node) {
computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
computer._addRegion_token(node.importKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(
node.augmentKeyword, HighlightRegionType.BUILT_IN);
super.visitAugmentationImportDirective(node);
}

@override
void visitAugmentedExpression(AugmentedExpression node) {
computer._addRegion_token(
Expand Down Expand Up @@ -1189,16 +1180,6 @@ class _DartUnitHighlightsComputerVisitor extends RecursiveAstVisitor<void> {
super.visitIsExpression(node);
}

@override
void visitLibraryAugmentationDirective(LibraryAugmentationDirective node) {
computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
computer._addRegion_token(
node.libraryKeyword, HighlightRegionType.BUILT_IN);
computer._addRegion_token(
node.augmentKeyword, HighlightRegionType.BUILT_IN);
super.visitLibraryAugmentationDirective(node);
}

@override
void visitLibraryDirective(LibraryDirective node) {
computer._addRegion_node(node, HighlightRegionType.DIRECTIVE);
Expand Down
4 changes: 3 additions & 1 deletion pkg/analysis_server/lib/src/legacy_analysis_server.dart
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@ import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
import 'package:analysis_server/src/server/diagnostic_server.dart';
import 'package:analysis_server/src/server/error_notifier.dart';
import 'package:analysis_server/src/server/features.dart';
import 'package:analysis_server/src/server/message_scheduler.dart';
import 'package:analysis_server/src/server/performance.dart';
import 'package:analysis_server/src/server/sdk_configuration.dart';
import 'package:analysis_server/src/services/completion/completion_state.dart';
Expand Down Expand Up @@ -606,7 +607,8 @@ class LegacyAnalysisServer extends AnalysisServer {
/// Handle a [request] that was read from the communication channel.
void handleRequestOrResponse(RequestOrResponse requestOrResponse) {
if (requestOrResponse is Request) {
handleRequest(requestOrResponse);
messageScheduler.add(LegacyMessage(request: requestOrResponse));
messageScheduler.notify();
} else if (requestOrResponse is Response) {
handleResponse(requestOrResponse);
}
Expand Down
9 changes: 8 additions & 1 deletion pkg/analysis_server/lib/src/lsp/lsp_analysis_server.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ import 'package:analysis_server/src/server/crash_reporting_attachments.dart';
import 'package:analysis_server/src/server/detachable_filesystem_manager.dart';
import 'package:analysis_server/src/server/diagnostic_server.dart';
import 'package:analysis_server/src/server/error_notifier.dart';
import 'package:analysis_server/src/server/message_scheduler.dart';
import 'package:analysis_server/src/server/performance.dart';
import 'package:analysis_server/src/services/user_prompts/dart_fix_prompt_manager.dart';
import 'package:analysis_server/src/utilities/extensions/flutter.dart';
Expand Down Expand Up @@ -191,7 +192,8 @@ class LspAnalysisServer extends AnalysisServer {
analysisDriverScheduler.start();

_channelSubscription =
channel.listen(handleMessage, onDone: done, onError: socketError);
channel.listen(scheduleMessage, onDone: done, onError: socketError);

if (AnalysisServer.supportsPlugins) {
_pluginChangeSubscription =
pluginManager.pluginsChanged.listen((_) => _onPluginsChanged());
Expand Down Expand Up @@ -757,6 +759,11 @@ class LspAnalysisServer extends AnalysisServer {
}
}

void scheduleMessage(Message message) {
messageScheduler.add(LspMessage(message: message));
messageScheduler.notify();
}

void sendErrorResponse(Message message, ResponseError error) {
if (message is RequestMessage) {
sendResponse(ResponseMessage(
Expand Down
92 changes: 92 additions & 0 deletions pkg/analysis_server/lib/src/server/message_scheduler.dart
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
// Copyright (c) 2024, 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 'dart:collection';

import 'package:analysis_server/lsp_protocol/protocol.dart' as lsp;
import 'package:analysis_server/protocol/protocol.dart' as legacy;
import 'package:analysis_server/src/analysis_server.dart';
import 'package:analysis_server/src/legacy_analysis_server.dart';
import 'package:analysis_server/src/lsp/lsp_analysis_server.dart';
import 'package:analyzer/src/util/performance/operation_performance.dart';
import 'package:meta/meta.dart';

/// Represents a message from DTD (Dart Tooling Daemon).
final class DtdMessage extends MessageObject {
final lsp.IncomingMessage message;
final Completer<Map<String, Object?>> completer;
final OperationPerformanceImpl performance;

DtdMessage(
{required this.message,
required this.completer,
required this.performance});
}

/// Represents a message in the Legacy protocol format.
final class LegacyMessage extends MessageObject {
final legacy.Request request;

LegacyMessage({required this.request});
}

/// Represents a message in the LSP protocol format.
final class LspMessage extends MessageObject {
final lsp.Message message;

LspMessage({required this.message});
}

/// Represents a message from a client, can be an IDE, DTD etc.
sealed class MessageObject {}

/// The [MessageScheduler] receives messages from all clients of the
/// [AnalysisServer]. Clients can include IDE's (LSP and Legacy protocol), DTD,
/// and the Diagnostic server. The [MessageSchedular] acts as a hub for all
/// incoming messages and forwards the messages to the appropriate handlers.
final class MessageScheduler {
/// The [AnalaysisServer] associated with the schedular.
late final AnalysisServer server;

/// A queue of incoming messages from all the clients of the [AnalysisServer].
final ListQueue<MessageObject> _incomingMessages = ListQueue<MessageObject>();

@visibleForTesting
ListQueue<MessageObject> get incomingMessages => _incomingMessages;

/// Add a message to the end of the incoming messages queue.
void add(MessageObject message) {
_incomingMessages.addLast(message);
}

/// Notify the [MessageSchedular] to process the messages queue.
void notify() async {
processMessages();
}

/// Dispatch the first message in the queue to be executed.
void processMessages() {
if (_incomingMessages.isEmpty) {
return;
}
var message = _incomingMessages.removeFirst();
switch (message) {
case LspMessage():
var lspMessage = message.message;
(server as LspAnalysisServer).handleMessage(lspMessage);
case LegacyMessage():
var request = message.request;
(server as LegacyAnalysisServer).handleRequest(request);
case DtdMessage():
server.dtd!.processMessage(
message.message, message.performance, message.completer);
}
}

/// Set the [AnalysisServer].
void setServer(AnalysisServer analysisServer) {
server = analysisServer;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -3940,7 +3940,6 @@ extension on AstNode {
return switch (this) {
AdjacentStrings(:var strings) => strings.contains(child),
ArgumentList(:var arguments) => arguments.contains(child),
AugmentationImportDirective(:var metadata) => metadata.contains(child),
Block(:var statements) => statements.contains(child),
CascadeExpression(:var cascadeSections) =>
cascadeSections.contains(child),
Expand Down Expand Up @@ -3982,7 +3981,6 @@ extension on AstNode {
configurations.contains(child) ||
metadata.contains(child),
LabeledStatement(:var labels) => labels.contains(child),
LibraryAugmentationDirective(:var metadata) => metadata.contains(child),
LibraryDirective(:var metadata) => metadata.contains(child),
LibraryIdentifier(:var components) => components.contains(child),
ListLiteral(:var elements) => elements.contains(child),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,29 +37,32 @@ class FlutterRemoveWidget extends ResolvedCorrectionProducer {
@override
Future<void> compute(ChangeBuilder builder) async {
var widgetCreation = node.findInstanceCreationExpression;
if (widgetCreation == null) {
if (widgetCreation == null || !widgetCreation.isWidgetCreation) {
return;
}

// Prepare the list of our children.
var childrenArgument = widgetCreation.childrenArgument;
if (childrenArgument != null) {
if (widgetCreation.childrenArgument case var childrenArgument?) {
var childrenExpression = childrenArgument.expression;
if (childrenExpression is ListLiteral &&
childrenExpression.elements.isNotEmpty) {
await _removeChildren(
builder, widgetCreation, childrenExpression.elements);
}
} else {
var childArgument = widgetCreation.childArgument;
if (childArgument != null) {
await _removeSingle(builder, widgetCreation, childArgument.expression);
} else {
var builderArgument = widgetCreation.builderArgument;
if (builderArgument != null) {
await _removeBuilder(builder, widgetCreation, builderArgument);
}
} else if (widgetCreation.childArgument case var childArgument?) {
await _removeSingle(builder, widgetCreation, childArgument.expression);
} else if (widgetCreation.builderArgument case var builderArgument?) {
await _removeBuilder(builder, widgetCreation, builderArgument);
} else if (widgetCreation.sliversArgument case var sliversArgument?) {
var sliversExpression = sliversArgument.expression;
if (sliversExpression is ListLiteral &&
sliversExpression.elements.isNotEmpty) {
await _removeChildren(
builder, widgetCreation, sliversExpression.elements);
}
} else if (widgetCreation.sliverArgument case var sliverArgument?) {
await _removeSingle(builder, widgetCreation, sliverArgument.expression);
} else {
await _removeSingleWhenInList(builder, widgetCreation);
}
}

Expand Down Expand Up @@ -133,6 +136,23 @@ class FlutterRemoveWidget extends ResolvedCorrectionProducer {
builder.addSimpleReplacement(range.node(widgetCreation), childText);
});
}

Future<void> _removeSingleWhenInList(
ChangeBuilder builder,
InstanceCreationExpression widgetCreation,
) async {
// We can only remove the widget when this widget is in list.
var widgetParentNode = widgetCreation.parent;
if (widgetParentNode is! ListLiteral) {
return;
}

await builder.addDartFileEdit(file, (builder) {
builder.addDeletion(
range.nodeInList(widgetParentNode.elements, widgetCreation),
);
});
}
}

class _UsageFinder extends RecursiveAstVisitor<void> {
Expand Down
Loading

0 comments on commit 597bb26

Please sign in to comment.