forked from qt-creator/qt-creator
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:
@@ -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)
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user