ProjectExplorer: Replace BuildConfigurationFactory::availableBuilds

... by a function object.

Change-Id: I9953ba6915c0177e7c4067d36dd755fc2ba5cf84
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2020-01-09 15:06:30 +01:00
parent ce69a9af83
commit a971da3bfe
19 changed files with 149 additions and 195 deletions

View File

@@ -75,20 +75,19 @@ AutotoolsBuildConfigurationFactory::AutotoolsBuildConfigurationFactory()
setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID); setSupportedProjectType(Constants::AUTOTOOLS_PROJECT_ID);
setSupportedProjectMimeTypeName(Constants::MAKEFILE_MIMETYPE); setSupportedProjectMimeTypeName(Constants::MAKEFILE_MIMETYPE);
}
QList<BuildInfo> AutotoolsBuildConfigurationFactory::availableBuilds setBuildGenerator([this](const Kit *k, const FilePath &projectPath, bool forSetup) {
(const Kit *k, const FilePath &projectPath, bool forSetup) const
{
BuildInfo info(this); BuildInfo info(this);
info.typeName = tr("Build"); info.typeName = tr("Build");
info.buildDirectory = forSetup ? FilePath::fromString(projectPath.toFileInfo().absolutePath()) : projectPath; info.buildDirectory = forSetup
? FilePath::fromString(projectPath.toFileInfo().absolutePath()) : projectPath;
info.kitId = k->id(); info.kitId = k->id();
if (forSetup) { if (forSetup) {
//: The name of the build configuration created by default for a autotools project. //: The name of the build configuration created by default for a autotools project.
info.displayName = tr("Default"); info.displayName = tr("Default");
} }
return {info}; return QList<BuildInfo>{info};
});
} }
} // Internal } // Internal

View File

@@ -46,11 +46,6 @@ class AutotoolsBuildConfigurationFactory : public ProjectExplorer::BuildConfigur
public: public:
AutotoolsBuildConfigurationFactory(); AutotoolsBuildConfigurationFactory();
private:
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *k,
const Utils::FilePath &projectPath,
bool forSetup) const override;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -408,6 +408,24 @@ CMakeBuildConfigurationFactory::CMakeBuildConfigurationFactory()
setSupportedProjectType(CMakeProjectManager::Constants::CMAKEPROJECT_ID); setSupportedProjectType(CMakeProjectManager::Constants::CMAKEPROJECT_ID);
setSupportedProjectMimeTypeName(Constants::CMAKEPROJECTMIMETYPE); setSupportedProjectMimeTypeName(Constants::CMAKEPROJECTMIMETYPE);
setBuildGenerator([this](const Kit *k, const FilePath &projectPath, bool forSetup) {
QList<BuildInfo> result;
FilePath path = forSetup ? Project::projectDirectory(projectPath) : projectPath;
for (int type = BuildTypeDebug; type != BuildTypeLast; ++type) {
BuildInfo info = createBuildInfo(k, path.toString(), BuildType(type));
if (forSetup) {
info.buildDirectory = CMakeBuildConfiguration::shadowBuildDirectory(projectPath,
k,
info.typeName,
info.buildType);
}
result << info;
}
return result;
});
} }
CMakeBuildConfigurationFactory::BuildType CMakeBuildConfigurationFactory::buildTypeFromByteArray( CMakeBuildConfigurationFactory::BuildType CMakeBuildConfigurationFactory::buildTypeFromByteArray(
@@ -439,27 +457,6 @@ BuildConfiguration::BuildType CMakeBuildConfigurationFactory::cmakeBuildTypeToBu
return BuildConfiguration::Unknown; return BuildConfiguration::Unknown;
} }
QList<BuildInfo> CMakeBuildConfigurationFactory::availableBuilds(const Kit *k,
const FilePath &projectPath,
bool forSetup) const
{
QList<BuildInfo> result;
FilePath path = forSetup ? Project::projectDirectory(projectPath) : projectPath;
for (int type = BuildTypeDebug; type != BuildTypeLast; ++type) {
BuildInfo info = createBuildInfo(k, path.toString(), BuildType(type));
if (forSetup) {
info.buildDirectory = CMakeBuildConfiguration::shadowBuildDirectory(projectPath,
k,
info.typeName,
info.buildType);
}
result << info;
}
return result;
}
BuildInfo CMakeBuildConfigurationFactory::createBuildInfo(const Kit *k, BuildInfo CMakeBuildConfigurationFactory::createBuildInfo(const Kit *k,
const QString &, const QString &,
BuildType buildType) const BuildType buildType) const

View File

@@ -125,10 +125,6 @@ public:
static BuildType buildTypeFromByteArray(const QByteArray &in); static BuildType buildTypeFromByteArray(const QByteArray &in);
static ProjectExplorer::BuildConfiguration::BuildType cmakeBuildTypeToBuildType(const BuildType &in); static ProjectExplorer::BuildConfiguration::BuildType cmakeBuildTypeToBuildType(const BuildType &in);
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *k,
const Utils::FilePath &projectPath,
bool forSetup) const override;
private: private:
ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k,
const QString &sourceDir, const QString &sourceDir,

View File

@@ -538,11 +538,8 @@ CompilationDatabaseBuildConfigurationFactory::CompilationDatabaseBuildConfigurat
setSupportedProjectType(Constants::COMPILATIONDATABASEPROJECT_ID); setSupportedProjectType(Constants::COMPILATIONDATABASEPROJECT_ID);
setSupportedProjectMimeTypeName(Constants::COMPILATIONDATABASEMIMETYPE); setSupportedProjectMimeTypeName(Constants::COMPILATIONDATABASEMIMETYPE);
}
QList<BuildInfo> CompilationDatabaseBuildConfigurationFactory::availableBuilds setBuildGenerator([this](const Kit *kit, const FilePath &projectPath, bool) {
(const Kit *kit, const FilePath &projectPath, bool) const
{
const QString name = tr("Release"); const QString name = tr("Release");
ProjectExplorer::BuildInfo info(this); ProjectExplorer::BuildInfo info(this);
info.typeName = name; info.typeName = name;
@@ -550,7 +547,8 @@ QList<BuildInfo> CompilationDatabaseBuildConfigurationFactory::availableBuilds
info.buildType = BuildConfiguration::Release; info.buildType = BuildConfiguration::Release;
info.buildDirectory = projectPath.parentDir(); info.buildDirectory = projectPath.parentDir();
info.kitId = kit->id(); info.kitId = kit->id();
return {info}; return QList<BuildInfo>{info};
});
} }
} // namespace Internal } // namespace Internal

View File

@@ -100,10 +100,6 @@ class CompilationDatabaseBuildConfigurationFactory
Q_OBJECT Q_OBJECT
public: public:
CompilationDatabaseBuildConfigurationFactory(); CompilationDatabaseBuildConfigurationFactory();
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *k,
const Utils::FilePath &projectPath,
bool forSetup) const override;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -76,11 +76,8 @@ GenericBuildConfigurationFactory::GenericBuildConfigurationFactory()
setSupportedProjectType(Constants::GENERICPROJECT_ID); setSupportedProjectType(Constants::GENERICPROJECT_ID);
setSupportedProjectMimeTypeName(Constants::GENERICMIMETYPE); setSupportedProjectMimeTypeName(Constants::GENERICMIMETYPE);
}
QList<BuildInfo> GenericBuildConfigurationFactory::availableBuilds setBuildGenerator([this](const Kit *k, const FilePath &projectPath, bool forSetup) {
(const Kit *k, const FilePath &projectPath, bool forSetup) const
{
BuildInfo info(this); BuildInfo info(this);
info.typeName = tr("Build"); info.typeName = tr("Build");
info.buildDirectory = forSetup ? Project::projectDirectory(projectPath) : projectPath; info.buildDirectory = forSetup ? Project::projectDirectory(projectPath) : projectPath;
@@ -91,7 +88,8 @@ QList<BuildInfo> GenericBuildConfigurationFactory::availableBuilds
info.displayName = tr("Default"); info.displayName = tr("Default");
} }
return {info}; return QList<BuildInfo>{info};
});
} }
void GenericBuildConfiguration::addToEnvironment(Utils::Environment &env) const void GenericBuildConfiguration::addToEnvironment(Utils::Environment &env) const

View File

@@ -46,11 +46,6 @@ class GenericBuildConfigurationFactory : public ProjectExplorer::BuildConfigurat
public: public:
GenericBuildConfigurationFactory(); GenericBuildConfigurationFactory();
private:
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *k,
const Utils::FilePath &projectPath,
bool forSetup) const override;
}; };
} // namespace Internal } // namespace Internal

View File

@@ -85,25 +85,22 @@ NimbleBuildConfigurationFactory::NimbleBuildConfigurationFactory()
registerBuildConfiguration<NimbleBuildConfiguration>(Constants::C_NIMBLEBUILDCONFIGURATION_ID); registerBuildConfiguration<NimbleBuildConfiguration>(Constants::C_NIMBLEBUILDCONFIGURATION_ID);
setSupportedProjectType(Constants::C_NIMBLEPROJECT_ID); setSupportedProjectType(Constants::C_NIMBLEPROJECT_ID);
setSupportedProjectMimeTypeName(Constants::C_NIMBLE_MIMETYPE); setSupportedProjectMimeTypeName(Constants::C_NIMBLE_MIMETYPE);
}
QList<BuildInfo> NimbleBuildConfigurationFactory::availableBuilds(const Kit *k, const Utils::FilePath &projectPath, bool forSetup) const setBuildGenerator([this](const Kit *k, const FilePath &projectPath, bool forSetup) {
{ const auto oneBuild = [&](BuildConfiguration::BuildType buildType, const QString &typeName) {
static const QList<BuildConfiguration::BuildType> configurations = {BuildConfiguration::Debug, BuildConfiguration::Release};
return Utils::transform(configurations, [&](BuildConfiguration::BuildType buildType){
BuildInfo info(this); BuildInfo info(this);
info.buildType = buildType; info.buildType = buildType;
info.kitId = k->id(); info.kitId = k->id();
info.typeName = typeName;
if (buildType == BuildConfiguration::Debug)
info.typeName = tr("Debug");
else if (buildType == BuildConfiguration::Release)
info.typeName = tr("Release");
if (forSetup) { if (forSetup) {
info.displayName = info.typeName; info.displayName = info.typeName;
info.buildDirectory = projectPath.parentDir(); info.buildDirectory = projectPath.parentDir();
} }
return info; return info;
};
return QList<BuildInfo>{
oneBuild(BuildConfiguration::Debug, tr("Debug")),
oneBuild(BuildConfiguration::Release, tr("Release"))
};
}); });
} }

View File

@@ -54,11 +54,6 @@ class NimbleBuildConfigurationFactory : public ProjectExplorer::BuildConfigurati
public: public:
NimbleBuildConfigurationFactory(); NimbleBuildConfigurationFactory();
private:
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *k,
const Utils::FilePath &projectPath,
bool forSetup) const override;
}; };
} }

View File

@@ -134,31 +134,24 @@ NimBuildConfigurationFactory::NimBuildConfigurationFactory()
registerBuildConfiguration<NimBuildConfiguration>(Constants::C_NIMBUILDCONFIGURATION_ID); registerBuildConfiguration<NimBuildConfiguration>(Constants::C_NIMBUILDCONFIGURATION_ID);
setSupportedProjectType(Constants::C_NIMPROJECT_ID); setSupportedProjectType(Constants::C_NIMPROJECT_ID);
setSupportedProjectMimeTypeName(Constants::C_NIM_PROJECT_MIMETYPE); setSupportedProjectMimeTypeName(Constants::C_NIM_PROJECT_MIMETYPE);
}
QList<BuildInfo> NimBuildConfigurationFactory::availableBuilds setBuildGenerator([this](const Kit *k, const FilePath &projectPath, bool forSetup) {
(const Kit *k, const FilePath &projectPath, bool forSetup) const const auto oneBuild = [&](BuildConfiguration::BuildType buildType, const QString &typeName) {
{
QList<BuildInfo> result;
for (auto buildType : {BuildConfiguration::Debug, BuildConfiguration::Release}) {
BuildInfo info(this); BuildInfo info(this);
info.buildType = buildType; info.buildType = buildType;
info.kitId = k->id(); info.kitId = k->id();
info.typeName = typeName;
if (buildType == BuildConfiguration::Debug)
info.typeName = tr("Debug");
else if (buildType == BuildConfiguration::Profile)
info.typeName = tr("Profile");
else if (buildType == BuildConfiguration::Release)
info.typeName = tr("Release");
if (forSetup) { if (forSetup) {
info.displayName = info.typeName; info.displayName = info.typeName;
info.buildDirectory = defaultBuildDirectory(k, projectPath, info.typeName, buildType); info.buildDirectory = defaultBuildDirectory(k, projectPath, info.typeName, buildType);
} }
result.push_back(info); return info;
} };
return result; return QList<BuildInfo>{
oneBuild(BuildConfiguration::Debug, tr("Debug")),
oneBuild(BuildConfiguration::Release, tr("Release"))
};
});
} }
} // namespace Nim } // namespace Nim

View File

@@ -58,11 +58,6 @@ class NimBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationF
public: public:
NimBuildConfigurationFactory(); NimBuildConfigurationFactory();
private:
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *k,
const Utils::FilePath &projectPath,
bool forSetup) const override;
}; };
} }

View File

@@ -508,13 +508,15 @@ const Tasks BuildConfigurationFactory::reportIssues(ProjectExplorer::Kit *kit, c
const QList<BuildInfo> BuildConfigurationFactory::allAvailableBuilds(const Target *parent) const const QList<BuildInfo> BuildConfigurationFactory::allAvailableBuilds(const Target *parent) const
{ {
return availableBuilds(parent->kit(), parent->project()->projectFilePath(), false); QTC_ASSERT(m_buildGenerator, return {});
return m_buildGenerator(parent->kit(), parent->project()->projectFilePath(), false);
} }
const QList<BuildInfo> const QList<BuildInfo>
BuildConfigurationFactory::allAvailableSetups(const Kit *k, const FilePath &projectPath) const BuildConfigurationFactory::allAvailableSetups(const Kit *k, const FilePath &projectPath) const
{ {
return availableBuilds(k, projectPath, /* forSetup = */ true); QTC_ASSERT(m_buildGenerator, return {});
return m_buildGenerator(k, projectPath, /* forSetup = */ true);
} }
bool BuildConfigurationFactory::supportsTargetDeviceType(Core::Id id) const bool BuildConfigurationFactory::supportsTargetDeviceType(Core::Id id) const
@@ -577,6 +579,11 @@ bool BuildConfigurationFactory::canHandle(const Target *target) const
return true; return true;
} }
void BuildConfigurationFactory::setBuildGenerator(const BuildGenerator &buildGenerator)
{
m_buildGenerator = buildGenerator;
}
void BuildConfigurationFactory::setIssueReporter(const IssueReporter &issueReporter) void BuildConfigurationFactory::setIssueReporter(const IssueReporter &issueReporter)
{ {
m_issueReporter = issueReporter; m_issueReporter = issueReporter;

View File

@@ -163,8 +163,9 @@ public:
const QString &projectPath, const QString &buildDir) const; const QString &projectPath, const QString &buildDir) const;
protected: protected:
virtual QList<BuildInfo> using BuildGenerator
availableBuilds(const Kit *k, const Utils::FilePath &projectPath, bool forSetup) const = 0; = std::function<QList<BuildInfo>(const Kit *, const Utils::FilePath &, bool)>;
void setBuildGenerator(const BuildGenerator &buildGenerator);
bool supportsTargetDeviceType(Core::Id id) const; bool supportsTargetDeviceType(Core::Id id) const;
void setSupportedProjectType(Core::Id id); void setSupportedProjectType(Core::Id id);
@@ -191,6 +192,7 @@ private:
QList<Core::Id> m_supportedTargetDeviceTypes; QList<Core::Id> m_supportedTargetDeviceTypes;
QString m_supportedProjectMimeTypeName; QString m_supportedProjectMimeTypeName;
IssueReporter m_issueReporter; IssueReporter m_issueReporter;
BuildGenerator m_buildGenerator;
}; };
} // namespace ProjectExplorer } // namespace ProjectExplorer

View File

@@ -422,10 +422,8 @@ QbsBuildConfigurationFactory::QbsBuildConfigurationFactory()
return version ? version->reportIssues(projectPath, buildDir) return version ? version->reportIssues(projectPath, buildDir)
: Tasks(); : Tasks();
}); });
}
QList<BuildInfo> QbsBuildConfigurationFactory::availableBuilds(const Kit *k, const FilePath &projectPath, bool forSetup) const setBuildGenerator([this](const Kit *k, const FilePath &projectPath, bool forSetup) {
{
QList<BuildInfo> result; QList<BuildInfo> result;
if (forSetup) { if (forSetup) {
@@ -455,6 +453,7 @@ QList<BuildInfo> QbsBuildConfigurationFactory::availableBuilds(const Kit *k, con
} }
return result; return result;
});
} }
BuildInfo QbsBuildConfigurationFactory::createBuildInfo(const Kit *k, BuildInfo QbsBuildConfigurationFactory::createBuildInfo(const Kit *k,

View File

@@ -102,9 +102,6 @@ class QbsBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationF
public: public:
QbsBuildConfigurationFactory(); QbsBuildConfigurationFactory();
QList<ProjectExplorer::BuildInfo> availableBuilds
(const ProjectExplorer::Kit *k, const Utils::FilePath &projectPath, bool forSetup) const override;
private: private:
ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k,
ProjectExplorer::BuildConfiguration::BuildType type) const; ProjectExplorer::BuildConfiguration::BuildType type) const;

View File

@@ -711,6 +711,31 @@ QmakeBuildConfigurationFactory::QmakeBuildConfigurationFactory()
} }
return issues; return issues;
}); });
setBuildGenerator([this](const Kit *k, const FilePath &projectPath, bool forSetup) {
QList<BuildInfo> result;
BaseQtVersion *qtVersion = QtKitAspect::qtVersion(k);
if (forSetup && (!qtVersion || !qtVersion->isValid()))
return result;
const auto addBuild = [&](BuildConfiguration::BuildType buildType) {
BuildInfo info = createBuildInfo(k, projectPath, buildType);
if (!forSetup) {
info.displayName.clear(); // ask for a name
info.buildDirectory.clear(); // This depends on the displayName
}
result << info;
};
addBuild(BuildConfiguration::Debug);
addBuild(BuildConfiguration::Release);
if (qtVersion && qtVersion->qtVersion().majorVersion > 4)
addBuild(BuildConfiguration::Profile);
return result;
});
} }
BuildInfo QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k, BuildInfo QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k,
@@ -779,32 +804,6 @@ BuildInfo QmakeBuildConfigurationFactory::createBuildInfo(const Kit *k,
return info; return info;
} }
QList<BuildInfo> QmakeBuildConfigurationFactory::availableBuilds(const Kit *k, const FilePath &projectPath, bool forSetup) const
{
QList<BuildInfo> result;
BaseQtVersion *qtVersion = QtKitAspect::qtVersion(k);
if (forSetup && (!qtVersion || !qtVersion->isValid()))
return {};
const auto addBuild = [&](BuildConfiguration::BuildType buildType) {
BuildInfo info = createBuildInfo(k, projectPath, buildType);
if (!forSetup) {
info.displayName.clear(); // ask for a name
info.buildDirectory.clear(); // This depends on the displayName
}
result << info;
};
addBuild(BuildConfiguration::Debug);
addBuild(BuildConfiguration::Release);
if (qtVersion && qtVersion->qtVersion().majorVersion > 4)
addBuild(BuildConfiguration::Profile);
return result;
}
BuildConfiguration::BuildType QmakeBuildConfiguration::buildType() const BuildConfiguration::BuildType QmakeBuildConfiguration::buildType() const
{ {
if (qmakeBuildConfiguration() & BaseQtVersion::DebugBuild) if (qmakeBuildConfiguration() & BaseQtVersion::DebugBuild)

View File

@@ -158,9 +158,6 @@ class QMAKEPROJECTMANAGER_EXPORT QmakeBuildConfigurationFactory : public Project
public: public:
QmakeBuildConfigurationFactory(); QmakeBuildConfigurationFactory();
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *k,
const Utils::FilePath &projectPath,
bool forSetup) const override;
private: private:
ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FilePath &projectPath, ProjectExplorer::BuildInfo createBuildInfo(const ProjectExplorer::Kit *k, const Utils::FilePath &projectPath,
ProjectExplorer::BuildConfiguration::BuildType type) const; ProjectExplorer::BuildConfiguration::BuildType type) const;

View File

@@ -68,13 +68,12 @@ public:
bool needsConfiguration() const final { return false; } bool needsConfiguration() const final { return false; }
}; };
class DummyBuildConfigurationFactory : public ProjectExplorer::BuildConfigurationFactory class DummyBuildConfigurationFactory : public BuildConfigurationFactory
{ {
public: public:
QList<ProjectExplorer::BuildInfo> availableBuilds(const ProjectExplorer::Kit *, DummyBuildConfigurationFactory()
const FilePath &, bool) const final
{ {
return {}; setBuildGenerator([](const Kit *, const FilePath &, bool) { return QList<BuildInfo>{}; });
} }
}; };