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

0001 /*
0002     SPDX-FileCopyrightText: 2016 Aetf <aetf@unlimitedcodeworks.xyz>
0003 
0004     SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0005 */
0006 
0007 #include "debuggerplugin.h"
0008 
0009 #include "debuglog.h"
0010 #include "lldblauncher.h"
0011 #include "widgets/debuggerconsoleview.h"
0012 
0013 #include <execute/iexecuteplugin.h>
0014 #include <interfaces/icore.h>
0015 #include <interfaces/iplugincontroller.h>
0016 #include <interfaces/iruncontroller.h>
0017 #include <interfaces/launchconfigurationtype.h>
0018 
0019 #include <KPluginFactory>
0020 
0021 using namespace KDevMI::LLDB;
0022 
0023 inline void initMyResource() { Q_INIT_RESOURCE(kdevlldb); }
0024 
0025 K_PLUGIN_FACTORY_WITH_JSON(LldbDebuggerFactory, "kdevlldb.json", registerPlugin<LldbDebuggerPlugin>(); )
0026 
0027 LldbDebuggerPlugin::LldbDebuggerPlugin(QObject *parent, const QVariantList &)
0028     : MIDebuggerPlugin(QStringLiteral("kdevlldb"), i18n("LLDB"), parent)
0029     , m_consoleFactory(nullptr)
0030     , m_disassembleFactory(nullptr)
0031 {
0032     initMyResource();
0033 
0034     setXMLFile(QStringLiteral("kdevlldbui.rc"));
0035 
0036     auto pluginController = core()->pluginController();
0037     const auto plugins = pluginController->allPluginsForExtension(QStringLiteral("org.kdevelop.IExecutePlugin"));
0038     for (auto plugin : plugins) {
0039         setupExecutePlugin(plugin, true);
0040     }
0041 
0042     connect(pluginController, &KDevelop::IPluginController::pluginLoaded,
0043             this, [this](KDevelop::IPlugin* plugin) {
0044                 setupExecutePlugin(plugin, true);
0045             });
0046 
0047     connect(pluginController, &KDevelop::IPluginController::unloadingPlugin,
0048             this, [this](KDevelop::IPlugin* plugin) {
0049                 setupExecutePlugin(plugin, false);
0050             });
0051 }
0052 
0053 void LldbDebuggerPlugin::unload()
0054 {
0055     const auto plugins = core()->pluginController()->allPluginsForExtension(QStringLiteral("org.kdevelop.IExecutePlugin"));
0056     for (auto plugin : plugins) {
0057         setupExecutePlugin(plugin, false);
0058     }
0059     Q_ASSERT(m_launchers.isEmpty());
0060 }
0061 
0062 void LldbDebuggerPlugin::setupExecutePlugin(KDevelop::IPlugin* plugin, bool load)
0063 {
0064     if (plugin == this) {
0065         return;
0066     }
0067 
0068     auto iface = plugin->extension<IExecutePlugin>();
0069     if (!iface) {
0070         return;
0071     }
0072 
0073     auto type = core()->runController()->launchConfigurationTypeForId(iface->nativeAppConfigTypeId());
0074     Q_ASSERT(type);
0075 
0076     if (load) {
0077         auto launcher = new LldbLauncher(this, iface);
0078         m_launchers.insert(plugin, launcher);
0079         type->addLauncher(launcher);
0080     } else {
0081         auto launcher = m_launchers.take(plugin);
0082         Q_ASSERT(launcher);
0083 
0084         type->removeLauncher(launcher);
0085         delete launcher;
0086     }
0087 }
0088 
0089 void LldbDebuggerPlugin::setupToolViews()
0090 {
0091     m_consoleFactory = new DebuggerToolFactory<NonInterruptDebuggerConsoleView>(this,
0092                             QStringLiteral("org.kdevelop.debugger.LldbConsole"), Qt::BottomDockWidgetArea);
0093     core()->uiController()->addToolView(i18nc("@title:window", "LLDB Console"), m_consoleFactory);
0094     /*
0095     m_disassembleFactory = new DebuggerToolFactory<DisassembleWidget>(this,
0096                             "org.kdevelop.debugger.LldbDisassemble", Qt::BottomDockWidgetArea);
0097     core()->uiController()->addToolView(i18nc("@title:window", "LLDB Disassemble/Register"), m_disassembleFactory);
0098     */
0099 }
0100 
0101 void LldbDebuggerPlugin::unloadToolViews()
0102 {
0103     if (m_consoleFactory) {
0104         qCDebug(DEBUGGERLLDB) << "Removing tool view";
0105         core()->uiController()->removeToolView(m_consoleFactory);
0106         m_consoleFactory = nullptr;
0107     }
0108     /*
0109     core()->uiController()->removeToolView(m_disassembleFactory);
0110     core()->uiController()->removeToolView(memoryviewerfactory);
0111     */
0112 }
0113 
0114 LldbDebuggerPlugin::~LldbDebuggerPlugin()
0115 {
0116 }
0117 
0118 DebugSession* LldbDebuggerPlugin::createSession()
0119 {
0120     auto *session = new DebugSession(this);
0121     core()->debugController()->addSession(session);
0122     connect(session, &DebugSession::showMessage, this, &LldbDebuggerPlugin::showStatusMessage);
0123     connect(session, &DebugSession::reset, this, &LldbDebuggerPlugin::reset);
0124     connect(session, &DebugSession::raiseDebuggerConsoleViews,
0125             this, &LldbDebuggerPlugin::raiseDebuggerConsoleViews);
0126     return session;
0127 }
0128 
0129 #include "debuggerplugin.moc"
0130 #include "moc_debuggerplugin.cpp"