diff --git a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp index bd1ce09ae97..c73fc7e5790 100644 --- a/src/plugins/clangtools/clangtoolsdiagnosticview.cpp +++ b/src/plugins/clangtools/clangtoolsdiagnosticview.cpp @@ -48,7 +48,6 @@ #include #include #include -#include #include @@ -241,37 +240,8 @@ void DiagnosticView::suppressCurrentDiagnostic() void DiagnosticView::disableCheckForCurrentDiagnostic() { - ClangToolsSettings * const settings = ClangToolsSettings::instance(); - ClangDiagnosticConfigs configs = settings->diagnosticConfigs(); - Utils::Id activeConfigId = settings->runSettings().diagnosticConfigId(); - ClangToolsProjectSettings::ClangToolsProjectSettingsPtr projectSettings; - if (ProjectExplorer::Project * const project - = static_cast(model())->project()) { - projectSettings = ClangToolsProjectSettings::getSettings(project); - if (!projectSettings->useGlobalSettings()) - activeConfigId = projectSettings->runSettings().diagnosticConfigId(); - } - ClangDiagnosticConfig config = Utils::findOrDefault(configs, - [activeConfigId](const ClangDiagnosticConfig &c) { return c.id() == activeConfigId; }); - const bool defaultWasActive = !config.id().isValid(); - if (defaultWasActive) { - QTC_ASSERT(configs.isEmpty(), return); - config = builtinConfig(); - config.setIsReadOnly(false); - config.setId(Utils::Id::fromString(QUuid::createUuid().toString())); - config.setDisplayName(tr("Custom Configuration")); - configs << config; - RunSettings runSettings = settings->runSettings(); - runSettings.setDiagnosticConfigId(config.id()); - settings->setRunSettings(runSettings); - if (projectSettings && !projectSettings->useGlobalSettings()) { - runSettings = projectSettings->runSettings(); - runSettings.setDiagnosticConfigId(config.id()); - projectSettings->setRunSettings(runSettings); - } - } - std::set handledNames; + QList diagnostics; const QModelIndexList indexes = selectionModel()->selectedRows(); for (const QModelIndex &index : indexes) { const Diagnostic diag = model()->data(index, ClangToolsDiagnosticModel::DiagnosticRole) @@ -280,34 +250,9 @@ void DiagnosticView::disableCheckForCurrentDiagnostic() continue; if (!handledNames.insert(diag.name).second) continue; - - if (diag.name.startsWith("clazy-")) { - if (config.clazyMode() == ClangDiagnosticConfig::ClazyMode::UseDefaultChecks) { - config.setClazyMode(ClangDiagnosticConfig::ClazyMode::UseCustomChecks); - const ClazyStandaloneInfo clazyInfo(clazyStandaloneExecutable()); - config.setClazyChecks(clazyInfo.defaultChecks.join(',')); - } - config.setClazyChecks(removeClazyCheck(config.clazyChecks(), diag.name)); - } else if (config.clangTidyMode() != ClangDiagnosticConfig::TidyMode::UseConfigFile) { - if (config.clangTidyMode() == ClangDiagnosticConfig::TidyMode::UseDefaultChecks) { - config.setClangTidyMode(ClangDiagnosticConfig::TidyMode::UseCustomChecks); - const ClangTidyInfo tidyInfo(clangTidyExecutable()); - config.setClangTidyChecks(tidyInfo.defaultChecks.join(',')); - } - config.setClangTidyChecks(removeClangTidyCheck(config.clangTidyChecks(), diag.name)); - } + diagnostics << diag; } - - if (!defaultWasActive) { - for (ClangDiagnosticConfig &c : configs) { - if (c.id() == config.id()) { - c = config; - break; - } - } - } - settings->setDiagnosticConfigs(configs); - settings->writeSettings(); + disableChecks(diagnostics); } void DiagnosticView::goNext() diff --git a/src/plugins/clangtools/diagnosticconfigswidget.cpp b/src/plugins/clangtools/diagnosticconfigswidget.cpp index 1407e8b8767..a2c7e420b34 100644 --- a/src/plugins/clangtools/diagnosticconfigswidget.cpp +++ b/src/plugins/clangtools/diagnosticconfigswidget.cpp @@ -25,6 +25,9 @@ #include "diagnosticconfigswidget.h" +#include "clangtoolsdiagnostic.h" +#include "clangtoolsprojectsettings.h" +#include "clangtoolssettings.h" #include "clangtoolsutils.h" #include "executableinfo.h" @@ -35,8 +38,10 @@ #include #include #include +#include #include +#include #include #include @@ -49,6 +54,7 @@ #include #include #include +#include #include using namespace CppTools; @@ -1146,6 +1152,72 @@ QString removeClazyCheck(const QString &checks, const QString &check) return model.enabledChecks().join(','); } +void disableChecks(const QList &diagnostics) +{ + if (diagnostics.isEmpty()) + return; + + ClangToolsSettings * const settings = ClangToolsSettings::instance(); + ClangDiagnosticConfigs configs = settings->diagnosticConfigs(); + Utils::Id activeConfigId = settings->runSettings().diagnosticConfigId(); + ClangToolsProjectSettings::ClangToolsProjectSettingsPtr projectSettings; + + if (ProjectExplorer::Project *project = ProjectExplorer::SessionManager + ::projectForFile(Utils::FilePath::fromString(diagnostics.first().location.filePath))) { + projectSettings = ClangToolsProjectSettings::getSettings(project); + if (!projectSettings->useGlobalSettings()) + activeConfigId = projectSettings->runSettings().diagnosticConfigId(); + } + ClangDiagnosticConfig config = Utils::findOrDefault(configs, + [activeConfigId](const ClangDiagnosticConfig &c) { return c.id() == activeConfigId; }); + const bool defaultWasActive = !config.id().isValid(); + if (defaultWasActive) { + QTC_ASSERT(configs.isEmpty(), return); + config = builtinConfig(); + config.setIsReadOnly(false); + config.setId(Utils::Id::fromString(QUuid::createUuid().toString())); + config.setDisplayName(QCoreApplication::translate("Clang Tools", "Custom Configuration")); + configs << config; + RunSettings runSettings = settings->runSettings(); + runSettings.setDiagnosticConfigId(config.id()); + settings->setRunSettings(runSettings); + if (projectSettings && !projectSettings->useGlobalSettings()) { + runSettings = projectSettings->runSettings(); + runSettings.setDiagnosticConfigId(config.id()); + projectSettings->setRunSettings(runSettings); + } + } + + for (const Diagnostic &diag : diagnostics) { + if (diag.name.startsWith("clazy-")) { + if (config.clazyMode() == ClangDiagnosticConfig::ClazyMode::UseDefaultChecks) { + config.setClazyMode(ClangDiagnosticConfig::ClazyMode::UseCustomChecks); + const ClazyStandaloneInfo clazyInfo(clazyStandaloneExecutable()); + config.setClazyChecks(clazyInfo.defaultChecks.join(',')); + } + config.setClazyChecks(removeClazyCheck(config.clazyChecks(), diag.name)); + } else if (config.clangTidyMode() != ClangDiagnosticConfig::TidyMode::UseConfigFile) { + if (config.clangTidyMode() == ClangDiagnosticConfig::TidyMode::UseDefaultChecks) { + config.setClangTidyMode(ClangDiagnosticConfig::TidyMode::UseCustomChecks); + const ClangTidyInfo tidyInfo(clangTidyExecutable()); + config.setClangTidyChecks(tidyInfo.defaultChecks.join(',')); + } + config.setClangTidyChecks(removeClangTidyCheck(config.clangTidyChecks(), diag.name)); + } + } + + if (!defaultWasActive) { + for (ClangDiagnosticConfig &c : configs) { + if (c.id() == config.id()) { + c = config; + break; + } + } + } + settings->setDiagnosticConfigs(configs); + settings->writeSettings(); +} + } // namespace Internal } // namespace ClangTools diff --git a/src/plugins/clangtools/diagnosticconfigswidget.h b/src/plugins/clangtools/diagnosticconfigswidget.h index fdf961df416..7eb2423901a 100644 --- a/src/plugins/clangtools/diagnosticconfigswidget.h +++ b/src/plugins/clangtools/diagnosticconfigswidget.h @@ -33,10 +33,12 @@ namespace ClangTools { namespace Internal { +class Diagnostic; // Not UI-related, but requires the tree model (or else a huge refactoring or code duplication). QString removeClangTidyCheck(const QString &checks, const QString &check); QString removeClazyCheck(const QString &checks, const QString &check); +void disableChecks(const QList &diagnostics); namespace Ui { class ClazyChecks; diff --git a/src/plugins/clangtools/diagnosticmark.cpp b/src/plugins/clangtools/diagnosticmark.cpp index f20a13a148f..68adec147eb 100644 --- a/src/plugins/clangtools/diagnosticmark.cpp +++ b/src/plugins/clangtools/diagnosticmark.cpp @@ -27,6 +27,7 @@ #include "clangtoolsconstants.h" #include "clangtoolsutils.h" +#include "diagnosticconfigswidget.h" #include @@ -68,6 +69,13 @@ DiagnosticMark::DiagnosticMark(const Diagnostic &diagnostic) }); actions << action; + // Disable diagnostic action + action = new QAction(); + action->setIcon(Utils::Icons::BROKEN.icon()); + action->setToolTip(tr("Disable Diagnostic")); + QObject::connect(action, &QAction::triggered, [diagnostic] { disableChecks({diagnostic}); }); + actions << action; + setActions(actions); }