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 <QHeaderView>
|
||||||
#include <QPainter>
|
#include <QPainter>
|
||||||
#include <QSet>
|
#include <QSet>
|
||||||
#include <QUuid>
|
|
||||||
|
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
||||||
@@ -241,37 +240,8 @@ void DiagnosticView::suppressCurrentDiagnostic()
|
|||||||
|
|
||||||
void DiagnosticView::disableCheckForCurrentDiagnostic()
|
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;
|
std::set<QString> handledNames;
|
||||||
|
QList<Diagnostic> diagnostics;
|
||||||
const QModelIndexList indexes = selectionModel()->selectedRows();
|
const QModelIndexList indexes = selectionModel()->selectedRows();
|
||||||
for (const QModelIndex &index : indexes) {
|
for (const QModelIndex &index : indexes) {
|
||||||
const Diagnostic diag = model()->data(index, ClangToolsDiagnosticModel::DiagnosticRole)
|
const Diagnostic diag = model()->data(index, ClangToolsDiagnosticModel::DiagnosticRole)
|
||||||
@@ -280,34 +250,9 @@ void DiagnosticView::disableCheckForCurrentDiagnostic()
|
|||||||
continue;
|
continue;
|
||||||
if (!handledNames.insert(diag.name).second)
|
if (!handledNames.insert(diag.name).second)
|
||||||
continue;
|
continue;
|
||||||
|
diagnostics << diag;
|
||||||
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));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
disableChecks(diagnostics);
|
||||||
if (!defaultWasActive) {
|
|
||||||
for (ClangDiagnosticConfig &c : configs) {
|
|
||||||
if (c.id() == config.id()) {
|
|
||||||
c = config;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
settings->setDiagnosticConfigs(configs);
|
|
||||||
settings->writeSettings();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void DiagnosticView::goNext()
|
void DiagnosticView::goNext()
|
||||||
|
|||||||
@@ -25,6 +25,9 @@
|
|||||||
|
|
||||||
#include "diagnosticconfigswidget.h"
|
#include "diagnosticconfigswidget.h"
|
||||||
|
|
||||||
|
#include "clangtoolsdiagnostic.h"
|
||||||
|
#include "clangtoolsprojectsettings.h"
|
||||||
|
#include "clangtoolssettings.h"
|
||||||
#include "clangtoolsutils.h"
|
#include "clangtoolsutils.h"
|
||||||
#include "executableinfo.h"
|
#include "executableinfo.h"
|
||||||
|
|
||||||
@@ -35,8 +38,10 @@
|
|||||||
#include <cpptools/cpptoolsconstants.h>
|
#include <cpptools/cpptoolsconstants.h>
|
||||||
#include <cpptools/cpptoolsreuse.h>
|
#include <cpptools/cpptoolsreuse.h>
|
||||||
#include <projectexplorer/selectablefilesmodel.h>
|
#include <projectexplorer/selectablefilesmodel.h>
|
||||||
|
#include <projectexplorer/session.h>
|
||||||
|
|
||||||
#include <utils/algorithm.h>
|
#include <utils/algorithm.h>
|
||||||
|
#include <utils/fileutils.h>
|
||||||
#include <utils/qtcassert.h>
|
#include <utils/qtcassert.h>
|
||||||
#include <utils/stringutils.h>
|
#include <utils/stringutils.h>
|
||||||
|
|
||||||
@@ -49,6 +54,7 @@
|
|||||||
#include <QStringListModel>
|
#include <QStringListModel>
|
||||||
#include <QTreeWidget>
|
#include <QTreeWidget>
|
||||||
#include <QTreeWidgetItem>
|
#include <QTreeWidgetItem>
|
||||||
|
#include <QUuid>
|
||||||
#include <QVBoxLayout>
|
#include <QVBoxLayout>
|
||||||
|
|
||||||
using namespace CppTools;
|
using namespace CppTools;
|
||||||
@@ -1146,6 +1152,72 @@ QString removeClazyCheck(const QString &checks, const QString &check)
|
|||||||
return model.enabledChecks().join(',');
|
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 Internal
|
||||||
} // namespace ClangTools
|
} // namespace ClangTools
|
||||||
|
|
||||||
|
|||||||
@@ -33,10 +33,12 @@
|
|||||||
|
|
||||||
namespace ClangTools {
|
namespace ClangTools {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
class Diagnostic;
|
||||||
|
|
||||||
// Not UI-related, but requires the tree model (or else a huge refactoring or code duplication).
|
// 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 removeClangTidyCheck(const QString &checks, const QString &check);
|
||||||
QString removeClazyCheck(const QString &checks, const QString &check);
|
QString removeClazyCheck(const QString &checks, const QString &check);
|
||||||
|
void disableChecks(const QList<Diagnostic> &diagnostics);
|
||||||
|
|
||||||
namespace Ui {
|
namespace Ui {
|
||||||
class ClazyChecks;
|
class ClazyChecks;
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
|
|
||||||
#include "clangtoolsconstants.h"
|
#include "clangtoolsconstants.h"
|
||||||
#include "clangtoolsutils.h"
|
#include "clangtoolsutils.h"
|
||||||
|
#include "diagnosticconfigswidget.h"
|
||||||
|
|
||||||
#include <utils/utilsicons.h>
|
#include <utils/utilsicons.h>
|
||||||
|
|
||||||
@@ -68,6 +69,13 @@ DiagnosticMark::DiagnosticMark(const Diagnostic &diagnostic)
|
|||||||
});
|
});
|
||||||
actions << action;
|
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);
|
setActions(actions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user