From f334bd422ee730795d71c2b54ebc2b1b0379ccd3 Mon Sep 17 00:00:00 2001 From: David Schulz Date: Fri, 25 Feb 2022 09:31:40 +0100 Subject: [PATCH] ClangCodeModel: prevent text mark annotations in non project files Since non project files get opened in project specific clients now, the check whether we should add annotations needs to make sure that the marks file is part of the client project. Change-Id: I2790d0f7feb39162686efd06bb3542684d289b95 Reviewed-by: Christian Kandeler --- src/plugins/clangcodemodel/clangdclient.cpp | 4 ++-- src/plugins/clangcodemodel/clangtextmark.cpp | 3 ++- src/plugins/clangcodemodel/clangtextmark.h | 1 + src/plugins/languageclient/diagnosticmanager.cpp | 7 +++++-- src/plugins/languageclient/diagnosticmanager.h | 2 +- 5 files changed, 11 insertions(+), 6 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index 1c3c2ad457b..f4596dcb14e 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -1315,10 +1315,10 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir) setDocumentChangeUpdateThreshold(d->settings.documentUpdateThreshold); const auto textMarkCreator = [this](const Utils::FilePath &filePath, - const Diagnostic &diag) { + const Diagnostic &diag, bool isProjectFile) { if (d->isTesting) emit textMarkCreated(filePath); - return new ClangdTextMark(filePath, diag, this); + return new ClangdTextMark(filePath, diag, isProjectFile, this); }; const auto hideDiagsHandler = []{ ClangDiagnosticManager::clearTaskHubIssues(); }; setDiagnosticsHandlers(textMarkCreator, hideDiagsHandler); diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index 16fda9accba..20bef44e3bd 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -385,6 +385,7 @@ ClangBackEnd::DiagnosticContainer convertDiagnostic(const ClangdDiagnostic &src, ClangdTextMark::ClangdTextMark(const FilePath &filePath, const Diagnostic &diagnostic, + bool isProjectFile, const Client *client) : TextEditor::TextMark(filePath, int(diagnostic.range().start().line() + 1), client->id()) , m_lspDiagnostic(diagnostic) @@ -399,7 +400,7 @@ ClangdTextMark::ClangdTextMark(const FilePath &filePath, setPriority(isError ? TextEditor::TextMark::HighPriority : TextEditor::TextMark::NormalPriority); setIcon(isError ? Icons::CODEMODEL_ERROR.icon() : Icons::CODEMODEL_WARNING.icon()); - if (client->project()) { + if (isProjectFile) { setLineAnnotation(diagnostic.message()); setColor(isError ? Theme::CodeModel_Error_TextMarkColor : Theme::CodeModel_Warning_TextMarkColor); diff --git a/src/plugins/clangcodemodel/clangtextmark.h b/src/plugins/clangcodemodel/clangtextmark.h index 15b97ab32f1..2c08e875900 100644 --- a/src/plugins/clangcodemodel/clangtextmark.h +++ b/src/plugins/clangcodemodel/clangtextmark.h @@ -72,6 +72,7 @@ class ClangdTextMark : public TextEditor::TextMark public: ClangdTextMark(const ::Utils::FilePath &filePath, const LanguageServerProtocol::Diagnostic &diagnostic, + bool isProjectFile, const LanguageClient::Client *client); private: diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index cdaadb7d4a8..381e0f9fc45 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -28,6 +28,7 @@ #include "client.h" #include +#include #include #include #include @@ -74,7 +75,7 @@ private: DiagnosticManager::DiagnosticManager(Client *client) : m_client(client) { - m_textMarkCreator = [this](const FilePath &filePath, const Diagnostic &diagnostic) { + m_textMarkCreator = [this](const FilePath &filePath, const Diagnostic &diagnostic, bool /*isProjectFile*/) { return createTextMark(filePath, diagnostic); }; } @@ -125,9 +126,11 @@ void DiagnosticManager::showDiagnostics(const DocumentUri &uri, int version) QList extraSelections; const VersionedDiagnostics &versionedDiagnostics = m_diagnostics.value(uri); if (versionedDiagnostics.version.value_or(version) == version) { + const bool isProjectFile = m_client->project() + && m_client->project()->isKnownFile(filePath); for (const Diagnostic &diagnostic : versionedDiagnostics.diagnostics) { extraSelections << toDiagnosticsSelections(diagnostic, doc->document()); - m_marks[filePath].append(m_textMarkCreator(filePath, diagnostic)); + m_marks[filePath].append(m_textMarkCreator(filePath, diagnostic, isProjectFile)); } } diff --git a/src/plugins/languageclient/diagnosticmanager.h b/src/plugins/languageclient/diagnosticmanager.h index a7e2e474852..c4bfabf71a3 100644 --- a/src/plugins/languageclient/diagnosticmanager.h +++ b/src/plugins/languageclient/diagnosticmanager.h @@ -43,7 +43,7 @@ namespace LanguageClient { class Client; using TextMarkCreator = std::function; + const LanguageServerProtocol::Diagnostic &, bool)>; using HideDiagnosticsHandler = std::function; class DiagnosticManager