forked from qt-creator/qt-creator
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:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user