diff --git a/src/plugins/android/androidqtversionfactory.cpp b/src/plugins/android/androidqtversionfactory.cpp index 358f73583a5..52082d1af58 100644 --- a/src/plugins/android/androidqtversionfactory.cpp +++ b/src/plugins/android/androidqtversionfactory.cpp @@ -40,14 +40,14 @@ AndroidQtVersionFactory::AndroidQtVersionFactory() setPriority(90); } -QtSupport::BaseQtVersion *AndroidQtVersionFactory::create(ProFileEvaluator *evaluator) +bool AndroidQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const { - if (!evaluator->values(QLatin1String("CONFIG")).contains(QLatin1String("android")) - && evaluator->value(QLatin1String("QMAKE_PLATFORM")) != QLatin1String("android")) - return nullptr; - if (evaluator->values(QLatin1String("CONFIG")).contains(QLatin1String("android-no-sdk"))) - return nullptr; - return new AndroidQtVersion; + if (!evaluator->values("CONFIG").contains("android") + && evaluator->value("QMAKE_PLATFORM") != "android") + return false; + if (evaluator->values("CONFIG").contains("android-no-sdk")) + return false; + return true; } } // Internal diff --git a/src/plugins/android/androidqtversionfactory.h b/src/plugins/android/androidqtversionfactory.h index 5c9d0f5893c..b630bf3919d 100644 --- a/src/plugins/android/androidqtversionfactory.h +++ b/src/plugins/android/androidqtversionfactory.h @@ -35,7 +35,7 @@ class AndroidQtVersionFactory : public QtSupport::QtVersionFactory public: AndroidQtVersionFactory(); - QtSupport::BaseQtVersion *create(ProFileEvaluator *evaluator) override; + bool canCreate(ProFileEvaluator *evaluator) const override; }; } // namespace Internal diff --git a/src/plugins/ios/iosqtversionfactory.cpp b/src/plugins/ios/iosqtversionfactory.cpp index ebdbd74c5a3..8d118fe29c2 100644 --- a/src/plugins/ios/iosqtversionfactory.cpp +++ b/src/plugins/ios/iosqtversionfactory.cpp @@ -39,11 +39,9 @@ IosQtVersionFactory::IosQtVersionFactory() setPriority(90); } -QtSupport::BaseQtVersion *IosQtVersionFactory::create(ProFileEvaluator *evaluator) +bool IosQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const { - if (!(evaluator->values(QLatin1String("QMAKE_PLATFORM")).contains(QLatin1String("ios")))) - return nullptr; - return new IosQtVersion; + return evaluator->values("QMAKE_PLATFORM").contains("ios"); } } // Internal diff --git a/src/plugins/ios/iosqtversionfactory.h b/src/plugins/ios/iosqtversionfactory.h index ce912ed60f3..6bb18fd1765 100644 --- a/src/plugins/ios/iosqtversionfactory.h +++ b/src/plugins/ios/iosqtversionfactory.h @@ -35,7 +35,7 @@ class IosQtVersionFactory : public QtSupport::QtVersionFactory public: IosQtVersionFactory(); - QtSupport::BaseQtVersion *create(ProFileEvaluator *evaluator) override; + bool canCreate(ProFileEvaluator *evaluator) const override; }; } // namespace Internal diff --git a/src/plugins/qnx/qnxqtversionfactory.cpp b/src/plugins/qnx/qnxqtversionfactory.cpp index eea7f49243f..ad484ddc04a 100644 --- a/src/plugins/qnx/qnxqtversionfactory.cpp +++ b/src/plugins/qnx/qnxqtversionfactory.cpp @@ -40,10 +40,7 @@ QnxQtVersionFactory::QnxQtVersionFactory() setPriority(50); } -QtSupport::BaseQtVersion *QnxQtVersionFactory::create(ProFileEvaluator *evaluator) +bool QnxQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const { - if (evaluator->contains(QLatin1String("QNX_CPUDIR"))) - return new QnxQtVersion; - - return nullptr; + return evaluator->contains("QNX_CPUDIR"); } diff --git a/src/plugins/qnx/qnxqtversionfactory.h b/src/plugins/qnx/qnxqtversionfactory.h index 5c3aabb5204..4abdeaf31bb 100644 --- a/src/plugins/qnx/qnxqtversionfactory.h +++ b/src/plugins/qnx/qnxqtversionfactory.h @@ -35,7 +35,7 @@ class QnxQtVersionFactory : public QtSupport::QtVersionFactory public: QnxQtVersionFactory(); - QtSupport::BaseQtVersion *create(ProFileEvaluator *evaluator) override; + bool canCreate(ProFileEvaluator *evaluator) const override; }; } // namespace Internal diff --git a/src/plugins/qtsupport/desktopqtversionfactory.cpp b/src/plugins/qtsupport/desktopqtversionfactory.cpp index 368fef90268..b7a8bcea90c 100644 --- a/src/plugins/qtsupport/desktopqtversionfactory.cpp +++ b/src/plugins/qtsupport/desktopqtversionfactory.cpp @@ -35,11 +35,5 @@ DesktopQtVersionFactory::DesktopQtVersionFactory() setQtVersionCreator([] { return new DesktopQtVersion; }); setSupportedType(Constants::DESKTOPQT); setPriority(0); // Lowest of all, we want to be the fallback -} - -BaseQtVersion *DesktopQtVersionFactory::create(ProFileEvaluator *evaluator) -{ - Q_UNUSED(evaluator); - // we are the fallback :) so we don't care what kind of qt it is - return new DesktopQtVersion; + // No further restrictions. We are the fallback :) so we don't care what kind of qt it is. } diff --git a/src/plugins/qtsupport/desktopqtversionfactory.h b/src/plugins/qtsupport/desktopqtversionfactory.h index d2d12e2f95c..00d308456ef 100644 --- a/src/plugins/qtsupport/desktopqtversionfactory.h +++ b/src/plugins/qtsupport/desktopqtversionfactory.h @@ -34,8 +34,6 @@ class DesktopQtVersionFactory : public QtVersionFactory { public: DesktopQtVersionFactory(); - - BaseQtVersion *create(ProFileEvaluator *evaluator) override; }; } // Internal diff --git a/src/plugins/qtsupport/qtversionfactory.cpp b/src/plugins/qtsupport/qtversionfactory.cpp index 4a00a199bea..99c5e62478c 100644 --- a/src/plugins/qtsupport/qtversionfactory.cpp +++ b/src/plugins/qtsupport/qtversionfactory.cpp @@ -71,6 +71,18 @@ BaseQtVersion *QtVersionFactory::restore(const QString &type, const QVariantMap return version; } +BaseQtVersion *QtVersionFactory::create() const +{ + QTC_ASSERT(m_creator, return nullptr); + return m_creator(); +} + +bool QtVersionFactory::canCreate(ProFileEvaluator *evaluator) const +{ + Q_UNUSED(evaluator); + return true; +} + BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileName &qmakePath, bool isAutoDetected, const QString &autoDetectionSource, QString *error) { QHash versionInfo; @@ -98,7 +110,9 @@ BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileN return nullptr; foreach (QtVersionFactory *factory, factories) { - if (BaseQtVersion *ver = factory->create(&evaluator)) { + if (factory->canCreate(&evaluator)) { + BaseQtVersion *ver = factory->create(); + QTC_ASSERT(ver, continue); ver->setupQmakePathAndId(qmakePath); ver->setAutoDetectionSource(autoDetectionSource); ver->setIsAutodetected(isAutoDetected); diff --git a/src/plugins/qtsupport/qtversionfactory.h b/src/plugins/qtsupport/qtversionfactory.h index c66a87a7405..59c85451576 100644 --- a/src/plugins/qtsupport/qtversionfactory.h +++ b/src/plugins/qtsupport/qtversionfactory.h @@ -54,7 +54,9 @@ public: /// a qtversion, the priority of the desktop factory is 0 and /// the desktop factory claims to handle all paths int priority() const { return m_priority; } - virtual BaseQtVersion *create(ProFileEvaluator *evaluator) = 0; + + BaseQtVersion *create() const; + virtual bool canCreate(ProFileEvaluator *evaluator) const; static BaseQtVersion *createQtVersionFromQMakePath( const Utils::FileName &qmakePath, bool isAutoDetected = false, diff --git a/src/plugins/remotelinux/embeddedlinuxqtversionfactory.cpp b/src/plugins/remotelinux/embeddedlinuxqtversionfactory.cpp index 74b7bd106af..1ff52d29603 100644 --- a/src/plugins/remotelinux/embeddedlinuxqtversionfactory.cpp +++ b/src/plugins/remotelinux/embeddedlinuxqtversionfactory.cpp @@ -40,21 +40,17 @@ EmbeddedLinuxQtVersionFactory::EmbeddedLinuxQtVersionFactory() setPriority(10); } -QtSupport::BaseQtVersion *EmbeddedLinuxQtVersionFactory::create(ProFileEvaluator *evaluator) +bool EmbeddedLinuxQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const { Q_UNUSED(evaluator); - auto version = new EmbeddedLinuxQtVersion; + EmbeddedLinuxQtVersion tempVersion; + QList abis = tempVersion.qtAbis(); - QList abis = version->qtAbis(); // Note: This fails for e.g. intel/meego cross builds on x86 linux machines. - if (abis.count() == 1 + return abis.count() == 1 && abis.at(0).os() == ProjectExplorer::Abi::LinuxOS - && !ProjectExplorer::Abi::hostAbi().isCompatibleWith(abis.at(0))) - return version; - - delete version; - return nullptr; + && !ProjectExplorer::Abi::hostAbi().isCompatibleWith(abis.at(0)); } } // namespace Internal diff --git a/src/plugins/remotelinux/embeddedlinuxqtversionfactory.h b/src/plugins/remotelinux/embeddedlinuxqtversionfactory.h index 7e341acb2f9..11dbdf64807 100644 --- a/src/plugins/remotelinux/embeddedlinuxqtversionfactory.h +++ b/src/plugins/remotelinux/embeddedlinuxqtversionfactory.h @@ -35,7 +35,7 @@ class EmbeddedLinuxQtVersionFactory : public QtSupport::QtVersionFactory public: EmbeddedLinuxQtVersionFactory(); - QtSupport::BaseQtVersion *create(ProFileEvaluator *evaluator) override; + bool canCreate(ProFileEvaluator *evaluator) const override; }; } // Internal diff --git a/src/plugins/winrt/winrtqtversionfactory.cpp b/src/plugins/winrt/winrtqtversionfactory.cpp index 38ebe45ba80..c8fe3970007 100644 --- a/src/plugins/winrt/winrtqtversionfactory.cpp +++ b/src/plugins/winrt/winrtqtversionfactory.cpp @@ -40,14 +40,9 @@ WinRtQtVersionFactory::WinRtQtVersionFactory() setPriority(10); } -QtSupport::BaseQtVersion *WinRtQtVersionFactory::create(ProFileEvaluator *evaluator) +bool WinRtQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const { - foreach (const QString &value, evaluator->values(QLatin1String("QMAKE_PLATFORM"))) { - if (value == QStringLiteral("winrt")) - return new WinRtQtVersion; - } - - return nullptr; + return evaluator->values("QMAKE_PLATFORM").contains("winrt"); } @@ -59,14 +54,9 @@ WinRtPhoneQtVersionFactory::WinRtPhoneQtVersionFactory() setPriority(10); } -QtSupport::BaseQtVersion *WinRtPhoneQtVersionFactory::create(ProFileEvaluator *evaluator) +bool WinRtPhoneQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const { - foreach (const QString &value, evaluator->values(QLatin1String("QMAKE_PLATFORM"))) { - if (value == QStringLiteral("winphone")) - return new WinRtPhoneQtVersion; - } - - return nullptr; + return evaluator->values("QMAKE_PLATFORM").contains("winphone"); } } // Internal diff --git a/src/plugins/winrt/winrtqtversionfactory.h b/src/plugins/winrt/winrtqtversionfactory.h index 1b778ff0033..302a3ecf8d7 100644 --- a/src/plugins/winrt/winrtqtversionfactory.h +++ b/src/plugins/winrt/winrtqtversionfactory.h @@ -35,7 +35,7 @@ class WinRtQtVersionFactory : public QtSupport::QtVersionFactory public: WinRtQtVersionFactory(); - QtSupport::BaseQtVersion *create(ProFileEvaluator *evaluator) override; + bool canCreate(ProFileEvaluator *evaluator) const override; }; class WinRtPhoneQtVersionFactory : public QtSupport::QtVersionFactory @@ -43,7 +43,7 @@ class WinRtPhoneQtVersionFactory : public QtSupport::QtVersionFactory public: WinRtPhoneQtVersionFactory(); - QtSupport::BaseQtVersion *create(ProFileEvaluator *evaluator) override; + bool canCreate(ProFileEvaluator *evaluator) const override; }; } // Internal