File indexing completed on 2024-04-28 04:38:09
0001 /* 0002 SPDX-FileCopyrightText: 2016 Carlos Nihelton <carlosnsoliveira@gmail.com> 0003 SPDX-FileCopyrightText: 2018, 2020 Friedrich W. H. Kossebau <kossebau@kde.org> 0004 0005 SPDX-License-Identifier: GPL-2.0-or-later 0006 */ 0007 0008 #include "analyzer.h" 0009 0010 // plugin 0011 #include "plugin.h" 0012 #include "job.h" 0013 #include "checksetselectionmanager.h" 0014 #include <clangtidyconfig.h> 0015 #include <clangtidyprojectconfig.h> 0016 // KDevPlatform 0017 #include <interfaces/iproject.h> 0018 #include <util/path.h> 0019 // KF 0020 #include <KLocalizedString> 0021 // Qt 0022 #include <QThread> 0023 0024 namespace ClangTidy 0025 { 0026 0027 Analyzer::Analyzer(Plugin* plugin, CheckSetSelectionManager* checkSetSelectionManager, QObject* parent) 0028 : KDevelop::CompileAnalyzer(plugin, 0029 i18n("Clang-Tidy"), QStringLiteral("dialog-ok"), 0030 QStringLiteral("clangtidy_file"), QStringLiteral("clangtidy_project"), 0031 QStringLiteral("ClangTidy"), 0032 KDevelop::ProblemModel::CanDoFullUpdate | 0033 KDevelop::ProblemModel::ScopeFilter | 0034 KDevelop::ProblemModel::SeverityFilter | 0035 KDevelop::ProblemModel::Grouping | 0036 KDevelop::ProblemModel::CanByPassScopeFilter, 0037 parent) 0038 , m_plugin(plugin) 0039 , m_checkSetSelectionManager(checkSetSelectionManager) 0040 { 0041 } 0042 0043 Analyzer::~Analyzer() = default; 0044 0045 KDevelop::CompileAnalyzeJob * Analyzer::createJob(KDevelop::IProject* project, 0046 const KDevelop::Path& buildDirectory, 0047 const QUrl& url, const QStringList& filePaths) 0048 { 0049 Q_UNUSED(url); 0050 0051 ClangTidyProjectSettings projectSettings; 0052 projectSettings.setSharedConfig(project->projectConfiguration()); 0053 projectSettings.load(); 0054 0055 Job::Parameters params; 0056 0057 params.projectRootDir = project->path().toLocalFile(); 0058 0059 auto clangTidyPath = KDevelop::Path(ClangTidySettings::clangtidyPath()).toLocalFile(); 0060 params.executablePath = clangTidyPath; 0061 0062 params.filePaths = filePaths; 0063 params.buildDir = buildDirectory.toLocalFile(); 0064 0065 params.additionalParameters = projectSettings.additionalParameters(); 0066 0067 QString checkSetSelectionId = projectSettings.checkSetSelection(); 0068 if (checkSetSelectionId == QLatin1String("Default")) { 0069 checkSetSelectionId = m_checkSetSelectionManager->defaultCheckSetSelectionId(); 0070 } 0071 const auto enabledChecks = checkSetSelectionId.isEmpty() ? projectSettings.enabledChecks() : m_checkSetSelectionManager->checkSetSelection(checkSetSelectionId).selectionAsString(); 0072 if (!enabledChecks.isEmpty()) { 0073 params.enabledChecks = enabledChecks; 0074 } else { 0075 auto& checkSet = m_plugin->checkSet(); 0076 // make sure the defaults are up-to-date TODO: make async 0077 checkSet.setClangTidyPath(clangTidyPath); 0078 params.enabledChecks = checkSet.defaults().join(QLatin1Char(',')); 0079 } 0080 params.useConfigFile = projectSettings.useConfigFile(); 0081 params.headerFilter = projectSettings.headerFilter(); 0082 params.checkSystemHeaders = projectSettings.checkSystemHeaders(); 0083 0084 params.parallelJobCount = 0085 ClangTidySettings::parallelJobsEnabled() ? 0086 (ClangTidySettings::parallelJobsAutoCount() ? 0087 QThread::idealThreadCount() : 0088 ClangTidySettings::parallelJobsFixedCount()) : 0089 1; 0090 0091 return new Job(params, this); 0092 } 0093 0094 } 0095 0096 #include "moc_analyzer.cpp"