File indexing completed on 2024-04-28 04:38:10

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 "plugin.h"
0009 
0010 // plugin
0011 #include <clangtidyconfig.h>
0012 #include <clangtidyprojectconfig.h>
0013 #include "config/clangtidypreferences.h"
0014 #include "config/clangtidyprojectconfigpage.h"
0015 #include "analyzer.h"
0016 #include "checksetselectionmanager.h"
0017 // KDevPlatform
0018 #include <interfaces/contextmenuextension.h>
0019 #include <project/projectconfigpage.h>
0020 #include <util/path.h>
0021 // KF
0022 #include <KLocalizedString>
0023 #include <KPluginFactory>
0024 
0025 using namespace KDevelop;
0026 
0027 K_PLUGIN_FACTORY_WITH_JSON(ClangTidyFactory, "kdevclangtidy.json",
0028                            registerPlugin<ClangTidy::Plugin>();)
0029 
0030 namespace ClangTidy
0031 {
0032 
0033 Plugin::Plugin(QObject* parent, const QVariantList& /*unused*/)
0034     : IPlugin(QStringLiteral("kdevclangtidy"), parent)
0035     , m_checkSetSelectionManager(new CheckSetSelectionManager)
0036 {
0037     setXMLFile(QStringLiteral("kdevclangtidy.rc"));
0038 
0039     // create after ui.rc file is set with action ids
0040     m_analyzer = new Analyzer(this, m_checkSetSelectionManager, this);
0041 
0042     auto clangTidyPath = KDevelop::Path(ClangTidySettings::clangtidyPath()).toLocalFile();
0043 
0044     // TODO: not only collect on plugin loading, but also on every change in the settings
0045     // TODO: should also check version on every job start to see if there was an update
0046     // behind our back while kdevelop running
0047     // TODO: collect in async job
0048     m_checkSet.setClangTidyPath(clangTidyPath);
0049 }
0050 
0051 Plugin::~Plugin() = default;
0052 
0053 void Plugin::unload()
0054 {
0055     delete m_checkSetSelectionManager;
0056     m_checkSetSelectionManager = nullptr;
0057     delete m_analyzer;
0058     m_analyzer = nullptr;
0059 }
0060 
0061 ContextMenuExtension Plugin::contextMenuExtension(Context* context, QWidget* parent)
0062 {
0063     ContextMenuExtension extension = KDevelop::IPlugin::contextMenuExtension(context, parent);
0064 
0065     m_analyzer->fillContextMenuExtension(extension, context, parent);
0066 
0067     return extension;
0068 }
0069 
0070 KDevelop::ConfigPage* Plugin::perProjectConfigPage(int number, const ProjectConfigOptions& options, QWidget* parent)
0071 {
0072     if (number != 0) {
0073         return nullptr;
0074     }
0075 
0076     // ensure checkset is up-to-date TODO: async
0077     auto clangTidyPath = KDevelop::Path(ClangTidySettings::clangtidyPath()).toLocalFile();
0078     m_checkSet.setClangTidyPath(clangTidyPath);
0079 
0080     return new ProjectConfigPage(this, options.project, m_checkSetSelectionManager, &m_checkSet, parent);
0081 }
0082 
0083 KDevelop::ConfigPage* Plugin::configPage(int number, QWidget* parent)
0084 {
0085     if (number != 0) {
0086         return nullptr;
0087     }
0088 
0089     // ensure checkset is up-to-date TODO: async
0090     auto clangTidyPath = KDevelop::Path(ClangTidySettings::clangtidyPath()).toLocalFile();
0091     m_checkSet.setClangTidyPath(clangTidyPath);
0092 
0093     return new ClangTidyPreferences(m_checkSetSelectionManager, &m_checkSet, this, parent);
0094 }
0095 
0096 } // namespace ClangTidy
0097 
0098 #include "plugin.moc"
0099 #include "moc_plugin.cpp"