diff --git a/src/plugins/languageclient/languageclientsymbolsupport.cpp b/src/plugins/languageclient/languageclientsymbolsupport.cpp index 1f6fb13e040..c9f4ce6929c 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.cpp +++ b/src/plugins/languageclient/languageclientsymbolsupport.cpp @@ -112,6 +112,30 @@ void SymbolSupport::findLinkAt(TextEditor::TextDocument *document, } +bool SymbolSupport::supportsFindUsages(TextEditor::TextDocument *document) const +{ + if (!m_client || !m_client->reachable()) + return false; + if (m_client->dynamicCapabilities().isRegistered(FindReferencesRequest::methodName)) { + QJsonObject options + = m_client->dynamicCapabilities().option(FindReferencesRequest::methodName).toObject(); + const TextDocumentRegistrationOptions docOps(options); + if (docOps.isValid() + && !docOps.filterApplies(document->filePath(), + Utils::mimeTypeForName(document->mimeType()))) { + return false; + } + } else if (auto referencesProvider = m_client->capabilities().referencesProvider()) { + if (std::holds_alternative(*referencesProvider)) { + if (!std::get(*referencesProvider)) + return false; + } + } else { + return false; + } + return true; +} + struct ItemData { Core::Search::TextRange range; @@ -199,7 +223,7 @@ void SymbolSupport::handleFindReferencesResponse(const FindReferencesRequest::Re std::optional SymbolSupport::findUsages( TextEditor::TextDocument *document, const QTextCursor &cursor, const ResultHandler &handler) { - if (!m_client->reachable()) + if (!supportsFindUsages(document)) return {}; ReferenceParams params(generateDocPosParams(document, cursor)); params.setContext(ReferenceParams::ReferenceContext(true)); diff --git a/src/plugins/languageclient/languageclientsymbolsupport.h b/src/plugins/languageclient/languageclientsymbolsupport.h index 41919ab51be..38a3049d839 100644 --- a/src/plugins/languageclient/languageclientsymbolsupport.h +++ b/src/plugins/languageclient/languageclientsymbolsupport.h @@ -34,6 +34,7 @@ public: Utils::LinkHandler callback, const bool resolveTarget); + bool supportsFindUsages(TextEditor::TextDocument *document) const; using ResultHandler = std::function &)>; std::optional findUsages( TextEditor::TextDocument *document,