forked from qt-creator/qt-creator
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>
This commit is contained in:
@@ -90,28 +90,76 @@ ProjectExplorer::Project *projectForCurrentEditor()
|
|||||||
return nullptr;
|
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,
|
void disableDiagnosticInConfig(ClangDiagnosticConfig &config,
|
||||||
const ClangBackEnd::DiagnosticContainer &diagnostic)
|
const ClangBackEnd::DiagnosticContainer &diagnostic)
|
||||||
{
|
{
|
||||||
// Clang check
|
|
||||||
if (!diagnostic.disableOption.isEmpty()) {
|
|
||||||
config.setClangOptions(config.clangOptions() + QStringList(diagnostic.disableOption));
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Clazy check
|
|
||||||
using namespace ClangCodeModel::Utils;
|
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());
|
const QString checkName = DiagnosticTextInfo::clazyCheckName(textInfo.option());
|
||||||
QStringList newChecks = config.clazyChecks().split(',');
|
QStringList newChecks = config.clazyChecks().split(',');
|
||||||
newChecks.removeOne(checkName);
|
newChecks.removeOne(checkName);
|
||||||
config.setClazyChecks(newChecks.join(','));
|
config.setClazyChecks(newChecks.join(','));
|
||||||
return;
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Tidy check
|
ClangDiagnosticConfig diagnosticConfig(ClangProjectSettings &projectSettings,
|
||||||
config.setClangTidyChecks(config.clangTidyChecks() + QString(",-") + textInfo.option());
|
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)
|
void disableDiagnosticInCurrentProjectConfig(const ClangBackEnd::DiagnosticContainer &diagnostic)
|
||||||
@@ -124,15 +172,9 @@ void disableDiagnosticInCurrentProjectConfig(const ClangBackEnd::DiagnosticConta
|
|||||||
project);
|
project);
|
||||||
const QSharedPointer<CppCodeModelSettings> globalSettings = codeModelSettings();
|
const QSharedPointer<CppCodeModelSettings> globalSettings = codeModelSettings();
|
||||||
|
|
||||||
// Get config id
|
|
||||||
Core::Id currentConfigId = projectSettings.warningConfigId();
|
|
||||||
if (projectSettings.useGlobalConfig())
|
|
||||||
currentConfigId = globalSettings->clangDiagnosticConfigId();
|
|
||||||
|
|
||||||
// Get config
|
// Get config
|
||||||
|
ClangDiagnosticConfig config = diagnosticConfig(projectSettings, *globalSettings);
|
||||||
ClangDiagnosticConfigsModel configsModel(globalSettings->clangCustomDiagnosticConfigs());
|
ClangDiagnosticConfigsModel configsModel(globalSettings->clangCustomDiagnosticConfigs());
|
||||||
QTC_ASSERT(configsModel.hasConfigWithId(currentConfigId), return );
|
|
||||||
ClangDiagnosticConfig config = configsModel.configWithId(currentConfigId);
|
|
||||||
|
|
||||||
// Create copy if needed
|
// Create copy if needed
|
||||||
if (config.isReadOnly()) {
|
if (config.isReadOnly()) {
|
||||||
@@ -201,7 +243,8 @@ ClangTextMark::ClangTextMark(const FileName &fileName,
|
|||||||
actions << action;
|
actions << action;
|
||||||
|
|
||||||
// Remove diagnostic warning action
|
// Remove diagnostic warning action
|
||||||
if (projectForCurrentEditor()) {
|
ProjectExplorer::Project *project = projectForCurrentEditor();
|
||||||
|
if (project && isDiagnosticConfigChangable(project, diagnostic)) {
|
||||||
action = new QAction();
|
action = new QAction();
|
||||||
action->setIcon(::Utils::Icons::BROKEN.icon());
|
action->setIcon(::Utils::Icons::BROKEN.icon());
|
||||||
QObject::connect(action, &QAction::triggered, [diagnostic]() {
|
QObject::connect(action, &QAction::triggered, [diagnostic]() {
|
||||||
|
Reference in New Issue
Block a user