forked from qt-creator/qt-creator
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: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
@@ -1321,7 +1321,12 @@ ClangdClient::ClangdClient(Project *project, const Utils::FilePath &jsonDbDir)
|
|||||||
return new ClangdTextMark(filePath, diag, isProjectFile, this);
|
return new ClangdTextMark(filePath, diag, isProjectFile, this);
|
||||||
};
|
};
|
||||||
const auto hideDiagsHandler = []{ ClangDiagnosticManager::clearTaskHubIssues(); };
|
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<QString>(&code);
|
||||||
|
return !codeString || *codeString != "drv_unknown_argument";
|
||||||
|
};
|
||||||
|
setDiagnosticsHandlers(textMarkCreator, hideDiagsHandler, diagsFilter);
|
||||||
setSymbolStringifier(displayNameFromDocumentSymbol);
|
setSymbolStringifier(displayNameFromDocumentSymbol);
|
||||||
setSemanticTokensHandler([this](TextDocument *doc, const QList<ExpandedSemanticToken> &tokens,
|
setSemanticTokensHandler([this](TextDocument *doc, const QList<ExpandedSemanticToken> &tokens,
|
||||||
int version, bool force) {
|
int version, bool force) {
|
||||||
|
@@ -27,5 +27,7 @@ SOURCES = \
|
|||||||
privateFuncDefCompletion.cpp \
|
privateFuncDefCompletion.cpp \
|
||||||
signalCompletion.cpp
|
signalCompletion.cpp
|
||||||
|
|
||||||
|
QMAKE_CXXFLAGS += -ffoo
|
||||||
|
|
||||||
HEADERS = mainwindow.h
|
HEADERS = mainwindow.h
|
||||||
FORMS = mainwindow.ui
|
FORMS = mainwindow.ui
|
||||||
|
@@ -2,3 +2,4 @@ TEMPLATE = app
|
|||||||
QT = core
|
QT = core
|
||||||
HEADERS = defs.h
|
HEADERS = defs.h
|
||||||
SOURCES = main.cpp
|
SOURCES = main.cpp
|
||||||
|
QMAKE_CXXFLAGS += -ffoo
|
||||||
|
@@ -2,3 +2,4 @@ TEMPLATE = app
|
|||||||
CONFIG -= qt
|
CONFIG -= qt
|
||||||
HEADERS = cursor.h header.h
|
HEADERS = cursor.h header.h
|
||||||
SOURCES = cursor.cpp main.cpp
|
SOURCES = cursor.cpp main.cpp
|
||||||
|
QMAKE_CXXFLAGS += -ffoo
|
||||||
|
@@ -1,3 +1,4 @@
|
|||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
CONFIG -= qt
|
CONFIG -= qt
|
||||||
SOURCES = highlighting.cpp
|
SOURCES = highlighting.cpp
|
||||||
|
QMAKE_CXXFLAGS += -ffoo
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
TEMPLATE = app
|
TEMPLATE = app
|
||||||
|
|
||||||
CONFIG -= qt
|
CONFIG -= qt
|
||||||
|
|
||||||
SOURCES = references.cpp
|
SOURCES = references.cpp
|
||||||
|
QMAKE_CXXFLAGS += -ffoo
|
||||||
|
@@ -1054,9 +1054,10 @@ bool Client::hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri,
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Client::setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
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)
|
void Client::setSemanticTokensHandler(const SemanticTokensHandler &handler)
|
||||||
|
@@ -186,7 +186,7 @@ public:
|
|||||||
bool hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri,
|
bool hasDiagnostic(const LanguageServerProtocol::DocumentUri &uri,
|
||||||
const LanguageServerProtocol::Diagnostic &diag) const;
|
const LanguageServerProtocol::Diagnostic &diag) const;
|
||||||
void setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
void setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
||||||
const HideDiagnosticsHandler &hideHandler);
|
const HideDiagnosticsHandler &hideHandler, const DiagnosticsFilter &filter);
|
||||||
void setSemanticTokensHandler(const SemanticTokensHandler &handler);
|
void setSemanticTokensHandler(const SemanticTokensHandler &handler);
|
||||||
void setSymbolStringifier(const LanguageServerProtocol::SymbolStringifier &stringifier);
|
void setSymbolStringifier(const LanguageServerProtocol::SymbolStringifier &stringifier);
|
||||||
LanguageServerProtocol::SymbolStringifier symbolStringifier() const;
|
LanguageServerProtocol::SymbolStringifier symbolStringifier() const;
|
||||||
|
@@ -90,7 +90,9 @@ void DiagnosticManager::setDiagnostics(const LanguageServerProtocol::DocumentUri
|
|||||||
const Utils::optional<int> &version)
|
const Utils::optional<int> &version)
|
||||||
{
|
{
|
||||||
hideDiagnostics(uri.toFilePath());
|
hideDiagnostics(uri.toFilePath());
|
||||||
m_diagnostics[uri] = {version, diagnostics};
|
const QList<Diagnostic> filteredDiags = m_filter
|
||||||
|
? Utils::filtered(diagnostics, m_filter) : diagnostics;
|
||||||
|
m_diagnostics[uri] = {version, filteredDiags};
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath)
|
void DiagnosticManager::hideDiagnostics(const Utils::FilePath &filePath)
|
||||||
@@ -201,10 +203,12 @@ bool DiagnosticManager::hasDiagnostic(const LanguageServerProtocol::DocumentUri
|
|||||||
}
|
}
|
||||||
|
|
||||||
void DiagnosticManager::setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
void DiagnosticManager::setDiagnosticsHandlers(const TextMarkCreator &textMarkCreator,
|
||||||
const HideDiagnosticsHandler &removalHandler)
|
const HideDiagnosticsHandler &removalHandler,
|
||||||
|
const DiagnosticsFilter &filter)
|
||||||
{
|
{
|
||||||
m_textMarkCreator = textMarkCreator;
|
m_textMarkCreator = textMarkCreator;
|
||||||
m_hideHandler = removalHandler;
|
m_hideHandler = removalHandler;
|
||||||
|
m_filter = filter;
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace LanguageClient
|
} // namespace LanguageClient
|
||||||
|
@@ -45,6 +45,7 @@ class Client;
|
|||||||
using TextMarkCreator = std::function<TextEditor::TextMark *(const Utils::FilePath &,
|
using TextMarkCreator = std::function<TextEditor::TextMark *(const Utils::FilePath &,
|
||||||
const LanguageServerProtocol::Diagnostic &, bool)>;
|
const LanguageServerProtocol::Diagnostic &, bool)>;
|
||||||
using HideDiagnosticsHandler = std::function<void()>;
|
using HideDiagnosticsHandler = std::function<void()>;
|
||||||
|
using DiagnosticsFilter = std::function<bool(const LanguageServerProtocol::Diagnostic &)>;
|
||||||
|
|
||||||
class DiagnosticManager
|
class DiagnosticManager
|
||||||
{
|
{
|
||||||
@@ -70,7 +71,8 @@ public:
|
|||||||
const LanguageServerProtocol::Diagnostic &diag) const;
|
const LanguageServerProtocol::Diagnostic &diag) const;
|
||||||
|
|
||||||
void setDiagnosticsHandlers(const TextMarkCreator &shownHandler,
|
void setDiagnosticsHandlers(const TextMarkCreator &shownHandler,
|
||||||
const HideDiagnosticsHandler &removalHandler);
|
const HideDiagnosticsHandler &removalHandler,
|
||||||
|
const DiagnosticsFilter &filter);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
TextEditor::TextMark *createTextMark(const Utils::FilePath &filePath,
|
TextEditor::TextMark *createTextMark(const Utils::FilePath &filePath,
|
||||||
@@ -83,6 +85,7 @@ private:
|
|||||||
QMap<Utils::FilePath, QList<TextEditor::TextMark *>> m_marks;
|
QMap<Utils::FilePath, QList<TextEditor::TextMark *>> m_marks;
|
||||||
TextMarkCreator m_textMarkCreator;
|
TextMarkCreator m_textMarkCreator;
|
||||||
HideDiagnosticsHandler m_hideHandler;
|
HideDiagnosticsHandler m_hideHandler;
|
||||||
|
DiagnosticsFilter m_filter;
|
||||||
Client *m_client;
|
Client *m_client;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user