forked from qt-creator/qt-creator
ProjectExplorer: De-duplicate code in IBuildStepFactory derived classes
This removes 900 lines of duplicated code, some duplicated checks at runtime and some (minor) quadratic behavior when gathering display names. canClone(), canRestore() and canCreate() and restore() use the same pattern. Handle that on the core side once. Leave retore() virtual to let the ios code unmodified (which is likely not needed, later...). Introduce 'Unclonable' and 'Uncreatable' flags to keep Android package installation and WinRT deployment (non-)functionality unchanged. Change-Id: I0325479aff818a4038b2f241ca733b8d8cd66f2f Reviewed-by: Tobias Hunger <tobias.hunger@qt.io>
This commit is contained in:
@@ -39,22 +39,6 @@ using namespace ProjectExplorer;
|
||||
|
||||
namespace {
|
||||
|
||||
IBuildStepFactory *findCloneFactory(BuildStepList *parent, BuildStep *source)
|
||||
{
|
||||
return ExtensionSystem::PluginManager::getObject<IBuildStepFactory>(
|
||||
[&parent, &source](IBuildStepFactory *factory) {
|
||||
return factory->canClone(parent, source);
|
||||
});
|
||||
}
|
||||
|
||||
IBuildStepFactory *findRestoreFactory(BuildStepList *parent, const QVariantMap &map)
|
||||
{
|
||||
return ExtensionSystem::PluginManager::getObject<IBuildStepFactory>(
|
||||
[&parent, &map](IBuildStepFactory *factory) {
|
||||
return factory->canRestore(parent, map);
|
||||
});
|
||||
}
|
||||
|
||||
const char STEPS_COUNT_KEY[] = "ProjectExplorer.BuildStepList.StepsCount";
|
||||
const char STEPS_PREFIX[] = "ProjectExplorer.BuildStepList.Step.";
|
||||
|
||||
@@ -125,13 +109,23 @@ bool BuildStepList::contains(Core::Id id) const
|
||||
void BuildStepList::cloneSteps(BuildStepList *source)
|
||||
{
|
||||
Q_ASSERT(source);
|
||||
const QList<IBuildStepFactory *> factories
|
||||
= ExtensionSystem::PluginManager::getObjects<IBuildStepFactory>();
|
||||
foreach (BuildStep *originalbs, source->steps()) {
|
||||
IBuildStepFactory *factory(findCloneFactory(this, originalbs));
|
||||
if (!factory)
|
||||
continue;
|
||||
BuildStep *clonebs(factory->clone(this, originalbs));
|
||||
if (clonebs)
|
||||
m_steps.append(clonebs);
|
||||
foreach (IBuildStepFactory *factory, factories) {
|
||||
const QList<BuildStepInfo> steps = factory->availableSteps(source);
|
||||
const Core::Id sourceId = originalbs->id();
|
||||
const auto canClone = [sourceId](const BuildStepInfo &info) {
|
||||
return (info.flags & BuildStepInfo::Unclonable) == 0 && info.id == sourceId;
|
||||
};
|
||||
if (Utils::contains(steps, canClone)) {
|
||||
if (BuildStep *clonebs = factory->clone(this, originalbs)) {
|
||||
m_steps.append(clonebs);
|
||||
break;
|
||||
}
|
||||
qWarning() << "Cloning of step " << originalbs->displayName() << " failed (continuing).";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -141,6 +135,9 @@ bool BuildStepList::fromMap(const QVariantMap &map)
|
||||
if (!ProjectConfiguration::fromMap(map))
|
||||
return false;
|
||||
|
||||
const QList<IBuildStepFactory *> factories
|
||||
= ExtensionSystem::PluginManager::getObjects<IBuildStepFactory>();
|
||||
|
||||
int maxSteps = map.value(QString::fromLatin1(STEPS_COUNT_KEY), 0).toInt();
|
||||
for (int i = 0; i < maxSteps; ++i) {
|
||||
QVariantMap bsData(map.value(QString::fromLatin1(STEPS_PREFIX) + QString::number(i)).toMap());
|
||||
@@ -148,17 +145,17 @@ bool BuildStepList::fromMap(const QVariantMap &map)
|
||||
qWarning() << "No step data found for" << i << "(continuing).";
|
||||
continue;
|
||||
}
|
||||
IBuildStepFactory *factory = findRestoreFactory(this, bsData);
|
||||
if (!factory) {
|
||||
qWarning() << "No factory for step" << i << "in list" << displayName() << "found (continuing).";
|
||||
continue;
|
||||
foreach (IBuildStepFactory *factory, factories) {
|
||||
const QList<BuildStepInfo> steps = factory->availableSteps(this);
|
||||
const Core::Id id = ProjectExplorer::idFromMap(bsData);
|
||||
if (Utils::contains(steps, Utils::equal(&BuildStepInfo::id, id))) {
|
||||
if (BuildStep *bs = factory->restore(this, bsData)) {
|
||||
appendStep(bs);
|
||||
break;
|
||||
}
|
||||
qWarning() << "Restoration of step" << i << "failed (continuing).";
|
||||
}
|
||||
}
|
||||
BuildStep *bs(factory->restore(this, bsData));
|
||||
if (!bs) {
|
||||
qWarning() << "Restoration of step" << i << "failed (continuing).";
|
||||
continue;
|
||||
}
|
||||
insertStep(m_steps.count(), bs);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user