LanguageClient: fix diagnostic document revision check

We track the document revision in the client nowadays.

Change-Id: Ia55bc7cd5eaf100fb19953ca71e8de8f43ae3266
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
David Schulz
2021-06-22 15:28:35 +02:00
parent 44f0f9ae18
commit 922f9b159d
3 changed files with 13 additions and 9 deletions

View File

@@ -81,7 +81,7 @@ static Q_LOGGING_CATEGORY(LOGLSPCLIENT, "qtc.languageclient.client", QtWarningMs
Client::Client(BaseClientInterface *clientInterface) Client::Client(BaseClientInterface *clientInterface)
: m_id(Utils::Id::fromString(QUuid::createUuid().toString())) : m_id(Utils::Id::fromString(QUuid::createUuid().toString()))
, m_clientInterface(clientInterface) , m_clientInterface(clientInterface)
, m_diagnosticManager(m_id) , m_diagnosticManager(this)
, m_documentSymbolCache(this) , m_documentSymbolCache(this)
, m_hoverHandler(this) , m_hoverHandler(this)
, m_symbolSupport(this) , m_symbolSupport(this)

View File

@@ -25,6 +25,8 @@
#include "diagnosticmanager.h" #include "diagnosticmanager.h"
#include "client.h"
#include <coreplugin/editormanager/documentmodel.h> #include <coreplugin/editormanager/documentmodel.h>
#include <texteditor/fontsettings.h> #include <texteditor/fontsettings.h>
#include <texteditor/textdocument.h> #include <texteditor/textdocument.h>
@@ -69,8 +71,8 @@ private:
const Diagnostic m_diagnostic; const Diagnostic m_diagnostic;
}; };
DiagnosticManager::DiagnosticManager(const Id &clientId) DiagnosticManager::DiagnosticManager(Client *client)
: m_clientId(clientId) : m_client(client)
{} {}
DiagnosticManager::~DiagnosticManager() DiagnosticManager::~DiagnosticManager()
@@ -95,7 +97,7 @@ void DiagnosticManager::hideDiagnostics(TextDocument *doc)
m_hideHandler(); m_hideHandler();
for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc)) for (BaseTextEditor *editor : BaseTextEditor::textEditorsForDocument(doc))
editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, {}); editor->editorWidget()->setExtraSelections(TextEditorWidget::CodeWarningsSelection, {});
qDeleteAll(Utils::filtered(doc->marks(), Utils::equal(&TextMark::category, m_clientId))); qDeleteAll(Utils::filtered(doc->marks(), Utils::equal(&TextMark::category, m_client->id())));
} }
void DiagnosticManager::removeDiagnostics(const LanguageServerProtocol::DocumentUri &uri) void DiagnosticManager::removeDiagnostics(const LanguageServerProtocol::DocumentUri &uri)
@@ -141,7 +143,7 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version)
QObject::connect(action, &QAction::triggered, [text = diagnostic.message()]() { QObject::connect(action, &QAction::triggered, [text = diagnostic.message()]() {
QApplication::clipboard()->setText(text); QApplication::clipboard()->setText(text);
}); });
auto mark = new TextMark(filePath, diagnostic, m_clientId); auto mark = new TextMark(filePath, diagnostic, m_client->id());
mark->setActions({action}); mark->setActions({action});
doc->addMark(mark); doc->addMark(mark);
@@ -164,7 +166,7 @@ void DiagnosticManager::clearDiagnostics()
QList<Diagnostic> DiagnosticManager::diagnosticsAt(const DocumentUri &uri, QList<Diagnostic> DiagnosticManager::diagnosticsAt(const DocumentUri &uri,
const QTextCursor &cursor) const const QTextCursor &cursor) const
{ {
const int documentRevision = cursor.document()->revision(); const int documentRevision = m_client->documentVersion(uri.toFilePath());
auto it = m_diagnostics.find(uri); auto it = m_diagnostics.find(uri);
if (it == m_diagnostics.end()) if (it == m_diagnostics.end())
return {}; return {};
@@ -184,7 +186,7 @@ bool DiagnosticManager::hasDiagnostic(const LanguageServerProtocol::DocumentUri
const auto it = m_diagnostics.find(uri); const auto it = m_diagnostics.find(uri);
if (it == m_diagnostics.end()) if (it == m_diagnostics.end())
return {}; return {};
const int revision = doc->document()->revision(); const int revision = m_client->documentVersion(uri.toFilePath());
if (revision != it->version.value_or(revision)) if (revision != it->version.value_or(revision))
return false; return false;
return it->diagnostics.contains(diag); return it->diagnostics.contains(diag);

View File

@@ -40,6 +40,8 @@ class TextMark;
namespace LanguageClient { namespace LanguageClient {
class Client;
using TextMarkCreator = std::function<TextEditor::TextMark *(const Utils::FilePath &, using TextMarkCreator = std::function<TextEditor::TextMark *(const Utils::FilePath &,
const LanguageServerProtocol::Diagnostic &)>; const LanguageServerProtocol::Diagnostic &)>;
using HideDiagnosticsHandler = std::function<void()>; using HideDiagnosticsHandler = std::function<void()>;
@@ -48,7 +50,7 @@ class DiagnosticManager
{ {
Q_DECLARE_TR_FUNCTIONS(LanguageClient::DiagnosticManager) Q_DECLARE_TR_FUNCTIONS(LanguageClient::DiagnosticManager)
public: public:
explicit DiagnosticManager(const Utils::Id &clientId); explicit DiagnosticManager(Client *client);
~DiagnosticManager(); ~DiagnosticManager();
void setDiagnostics(const LanguageServerProtocol::DocumentUri &uri, void setDiagnostics(const LanguageServerProtocol::DocumentUri &uri,
@@ -77,9 +79,9 @@ private:
QList<LanguageServerProtocol::Diagnostic> diagnostics; QList<LanguageServerProtocol::Diagnostic> diagnostics;
}; };
QMap<LanguageServerProtocol::DocumentUri, VersionedDiagnostics> m_diagnostics; QMap<LanguageServerProtocol::DocumentUri, VersionedDiagnostics> m_diagnostics;
Utils::Id m_clientId;
TextMarkCreator m_textMarkCreator; TextMarkCreator m_textMarkCreator;
HideDiagnosticsHandler m_hideHandler; HideDiagnosticsHandler m_hideHandler;
Client *m_client;
}; };
} // namespace LanguageClient } // namespace LanguageClient