diff --git a/src/libs/utils/shutdownguard.h b/src/libs/utils/shutdownguard.h index 226bd06d76c..d4e362aa47b 100644 --- a/src/libs/utils/shutdownguard.h +++ b/src/libs/utils/shutdownguard.h @@ -18,15 +18,18 @@ template class GuardedObject { public: - GuardedObject() - : m_object(new T) + GuardedObject(T *obj) + : m_object(obj) { QObject::connect(shutdownGuard(), &QObject::destroyed, shutdownGuard(), [this] { delete m_object; m_object = nullptr; }); } - ~GuardedObject() = default; + + GuardedObject() + : GuardedObject(new T) + {} T *get() const { return m_object; } diff --git a/src/plugins/languageclient/languageclientmanager.cpp b/src/plugins/languageclient/languageclientmanager.cpp index 86fd28fa93d..db8c011d206 100644 --- a/src/plugins/languageclient/languageclientmanager.cpp +++ b/src/plugins/languageclient/languageclientmanager.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include @@ -50,8 +51,7 @@ class LanguageClientManagerPrivate LanguageFunctionsFilter m_functionFilter; }; -LanguageClientManager::LanguageClientManager(QObject *parent) - : QObject(parent) +LanguageClientManager::LanguageClientManager() { setObjectName("LanguageClientManager"); @@ -742,9 +742,9 @@ bool LanguageClientManager::isShutdownFinished() && managerInstance->m_scheduledForDeletion.isEmpty(); } -void setupLanguageClientManager(QObject *guard) +void setupLanguageClientManager() { - (void) new LanguageClientManager(guard); + static Utils::GuardedObject theLanguageClientManager{new LanguageClientManager}; } } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientmanager.h b/src/plugins/languageclient/languageclientmanager.h index e29c268331f..12cc3dafb35 100644 --- a/src/plugins/languageclient/languageclientmanager.h +++ b/src/plugins/languageclient/languageclientmanager.h @@ -33,6 +33,8 @@ class LANGUAGECLIENT_EXPORT LanguageClientManager : public QObject Q_DISABLE_COPY_MOVE(LanguageClientManager) public: + ~LanguageClientManager() override; + static void clientStarted(Client *client); static void clientFinished(Client *client); static Client *startClient(const BaseSettings *setting, ProjectExplorer::Project *project = nullptr); @@ -98,10 +100,9 @@ signals: void openCallHierarchy(); private: - explicit LanguageClientManager(QObject *parent); - ~LanguageClientManager() override; + LanguageClientManager(); - friend void setupLanguageClientManager(QObject *guard); + friend void setupLanguageClientManager(); void updateProject(ProjectExplorer::Project *project); void projectAdded(ProjectExplorer::Project *project); @@ -127,6 +128,6 @@ template bool LanguageClientManager::hasClients() }); } -void setupLanguageClientManager(QObject *guard); +void setupLanguageClientManager(); } // namespace LanguageClient diff --git a/src/plugins/languageclient/languageclientplugin.cpp b/src/plugins/languageclient/languageclientplugin.cpp index b8af019f9a5..1595b6815ff 100644 --- a/src/plugins/languageclient/languageclientplugin.cpp +++ b/src/plugins/languageclient/languageclientplugin.cpp @@ -50,7 +50,7 @@ void LanguageClientPlugin::initialize() setupCallHierarchyFactory(); setupTypeHierarchyFactory(); setupLanguageClientProjectPanel(); - setupLanguageClientManager(this); + setupLanguageClientManager(); setupLanguageClientOutline(); #ifdef WITH_TESTS diff --git a/src/plugins/python/pythonplugin.cpp b/src/plugins/python/pythonplugin.cpp index a26ced0381c..b193ead79da 100644 --- a/src/plugins/python/pythonplugin.cpp +++ b/src/plugins/python/pythonplugin.cpp @@ -90,7 +90,7 @@ class PythonPlugin final : public ExtensionSystem::IPlugin setupPythonDebugWorker(); setupPythonOutputParser(); - setupPythonSettings(this); + setupPythonSettings(); setupPythonWizard(); setupPipSupport(this); diff --git a/src/plugins/python/pythonsettings.cpp b/src/plugins/python/pythonsettings.cpp index 6ad05a6399d..54f1fc0b869 100644 --- a/src/plugins/python/pythonsettings.cpp +++ b/src/plugins/python/pythonsettings.cpp @@ -36,6 +36,7 @@ #include #include #include +#include #include #include @@ -1169,10 +1170,9 @@ Interpreter PythonSettings::interpreter(const QString &interpreterId) Utils::equal(&Interpreter::id, interpreterId)); } -void setupPythonSettings(QObject *guard) +void setupPythonSettings() { - new PythonSettings; // Initializes settingsInstance - settingsInstance->setParent(guard); + static GuardedObject thePythonSettings{new PythonSettings}; } Utils::ListModel *createInterpreterModel(QObject *parent) diff --git a/src/plugins/python/pythonsettings.h b/src/plugins/python/pythonsettings.h index ff6584e6fd9..159f8011a54 100644 --- a/src/plugins/python/pythonsettings.h +++ b/src/plugins/python/pythonsettings.h @@ -78,7 +78,8 @@ private: static void saveSettings(); }; -void setupPythonSettings(QObject *guard); +void setupPythonSettings(); + Utils::ListModel *createInterpreterModel(QObject *parent); } // Python::Internal