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>
This commit is contained in:
David Schulz
2019-10-15 13:48:34 +02:00
parent 0942f2e1ec
commit bfc65cee98
2 changed files with 16 additions and 29 deletions

View File

@@ -71,8 +71,8 @@ static Q_LOGGING_CATEGORY(LOGLSPCLIENT, "qtc.languageclient.client", QtWarningMs
class TextMark : public TextEditor::TextMark class TextMark : public TextEditor::TextMark
{ {
public: public:
TextMark(const Utils::FilePath &fileName, const Diagnostic &diag) TextMark(const Utils::FilePath &fileName, const Diagnostic &diag, const Core::Id &clientId)
: TextEditor::TextMark(fileName, diag.range().start().line() + 1, "lspmark") : TextEditor::TextMark(fileName, diag.range().start().line() + 1, clientId)
, m_diagnostic(diag) , m_diagnostic(diag)
{ {
using namespace Utils; 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> Client::diagnosticsAt(const DocumentUri &uri, const Range &range) const
{ {
QList<Diagnostic> diagnostics; QList<Diagnostic> diagnostics;
for (const TextMark *mark : m_diagnostics[uri]) { for (const Diagnostic &diagnostic : m_diagnostics[uri]) {
const Diagnostic diagnostic = mark->diagnostic();
if (diagnostic.range().overlaps(range)) if (diagnostic.range().overlaps(range))
diagnostics << diagnostic; diagnostics << diagnostic;
} }
@@ -852,9 +851,7 @@ void Client::hideDiagnostics(TextEditor::TextDocument *doc)
{ {
if (!doc) if (!doc)
return; return;
DocumentUri uri = DocumentUri::fromFilePath(doc->filePath()); qDeleteAll(Utils::filtered(doc->marks(), Utils::equal(&TextEditor::TextMark::category, id())));
for (TextMark *mark : m_diagnostics.value(uri))
doc->removeMark(mark);
} }
const ServerCapabilities &Client::capabilities() const const ServerCapabilities &Client::capabilities() const
@@ -917,23 +914,18 @@ void Client::showMessageBox(const ShowMessageRequestParams &message, const Messa
void Client::showDiagnostics(const DocumentUri &uri) void Client::showDiagnostics(const DocumentUri &uri)
{ {
if (TextEditor::TextDocument *doc const FilePath &filePath = uri.toFilePath();
= TextEditor::TextDocument::textDocumentForFilePath(uri.toFilePath())) { if (TextEditor::TextDocument *doc = TextEditor::TextDocument::textDocumentForFilePath(
for (TextMark *mark : m_diagnostics.value(uri)) uri.toFilePath())) {
doc->addMark(mark); for (const Diagnostic &diagnostic : m_diagnostics.value(uri))
doc->addMark(new TextMark(filePath, diagnostic, id()));
} }
} }
void Client::removeDiagnostics(const DocumentUri &uri) void Client::removeDiagnostics(const DocumentUri &uri)
{ {
TextEditor::TextDocument *doc hideDiagnostics(TextEditor::TextDocument::textDocumentForFilePath(uri.toFilePath()));
= TextEditor::TextDocument::textDocumentForFilePath(uri.toFilePath()); m_diagnostics.remove(uri);
for (TextMark *mark : m_diagnostics.take(uri)) {
if (doc)
doc->removeMark(mark);
delete mark;
}
} }
void Client::resetAssistProviders(TextEditor::TextDocument *document) void Client::resetAssistProviders(TextEditor::TextDocument *document)
@@ -1045,16 +1037,11 @@ void Client::handleDiagnostics(const PublishDiagnosticsParams &params)
removeDiagnostics(uri); removeDiagnostics(uri);
const QList<Diagnostic> &diagnostics = params.diagnostics(); const QList<Diagnostic> &diagnostics = params.diagnostics();
m_diagnostics[uri] = m_diagnostics[uri] = diagnostics;
Utils::transform(diagnostics, [fileName = uri.toFilePath()](const Diagnostic &diagnostic) { if (LanguageClientManager::clientForUri(uri) == this) {
return new TextMark(fileName, diagnostic); showDiagnostics(uri);
});
// 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
requestCodeActions(uri, diagnostics); requestCodeActions(uri, diagnostics);
}
} }
void Client::handleSemanticHighlight(const SemanticHighlightingParams &params) void Client::handleSemanticHighlight(const SemanticHighlightingParams &params)

View File

@@ -222,7 +222,7 @@ private:
QHash<LanguageServerProtocol::DocumentUri, LanguageServerProtocol::MessageId> m_highlightRequests; QHash<LanguageServerProtocol::DocumentUri, LanguageServerProtocol::MessageId> m_highlightRequests;
int m_restartsLeft = 5; int m_restartsLeft = 5;
QScopedPointer<BaseClientInterface> m_clientInterface; QScopedPointer<BaseClientInterface> m_clientInterface;
QMap<LanguageServerProtocol::DocumentUri, QList<TextMark *>> m_diagnostics; QMap<LanguageServerProtocol::DocumentUri, QList<LanguageServerProtocol::Diagnostic>> m_diagnostics;
DocumentSymbolCache m_documentSymbolCache; DocumentSymbolCache m_documentSymbolCache;
HoverHandler m_hoverHandler; HoverHandler m_hoverHandler;
QHash<LanguageServerProtocol::DocumentUri, TextEditor::HighlightingResults> m_highlights; QHash<LanguageServerProtocol::DocumentUri, TextEditor::HighlightingResults> m_highlights;