From 9735049e2c4e1bc817fa7a894ca88c97b61b4741 Mon Sep 17 00:00:00 2001 From: Christian Kandeler Date: Fri, 25 Feb 2022 16:37:16 +0100 Subject: [PATCH] ClangCodeModel: Suppress "Unknown argument" error Unknown compiler flags are an unsuppressable error in clang. But we do not want to maintain a blacklist of unsupported GCC and MSVC options or a whitelist of supported clang options, as both would constantly go out of date. As clangd seems to work fine despite the error message, we simply filter out this type of diagnostic. Fixes: QTCREATORBUG-27113 Change-Id: Ib32601831eded60daf80eb0ca5cf01bbd71493fa Reviewed-by: Reviewed-by: David Schulz --- src/plugins/clangcodemodel/clangdclient.cpp | 7 ++++++- .../clangcodemodel/test/data/completion/completion.pro | 2 ++ .../clangcodemodel/test/data/find-usages/find-usages.pro | 1 + .../test/data/follow-symbol/follow-symbol.pro | 1 + .../test/data/highlighting/highlighting.pro | 1 + .../test/data/local-references/local-references.pro | 3 +-- src/plugins/languageclient/client.cpp | 5 +++-- src/plugins/languageclient/client.h | 2 +- src/plugins/languageclient/diagnosticmanager.cpp | 8 ++++++-- src/plugins/languageclient/diagnosticmanager.h | 5 ++++- 10 files changed, 26 insertions(+), 9 deletions(-) diff --git a/src/plugins/clangcodemodel/clangdclient.cpp b/src/plugins/clangcodemodel/clangdclient.cpp index f0637feb753..894f22aaa92 100644 --- a/src/plugins/clangcodemodel/clangdclient.cpp +++ b/src/plugins/clangcodemodel/clangdclient.cpp @@ -1321,7 +1321,12 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir) return new ClangdTextMark(filePath, diag, isProjectFile, this); }; const auto hideDiagsHandler = []{ ClangDiagnosticManager::clearTaskHubIssues(); }; - setDiagnosticsHandlers(textMarkCreator, hideDiagsHandler); + static const auto diagsFilter = [](const Diagnostic &diag) { + const Diagnostic::Code code = diag.code().value_or(Diagnostic::Code()); + const QString * const codeString = Utils::get_if(&code); + return !codeString || *codeString != "drv_unknown_argument"; + }; + setDiagnosticsHandlers(textMarkCreator, hideDiagsHandler, diagsFilter); setSymbolStringifier(displayNameFromDocumentSymbol); setSemanticTokensHandler([this](TextDocument *doc, const QList &tokens, int version, bool force) { diff --git a/src/plugins/clangcodemodel/test/data/completion/completion.pro b/src/plugins/clangcodemodel/test/data/completion/completion.pro index da641f22378..832b9aac07f 100644 --- a/src/plugins/clangcodemodel/test/data/completion/completion.pro +++ b/src/plugins/clangcodemodel/test/data/completion/completion.pro @@ -27,5 +27,7 @@ SOURCES = \ privateFuncDefCompletion.cpp \ signalCompletion.cpp +QMAKE_CXXFLAGS += -ffoo + HEADERS = mainwindow.h FORMS = mainwindow.ui diff --git a/src/plugins/clangcodemodel/test/data/find-usages/find-usages.pro b/src/plugins/clangcodemodel/test/data/find-usages/find-usages.pro index c4474855308..cf511fee40a 100644 --- a/src/plugins/clangcodemodel/test/data/find-usages/find-usages.pro +++ b/src/plugins/clangcodemodel/test/data/find-usages/find-usages.pro @@ -2,3 +2,4 @@ TEMPLATE = app QT = core HEADERS = defs.h SOURCES = main.cpp +QMAKE_CXXFLAGS += -ffoo diff --git a/src/plugins/clangcodemodel/test/data/follow-symbol/follow-symbol.pro b/src/plugins/clangcodemodel/test/data/follow-symbol/follow-symbol.pro index 7d2c3147a3e..8b0d6d1879b 100644 --- a/src/plugins/clangcodemodel/test/data/follow-symbol/follow-symbol.pro +++ b/src/plugins/clangcodemodel/test/data/follow-symbol/follow-symbol.pro @@ -2,3 +2,4 @@ TEMPLATE = app CONFIG -= qt HEADERS = cursor.h header.h SOURCES = cursor.cpp main.cpp +QMAKE_CXXFLAGS += -ffoo diff --git a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.pro b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.pro index 7dd57583ea9..32196b9724f 100644 --- a/src/plugins/clangcodemodel/test/data/highlighting/highlighting.pro +++ b/src/plugins/clangcodemodel/test/data/highlighting/highlighting.pro @@ -1,3 +1,4 @@ TEMPLATE = app CONFIG -= qt SOURCES = highlighting.cpp +QMAKE_CXXFLAGS += -ffoo diff --git a/src/plugins/clangcodemodel/test/data/local-references/local-references.pro b/src/plugins/clangcodemodel/test/data/local-references/local-references.pro index c3b335aad8d..f47c1c68154 100644 --- a/src/plugins/clangcodemodel/test/data/local-references/local-references.pro +++ b/src/plugins/clangcodemodel/test/data/local-references/local-references.pro @@ -1,5 +1,4 @@ TEMPLATE = app - CONFIG -= qt - SOURCES = references.cpp +QMAKE_CXXFLAGS += -ffoo diff --git a/src/plugins/languageclient/client.cpp b/src/plugins/languageclient/client.cpp index 79a6782e060..541ba0d3e21 100644 --- a/src/plugins/languageclient/client.cpp +++ b/src/plugins/languageclient/client.cpp @@ -1054,9 +1054,10 @@ bool Client::hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri, } void Client::setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator, - const HideDiagnosticsHandler &hideHandler) + const HideDiagnosticsHandler &hideHandler, + const DiagnosticsFilter &filter) { - m_diagnosticManager.setDiagnosticsHandlers(textMarkCreator, hideHandler); + m_diagnosticManager.setDiagnosticsHandlers(textMarkCreator, hideHandler, filter); } void Client::setSemanticTokensHandler(const SemanticTokensHandler &handler) diff --git a/src/plugins/languageclient/client.h b/src/plugins/languageclient/client.h index d95d5693609..f1e9c581f48 100644 --- a/src/plugins/languageclient/client.h +++ b/src/plugins/languageclient/client.h @@ -186,7 +186,7 @@ public: bool hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri, const LanguageServerProtocol::Diagnostic &diag) const; void setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator, - const HideDiagnosticsHandler &hideHandler); + const HideDiagnosticsHandler &hideHandler, const DiagnosticsFilter &filter); void setSemanticTokensHandler(const SemanticTokensHandler &handler); void setSymbolStringifier(const LanguageServerProtocol::SymbolStringifier &stringifier); LanguageServerProtocol::SymbolStringifier symbolStringifier() const; diff --git a/src/plugins/languageclient/diagnosticmanager.cpp b/src/plugins/languageclient/diagnosticmanager.cpp index 2b1d66c477d..a1b729ce9bf 100644 --- a/src/plugins/languageclient/diagnosticmanager.cpp +++ b/src/plugins/languageclient/diagnosticmanager.cpp @@ -90,7 +90,9 @@ void DiagnosticManager::setDiagnostics(const LanguageServerProtocol::DocumentUri const Utils::optional &version) { hideDiagnostics(uri.toFilePath()); - m_diagnostics[uri] = {version, diagnostics}; + const QList filteredDiags = m_filter + ? Utils::filtered(diagnostics, m_filter) : diagnostics; + m_diagnostics[uri] = {version, filteredDiags}; } void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath) @@ -201,10 +203,12 @@ bool DiagnosticManager::hasDiagnostic(const LanguageServerProtocol::DocumentUri } void DiagnosticManager::setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator, - const HideDiagnosticsHandler &removalHandler) + const HideDiagnosticsHandler &removalHandler, + const DiagnosticsFilter &filter) { m_textMarkCreator = textMarkCreator; m_hideHandler = removalHandler; + m_filter = filter; } } // namespace LanguageClient diff --git a/src/plugins/languageclient/diagnosticmanager.h b/src/plugins/languageclient/diagnosticmanager.h index c4bfabf71a3..f201aaf50c2 100644 --- a/src/plugins/languageclient/diagnosticmanager.h +++ b/src/plugins/languageclient/diagnosticmanager.h @@ -45,6 +45,7 @@ class Client; using TextMarkCreator = std::function; using HideDiagnosticsHandler = std::function; +using DiagnosticsFilter = std::function; class DiagnosticManager { @@ -70,7 +71,8 @@ public: const LanguageServerProtocol::Diagnostic &diag) const; void setDiagnosticsHandlers(const TextMarkCreator &shownHandler, - const HideDiagnosticsHandler &removalHandler); + const HideDiagnosticsHandler &removalHandler, + const DiagnosticsFilter &filter); private: TextEditor::TextMark *createTextMark(const Utils::FilePath &filePath, @@ -83,6 +85,7 @@ private: QMap> m_marks; TextMarkCreator m_textMarkCreator; HideDiagnosticsHandler m_hideHandler; + DiagnosticsFilter m_filter; Client *m_client; };