QtSupport: Replace QtVersionFactory::canCreate

... by a functor checking some ad-hoc custom structure content.

This effectively replaces one ugliness (access to qmake specific
variable via qmake specific ProFileEvaluator) by an indirection
layer with similarly ungeneric contents, but I like the latter
setup better.

Change-Id: Iaee07c992fce4aabee2f4eae32a2413d772fe945
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2019-02-14 12:15:48 +01:00
parent 4079dd5cbc
commit 7563cd6d39
12 changed files with 41 additions and 83 deletions

View File

@@ -26,9 +26,6 @@
#include "androidqtversionfactory.h" #include "androidqtversionfactory.h"
#include "androidqtversion.h" #include "androidqtversion.h"
#include "androidconstants.h" #include "androidconstants.h"
#include <qtsupport/qtsupportconstants.h>
#include <utils/qtcassert.h>
#include <proparser/profileevaluator.h>
namespace Android { namespace Android {
namespace Internal { namespace Internal {
@@ -38,15 +35,12 @@ AndroidQtVersionFactory::AndroidQtVersionFactory()
setQtVersionCreator([] { return new AndroidQtVersion; }); setQtVersionCreator([] { return new AndroidQtVersion; });
setSupportedType(Constants::ANDROIDQT); setSupportedType(Constants::ANDROIDQT);
setPriority(90); setPriority(90);
}
bool AndroidQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const setRestrictionChecker([](const SetupData &setup) {
{ return !setup.config.contains("android-no-sdk")
if (evaluator->values("CONFIG").contains("android-no-sdk")) && (setup.config.contains("android")
return false; || setup.platforms.contains("android"));
});
return evaluator->values("CONFIG").contains("android")
|| evaluator->value("QMAKE_PLATFORM") == "android";
} }
} // Internal } // Internal

View File

@@ -34,8 +34,6 @@ class AndroidQtVersionFactory : public QtSupport::QtVersionFactory
{ {
public: public:
AndroidQtVersionFactory(); AndroidQtVersionFactory();
bool canCreate(ProFileEvaluator *evaluator) const override;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -26,8 +26,6 @@
#include "iosqtversionfactory.h" #include "iosqtversionfactory.h"
#include "iosqtversion.h" #include "iosqtversion.h"
#include "iosconstants.h" #include "iosconstants.h"
#include <qtsupport/qtsupportconstants.h>
#include <proparser/profileevaluator.h>
namespace Ios { namespace Ios {
namespace Internal { namespace Internal {
@@ -37,11 +35,10 @@ IosQtVersionFactory::IosQtVersionFactory()
setQtVersionCreator([] { return new IosQtVersion; }); setQtVersionCreator([] { return new IosQtVersion; });
setSupportedType(Constants::IOSQT); setSupportedType(Constants::IOSQT);
setPriority(90); setPriority(90);
}
bool IosQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const setRestrictionChecker([](const SetupData &setup) {
{ return setup.platforms.contains("ios");
return evaluator->values("QMAKE_PLATFORM").contains("ios"); });
} }
} // Internal } // Internal

View File

@@ -34,8 +34,6 @@ class IosQtVersionFactory : public QtSupport::QtVersionFactory
{ {
public: public:
IosQtVersionFactory(); IosQtVersionFactory();
bool canCreate(ProFileEvaluator *evaluator) const override;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -28,8 +28,6 @@
#include "qnxconstants.h" #include "qnxconstants.h"
#include "qnxqtversion.h" #include "qnxqtversion.h"
#include <qtsupport/profilereader.h>
using namespace Qnx; using namespace Qnx;
using namespace Qnx::Internal; using namespace Qnx::Internal;
@@ -38,9 +36,6 @@ QnxQtVersionFactory::QnxQtVersionFactory()
setQtVersionCreator([] { return new QnxQtVersion; }); setQtVersionCreator([] { return new QnxQtVersion; });
setSupportedType(Constants::QNX_QNX_QT); setSupportedType(Constants::QNX_QNX_QT);
setPriority(50); setPriority(50);
setRestrictionChecker([](const SetupData &setup) { return setup.isQnx; });
} }
bool QnxQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const
{
return evaluator->contains("QNX_CPUDIR");
}

View File

@@ -34,8 +34,6 @@ class QnxQtVersionFactory : public QtSupport::QtVersionFactory
{ {
public: public:
QnxQtVersionFactory(); QnxQtVersionFactory();
bool canCreate(ProFileEvaluator *evaluator) const override;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -71,18 +71,6 @@ BaseQtVersion *QtVersionFactory::restore(const QString &type, const QVariantMap
return version; 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) BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileName &qmakePath, bool isAutoDetected, const QString &autoDetectionSource, QString *error)
{ {
QHash<ProKey, ProString> versionInfo; QHash<ProKey, ProString> versionInfo;
@@ -109,9 +97,15 @@ BaseQtVersion *QtVersionFactory::createQtVersionFromQMakePath(const Utils::FileN
if (!fi.exists() || !fi.isExecutable() || !fi.isFile()) if (!fi.exists() || !fi.isExecutable() || !fi.isFile())
return nullptr; return nullptr;
SetupData setup;
setup.config = evaluator.values("CONFIG");
setup.platforms = evaluator.values("QMAKE_PLATFORM"); // It's a list in general.
setup.isQnx = !evaluator.value("QNX_CPUDIR").isEmpty();
foreach (QtVersionFactory *factory, factories) { foreach (QtVersionFactory *factory, factories) {
if (factory->canCreate(&evaluator)) { if (!factory->m_restrictionChecker || factory->m_restrictionChecker(setup)) {
BaseQtVersion *ver = factory->create(); QTC_ASSERT(factory->m_creator, continue);
BaseQtVersion *ver = factory->m_creator();
QTC_ASSERT(ver, continue); QTC_ASSERT(ver, continue);
ver->setupQmakePathAndId(qmakePath); ver->setupQmakePathAndId(qmakePath);
ver->setAutoDetectionSource(autoDetectionSource); ver->setAutoDetectionSource(autoDetectionSource);
@@ -133,6 +127,11 @@ void QtVersionFactory::setQtVersionCreator(const std::function<BaseQtVersion *()
m_creator = creator; m_creator = creator;
} }
void QtVersionFactory::setRestrictionChecker(const std::function<bool(const SetupData &)> &checker)
{
m_restrictionChecker = checker;
}
void QtVersionFactory::setSupportedType(const QString &type) void QtVersionFactory::setSupportedType(const QString &type)
{ {
m_supportedType = type; m_supportedType = type;

View File

@@ -29,10 +29,6 @@
#include <QVariantMap> #include <QVariantMap>
QT_BEGIN_NAMESPACE
class ProFileEvaluator;
QT_END_NAMESPACE
namespace Utils { class FileName; } namespace Utils { class FileName; }
namespace QtSupport { namespace QtSupport {
@@ -55,20 +51,26 @@ public:
/// the desktop factory claims to handle all paths /// the desktop factory claims to handle all paths
int priority() const { return m_priority; } int priority() const { return m_priority; }
BaseQtVersion *create() const;
virtual bool canCreate(ProFileEvaluator *evaluator) const;
static BaseQtVersion *createQtVersionFromQMakePath( static BaseQtVersion *createQtVersionFromQMakePath(
const Utils::FileName &qmakePath, bool isAutoDetected = false, const Utils::FileName &qmakePath, bool isAutoDetected = false,
const QString &autoDetectionSource = QString(), QString *error = nullptr); const QString &autoDetectionSource = QString(), QString *error = nullptr);
protected: protected:
struct SetupData
{
QStringList platforms;
QStringList config;
bool isQnx = false; // eeks...
};
void setQtVersionCreator(const std::function<BaseQtVersion *()> &creator); void setQtVersionCreator(const std::function<BaseQtVersion *()> &creator);
void setRestrictionChecker(const std::function<bool(const SetupData &)> &checker);
void setSupportedType(const QString &type); void setSupportedType(const QString &type);
void setPriority(int priority); void setPriority(int priority);
private: private:
std::function<BaseQtVersion *()> m_creator; std::function<BaseQtVersion *()> m_creator;
std::function<bool(const SetupData &)> m_restrictionChecker;
QString m_supportedType; QString m_supportedType;
int m_priority = 0; int m_priority = 0;
}; };

View File

@@ -28,8 +28,6 @@
#include "embeddedlinuxqtversion.h" #include "embeddedlinuxqtversion.h"
#include "remotelinux_constants.h" #include "remotelinux_constants.h"
#include <QFileInfo>
namespace RemoteLinux { namespace RemoteLinux {
namespace Internal { namespace Internal {
@@ -38,12 +36,8 @@ EmbeddedLinuxQtVersionFactory::EmbeddedLinuxQtVersionFactory()
setQtVersionCreator([] { return new EmbeddedLinuxQtVersion; }); setQtVersionCreator([] { return new EmbeddedLinuxQtVersion; });
setSupportedType(RemoteLinux::Constants::EMBEDDED_LINUX_QT); setSupportedType(RemoteLinux::Constants::EMBEDDED_LINUX_QT);
setPriority(10); setPriority(10);
}
bool EmbeddedLinuxQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const
{
Q_UNUSED(evaluator);
setRestrictionChecker([](const SetupData &) {
EmbeddedLinuxQtVersion tempVersion; EmbeddedLinuxQtVersion tempVersion;
QList<ProjectExplorer::Abi> abis = tempVersion.qtAbis(); QList<ProjectExplorer::Abi> abis = tempVersion.qtAbis();
@@ -51,6 +45,7 @@ bool EmbeddedLinuxQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const
return abis.count() == 1 return abis.count() == 1
&& abis.at(0).os() == ProjectExplorer::Abi::LinuxOS && abis.at(0).os() == ProjectExplorer::Abi::LinuxOS
&& !ProjectExplorer::Abi::hostAbi().isCompatibleWith(abis.at(0)); && !ProjectExplorer::Abi::hostAbi().isCompatibleWith(abis.at(0));
});
} }
} // namespace Internal } // namespace Internal

View File

@@ -34,8 +34,6 @@ class EmbeddedLinuxQtVersionFactory : public QtSupport::QtVersionFactory
{ {
public: public:
EmbeddedLinuxQtVersionFactory(); EmbeddedLinuxQtVersionFactory();
bool canCreate(ProFileEvaluator *evaluator) const override;
}; };
} // Internal } // Internal

View File

@@ -28,8 +28,6 @@
#include "winrtconstants.h" #include "winrtconstants.h"
#include "winrtphoneqtversion.h" #include "winrtphoneqtversion.h"
#include <proparser/profileevaluator.h>
namespace WinRt { namespace WinRt {
namespace Internal { namespace Internal {
@@ -37,27 +35,17 @@ WinRtQtVersionFactory::WinRtQtVersionFactory()
{ {
setQtVersionCreator([] { return new WinRtQtVersion; }); setQtVersionCreator([] { return new WinRtQtVersion; });
setSupportedType(Constants::WINRT_WINRTQT); setSupportedType(Constants::WINRT_WINRTQT);
setRestrictionChecker([](const SetupData &setup) { return setup.platforms.contains("winrt"); });
setPriority(10); setPriority(10);
} }
bool WinRtQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const
{
return evaluator->values("QMAKE_PLATFORM").contains("winrt");
}
WinRtPhoneQtVersionFactory::WinRtPhoneQtVersionFactory() WinRtPhoneQtVersionFactory::WinRtPhoneQtVersionFactory()
{ {
setQtVersionCreator([] { return new WinRtPhoneQtVersion; }); setQtVersionCreator([] { return new WinRtPhoneQtVersion; });
setSupportedType(Constants::WINRT_WINPHONEQT); setSupportedType(Constants::WINRT_WINPHONEQT);
setRestrictionChecker([](const SetupData &setup) { return setup.platforms.contains("winphone"); });
setPriority(10); setPriority(10);
} }
bool WinRtPhoneQtVersionFactory::canCreate(ProFileEvaluator *evaluator) const
{
return evaluator->values("QMAKE_PLATFORM").contains("winphone");
}
} // Internal } // Internal
} // WinRt } // WinRt

View File

@@ -34,16 +34,12 @@ class WinRtQtVersionFactory : public QtSupport::QtVersionFactory
{ {
public: public:
WinRtQtVersionFactory(); WinRtQtVersionFactory();
bool canCreate(ProFileEvaluator *evaluator) const override;
}; };
class WinRtPhoneQtVersionFactory : public QtSupport::QtVersionFactory class WinRtPhoneQtVersionFactory : public QtSupport::QtVersionFactory
{ {
public: public:
WinRtPhoneQtVersionFactory(); WinRtPhoneQtVersionFactory();
bool canCreate(ProFileEvaluator *evaluator) const override;
}; };
} // Internal } // Internal