aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlls/qqmlhover.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlls/qqmlhover.cpp')
-rw-r--r--src/qmlls/qqmlhover.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/qmlls/qqmlhover.cpp b/src/qmlls/qqmlhover.cpp
new file mode 100644
index 0000000000..d2acd7b5d9
--- /dev/null
+++ b/src/qmlls/qqmlhover.cpp
@@ -0,0 +1,82 @@
+// Copyright (C) 2024 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
+
+#include "qqmlhover_p.h"
+#include <QtQmlLS/private/qqmllshelputils_p.h>
+
+QT_BEGIN_NAMESPACE
+
+Q_LOGGING_CATEGORY(hoverLog, "qt.languageserver.hover")
+
+QQmlHover::QQmlHover(QmlLsp::QQmlCodeModel *codeModel)
+ : QQmlBaseModule(codeModel), m_helpManager(std::make_unique<HelpManager>())
+{
+ // if set thorugh the commandline
+ if (!codeModel->documentationRootPath().isEmpty())
+ m_helpManager->setDocumentationRootPath(codeModel->documentationRootPath());
+
+ connect(codeModel, &QmlLsp::QQmlCodeModel::documentationRootPathChanged, this, [this](const QString &path) {
+ m_helpManager->setDocumentationRootPath(path);
+ });
+}
+
+QQmlHover::~QQmlHover() = default;
+
+QString QQmlHover::name() const
+{
+ return u"QQmlHover"_s;
+}
+
+void QQmlHover::registerHandlers(QLanguageServer *, QLanguageServerProtocol *protocol)
+{
+ protocol->registerHoverRequestHandler(getRequestHandler());
+}
+
+void QQmlHover::setupCapabilities(
+ const QLspSpecification::InitializeParams &,
+ QLspSpecification::InitializeResult &serverCapabilities)
+{
+ serverCapabilities.capabilities.hoverProvider = true;
+}
+
+void QQmlHover::process(RequestPointerArgument request)
+{
+ if (!m_helpManager) {
+ qCWarning(hoverLog)
+ << "No help manager is available, documentation hints will not function!";
+ return;
+ }
+ using namespace QQmlJS::Dom;
+ QLspSpecification::Hover result;
+ ResponseScopeGuard guard(result, request->m_response);
+ if (!request) {
+ qCWarning(hoverLog) << "No hover information is available!";
+ return;
+ }
+ const auto textDocument = request->m_parameters.textDocument;
+ const auto position = request->m_parameters.position;
+ const auto doc = m_codeModel->openDocumentByUrl(QQmlLSUtils::lspUriToQmlUrl(textDocument.uri));
+ DomItem file = doc.snapshot.doc.fileObject(GoTo::MostLikely);
+ if (!file) {
+ guard.setError(QQmlLSUtils::ErrorMessage{
+ 0, u"Could not find the file %1"_s.arg(doc.snapshot.doc.canonicalFilePath()) });
+ return;
+ }
+
+ const auto documentation = m_helpManager->documentationForItem(file, position);
+ if (!documentation.has_value()) {
+ qCDebug(hoverLog)
+ << QStringLiteral(
+ "No documentation hints found for the item at (line, col): (%1,%2)")
+ .arg(position.line)
+ .arg(position.character);
+ return;
+ }
+ QLspSpecification::MarkupContent content;
+ // TODO: We need to do post-formatting what we fetch from documentation.
+ content.kind = QLspSpecification::MarkupKind::Markdown;
+ content.value = documentation.value();
+ result.contents = std::move(content);
+}
+
+QT_END_NAMESPACE