diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index fc752548f07..f4165c87a6e 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -129,21 +129,13 @@ void SymbolSupport::findLinkAt(TextEditor::TextDocument *document, } -Core::Search::TextRange convertRange(const Range &range) -{ - auto convertPosition = [](const Position &pos) { - return Core::Search::TextPosition(pos.line() + 1, pos.character()); - }; - return Core::Search::TextRange(convertPosition(range.start()), convertPosition(range.end())); -} - struct ItemData { Core::Search::TextRange range; QVariant userData; }; -static QStringList getFileContents(const QString &filePath) +QStringList SymbolSupport::getFileContents(const QString &filePath) { QString fileContent; if (TextEditor::TextDocument *document = TextEditor::TextDocument::textDocumentForFilePath( @@ -173,7 +165,7 @@ QList generateSearchResultItems( item.setFilePath(Utils::FilePath::fromString(fileName)); item.setUseTextEditorFont(true); - QStringList lines = getFileContents(fileName); + QStringList lines = SymbolSupport::getFileContents(fileName); for (const ItemData &data : it.value()) { item.setMainRange(data.range); if (data.range.begin.line > 0 && data.range.begin.line <= lines.size()) @@ -193,14 +185,21 @@ QList generateSearchResultItems( QMap> rangesInDocument; for (const Location &location : locations.toList()) rangesInDocument[location.uri().toFilePath().toString()] - << ItemData{convertRange(location.range()), {}}; + << ItemData{SymbolSupport::convertRange(location.range()), {}}; return generateSearchResultItems(rangesInDocument); } void SymbolSupport::handleFindReferencesResponse(const FindReferencesRequest::Response &response, - const QString &wordUnderCursor) + const QString &wordUnderCursor, + const ResultHandler &handler) { - if (auto result = response.result()) { + const auto result = response.result(); + if (handler) { + const LanguageClientArray locations = result.value_or(nullptr); + handler(locations.isNull() ? QList() : locations.toList()); + return; + } + if (result) { Core::SearchResult *search = Core::SearchResultWindow::instance()->startNewSearch( tr("Find References with %1 for:").arg(m_client->name()), "", wordUnderCursor); search->addResults(generateSearchResultItems(result.value()), @@ -215,24 +214,26 @@ void SymbolSupport::handleFindReferencesResponse(const FindReferencesRequest::Re } } -void SymbolSupport::findUsages(TextEditor::TextDocument *document, const QTextCursor &cursor) +Utils::optional SymbolSupport::findUsages( + TextEditor::TextDocument *document, const QTextCursor &cursor, const ResultHandler &handler) { if (!m_client->reachable()) - return; + return {}; ReferenceParams params(generateDocPosParams(document, cursor)); params.setContext(ReferenceParams::ReferenceContext(true)); FindReferencesRequest request(params); QTextCursor termCursor(cursor); termCursor.select(QTextCursor::WordUnderCursor); - request.setResponseCallback([this, wordUnderCursor = termCursor.selectedText()]( - const FindReferencesRequest::Response &response) { - handleFindReferencesResponse(response, wordUnderCursor); + request.setResponseCallback([this, wordUnderCursor = termCursor.selectedText(), handler]( + const FindReferencesRequest::Response &response) { + handleFindReferencesResponse(response, wordUnderCursor, handler); }); sendTextDocumentPositionParamsRequest(m_client, request, m_client->dynamicCapabilities(), m_client->capabilities()); + return request.id(); } static bool supportsRename(Client *client, @@ -332,7 +333,7 @@ QList generateReplaceItems(const WorkspaceEdit &edits) { auto convertEdits = [](const QList &edits) { return Utils::transform(edits, [](const TextEdit &edit) { - return ItemData{convertRange(edit.range()), QVariant(edit)}; + return ItemData{SymbolSupport::convertRange(edit.range()), QVariant(edit)}; }); }; QMap> rangesInDocument; @@ -419,4 +420,12 @@ void SymbolSupport::applyRename(const QList &checkedItem applyTextEdits(it.key(), it.value()); } +Core::Search::TextRange SymbolSupport::convertRange(const Range &range) +{ + auto convertPosition = [](const Position &pos) { + return Core::Search::TextPosition(pos.line() + 1, pos.character()); + }; + return Core::Search::TextRange(convertPosition(range.start()), convertPosition(range.end())); +} + } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientsymbolsupport.h b/src/plugins/languageclient/languageclientsymbolsupport.h index 582b5b95f6e..7b6374df712 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.h +++ b/src/plugins/languageclient/languageclientsymbolsupport.h @@ -27,6 +27,7 @@ #include "languageclient_global.h" +#include #include #include @@ -36,6 +37,8 @@ class SearchResult; class SearchResultItem; } +namespace LanguageServerProtocol { class MessageId; } + namespace LanguageClient { class Client; @@ -50,15 +53,24 @@ public: const QTextCursor &cursor, Utils::ProcessLinkCallback callback, const bool resolveTarget); - void findUsages(TextEditor::TextDocument *document, const QTextCursor &cursor); + + using ResultHandler = std::function &)>; + Utils::optional findUsages( + TextEditor::TextDocument *document, + const QTextCursor &cursor, + const ResultHandler &handler = {}); bool supportsRename(TextEditor::TextDocument *document); void renameSymbol(TextEditor::TextDocument *document, const QTextCursor &cursor); + static Core::Search::TextRange convertRange(const LanguageServerProtocol::Range &range); + static QStringList getFileContents(const QString &filePath); + private: void handleFindReferencesResponse( const LanguageServerProtocol::FindReferencesRequest::Response &response, - const QString &wordUnderCursor); + const QString &wordUnderCursor, + const ResultHandler &handler); void requestPrepareRename(const LanguageServerProtocol::TextDocumentPositionParams ¶ms, const QString &placeholder);