blob: 9bba424c1f689c3504c0d3945521dfd3970ad64f [file] [log] [blame]
// 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 'package:analysis_server/lsp_protocol/protocol.dart';
import 'package:analysis_server/src/lsp/error_or.dart';
import 'package:analysis_server/src/lsp/handlers/code_lens/abstract_code_lens_provider.dart';
import 'package:analysis_server/src/lsp/handlers/code_lens/augmentations.dart';
import 'package:analysis_server/src/lsp/handlers/handlers.dart';
import 'package:analysis_server/src/lsp/registration/feature_registration.dart';
import 'package:analyzer/source/line_info.dart';
class CodeLensHandler
extends SharedMessageHandler<CodeLensParams, List<CodeLens>> {
final List<AbstractCodeLensProvider> codeLensProviders;
CodeLensHandler(super.server)
: codeLensProviders = [
AugmentationCodeLensProvider(server),
];
@override
Method get handlesMessage => Method.textDocument_codeLens;
@override
LspJsonHandler<CodeLensParams> get jsonHandler => CodeLensParams.jsonHandler;
@override
bool get requiresTrustedCaller => false;
@override
Future<ErrorOr<List<CodeLens>>> handle(
CodeLensParams params,
MessageInfo message,
CancellationToken token,
) async {
var clientCapabilities = message.clientCapabilities;
if (clientCapabilities == null) {
return serverNotInitializedError;
}
// Ask all providers to compute their CodeLenses.
var lineInfoCache = <String, LineInfo?>{};
var providerResults = await Future.wait(
codeLensProviders
.where((provider) => provider.isAvailable(clientCapabilities, params))
.map((provider) =>
provider.handle(params, message, token, lineInfoCache)),
);
// Merge the results, but if any errors, propogate the first error.
var allResults = <CodeLens>[];
for (var providerResult in providerResults) {
if (providerResult.isError) {
return failure(providerResult);
}
providerResult.ifResult(allResults.addAll);
}
return success(allResults);
}
}
class CodeLensRegistrations extends FeatureRegistration
with SingleDynamicRegistration, StaticRegistration<CodeLensOptions> {
@override
late final options = CodeLensRegistrationOptions(
documentSelector: dartFiles,
resolveProvider: staticOptions.resolveProvider,
workDoneProgress: staticOptions.workDoneProgress,
);
@override
final staticOptions = CodeLensOptions();
CodeLensRegistrations(super.info);
@override
Method get registrationMethod => Method.textDocument_codeLens;
@override
bool get supportsDynamic => clientDynamic.codeLens;
}