ProjectExplorer: Remove BuildConfigurationFactory::priority

It's essentially an intrusive hack that's used only to prioritize
Ios+Qmake over plain Qmake. The effect is now achieved by an
arguably equally evil dependency on the construction order of
BuildConfiguration factories.

It can be argued, however, that this is a feature as it allows
user plugins to intentionally override core functionality by
using the standard setup pattern and depending on the to-be-
overridden plugin.

Change-Id: Ic1efa305daf3ca19a880d2a7ccb40e2768d8f57c
Reviewed-by: Eike Ziller <eike.ziller@qt.io>
This commit is contained in:
hjk
2019-01-30 19:13:58 +01:00
parent 4ae0ad3ab5
commit a235d33837
4 changed files with 25 additions and 75 deletions

View File

@@ -145,7 +145,6 @@ IosBuildConfigurationFactory::IosBuildConfigurationFactory()
registerBuildConfiguration<IosBuildConfiguration>(QmakeProjectManager::Constants::QMAKE_BC_ID); registerBuildConfiguration<IosBuildConfiguration>(QmakeProjectManager::Constants::QMAKE_BC_ID);
addSupportedTargetDeviceType(Constants::IOS_DEVICE_TYPE); addSupportedTargetDeviceType(Constants::IOS_DEVICE_TYPE);
addSupportedTargetDeviceType(Constants::IOS_SIMULATOR_TYPE); addSupportedTargetDeviceType(Constants::IOS_SIMULATOR_TYPE);
setBasePriority(1);
} }
} // namespace Internal } // namespace Internal

View File

@@ -325,7 +325,8 @@ static QList<BuildConfigurationFactory *> g_buildConfigurationFactories;
BuildConfigurationFactory::BuildConfigurationFactory() BuildConfigurationFactory::BuildConfigurationFactory()
{ {
g_buildConfigurationFactories.append(this); // Note: Order matters as first-in-queue wins.
g_buildConfigurationFactories.prepend(this);
} }
BuildConfigurationFactory::~BuildConfigurationFactory() BuildConfigurationFactory::~BuildConfigurationFactory()
@@ -333,11 +334,6 @@ BuildConfigurationFactory::~BuildConfigurationFactory()
g_buildConfigurationFactories.removeOne(this); g_buildConfigurationFactories.removeOne(this);
} }
int BuildConfigurationFactory::priority(const Target *parent) const
{
return canHandle(parent) ? m_basePriority : -1;
}
const QList<Task> BuildConfigurationFactory::reportIssues(ProjectExplorer::Kit *kit, const QString &projectPath, const QList<Task> BuildConfigurationFactory::reportIssues(ProjectExplorer::Kit *kit, const QString &projectPath,
const QString &buildDir) const const QString &buildDir) const
{ {
@@ -363,45 +359,28 @@ bool BuildConfigurationFactory::supportsTargetDeviceType(Core::Id id) const
return m_supportedTargetDeviceTypes.contains(id); return m_supportedTargetDeviceTypes.contains(id);
} }
int BuildConfigurationFactory::priority(const Kit *k, const QString &projectPath) const
{
QTC_ASSERT(!m_supportedProjectMimeTypeName.isEmpty(), return -1);
if (k && Utils::mimeTypeForFile(projectPath).matchesName(m_supportedProjectMimeTypeName)
&& supportsTargetDeviceType(DeviceTypeKitInformation::deviceTypeId(k))) {
return m_basePriority;
}
return -1;
}
// setup // setup
BuildConfigurationFactory *BuildConfigurationFactory::find(const Kit *k, const QString &projectPath) BuildConfigurationFactory *BuildConfigurationFactory::find(const Kit *k, const QString &projectPath)
{ {
BuildConfigurationFactory *factory = nullptr; QTC_ASSERT(k, return nullptr);
int priority = -1; const Core::Id deviceType = DeviceTypeKitInformation::deviceTypeId(k);
for (BuildConfigurationFactory *i : g_buildConfigurationFactories) { for (BuildConfigurationFactory *factory : g_buildConfigurationFactories) {
int iPriority = i->priority(k, projectPath); if (Utils::mimeTypeForFile(projectPath).matchesName(factory->m_supportedProjectMimeTypeName)
if (iPriority > priority) { && factory->supportsTargetDeviceType(deviceType))
factory = i;
priority = iPriority;
}
}
return factory; return factory;
} }
return nullptr;
}
// create // create
BuildConfigurationFactory * BuildConfigurationFactory::find(Target *parent) BuildConfigurationFactory * BuildConfigurationFactory::find(Target *parent)
{ {
BuildConfigurationFactory *factory = nullptr; for (BuildConfigurationFactory *factory : g_buildConfigurationFactories) {
int priority = -1; if (factory->canHandle(parent))
for (BuildConfigurationFactory *i : g_buildConfigurationFactories) {
int iPriority = i->priority(parent);
if (iPriority > priority) {
factory = i;
priority = iPriority;
}
}
return factory; return factory;
} }
return nullptr;
}
void BuildConfigurationFactory::setSupportedProjectType(Core::Id id) void BuildConfigurationFactory::setSupportedProjectType(Core::Id id)
{ {
@@ -418,11 +397,6 @@ void BuildConfigurationFactory::addSupportedTargetDeviceType(Core::Id id)
m_supportedTargetDeviceTypes.append(id); m_supportedTargetDeviceTypes.append(id);
} }
void BuildConfigurationFactory::setBasePriority(int basePriority)
{
m_basePriority = basePriority;
}
bool BuildConfigurationFactory::canHandle(const Target *target) const bool BuildConfigurationFactory::canHandle(const Target *target) const
{ {
if (m_supportedProjectType.isValid() && m_supportedProjectType != target->project()->id()) if (m_supportedProjectType.isValid() && m_supportedProjectType != target->project()->id())
@@ -456,25 +430,13 @@ BuildConfiguration *BuildConfigurationFactory::create(Target *parent, const Buil
BuildConfiguration *BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map) BuildConfiguration *BuildConfigurationFactory::restore(Target *parent, const QVariantMap &map)
{ {
BuildConfigurationFactory *factory = nullptr;
int priority = -1;
for (BuildConfigurationFactory *i : g_buildConfigurationFactories) {
if (!i->canHandle(parent))
continue;
const Core::Id id = idFromMap(map); const Core::Id id = idFromMap(map);
if (!id.name().startsWith(i->m_buildConfigId.name())) for (BuildConfigurationFactory *factory : g_buildConfigurationFactories) {
continue;
int iPriority = i->priority(parent);
if (iPriority > priority) {
factory = i;
priority = iPriority;
}
}
if (!factory)
return nullptr;
QTC_ASSERT(factory->m_creator, return nullptr); QTC_ASSERT(factory->m_creator, return nullptr);
if (!factory->canHandle(parent))
continue;
if (!id.name().startsWith(factory->m_buildConfigId.name()))
continue;
BuildConfiguration *bc = factory->m_creator(parent); BuildConfiguration *bc = factory->m_creator(parent);
QTC_ASSERT(bc, return nullptr); QTC_ASSERT(bc, return nullptr);
if (!bc->fromMap(map)) { if (!bc->fromMap(map)) {
@@ -483,6 +445,8 @@ BuildConfiguration *BuildConfigurationFactory::restore(Target *parent, const QVa
} }
return bc; return bc;
} }
return nullptr;
}
BuildConfiguration *BuildConfigurationFactory::clone(Target *parent, BuildConfiguration *BuildConfigurationFactory::clone(Target *parent,
const BuildConfiguration *source) const BuildConfiguration *source)

View File

@@ -128,15 +128,10 @@ protected:
~BuildConfigurationFactory() override; ~BuildConfigurationFactory() override;
public: public:
// The priority is negative if this factory cannot create anything for the target.
// It is 0 for the "default" factory that wants to handle the target.
// Add 100 for each specialization.
virtual int priority(const Target *parent) const;
// List of build information that can be used to create a new build configuration via // List of build information that can be used to create a new build configuration via
// "Add Build Configuration" button. // "Add Build Configuration" button.
const QList<BuildInfo> allAvailableBuilds(const Target *parent) const; const QList<BuildInfo> allAvailableBuilds(const Target *parent) const;
virtual int priority(const Kit *k, const QString &projectPath) const;
// List of build information that can be used to initially set up a new build configuration. // List of build information that can be used to initially set up a new build configuration.
const QList<BuildInfo> allAvailableSetups(const Kit *k, const QString &projectPath) const; const QList<BuildInfo> allAvailableSetups(const Kit *k, const QString &projectPath) const;
@@ -162,7 +157,6 @@ protected:
void setSupportedProjectMimeTypeName(const QString &mimeTypeName); void setSupportedProjectMimeTypeName(const QString &mimeTypeName);
void addSupportedTargetDeviceType(Core::Id id); void addSupportedTargetDeviceType(Core::Id id);
void setDefaultDisplayName(const QString &defaultDisplayName); void setDefaultDisplayName(const QString &defaultDisplayName);
void setBasePriority(int basePriority);
using BuildConfigurationCreator = std::function<BuildConfiguration *(Target *)>; using BuildConfigurationCreator = std::function<BuildConfiguration *(Target *)>;
@@ -183,8 +177,6 @@ private:
QList<Core::Id> m_supportedTargetDeviceTypes; QList<Core::Id> m_supportedTargetDeviceTypes;
QString m_supportedProjectMimeTypeName; QString m_supportedProjectMimeTypeName;
IssueReporter m_issueReporter; IssueReporter m_issueReporter;
int m_basePriority = 0; // Use higher numbers (1, 2, ...) for higher priorities.
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -85,11 +85,6 @@ public:
{ {
return {}; return {};
} }
int priority(const ProjectExplorer::Kit *, const QString &) const final
{
return 0;
}
}; };
QmlProfilerDetailsRewriterTest::QmlProfilerDetailsRewriterTest(QObject *parent) : QObject(parent) QmlProfilerDetailsRewriterTest::QmlProfilerDetailsRewriterTest(QObject *parent) : QObject(parent)