ProjectExplorer: Add some more functions to buildsteplist

Use those functions instead of repeating code all over the place.

Change-Id: I03161663b4d5c538fb2ea667353ab7846373ad81
Reviewed-by: Tim Jenssen <tim.jenssen@theqtcompany.com>
This commit is contained in:
Tobias Hunger
2016-04-19 12:36:11 +02:00
parent 385237dbbd
commit f32a1b1e4c
10 changed files with 45 additions and 60 deletions

View File

@@ -42,18 +42,13 @@ public:
template<class T> static T *buildStep(const ProjectExplorer::BuildConfiguration *dc) template<class T> static T *buildStep(const ProjectExplorer::BuildConfiguration *dc)
{ {
if (!dc) if (!dc)
return 0; return nullptr;
foreach (const Core::Id &id, dc->knownStepLists()) { foreach (const Core::Id &id, dc->knownStepLists()) {
ProjectExplorer::BuildStepList *bsl = dc->stepList(id); T *const step = dc->stepList(id)->firstOfType<T>();
if (!bsl) if (step)
return 0;
const QList<ProjectExplorer::BuildStep *> &buildSteps = bsl->steps();
for (int i = buildSteps.count() - 1; i >= 0; --i) {
if (T * const step = qobject_cast<T *>(buildSteps.at(i)))
return step; return step;
} }
} return nullptr;
return 0;
} }
template<typename State> static void assertState(State expected, template<typename State> static void assertState(State expected,

View File

@@ -229,11 +229,6 @@ void AutotoolsBuildConfiguration::setBuildDirectory(const Utils::FileName &direc
if (directory == buildDirectory()) if (directory == buildDirectory())
return; return;
BuildConfiguration::setBuildDirectory(directory); BuildConfiguration::setBuildDirectory(directory);
BuildStepList *bsl = stepList(BUILDSTEPS_BUILD); foreach (auto bs, stepList(BUILDSTEPS_BUILD)->allOfType<ConfigureStep>())
foreach (BuildStep *bs, bsl->steps()) { bs->notifyBuildDirectoryChanged();
ConfigureStep *cs = qobject_cast<ConfigureStep *>(bs);
if (cs) {
cs->notifyBuildDirectoryChanged();
}
}
} }

View File

@@ -113,13 +113,11 @@ RunControl *BareMetalRunControlFactory::create(
DebuggerStartParameters sp; DebuggerStartParameters sp;
if (const BuildConfiguration *bc = target->activeBuildConfiguration()) { if (const BuildConfiguration *bc = target->activeBuildConfiguration()) {
if (const BuildStepList *bsl = bc->stepList(BareMetalGdbCommandsDeployStep::stepId())) { if (BuildStepList *bsl = bc->stepList(BareMetalGdbCommandsDeployStep::stepId())) {
foreach (const BuildStep *bs, bsl->steps()) { foreach (const BareMetalGdbCommandsDeployStep *bs, bsl->allOfType<BareMetalGdbCommandsDeployStep>()) {
if (auto ds = qobject_cast<const BareMetalGdbCommandsDeployStep *>(bs)) {
if (!sp.commandsAfterConnect.endsWith("\n")) if (!sp.commandsAfterConnect.endsWith("\n"))
sp.commandsAfterConnect.append("\n"); sp.commandsAfterConnect.append("\n");
sp.commandsAfterConnect.append(ds->gdbCommands().toLatin1()); sp.commandsAfterConnect.append(bs->gdbCommands().toLatin1());
}
} }
} }
} }

View File

@@ -84,29 +84,20 @@ QList<Core::LocatorFilterEntry> CMakeLocatorFilter::matchesFor(QFutureInterface<
void CMakeLocatorFilter::accept(Core::LocatorFilterEntry selection) const void CMakeLocatorFilter::accept(Core::LocatorFilterEntry selection) const
{ {
// Get the project containing the target selected // Get the project containing the target selected
CMakeProject *cmakeProject = 0; CMakeProject *cmakeProject = nullptr;
foreach (Project *p, SessionManager::projects()) { foreach (Project *p, SessionManager::projects()) {
cmakeProject = qobject_cast<CMakeProject *>(p); cmakeProject = qobject_cast<CMakeProject *>(p);
if (cmakeProject && cmakeProject->projectFilePath().toString() == selection.internalData.toString()) if (cmakeProject && cmakeProject->projectFilePath().toString() == selection.internalData.toString())
break; break;
cmakeProject = 0;
} }
if (!cmakeProject) if (!cmakeProject || !cmakeProject->activeTarget() || !cmakeProject->activeTarget()->activeBuildConfiguration())
return;
if (!cmakeProject->activeTarget())
return;
if (!cmakeProject->activeTarget()->activeBuildConfiguration())
return; return;
// Find the make step // Find the make step
ProjectExplorer::BuildStepList *buildStepList = cmakeProject->activeTarget()->activeBuildConfiguration() ProjectExplorer::BuildStepList *buildStepList = cmakeProject->activeTarget()->activeBuildConfiguration()
->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD); ->stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD);
auto buildStep auto buildStep = buildStepList->firstOfType<CMakeBuildStep>();
= qobject_cast<CMakeBuildStep *>(findOrDefault(buildStepList->steps(),
[](BuildStep *s) -> bool { return qobject_cast<CMakeBuildStep *>(s); }));
if (!buildStep) if (!buildStep)
return; return;

View File

@@ -174,19 +174,8 @@ void IosRunConfiguration::updateDisplayNames()
IosDeployStep *IosRunConfiguration::deployStep() const IosDeployStep *IosRunConfiguration::deployStep() const
{ {
IosDeployStep * step = 0;
DeployConfiguration *config = target()->activeDeployConfiguration(); DeployConfiguration *config = target()->activeDeployConfiguration();
BuildStepList *bsl = config->stepList(); return config ? config->stepList()->firstOfType<IosDeployStep>() : nullptr;
if (bsl) {
const QList<BuildStep *> &buildSteps = bsl->steps();
for (int i = buildSteps.count() - 1; i >= 0; --i) {
step = qobject_cast<IosDeployStep *>(buildSteps.at(i));
if (step)
break;
}
}
Q_ASSERT_X(step, Q_FUNC_INFO, "Impossible: iOS build configuration without deploy step.");
return step;
} }
FileName IosRunConfiguration::profilePath() const FileName IosRunConfiguration::profilePath() const

View File

@@ -553,10 +553,9 @@ bool BuildManager::buildLists(QList<BuildStepList *> bsls, const QStringList &st
QStringList names; QStringList names;
names.reserve(steps.size()); names.reserve(steps.size());
for (int i = 0; i < bsls.size(); ++i) { for (int i = 0; i < bsls.size(); ++i) {
for (int j = 0; j < bsls.at(i)->steps().size(); ++j) { for (int j = 0; j < bsls.at(i)->count(); ++j)
names.append(stepListNames.at(i)); names.append(stepListNames.at(i));
} }
}
bool success = buildQueueAppend(steps, names, preambelMessage); bool success = buildQueueAppend(steps, names, preambelMessage);
if (!success) { if (!success) {

View File

@@ -168,6 +168,11 @@ QList<BuildStep *> BuildStepList::steps() const
return m_steps; return m_steps;
} }
QList<BuildStep *> BuildStepList::steps(const std::function<bool (const BuildStep *)> &filter) const
{
return Utils::filtered(steps(), filter);
}
void BuildStepList::insertStep(int position, BuildStep *step) void BuildStepList::insertStep(int position, BuildStep *step)
{ {
m_steps.insert(position, step); m_steps.insert(position, step);

View File

@@ -47,6 +47,27 @@ public:
~BuildStepList() override; ~BuildStepList() override;
QList<BuildStep *> steps() const; QList<BuildStep *> steps() const;
QList<BuildStep *> steps(const std::function<bool(const BuildStep *)> &filter) const;
template <class BS> BS *firstOfType() {
BS *bs = nullptr;
for (int i = 0; i < count(); ++i) {
bs = qobject_cast<BS *>(at(i));
if (bs)
return bs;
}
return nullptr;
}
template <class BS> QList<BS *>allOfType() {
QList<BS *> result;
BS *bs = nullptr;
for (int i = 0; i < count(); ++i) {
bs = qobject_cast<BS *>(at(i));
if (bs)
result.append(bs);
}
return result;
}
bool isNull() const; bool isNull() const;
int count() const; int count() const;
bool isEmpty() const; bool isEmpty() const;

View File

@@ -115,11 +115,7 @@ NamedWidget *QbsBuildConfiguration::createConfigWidget()
QbsBuildStep *QbsBuildConfiguration::qbsStep() const QbsBuildStep *QbsBuildConfiguration::qbsStep() const
{ {
foreach (BuildStep *bs, stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->steps()) { return stepList(ProjectExplorer::Constants::BUILDSTEPS_BUILD)->firstOfType<QbsBuildStep>();
if (QbsBuildStep *qbsBs = qobject_cast<QbsBuildStep *>(bs))
return qbsBs;
}
return 0;
} }
QVariantMap QbsBuildConfiguration::qbsConfiguration() const QVariantMap QbsBuildConfiguration::qbsConfiguration() const

View File

@@ -55,11 +55,7 @@ static Core::Id genericQbsDeployConfigurationId()
QbsInstallStep *QbsDeployConfiguration::qbsInstallStep() const QbsInstallStep *QbsDeployConfiguration::qbsInstallStep() const
{ {
foreach (ProjectExplorer::BuildStep *bs, stepList()->steps()) { return stepList()->firstOfType<QbsInstallStep>();
if (QbsInstallStep *install = qobject_cast<QbsInstallStep *>(bs))
return install;
}
return 0;
} }
QbsDeployConfiguration::QbsDeployConfiguration(ProjectExplorer::Target *target, Core::Id id) : QbsDeployConfiguration::QbsDeployConfiguration(ProjectExplorer::Target *target, Core::Id id) :