From 139f700162f4a37e35048b9dce22e4369aae450c Mon Sep 17 00:00:00 2001 From: hjk Date: Mon, 18 Feb 2019 13:02:36 +0100 Subject: [PATCH] QtSupport: Replace BaseQtVersion::clone() ... by a mechanism that doesn't require re-implementation in each derived class. A QtVersion's type() is uniquely defined by the supported type of the factory creating it, so that factory can be found and used for cloning. Non-base data is copied by a fromMap(toMap()) dance as done in the project configurations. As a side-effect, the *QtVersion copy constructors are not used and not needed anymore. Change-Id: I3aa5a0fd90a27dd115769e0573647cb5669641a0 Reviewed-by: Christian Kandeler --- src/plugins/android/androidqtversion.cpp | 10 ------ src/plugins/android/androidqtversion.h | 2 -- src/plugins/ios/iosqtversion.cpp | 10 ------ src/plugins/ios/iosqtversion.h | 2 -- src/plugins/qnx/qnxqtversion.cpp | 10 ------ src/plugins/qnx/qnxqtversion.h | 4 --- src/plugins/qtsupport/baseqtversion.cpp | 9 ++++- src/plugins/qtsupport/baseqtversion.h | 7 ++-- src/plugins/qtsupport/desktopqtversion.cpp | 13 ------- src/plugins/qtsupport/desktopqtversion.h | 7 ---- src/plugins/qtsupport/qtoptionspage.cpp | 4 +-- src/plugins/qtsupport/qtversionfactory.cpp | 34 +++++++++++++++++-- src/plugins/qtsupport/qtversionfactory.h | 6 ++++ .../remotelinux/embeddedlinuxqtversion.cpp | 10 ------ .../remotelinux/embeddedlinuxqtversion.h | 4 --- src/plugins/winrt/winrtphoneqtversion.cpp | 10 ------ src/plugins/winrt/winrtphoneqtversion.h | 2 -- src/plugins/winrt/winrtqtversion.cpp | 10 ------ src/plugins/winrt/winrtqtversion.h | 2 -- 19 files changed, 51 insertions(+), 105 deletions(-) diff --git a/src/plugins/android/androidqtversion.cpp b/src/plugins/android/androidqtversion.cpp index ec1291ec270..e545d131cf1 100644 --- a/src/plugins/android/androidqtversion.cpp +++ b/src/plugins/android/androidqtversion.cpp @@ -52,16 +52,6 @@ AndroidQtVersion::AndroidQtVersion() { } -AndroidQtVersion *AndroidQtVersion::clone() const -{ - return new AndroidQtVersion(*this); -} - -QString AndroidQtVersion::type() const -{ - return QLatin1String(Constants::ANDROIDQT); -} - bool AndroidQtVersion::isValid() const { if (!BaseQtVersion::isValid()) diff --git a/src/plugins/android/androidqtversion.h b/src/plugins/android/androidqtversion.h index 5a448cf1cc1..4476aea6c70 100644 --- a/src/plugins/android/androidqtversion.h +++ b/src/plugins/android/androidqtversion.h @@ -40,8 +40,6 @@ class AndroidQtVersion : public QtSupport::BaseQtVersion public: AndroidQtVersion(); - AndroidQtVersion *clone() const override; - QString type() const override; bool isValid() const override; QString invalidReason() const override; diff --git a/src/plugins/ios/iosqtversion.cpp b/src/plugins/ios/iosqtversion.cpp index 3be02079739..78101fa55b7 100644 --- a/src/plugins/ios/iosqtversion.cpp +++ b/src/plugins/ios/iosqtversion.cpp @@ -42,16 +42,6 @@ using namespace ProjectExplorer; IosQtVersion::IosQtVersion() = default; -IosQtVersion *IosQtVersion::clone() const -{ - return new IosQtVersion(*this); -} - -QString IosQtVersion::type() const -{ - return QLatin1String(Constants::IOSQT); -} - bool IosQtVersion::isValid() const { if (!BaseQtVersion::isValid()) diff --git a/src/plugins/ios/iosqtversion.h b/src/plugins/ios/iosqtversion.h index 8ae07c4ce0b..3da34918d89 100644 --- a/src/plugins/ios/iosqtversion.h +++ b/src/plugins/ios/iosqtversion.h @@ -40,8 +40,6 @@ class IosQtVersion : public QtSupport::BaseQtVersion public: IosQtVersion(); - IosQtVersion *clone() const override; - QString type() const override; bool isValid() const override; QString invalidReason() const override; diff --git a/src/plugins/qnx/qnxqtversion.cpp b/src/plugins/qnx/qnxqtversion.cpp index 7269a09b9ff..330a1540159 100644 --- a/src/plugins/qnx/qnxqtversion.cpp +++ b/src/plugins/qnx/qnxqtversion.cpp @@ -46,16 +46,6 @@ static char SDP_PATH_KEY[] = "SDKPath"; QnxQtVersion::QnxQtVersion() = default; -QnxQtVersion *QnxQtVersion::clone() const -{ - return new QnxQtVersion(*this); -} - -QString QnxQtVersion::type() const -{ - return QLatin1String(Constants::QNX_QNX_QT); -} - QString QnxQtVersion::description() const { //: Qt Version is meant for QNX diff --git a/src/plugins/qnx/qnxqtversion.h b/src/plugins/qnx/qnxqtversion.h index 939beedb862..e72f78d8fea 100644 --- a/src/plugins/qnx/qnxqtversion.h +++ b/src/plugins/qnx/qnxqtversion.h @@ -41,10 +41,6 @@ class QnxQtVersion : public QtSupport::BaseQtVersion public: QnxQtVersion(); - QnxQtVersion *clone() const override; - - QString type() const override; - QString description() const override; QSet availableFeatures() const override; diff --git a/src/plugins/qtsupport/baseqtversion.cpp b/src/plugins/qtsupport/baseqtversion.cpp index bd046a81ecd..0995256d5f3 100644 --- a/src/plugins/qtsupport/baseqtversion.cpp +++ b/src/plugins/qtsupport/baseqtversion.cpp @@ -28,8 +28,10 @@ #include "qmldumptool.h" #include "qtkitinformation.h" +#include "qtversionfactory.h" #include "qtversionmanager.h" #include "profilereader.h" + #include #include #include @@ -193,7 +195,6 @@ bool QtVersionNumber::operator >=(const QtVersionNumber &b) const // BaseQtVersion /////////////// -BaseQtVersion::BaseQtVersion(const BaseQtVersion &other) = default; BaseQtVersion::BaseQtVersion() = default; BaseQtVersion::~BaseQtVersion() = default; @@ -645,6 +646,12 @@ int BaseQtVersion::uniqueId() const return m_id; } +QString BaseQtVersion::type() const +{ + QTC_ASSERT(m_factory, return QString()); + return m_factory->supportedType(); +} + bool BaseQtVersion::isAutodetected() const { return m_isAutodetected; diff --git a/src/plugins/qtsupport/baseqtversion.h b/src/plugins/qtsupport/baseqtversion.h index ca8837cf936..214b3f4c343 100644 --- a/src/plugins/qtsupport/baseqtversion.h +++ b/src/plugins/qtsupport/baseqtversion.h @@ -64,6 +64,7 @@ namespace QtSupport class QtConfigWidget; class BaseQtVersion; +class QtVersionFactory; // Wrapper to make the std::unique_ptr "copyable": class MacroExpanderWrapper @@ -113,7 +114,6 @@ public: virtual ~BaseQtVersion(); virtual void fromMap(const QVariantMap &map); - virtual BaseQtVersion *clone() const = 0; virtual bool equals(BaseQtVersion *other); bool isAutodetected() const; @@ -126,7 +126,7 @@ public: // All valid Ids are >= 0 int uniqueId() const; - virtual QString type() const = 0; + QString type() const; virtual QVariantMap toMap() const; virtual bool isValid() const; @@ -259,7 +259,7 @@ protected: virtual QSet availableFeatures() const; BaseQtVersion(); - BaseQtVersion(const BaseQtVersion &other); + BaseQtVersion(const BaseQtVersion &other) = delete; virtual QList reportIssuesImpl(const QString &proFile, const QString &buildDir) const; @@ -292,6 +292,7 @@ private: // and by the qtoptionspage to replace Qt versions int m_id = -1; + const QtVersionFactory *m_factory = nullptr; // The factory that created us. bool m_isAutodetected = false; mutable bool m_hasQmlDump = false; // controlled by m_versionInfoUpToDate diff --git a/src/plugins/qtsupport/desktopqtversion.cpp b/src/plugins/qtsupport/desktopqtversion.cpp index 7349f46e5b4..30292b11ee7 100644 --- a/src/plugins/qtsupport/desktopqtversion.cpp +++ b/src/plugins/qtsupport/desktopqtversion.cpp @@ -46,16 +46,6 @@ DesktopQtVersion::DesktopQtVersion() } -DesktopQtVersion *DesktopQtVersion::clone() const -{ - return new DesktopQtVersion(*this); -} - -QString DesktopQtVersion::type() const -{ - return QLatin1String(Constants::DESKTOPQT); -} - QStringList DesktopQtVersion::warningReason() const { QStringList ret = BaseQtVersion::warningReason(); @@ -112,9 +102,6 @@ QString DesktopQtVersion::qmlsceneCommand() const return m_qmlsceneCommand; } -DesktopQtVersion::DesktopQtVersion(const DesktopQtVersion &other) = default; - - namespace Internal { // Factory diff --git a/src/plugins/qtsupport/desktopqtversion.h b/src/plugins/qtsupport/desktopqtversion.h index 3aeee960efc..01e304e23ec 100644 --- a/src/plugins/qtsupport/desktopqtversion.h +++ b/src/plugins/qtsupport/desktopqtversion.h @@ -36,10 +36,6 @@ class QTSUPPORT_EXPORT DesktopQtVersion : public BaseQtVersion public: DesktopQtVersion(); - DesktopQtVersion *clone() const override; - - QString type() const override; - QStringList warningReason() const override; QString description() const override; @@ -51,9 +47,6 @@ public: QString qmlsceneCommand() const; -protected: - DesktopQtVersion(const DesktopQtVersion &other); - private: mutable QString m_qmlsceneCommand; }; diff --git a/src/plugins/qtsupport/qtoptionspage.cpp b/src/plugins/qtsupport/qtoptionspage.cpp index 37e64acde83..c4faa5bf289 100644 --- a/src/plugins/qtsupport/qtoptionspage.cpp +++ b/src/plugins/qtsupport/qtoptionspage.cpp @@ -522,7 +522,7 @@ void QtOptionsPageWidget::updateQtVersions(const QList &additions, const QL // Add changed/added items: foreach (int a, toAdd) { - BaseQtVersion *version = QtVersionManager::version(a)->clone(); + BaseQtVersion *version = QtVersionFactory::cloneQtVersion(QtVersionManager::version(a)); auto *item = new QtVersionItem(version); // Insert in the right place: @@ -753,7 +753,7 @@ void QtOptionsPageWidget::apply() m_model->forItemsAtLevel<2>([&versions](QtVersionItem *item) { item->setChanged(false); - versions.append(item->version()->clone()); + versions.append(QtVersionFactory::cloneQtVersion(item->version())); }); QtVersionManager::setNewQtVersions(versions); diff --git a/src/plugins/qtsupport/qtversionfactory.cpp b/src/plugins/qtsupport/qtversionfactory.cpp index d517ff89e05..2ae9c2030cd 100644 --- a/src/plugins/qtsupport/qtversionfactory.cpp +++ b/src/plugins/qtsupport/qtversionfactory.cpp @@ -66,7 +66,7 @@ BaseQtVersion *QtVersionFactory::restore(const QString &type, const QVariantMap { QTC_ASSERT(canRestore(type), return nullptr); QTC_ASSERT(m_creator, return nullptr); - BaseQtVersion *version = m_creator(); + BaseQtVersion *version = create(); version->fromMap(data); return version; } @@ -104,8 +104,7 @@ BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileN foreach (QtVersionFactory *factory, factories) { if (!factory->m_restrictionChecker || factory->m_restrictionChecker(setup)) { - QTC_ASSERT(factory->m_creator, continue); - BaseQtVersion *ver = factory->m_creator(); + BaseQtVersion *ver = factory->create(); QTC_ASSERT(ver, continue); ver->setupQmakePathAndId(qmakePath); ver->setAutoDetectionSource(autoDetectionSource); @@ -122,6 +121,35 @@ BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileN return 0; } +BaseQtVersion *QtVersionFactory::create() const +{ + QTC_ASSERT(m_creator, return nullptr); + BaseQtVersion *version = m_creator(); + version->m_factory = this; + return version; +} + +QString QtVersionFactory::supportedType() const +{ + return m_supportedType; +} + +BaseQtVersion *QtVersionFactory::cloneQtVersion(const BaseQtVersion *source) +{ + QTC_ASSERT(source, return nullptr); + const QString sourceType = source->type(); + for (QtVersionFactory *factory : g_qtVersionFactories) { + if (factory->m_supportedType == sourceType) { + BaseQtVersion *version = factory->create(); + QTC_ASSERT(version, return nullptr); + version->fromMap(source->toMap()); + return version; + } + } + QTC_CHECK(false); + return nullptr; +} + void QtVersionFactory::setQtVersionCreator(const std::function &creator) { m_creator = creator; diff --git a/src/plugins/qtsupport/qtversionfactory.h b/src/plugins/qtsupport/qtversionfactory.h index 9a34196d3a4..9753fccfbaa 100644 --- a/src/plugins/qtsupport/qtversionfactory.h +++ b/src/plugins/qtsupport/qtversionfactory.h @@ -51,10 +51,14 @@ public: /// the desktop factory claims to handle all paths int priority() const { return m_priority; } + QString supportedType() const; + static BaseQtVersion *createQtVersionFromQMakePath( const Utils::FileName &qmakePath, bool isAutoDetected = false, const QString &autoDetectionSource = QString(), QString *error = nullptr); + static BaseQtVersion *cloneQtVersion(const BaseQtVersion *source); + protected: struct SetupData { @@ -69,6 +73,8 @@ protected: void setPriority(int priority); private: + BaseQtVersion *create() const; + std::function m_creator; std::function m_restrictionChecker; QString m_supportedType; diff --git a/src/plugins/remotelinux/embeddedlinuxqtversion.cpp b/src/plugins/remotelinux/embeddedlinuxqtversion.cpp index a163f418c4a..10de3a6bf59 100644 --- a/src/plugins/remotelinux/embeddedlinuxqtversion.cpp +++ b/src/plugins/remotelinux/embeddedlinuxqtversion.cpp @@ -35,16 +35,6 @@ namespace RemoteLinux { namespace Internal { -EmbeddedLinuxQtVersion *EmbeddedLinuxQtVersion::clone() const -{ - return new EmbeddedLinuxQtVersion(*this); -} - -QString EmbeddedLinuxQtVersion::type() const -{ - return QLatin1String(RemoteLinux::Constants::EMBEDDED_LINUX_QT); -} - QString EmbeddedLinuxQtVersion::description() const { return QCoreApplication::translate("QtVersion", "Embedded Linux", "Qt Version is used for embedded Linux development"); diff --git a/src/plugins/remotelinux/embeddedlinuxqtversion.h b/src/plugins/remotelinux/embeddedlinuxqtversion.h index d929d812159..e70eea1df36 100644 --- a/src/plugins/remotelinux/embeddedlinuxqtversion.h +++ b/src/plugins/remotelinux/embeddedlinuxqtversion.h @@ -36,10 +36,6 @@ class EmbeddedLinuxQtVersion : public QtSupport::BaseQtVersion public: EmbeddedLinuxQtVersion() = default; - EmbeddedLinuxQtVersion *clone() const override; - - QString type() const override; - QString description() const override; QSet targetDeviceTypes() const override; diff --git a/src/plugins/winrt/winrtphoneqtversion.cpp b/src/plugins/winrt/winrtphoneqtversion.cpp index c1a657dc616..dc696d41f61 100644 --- a/src/plugins/winrt/winrtphoneqtversion.cpp +++ b/src/plugins/winrt/winrtphoneqtversion.cpp @@ -40,16 +40,6 @@ QString WinRtPhoneQtVersion::description() const return tr("Windows Phone"); } -QtSupport::BaseQtVersion *WinRtPhoneQtVersion::clone() const -{ - return new WinRtPhoneQtVersion(*this); -} - -QString WinRtPhoneQtVersion::type() const -{ - return QLatin1String(Constants::WINRT_WINPHONEQT); -} - QSet WinRtPhoneQtVersion::targetDeviceTypes() const { return {Constants::WINRT_DEVICE_TYPE_PHONE, Constants::WINRT_DEVICE_TYPE_EMULATOR}; diff --git a/src/plugins/winrt/winrtphoneqtversion.h b/src/plugins/winrt/winrtphoneqtversion.h index c99c0e9c358..a8f7062ae79 100644 --- a/src/plugins/winrt/winrtphoneqtversion.h +++ b/src/plugins/winrt/winrtphoneqtversion.h @@ -39,8 +39,6 @@ public: QSet availableFeatures() const override; QString description() const override; - BaseQtVersion *clone() const override; - QString type() const override; QSet targetDeviceTypes() const override; }; diff --git a/src/plugins/winrt/winrtqtversion.cpp b/src/plugins/winrt/winrtqtversion.cpp index 24e13cfec34..33d6a32bdcc 100644 --- a/src/plugins/winrt/winrtqtversion.cpp +++ b/src/plugins/winrt/winrtqtversion.cpp @@ -33,16 +33,6 @@ namespace WinRt { namespace Internal { -QtSupport::BaseQtVersion *WinRtQtVersion::clone() const -{ - return new WinRtQtVersion(*this); -} - -QString WinRtQtVersion::type() const -{ - return QLatin1String(Constants::WINRT_WINRTQT); -} - QString WinRtQtVersion::description() const { return tr("Windows Runtime"); diff --git a/src/plugins/winrt/winrtqtversion.h b/src/plugins/winrt/winrtqtversion.h index e966df69013..40030e4e6c2 100644 --- a/src/plugins/winrt/winrtqtversion.h +++ b/src/plugins/winrt/winrtqtversion.h @@ -37,8 +37,6 @@ class WinRtQtVersion : public QtSupport::BaseQtVersion public: WinRtQtVersion() = default; - BaseQtVersion *clone() const override; - QString type() const override; QString description() const override; QSet availableFeatures() const override;