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"