aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Schulz <david.schulz@qt.io>2019-10-15 13:48:34 +0200
committerDavid Schulz <david.schulz@qt.io>2019-10-17 08:04:47 +0000
commitbfc65cee9803b6efd859455833aecac01286d852 (patch)
tree4cb78ed496e182bc9d64fc6b866789bd2689dc17
parent0942f2e1ecf845a46db06f2db16843038596c11e (diff)
LanguageClient: create TextMarks only for active clients
Fixes that marks from all running clients are shown after splitting the editor. Change-Id: Ia76a084e5b133d5f7205ac79f9584b211d73b501 Reviewed-by: Christian Stenger <christian.stenger@qt.io>
-rw-r--r--src/plugins/languageclient/client.cpp43
-rw-r--r--src/plugins/languageclient/client.h2
2 files changed, 16 insertions, 29 deletions
diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp
index cf760d9244..3757800a07 100644
--- a/src/plugins/languageclient/client.cpp
+++ b/src/plugins/languageclient/client.cpp
@@ -71,8 +71,8 @@ static Q_LOGGING_CATEGORY(LOGLSPCLIENT, "qtc.languageclient.client", QtWarningMs
class TextMark : public TextEditor::TextMark
{
public:
- TextMark(const Utils::FilePath &fileName, const Diagnostic &diag)
- : TextEditor::TextMark(fileName, diag.range().start().line() + 1, "lspmark")
+ TextMark(const Utils::FilePath &fileName, const Diagnostic &diag, const Core::Id &clientId)
+ : TextEditor::TextMark(fileName, diag.range().start().line() + 1, clientId)
, m_diagnostic(diag)
{
using namespace Utils;
@@ -783,8 +783,7 @@ bool Client::needsRestart(const BaseSettings *settings) const
QList<Diagnostic> Client::diagnosticsAt(const DocumentUri &uri, const Range &range) const
{
QList<Diagnostic> diagnostics;
- for (const TextMark *mark : m_diagnostics[uri]) {
- const Diagnostic diagnostic = mark->diagnostic();
+ for (const Diagnostic &diagnostic : m_diagnostics[uri]) {
if (diagnostic.range().overlaps(range))
diagnostics << diagnostic;
}
@@ -852,9 +851,7 @@ void Client::hideDiagnostics(TextEditor::TextDocument *doc)
{
if (!doc)
return;
- DocumentUri uri = DocumentUri::fromFilePath(doc->filePath());
- for (TextMark *mark : m_diagnostics.value(uri))
- doc->removeMark(mark);
+ qDeleteAll(Utils::filtered(doc->marks(), Utils::equal(&TextEditor::TextMark::category, id())));
}
const ServerCapabilities &Client::capabilities() const
@@ -917,23 +914,18 @@ void Client::showMessageBox(const ShowMessageRequestParams &message, const Messa
void Client::showDiagnostics(const DocumentUri &uri)
{
- if (TextEditor::TextDocument *doc
- = TextEditor::TextDocument::textDocumentForFilePath(uri.toFilePath())) {
- for (TextMark *mark : m_diagnostics.value(uri))
- doc->addMark(mark);
+ const FilePath &filePath = uri.toFilePath();
+ if (TextEditor::TextDocument *doc = TextEditor::TextDocument::textDocumentForFilePath(
+ uri.toFilePath())) {
+ for (const Diagnostic &diagnostic : m_diagnostics.value(uri))
+ doc->addMark(new TextMark(filePath, diagnostic, id()));
}
}
void Client::removeDiagnostics(const DocumentUri &uri)
{
- TextEditor::TextDocument *doc
- = TextEditor::TextDocument::textDocumentForFilePath(uri.toFilePath());
-
- for (TextMark *mark : m_diagnostics.take(uri)) {
- if (doc)
- doc->removeMark(mark);
- delete mark;
- }
+ hideDiagnostics(TextEditor::TextDocument::textDocumentForFilePath(uri.toFilePath()));
+ m_diagnostics.remove(uri);
}
void Client::resetAssistProviders(TextEditor::TextDocument *document)
@@ -1045,16 +1037,11 @@ void Client::handleDiagnostics(const PublishDiagnosticsParams &params)
removeDiagnostics(uri);
const QList<Diagnostic> &diagnostics = params.diagnostics();
- m_diagnostics[uri] =
- Utils::transform(diagnostics, [fileName = uri.toFilePath()](const Diagnostic &diagnostic) {
- return new TextMark(fileName, diagnostic);
- });
- // TextMarks are already added in the TextEditor::TextMark constructor
- // so hide them if we are not the active client for this document
- if (LanguageClientManager::clientForUri(uri) != this)
- hideDiagnostics(TextEditor::TextDocument::textDocumentForFilePath(uri.toFilePath()));
- else
+ m_diagnostics[uri] = diagnostics;
+ if (LanguageClientManager::clientForUri(uri) == this) {
+ showDiagnostics(uri);
requestCodeActions(uri, diagnostics);
+ }
}
void Client::handleSemanticHighlight(const SemanticHighlightingParams &params)
diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h
index ab874e8569..86f3e8f483 100644
--- a/src/plugins/languageclient/client.h
+++ b/src/plugins/languageclient/client.h
@@ -222,7 +222,7 @@ private:
QHash<LanguageServerProtocol::DocumentUri, LanguageServerProtocol::MessageId> m_highlightRequests;
int m_restartsLeft = 5;
QScopedPointer<BaseClientInterface> m_clientInterface;
- QMap<LanguageServerProtocol::DocumentUri, QList<TextMark *>> m_diagnostics;
+ QMap<LanguageServerProtocol::DocumentUri, QList<LanguageServerProtocol::Diagnostic>> m_diagnostics;
DocumentSymbolCache m_documentSymbolCache;
HoverHandler m_hoverHandler;
QHash<LanguageServerProtocol::DocumentUri, TextEditor::HighlightingResults> m_highlights;