From 1bc10248c06bf7248ca9c4e05013b492edc3210a Mon Sep 17 00:00:00 2001 From: hjk Date: Wed, 13 Mar 2019 12:22:44 +0100 Subject: [PATCH] ProjectExplorer: Introduce a SimpleRunWorkerFactory template ... and use in as replacement for RunConfiguration::addRunWorkerFactory. It is still convenient to have a simple way to set up run worker factories for the typical "just run for this configuration" case, but it's even better if it follows the nowadays predominant pattern of keeping factories in the plugin's pimpl. Also, it turned out there were two copies of QmlProjectRunconfigurationFactory code, one is enough. Change-Id: I0b28c4ea18d0f52165a49f6133dc8687a3b9c7cf Reviewed-by: Christian Kandeler --- src/plugins/android/androidplugin.cpp | 11 +++-- .../cmakeprojectplugin.cpp | 4 ++ .../cmakerunconfiguration.cpp | 2 - src/plugins/nim/nimplugin.cpp | 2 + .../nim/project/nimrunconfiguration.cpp | 1 - .../customexecutablerunconfiguration.cpp | 2 - .../projectexplorer/projectexplorer.cpp | 1 + .../projectexplorer/runconfiguration.cpp | 12 +----- .../projectexplorer/runconfiguration.h | 14 ------ src/plugins/projectexplorer/runcontrol.h | 16 +++++++ .../pythoneditor/pythoneditorplugin.cpp | 2 +- .../qbsprojectmanagerplugin.cpp | 2 + .../qbsprojectmanager/qbsrunconfiguration.cpp | 2 - .../desktopqmakerunconfiguration.cpp | 2 - .../qmakeprojectmanagerplugin.cpp | 3 ++ .../qmlprojectmanager/qmlprojectplugin.cpp | 15 +++++-- .../qmlprojectmanager/qmlprojectplugin.h | 2 +- .../qmlprojectrunconfiguration.cpp | 2 - .../qmlprojectrunconfigurationfactory.cpp | 43 ------------------- .../qmlprojectrunconfigurationfactory.h | 40 ----------------- 20 files changed, 50 insertions(+), 128 deletions(-) delete mode 100644 src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp delete mode 100644 src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h diff --git a/src/plugins/android/androidplugin.cpp b/src/plugins/android/androidplugin.cpp index 7fa3153b4f2..607a29e7cac 100644 --- a/src/plugins/android/androidplugin.cpp +++ b/src/plugins/android/androidplugin.cpp @@ -85,10 +85,6 @@ public: registerRunConfiguration ("Qt4ProjectManager.AndroidRunConfiguration:"); addSupportedTargetDeviceType(Android::Constants::ANDROID_DEVICE_TYPE); - addRunWorkerFactory(NORMAL_RUN_MODE); - addRunWorkerFactory(DEBUG_RUN_MODE); - addRunWorkerFactory(QML_PROFILER_RUN_MODE); - addRunWorkerFactory(QML_PREVIEW_RUN_MODE); } }; @@ -135,6 +131,13 @@ public: AndroidPackageInstallationFactory packackeInstallationFactory; AndroidManifestEditorFactory manifestEditorFactory; AndroidRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory runWorkerFactory; + SimpleRunWorkerFactory + debugWorkerFactory{DEBUG_RUN_MODE}; + SimpleRunWorkerFactory + profilerWorkerFactory{QML_PROFILER_RUN_MODE}; + SimpleRunWorkerFactory + qmlPreviewWorkerFactory{QML_PREVIEW_RUN_MODE}; AndroidBuildApkStepFactory buildApkStepFactory; AndroidGdbServerKitAspect gdbServerKitAspect; }; diff --git a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp index 035d9605173..d4a3d27f873 100644 --- a/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp +++ b/src/plugins/cmakeprojectmanager/cmakeprojectplugin.cpp @@ -43,9 +43,12 @@ #include #include #include + #include #include #include +#include + #include #include @@ -67,6 +70,7 @@ public: CMakeManager manager; CMakeBuildStepFactory buildStepFactory; CMakeRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory runWorkerFactory; CMakeBuildConfigurationFactory buildConfigFactory; CMakeEditorFactory editorFactor; CMakeLocatorFilter locatorFiler; diff --git a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp index f9184d6e5ce..c2f111bb3c4 100644 --- a/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp +++ b/src/plugins/cmakeprojectmanager/cmakerunconfiguration.cpp @@ -93,8 +93,6 @@ CMakeRunConfigurationFactory::CMakeRunConfigurationFactory() registerRunConfiguration("CMakeProjectManager.CMakeRunConfiguration."); addSupportedProjectType(CMakeProjectManager::Constants::CMAKEPROJECT_ID); addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); - - addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // Internal diff --git a/src/plugins/nim/nimplugin.cpp b/src/plugins/nim/nimplugin.cpp index 3afcb19b5fa..67b282e0738 100644 --- a/src/plugins/nim/nimplugin.cpp +++ b/src/plugins/nim/nimplugin.cpp @@ -43,6 +43,7 @@ #include #include #include +#include #include using namespace Utils; @@ -66,6 +67,7 @@ public: NimEditorFactory editorFactory; NimBuildConfigurationFactory buildConfigFactory; NimRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory runWorkerFactory; NimCompilerBuildStepFactory buildStepFactory; NimCompilerCleanStepFactory cleanStepFactory; NimCodeStyleSettingsPage codeStyleSettingsPage; diff --git a/src/plugins/nim/project/nimrunconfiguration.cpp b/src/plugins/nim/project/nimrunconfiguration.cpp index 1dcbb9873da..8bfd0370885 100644 --- a/src/plugins/nim/project/nimrunconfiguration.cpp +++ b/src/plugins/nim/project/nimrunconfiguration.cpp @@ -100,7 +100,6 @@ NimRunConfigurationFactory::NimRunConfigurationFactory() : FixedRunConfiguration { registerRunConfiguration("Nim.NimRunConfiguration"); addSupportedProjectType(Constants::C_NIMPROJECT_ID); - addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // Nim diff --git a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp index a3c9a84f46e..1caa79c8fa7 100644 --- a/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp +++ b/src/plugins/projectexplorer/customexecutablerunconfiguration.cpp @@ -284,8 +284,6 @@ CustomExecutableRunConfigurationFactory::CustomExecutableRunConfigurationFactory FixedRunConfigurationFactory(CustomExecutableRunConfiguration::tr("Custom Executable")) { registerRunConfiguration(CUSTOM_EXECUTABLE_ID); - - addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace ProjectExplorer diff --git a/src/plugins/projectexplorer/projectexplorer.cpp b/src/plugins/projectexplorer/projectexplorer.cpp index 75051a4ce34..29366c60c6a 100644 --- a/src/plugins/projectexplorer/projectexplorer.cpp +++ b/src/plugins/projectexplorer/projectexplorer.cpp @@ -544,6 +544,7 @@ public: CurrentProjectFind m_curretProjectFind; CustomExecutableRunConfigurationFactory m_customExecutableRunConfigFactory; + SimpleRunWorkerFactory m_customExecutableRunWorkerFactory; ProjectFileWizardExtension m_projectFileWizardExtension; diff --git a/src/plugins/projectexplorer/runconfiguration.cpp b/src/plugins/projectexplorer/runconfiguration.cpp index ab40226f512..18442dbfaaf 100644 --- a/src/plugins/projectexplorer/runconfiguration.cpp +++ b/src/plugins/projectexplorer/runconfiguration.cpp @@ -427,8 +427,6 @@ RunConfigurationFactory::RunConfigurationFactory() RunConfigurationFactory::~RunConfigurationFactory() { g_runConfigurationFactories.removeOne(this); - qDeleteAll(m_ownedRunWorkerFactories); - m_ownedRunWorkerFactories.clear(); } QString RunConfigurationFactory::decoratedTargetName(const QString &targetName, Target *target) @@ -497,15 +495,7 @@ void RunConfigurationFactory::setDecorateDisplayNames(bool on) m_decorateDisplayNames = on; } -RunWorkerFactory *RunConfigurationFactory::addRunWorkerFactoryHelper - (Core::Id runMode, const std::function &creator) -{ - auto factory = new RunWorkerFactory; - factory->addConstraint(m_ownTypeChecker); - factory->addSupportedRunMode(runMode); - factory->setProducer(creator); - return factory; -} + void RunConfigurationFactory::addSupportedProjectType(Core::Id id) { diff --git a/src/plugins/projectexplorer/runconfiguration.h b/src/plugins/projectexplorer/runconfiguration.h index ea089e95307..c54b64ad96e 100644 --- a/src/plugins/projectexplorer/runconfiguration.h +++ b/src/plugins/projectexplorer/runconfiguration.h @@ -251,25 +251,13 @@ protected: return new RunConfig(t, runConfigBaseId); }; m_runConfigBaseId = runConfigBaseId; - m_ownTypeChecker = [](RunConfiguration *runConfig) { - return qobject_cast(runConfig) != nullptr; - }; } void addSupportedProjectType(Core::Id id); void addSupportedTargetDeviceType(Core::Id id); void setDecorateDisplayNames(bool on); - template - RunWorkerFactory *addRunWorkerFactory(Core::Id runMode) - { - return addRunWorkerFactoryHelper(runMode, [](RunControl *rc) { return new Worker(rc); }); - } - private: - RunWorkerFactory *addRunWorkerFactoryHelper - (Core::Id runMode, const std::function &creator); - bool canHandle(Target *target) const; friend class RunConfigurationCreationInfo; @@ -278,8 +266,6 @@ private: QList m_supportedProjectTypes; QList m_supportedTargetDeviceTypes; bool m_decorateDisplayNames = false; - QList m_ownedRunWorkerFactories; - std::function m_ownTypeChecker; }; class PROJECTEXPLORER_EXPORT FixedRunConfigurationFactory : public RunConfigurationFactory diff --git a/src/plugins/projectexplorer/runcontrol.h b/src/plugins/projectexplorer/runcontrol.h index 7afdbc5c661..657c7acd75f 100644 --- a/src/plugins/projectexplorer/runcontrol.h +++ b/src/plugins/projectexplorer/runcontrol.h @@ -327,4 +327,20 @@ private: bool m_useTerminal = false; }; +template +class SimpleRunWorkerFactory : public RunWorkerFactory +{ +public: + SimpleRunWorkerFactory(Core::Id runMode = ProjectExplorer::Constants::NORMAL_RUN_MODE) + { + addSupportedRunMode(runMode); + addConstraint([](RunConfiguration *runConfig) { + return qobject_cast(runConfig) != nullptr; + }); + setProducer([](RunControl *runControl) { + return new RunWorker(runControl); + }); + } +}; + } // namespace ProjectExplorer diff --git a/src/plugins/pythoneditor/pythoneditorplugin.cpp b/src/plugins/pythoneditor/pythoneditorplugin.cpp index 0d86d65a817..2d21a073c88 100644 --- a/src/plugins/pythoneditor/pythoneditorplugin.cpp +++ b/src/plugins/pythoneditor/pythoneditorplugin.cpp @@ -312,7 +312,6 @@ public: { registerRunConfiguration("PythonEditor.RunConfiguration."); addSupportedProjectType(PythonProjectId); - addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } }; @@ -723,6 +722,7 @@ class PythonEditorPluginPrivate public: PythonEditorFactory editorFactory; PythonRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory runWorkerFactory; }; PythonEditorPlugin::~PythonEditorPlugin() diff --git a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp index 8a2ab1ce08d..464d3f9beec 100644 --- a/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp +++ b/src/plugins/qbsprojectmanager/qbsprojectmanagerplugin.cpp @@ -54,6 +54,7 @@ #include #include #include +#include #include #include @@ -91,6 +92,7 @@ public: QbsCleanStepFactory cleanStepFactory; QbsInstallStepFactory installStepFactory; QbsRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory runWorkerFactory; QbsProfilesSettingsPage profilesSetttingsPage; QbsKitAspect qbsKitAspect; }; diff --git a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp index 09312bca79e..2a7412c4c65 100644 --- a/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp +++ b/src/plugins/qbsprojectmanager/qbsrunconfiguration.cpp @@ -169,8 +169,6 @@ QbsRunConfigurationFactory::QbsRunConfigurationFactory() registerRunConfiguration("Qbs.RunConfiguration:"); addSupportedProjectType(Constants::PROJECT_ID); addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); - - addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace Internal diff --git a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp index 0cb01cf15a3..d5f6eaecaa9 100644 --- a/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp +++ b/src/plugins/qmakeprojectmanager/desktopqmakerunconfiguration.cpp @@ -147,8 +147,6 @@ DesktopQmakeRunConfigurationFactory::DesktopQmakeRunConfigurationFactory() registerRunConfiguration("Qt4ProjectManager.Qt4RunConfiguration:"); addSupportedProjectType(QmakeProjectManager::Constants::QMAKEPROJECT_ID); addSupportedTargetDeviceType(ProjectExplorer::Constants::DESKTOP_DEVICE_TYPE); - - addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace Internal diff --git a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp index 06f35270617..b2ac41a8a28 100644 --- a/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp +++ b/src/plugins/qmakeprojectmanager/qmakeprojectmanagerplugin.cpp @@ -55,6 +55,7 @@ #include #include #include +#include #include #include @@ -100,6 +101,8 @@ public: QmakeBuildConfigurationFactory buildConfigFactory; DesktopQmakeRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory + runWorkerFactory; ProFileEditorFactory profileEditorFactory; diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp index 6e460d3e0b9..b2079c9f31d 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.cpp @@ -25,12 +25,13 @@ #include "qmlprojectplugin.h" #include "qmlproject.h" -#include "qmlprojectrunconfigurationfactory.h" +#include "qmlprojectrunconfiguration.h" #include #include #include +#include #include @@ -39,16 +40,24 @@ using namespace ProjectExplorer; namespace QmlProjectManager { namespace Internal { +class QmlProjectPluginPrivate +{ +public: + QmlProjectRunConfigurationFactory runConfigFactory; + SimpleRunWorkerFactory + runWorkerFactory{ProjectExplorer::Constants::NORMAL_RUN_MODE}; +}; + QmlProjectPlugin::~QmlProjectPlugin() { - delete m_rcFactory; + delete d; } bool QmlProjectPlugin::initialize(const QStringList &, QString *errorMessage) { Q_UNUSED(errorMessage) - m_rcFactory = new QmlProjectRunConfigurationFactory; + d = new QmlProjectPluginPrivate; ProjectManager::registerProjectType(QmlJSTools::Constants::QMLPROJECT_MIMETYPE); Core::FileIconProvider::registerIconOverlayForSuffix(":/qmlproject/images/qmlproject.png", "qmlproject"); diff --git a/src/plugins/qmlprojectmanager/qmlprojectplugin.h b/src/plugins/qmlprojectmanager/qmlprojectplugin.h index d08738cfa99..10a407216db 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectplugin.h +++ b/src/plugins/qmlprojectmanager/qmlprojectplugin.h @@ -43,7 +43,7 @@ private: bool initialize(const QStringList &arguments, QString *errorString) final; void extensionsInitialized() final {} - class QmlProjectRunConfigurationFactory *m_rcFactory = nullptr; + class QmlProjectPluginPrivate *d = nullptr; }; } // namespace Internal diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp index fc10cfde177..412cbb94c79 100644 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp +++ b/src/plugins/qmlprojectmanager/qmlprojectrunconfiguration.cpp @@ -459,8 +459,6 @@ QmlProjectRunConfigurationFactory::QmlProjectRunConfigurationFactory() registerRunConfiguration ("QmlProjectManager.QmlRunConfiguration.QmlScene"); addSupportedProjectType(QmlProjectManager::Constants::QML_PROJECT_ID); - - addRunWorkerFactory(ProjectExplorer::Constants::NORMAL_RUN_MODE); } } // namespace Internal diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp deleted file mode 100644 index e5abbcc0b3d..00000000000 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.cpp +++ /dev/null @@ -1,43 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#include "qmlprojectrunconfigurationfactory.h" -#include "qmlprojectmanagerconstants.h" -#include "qmlproject.h" -#include "qmlprojectrunconfiguration.h" - -namespace QmlProjectManager { -namespace Internal { - -QmlProjectRunConfigurationFactory::QmlProjectRunConfigurationFactory() : - ProjectExplorer::FixedRunConfigurationFactory(QmlProjectRunConfiguration::tr("QML Scene"), false) -{ - registerRunConfiguration(Constants::QML_SCENE_RC_ID); - addSupportedProjectType(QmlProjectManager::Constants::QML_PROJECT_ID); -} - -} // namespace Internal -} // namespace QmlProjectManager - diff --git a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h b/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h deleted file mode 100644 index 0a94d3c4f32..00000000000 --- a/src/plugins/qmlprojectmanager/qmlprojectrunconfigurationfactory.h +++ /dev/null @@ -1,40 +0,0 @@ -/**************************************************************************** -** -** Copyright (C) 2016 The Qt Company Ltd. -** Contact: https://www.qt.io/licensing/ -** -** This file is part of Qt Creator. -** -** Commercial License Usage -** Licensees holding valid commercial Qt licenses may use this file in -** accordance with the commercial license agreement provided with the -** Software or, alternatively, in accordance with the terms contained in -** a written agreement between you and The Qt Company. For licensing terms -** and conditions see https://www.qt.io/terms-conditions. For further -** information use the contact form at https://www.qt.io/contact-us. -** -** GNU General Public License Usage -** Alternatively, this file may be used under the terms of the GNU -** General Public License version 3 as published by the Free Software -** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT -** included in the packaging of this file. Please review the following -** information to ensure the GNU General Public License requirements will -** be met: https://www.gnu.org/licenses/gpl-3.0.html. -** -****************************************************************************/ - -#pragma once - -#include - -namespace QmlProjectManager { -namespace Internal { - -class QmlProjectRunConfigurationFactory : public ProjectExplorer::FixedRunConfigurationFactory -{ -public: - QmlProjectRunConfigurationFactory(); -}; - -} // namespace Internal -} // namespace QmlProjectManager