diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index e673df76220..f756acf2d3e 100644 --- a/src/plugins/clangcodemodel/clangtextmark.cpp +++ b/src/plugins/clangcodemodel/clangtextmark.cpp @@ -90,28 +90,76 @@ ProjectExplorer::Project *projectForCurrentEditor() 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, const ClangBackEnd::DiagnosticContainer &diagnostic) { - // Clang check - if (!diagnostic.disableOption.isEmpty()) { - config.setClangOptions(config.clangOptions() + QStringList(diagnostic.disableOption)); - return; - } - - // Clazy check 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()); QStringList newChecks = config.clazyChecks().split(','); newChecks.removeOne(checkName); config.setClazyChecks(newChecks.join(',')); - return; + break; } + } +} - // Tidy check - config.setClangTidyChecks(config.clangTidyChecks() + QString(",-") + textInfo.option()); +ClangDiagnosticConfig diagnosticConfig(ClangProjectSettings &projectSettings, + 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 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) @@ -124,15 +172,9 @@ void disableDiagnosticInCurrentProjectConfig(const ClangBackEnd::DiagnosticConta project); const QSharedPointer globalSettings = codeModelSettings(); - // Get config id - Core::Id currentConfigId = projectSettings.warningConfigId(); - if (projectSettings.useGlobalConfig()) - currentConfigId = globalSettings->clangDiagnosticConfigId(); - // Get config + ClangDiagnosticConfig config = diagnosticConfig(projectSettings, *globalSettings); ClangDiagnosticConfigsModel configsModel(globalSettings->clangCustomDiagnosticConfigs()); - QTC_ASSERT(configsModel.hasConfigWithId(currentConfigId), return ); - ClangDiagnosticConfig config = configsModel.configWithId(currentConfigId); // Create copy if needed if (config.isReadOnly()) { @@ -201,7 +243,8 @@ ClangTextMark::ClangTextMark(const FileName &fileName, actions << action; // Remove diagnostic warning action - if (projectForCurrentEditor()) { + ProjectExplorer::Project *project = projectForCurrentEditor(); + if (project && isDiagnosticConfigChangable(project, diagnostic)) { action = new QAction(); action->setIcon(::Utils::Icons::BROKEN.icon()); QObject::connect(action, &QAction::triggered, [diagnostic]() {