ClangTools: Let users disable checks from text marks

Fixes: QTCREATORBUG-25622
Change-Id: Ied5ca0fca65cd12a2df7744ffc2043dc9686c973
Reviewed-by: David Schulz <david.schulz@qt.io>
This commit is contained in:
Christian Kandeler
2021-05-03 15:19:11 +02:00
parent ffd9b7415d
commit 23fb4449f1
4 changed files with 85 additions and 58 deletions

View File

@@ -48,7 +48,6 @@
#include <QHeaderView>
#include <QPainter>
#include <QSet>
#include <QUuid>
#include <set>
@@ -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<DiagnosticFilterModel *>(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<QString> handledNames;
QList<Diagnostic> 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()

View File

@@ -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 <cpptools/cpptoolsconstants.h>
#include <cpptools/cpptoolsreuse.h>
#include <projectexplorer/selectablefilesmodel.h>
#include <projectexplorer/session.h>
#include <utils/algorithm.h>
#include <utils/fileutils.h>
#include <utils/qtcassert.h>
#include <utils/stringutils.h>
@@ -49,6 +54,7 @@
#include <QStringListModel>
#include <QTreeWidget>
#include <QTreeWidgetItem>
#include <QUuid>
#include <QVBoxLayout>
using namespace CppTools;
@@ -1146,6 +1152,72 @@ QString removeClazyCheck(const QString &checks, const QString &check)
return model.enabledChecks().join(',');
}
void disableChecks(const QList<Diagnostic> &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

View File

@@ -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<Diagnostic> &diagnostics);
namespace Ui {
class ClazyChecks;

View File

@@ -27,6 +27,7 @@
#include "clangtoolsconstants.h"
#include "clangtoolsutils.h"
#include "diagnosticconfigswidget.h"
#include <utils/utilsicons.h>
@@ -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);
}