blob: 77179aacf349b2a3275c1b94e224bc53fa28c839 [file] [log] [blame]
// Copyright (c) 2023, 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' hide Element;
import 'package:analysis_server/src/lsp/error_or.dart';
import 'package:analysis_server/src/lsp/handlers/handlers.dart';
import 'package:analysis_server/src/lsp/mapping.dart';
import 'package:analysis_server/src/lsp/registration/feature_registration.dart';
import 'package:analyzer/source/line_info.dart';
import 'package:analyzer_plugin/utilities/navigation/document_links.dart';
class DocumentLinkHandler
extends LspMessageHandler<DocumentLinkParams, List<DocumentLink>?>
with LspPluginRequestHandlerMixin {
DocumentLinkHandler(super.server);
@override
Method get handlesMessage => Method.textDocument_documentLink;
@override
LspJsonHandler<DocumentLinkParams> get jsonHandler =>
DocumentLinkParams.jsonHandler;
@override
Future<ErrorOr<List<DocumentLink>?>> handle(
DocumentLinkParams params,
MessageInfo message,
CancellationToken token,
) async {
if (!isDartDocument(params.textDocument)) {
return success(const []);
}
var path = pathOfDoc(params.textDocument);
var parsedUnit = await path.mapResult(requireUnresolvedUnit);
return parsedUnit.mapResult((unit) async {
/// Helper to convert using LineInfo.
DocumentLink convert(DartDocumentLink link) {
return _convert(link, unit.lineInfo);
}
var visitor = DartDocumentLinkVisitor(server.resourceProvider, unit);
var links = visitor.findLinks(unit.unit);
return success(links.map(convert).toList());
});
}
DocumentLink _convert(DartDocumentLink link, LineInfo lineInfo) {
return DocumentLink(
range: toRange(lineInfo, link.offset, link.length),
target: Uri.file(link.targetPath),
);
}
}
class DocumentLinkRegistrations extends FeatureRegistration
with SingleDynamicRegistration, StaticRegistration<DocumentLinkOptions> {
DocumentLinkRegistrations(super.info);
@override
ToJsonable? get options => DocumentLinkRegistrationOptions(
documentSelector: dartFiles,
resolveProvider: false,
);
@override
Method get registrationMethod => Method.textDocument_documentLink;
@override
DocumentLinkOptions get staticOptions =>
DocumentLinkOptions(resolveProvider: false);
@override
bool get supportsDynamic => clientDynamic.documentLink;
}