aboutsummaryrefslogtreecommitdiffstats
path: root/src/plugins/clangcodemodel
diff options
context:
space:
mode:
authorNikolai Kosjar <nikolai.kosjar@qt.io>2019-02-15 15:05:02 +0100
committerNikolai Kosjar <nikolai.kosjar@qt.io>2019-02-20 08:29:55 +0000
commit4e2c3a7d7242b773e516781bfa61f56a61bab102 (patch)
treecf42c0486ed41382bb553ddfa3407e2776be1caa /src/plugins/clangcodemodel
parent808910792762c0c89cbf37c644a42505df02afb2 (diff)
Clang: Do not suggest to remove warning from tidy
...if the tidy configuration is read from a file. Do not show the corresponding text mark action in this case. Change-Id: I6114304f41e3946d4041233031a9bc83eee13bba Reviewed-by: Ivan Donchevskii <ivan.donchevskii@qt.io>
Diffstat (limited to 'src/plugins/clangcodemodel')
-rw-r--r--src/plugins/clangcodemodel/clangtextmark.cpp83
1 files changed, 63 insertions, 20 deletions
diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp
index e673df7622..f756acf2d3 100644
--- a/src/plugins/clangcodemodel/clangtextmark.cpp
+++ b/src/plugins/clangcodemodel/clangtextmark.cpp
@@ -90,28 +90,76 @@ ProjectExplorer::Project *projectForCurrentEditor()
return nullptr;
}
+enum class DiagnosticType { Clang, Tidy, Clazy };
+DiagnosticType diagnosticType(const ClangBackEnd::DiagnosticContainer &diagnostic)
+
+{
+ if (!diagnostic.disableOption.isEmpty())
+ return DiagnosticType::Clang;
+
+ const Utils::DiagnosticTextInfo textInfo(diagnostic.text);
+ if (Utils::DiagnosticTextInfo::isClazyOption(textInfo.option()))
+ return DiagnosticType::Clazy;
+ return DiagnosticType::Tidy;
+}
+
void disableDiagnosticInConfig(ClangDiagnosticConfig &config,
const ClangBackEnd::DiagnosticContainer &diagnostic)
{
- // Clang check
- if (!diagnostic.disableOption.isEmpty()) {
- config.setClangOptions(config.clangOptions() + QStringList(diagnostic.disableOption));
- return;
- }
-
- // Clazy check
using namespace ClangCodeModel::Utils;
- DiagnosticTextInfo textInfo(diagnostic.text);
- if (DiagnosticTextInfo::isClazyOption(textInfo.option())) {
+
+ switch (diagnosticType(diagnostic)) {
+ case DiagnosticType::Clang:
+ config.setClangOptions(config.clangOptions() + QStringList(diagnostic.disableOption));
+ break;
+ case DiagnosticType::Tidy:
+ config.setClangTidyChecks(config.clangTidyChecks() + QString(",-")
+ + DiagnosticTextInfo(diagnostic.text).option());
+ break;
+ case DiagnosticType::Clazy: {
+ const DiagnosticTextInfo textInfo(diagnostic.text);
const QString checkName = DiagnosticTextInfo::clazyCheckName(textInfo.option());
QStringList newChecks = config.clazyChecks().split(',');
newChecks.removeOne(checkName);
config.setClazyChecks(newChecks.join(','));
- return;
+ break;
+ }
}
+}
- // Tidy check
- config.setClangTidyChecks(config.clangTidyChecks() + QString(",-") + textInfo.option());
+ClangDiagnosticConfig diagnosticConfig(ClangProjectSettings &projectSettings,
+ CppCodeModelSettings &globalSettings)
+{
+ ProjectExplorer::Project *project = projectForCurrentEditor();
+ QTC_ASSERT(project, return {});
+
+ // Get config id
+ Core::Id currentConfigId = projectSettings.warningConfigId();
+ if (projectSettings.useGlobalConfig())
+ currentConfigId = globalSettings.clangDiagnosticConfigId();
+
+ // Get config
+ ClangDiagnosticConfigsModel configsModel(globalSettings.clangCustomDiagnosticConfigs());
+ QTC_ASSERT(configsModel.hasConfigWithId(currentConfigId), return {});
+ return configsModel.configWithId(currentConfigId);
+}
+
+bool isDiagnosticConfigChangable(ProjectExplorer::Project *project,
+ const ClangBackEnd::DiagnosticContainer &diagnostic)
+{
+ if (!project)
+ return false;
+
+ ClangProjectSettings &projectSettings = ClangModelManagerSupport::instance()->projectSettings(
+ project);
+ const QSharedPointer<CppCodeModelSettings> globalSettings = codeModelSettings();
+ const ClangDiagnosticConfig config = diagnosticConfig(projectSettings, *globalSettings);
+
+ if (config.clangTidyMode() == ClangDiagnosticConfig::TidyMode::File
+ && diagnosticType(diagnostic) == DiagnosticType::Tidy) {
+ return false;
+ }
+ return true;
}
void disableDiagnosticInCurrentProjectConfig(const ClangBackEnd::DiagnosticContainer &diagnostic)
@@ -124,15 +172,9 @@ void disableDiagnosticInCurrentProjectConfig(const ClangBackEnd::DiagnosticConta
project);
const QSharedPointer<CppCodeModelSettings> globalSettings = codeModelSettings();
- // Get config id
- Core::Id currentConfigId = projectSettings.warningConfigId();
- if (projectSettings.useGlobalConfig())
- currentConfigId = globalSettings->clangDiagnosticConfigId();
-
// Get config
+ ClangDiagnosticConfig config = diagnosticConfig(projectSettings, *globalSettings);
ClangDiagnosticConfigsModel configsModel(globalSettings->clangCustomDiagnosticConfigs());
- QTC_ASSERT(configsModel.hasConfigWithId(currentConfigId), return );
- ClangDiagnosticConfig config = configsModel.configWithId(currentConfigId);
// Create copy if needed
if (config.isReadOnly()) {
@@ -201,7 +243,8 @@ ClangTextMark::ClangTextMark(const FileName &fileName,
actions << action;
// Remove diagnostic warning action
- if (projectForCurrentEditor()) {
+ ProjectExplorer::Project *project = projectForCurrentEditor();
+ if (project && isDiagnosticConfigChangable(project, diagnostic)) {
action = new QAction();
action->setIcon(::Utils::Icons::BROKEN.icon());
QObject::connect(action, &QAction::triggered, [diagnostic]() {