diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 543ec74a20a..4e2f3710247 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -384,8 +384,8 @@ void LanguageClientManager::editorOpened(Core::IEditor *editor) if (TextEditorWidget *widget = textEditor->editorWidget()) { connect(widget, &TextEditorWidget::requestLinkAt, this, [this, document = textEditor->textDocument()] - (const QTextCursor &cursor, Utils::ProcessLinkCallback &callback) { - findLinkAt(document, cursor, callback); + (const QTextCursor &cursor, Utils::ProcessLinkCallback &callback, bool resolveTarget) { + findLinkAt(document, cursor, callback, resolveTarget); }); connect(widget, &TextEditorWidget::requestUsages, this, [this, document = textEditor->textDocument()](const QTextCursor &cursor) { @@ -483,23 +483,35 @@ void LanguageClientManager::documentWillSave(Core::IDocument *document) void LanguageClientManager::findLinkAt(TextEditor::TextDocument *document, const QTextCursor &cursor, - Utils::ProcessLinkCallback callback) + Utils::ProcessLinkCallback callback, + bool resolveTarget) { const DocumentUri uri = DocumentUri::fromFilePath(document->filePath()); const TextDocumentIdentifier documentId(uri); const Position pos(cursor); TextDocumentPositionParams params(documentId, pos); GotoDefinitionRequest request(params); - request.setResponseCallback([callback](const GotoDefinitionRequest::Response &response){ + request.setResponseCallback([callback, filePath = document->filePath(), cursor, resolveTarget] + (const GotoDefinitionRequest::Response &response) { if (Utils::optional _result = response.result()) { const GotoResult result = _result.value(); if (Utils::holds_alternative(result)) return; + auto wordUnderCursor = [cursor, filePath]() { + QTextCursor linkCursor = cursor; + linkCursor.select(QTextCursor::WordUnderCursor); + Utils::Link link(filePath.toString(), + linkCursor.blockNumber() + 1, + linkCursor.positionInBlock()); + link.linkTextStart = linkCursor.selectionStart(); + link.linkTextEnd = linkCursor.selectionEnd(); + return link; + }; if (auto ploc = Utils::get_if(&result)) { - callback(ploc->toLink()); + callback(resolveTarget ? ploc->toLink() : wordUnderCursor()); } else if (auto plloc = Utils::get_if>(&result)) { if (!plloc->isEmpty()) - callback(plloc->value(0).toLink()); + callback(resolveTarget ? plloc->value(0).toLink() : wordUnderCursor()); } } }); diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index 84bdf63d133..fbf5322f1cc 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -97,7 +97,7 @@ private: void documentContentsSaved(Core::IDocument *document); void documentWillSave(Core::IDocument *document); void findLinkAt(TextEditor::TextDocument *document, const QTextCursor &cursor, - Utils::ProcessLinkCallback callback); + Utils::ProcessLinkCallback callback, const bool resolveTarget); void findUsages(TextEditor::TextDocument *document, const QTextCursor &cursor); void projectAdded(ProjectExplorer::Project *project);