diff options
author | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-02-15 15:05:02 +0100 |
---|---|---|
committer | Nikolai Kosjar <nikolai.kosjar@qt.io> | 2019-02-20 08:29:55 +0000 |
commit | 4e2c3a7d7242b773e516781bfa61f56a61bab102 (patch) | |
tree | cf42c0486ed41382bb553ddfa3407e2776be1caa /src/plugins/clangcodemodel | |
parent | 808910792762c0c89cbf37c644a42505df02afb2 (diff) |
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>
Diffstat (limited to 'src/plugins/clangcodemodel')
-rw-r--r-- | src/plugins/clangcodemodel/clangtextmark.cpp | 83 |
1 files changed, 63 insertions, 20 deletions
diff --git a/src/plugins/clangcodemodel/clangtextmark.cpp b/src/plugins/clangcodemodel/clangtextmark.cpp index e673df7622..f756acf2d3 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<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) @@ -124,15 +172,9 @@ void disableDiagnosticInCurrentProjectConfig(const ClangBackEnd::DiagnosticConta project); const QSharedPointer<CppCodeModelSettings> 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]() { |