diff --git a/src/plugins/coco/cocolanguageclient.cpp b/src/plugins/coco/cocolanguageclient.cpp index 7829d167c10..beecc803007 100644 --- a/src/plugins/coco/cocolanguageclient.cpp +++ b/src/plugins/coco/cocolanguageclient.cpp @@ -59,6 +59,10 @@ CocoLanguageClient::CocoLanguageClient(const FilePath &coco, const FilePath &csm &EditorManager::documentClosed, this, &CocoLanguageClient::handleDocumentClosed); + connect(EditorManager::instance(), + &EditorManager::editorOpened, + this, + &CocoLanguageClient::handleEditorOpened); for (IDocument *openDocument : DocumentModel::openedDocuments()) handleDocumentOpened(openDocument); @@ -70,6 +74,15 @@ CocoLanguageClient::CocoLanguageClient(const FilePath &coco, const FilePath &csm initClientCapabilities(); } +CocoLanguageClient::~CocoLanguageClient() +{ + const QList &editors = Core::DocumentModel::editorsForOpenedDocuments(); + for (Core::IEditor *editor : editors) { + if (auto textEditor = qobject_cast(editor)) + textEditor->editorWidget()->removeHoverHandler(hoverHandler()); + } +} + BaseClientInterface *CocoLanguageClient::clientInterface(const FilePath &coco, const FilePath &csmes) { @@ -207,6 +220,15 @@ DiagnosticManager *CocoLanguageClient::createDiagnosticManager() return new CocoDiagnosticManager(this); } +void CocoLanguageClient::handleDiagnostics(const PublishDiagnosticsParams ¶ms) +{ + using namespace TextEditor; + Client::handleDiagnostics(params); + TextDocument *document = documentForFilePath(params.uri().toFilePath()); + for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(document)) + editor->editorWidget()->addHoverHandler(hoverHandler()); +} + class CocoTextDocumentCapabilities : public TextDocumentClientCapabilities { public: @@ -240,4 +262,12 @@ void CocoLanguageClient::handleDocumentClosed(IDocument *document) closeDocument(textDocument); } +void CocoLanguageClient::handleEditorOpened(IEditor *editor) +{ + if (auto textEditor = qobject_cast(editor); + textEditor && hasDiagnostics(textEditor->textDocument())) { + textEditor->editorWidget()->addHoverHandler(hoverHandler()); + } +} + } // namespace Coco diff --git a/src/plugins/coco/cocolanguageclient.h b/src/plugins/coco/cocolanguageclient.h index 5fa75508d60..84584ab89a1 100644 --- a/src/plugins/coco/cocolanguageclient.h +++ b/src/plugins/coco/cocolanguageclient.h @@ -33,18 +33,20 @@ class CocoLanguageClient : public LanguageClient::Client { public: CocoLanguageClient(const Utils::FilePath &coco, const Utils::FilePath &csmes); + ~CocoLanguageClient() override; LanguageClient::BaseClientInterface *clientInterface(const Utils::FilePath &coco, const Utils::FilePath &csmes); protected: LanguageClient::DiagnosticManager *createDiagnosticManager() override; + void handleDiagnostics(const LanguageServerProtocol::PublishDiagnosticsParams ¶ms) override; private: void initClientCapabilities(); void handleDocumentOpened(Core::IDocument *document); void handleDocumentClosed(Core::IDocument *document); + void handleEditorOpened(Core::IEditor *editor); }; - } // namespace Coco diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 759243d6b24..4c360a15f70 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -1102,6 +1102,13 @@ bool Client::hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri, return false; } +bool Client::hasDiagnostics(const TextEditor::TextDocument *document) const +{ + if (m_diagnosticManager) + return m_diagnosticManager->hasDiagnostics(document); + return false; +} + DiagnosticManager *Client::createDiagnosticManager() { return new DiagnosticManager(this); diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index 8d8e5059d87..adb16e5d4cc 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -189,6 +189,7 @@ public: const QTextCursor &cursor) const; bool hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri, const LanguageServerProtocol::Diagnostic &diag) const; + bool hasDiagnostics(const TextEditor::TextDocument *document) const; void setSemanticTokensHandler(const SemanticTokensHandler &handler); void setSymbolStringifier(const LanguageServerProtocol::SymbolStringifier &stringifier); LanguageServerProtocol::SymbolStringifier symbolStringifier() const; diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index e772baf3f52..b80ea70b95e 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -206,4 +206,16 @@ bool DiagnosticManager::hasDiagnostic(const LanguageServerProtocol::DocumentUri return it->diagnostics.contains(diag); } +bool DiagnosticManager::hasDiagnostics(const TextDocument *doc) const +{ + const FilePath docPath = doc->filePath(); + const auto it = m_diagnostics.find(DocumentUri::fromFilePath(docPath)); + if (it == m_diagnostics.end()) + return {}; + const int revision = m_client->documentVersion(docPath); + if (revision != it->version.value_or(revision)) + return false; + return !it->diagnostics.isEmpty(); +} + } // namespace LanguageClient diff --git a/src/plugins/languageclient/diagnosticmanager.h b/src/plugins/languageclient/diagnosticmanager.h index 8844eaeb7f8..c4972524c00 100644 --- a/src/plugins/languageclient/diagnosticmanager.h +++ b/src/plugins/languageclient/diagnosticmanager.h @@ -69,6 +69,7 @@ public: bool hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri, const TextEditor::TextDocument *doc, const LanguageServerProtocol::Diagnostic &diag) const; + bool hasDiagnostics(const TextEditor::TextDocument *doc) const; signals: void textMarkCreated(const Utils::FilePath &path);