blob: e8b12954f687cde65167aab0312b9b5118d334a2 [file] [log] [blame]
// Copyright (c) 2018, 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/lsp_protocol/protocol.dart';
import 'package:analysis_server/src/lsp/constants.dart';
import 'package:analysis_server/src/lsp/error_or.dart';
import 'package:analysis_server/src/lsp/handlers/code_actions/code_action_computer.dart';
import 'package:analysis_server/src/lsp/handlers/handlers.dart';
import 'package:analysis_server/src/lsp/registration/feature_registration.dart';
typedef StaticOptions = Either2<bool, CodeActionOptions>;
class CodeActionHandler
extends
SharedMessageHandler<CodeActionParams, TextDocumentCodeActionResult> {
CodeActionHandler(super.server);
@override
Method get handlesMessage => Method.textDocument_codeAction;
@override
LspJsonHandler<CodeActionParams> get jsonHandler =>
CodeActionParams.jsonHandler;
@override
bool get requiresTrustedCaller => false;
@override
Future<ErrorOr<TextDocumentCodeActionResult>> handle(
CodeActionParams params,
MessageInfo message,
CancellationToken token,
) async {
var performance = message.performance;
var editorCapabilities = server.editorClientCapabilities;
var callerCapabilities = message.clientCapabilities;
if (editorCapabilities == null || callerCapabilities == null) {
// This should not happen unless a client misbehaves.
return serverNotInitializedError;
}
var supportsLiterals = callerCapabilities.literalCodeActions;
var supportedKinds =
supportsLiterals ? callerCapabilities.codeActionKinds : null;
var computer = CodeActionComputer(
server,
params.textDocument,
params.range,
editorCapabilities: editorCapabilities,
callerCapabilities: callerCapabilities,
only: params.context.only,
supportedKinds: supportedKinds,
triggerKind: params.context.triggerKind,
allowCommands: true,
allowCodeActionLiterals: supportsLiterals,
allowSnippets: true, // We allow snippets from code actions requests.
performance: performance,
);
return await computer.compute();
}
}
class CodeActionRegistrations extends FeatureRegistration
with SingleDynamicRegistration, StaticRegistration<StaticOptions> {
CodeActionRegistrations(super.info);
bool get codeActionLiteralSupport => clientCapabilities.literalCodeActions;
@override
ToJsonable? get options => CodeActionRegistrationOptions(
documentSelector: fullySupportedTypes,
codeActionKinds: DartCodeActionKind.serverSupportedKinds,
);
@override
Method get registrationMethod => Method.textDocument_codeAction;
@override
StaticOptions get staticOptions =>
// "The `CodeActionOptions` return type is only valid if the client
// signals code action literal support via the property
// `textDocument.codeAction.codeActionLiteralSupport`."
codeActionLiteralSupport
? Either2.t2(
CodeActionOptions(
codeActionKinds: DartCodeActionKind.serverSupportedKinds,
),
)
: Either2.t1(true);
@override
bool get supportsDynamic => clientDynamic.codeActions;
}