Qbs, Qmake, Python, Generic: Introduce BuildSystem derived classes

... and move context menu action handling there.

This is a temporary measure to be able to move that functionality
alongside the actual BuildSystem to the BuildConfiguration.

There is a lot to be cleaned up left, to keep the patch small.

Change-Id: If4b0820a13b376fc97b70785052924972ce22705
Reviewed-by: Christian Kandeler <christian.kandeler@qt.io>
This commit is contained in:
hjk
2019-10-22 14:55:51 +02:00
parent e1baae2e20
commit 66c7d75dbd
24 changed files with 707 additions and 544 deletions

View File

@@ -236,72 +236,6 @@ QbsGroupNode::QbsGroupNode(const qbs::GroupData &grp, const QString &productPath
m_qbsGroupData = grp;
}
bool QbsGroupNode::supportsAction(ProjectAction action, const Node *node) const
{
if (action == AddNewFile || action == AddExistingFile)
return true;
return supportsNodeAction(action, node);
}
bool QbsGroupNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
{
QStringList notAddedDummy;
if (!notAdded)
notAdded = &notAddedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(this);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notAdded += filePaths;
return false;
}
const QbsProductNode *prdNode = parentQbsProductNode(this);
if (!prdNode || !prdNode->qbsProductData().isValid()) {
*notAdded += filePaths;
return false;
}
return prjNode->project()->addFilesToProduct(filePaths, prdNode->qbsProductData(),
m_qbsGroupData, notAdded);
}
RemovedFilesFromProject QbsGroupNode::removeFiles(const QStringList &filePaths,
QStringList *notRemoved)
{
QStringList notRemovedDummy;
if (!notRemoved)
notRemoved = &notRemovedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(this);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notRemoved += filePaths;
return RemovedFilesFromProject::Error;
}
const QbsProductNode *prdNode = parentQbsProductNode(this);
if (!prdNode || !prdNode->qbsProductData().isValid()) {
*notRemoved += filePaths;
return RemovedFilesFromProject::Error;
}
return prjNode->project()->removeFilesFromProduct(filePaths, prdNode->qbsProductData(),
m_qbsGroupData, notRemoved);
}
bool QbsGroupNode::renameFile(const QString &filePath, const QString &newFilePath)
{
const QbsProjectNode *prjNode = parentQbsProjectNode(this);
if (!prjNode || !prjNode->qbsProject().isValid())
return false;
const QbsProductNode *prdNode = parentQbsProductNode(this);
if (!prdNode || !prdNode->qbsProductData().isValid())
return false;
return prjNode->project()->renameFileInProduct(filePath, newFilePath,
prdNode->qbsProductData(), m_qbsGroupData);
}
FolderNode::AddNewInformation QbsGroupNode::addNewInformation(const QStringList &files,
Node *context) const
{
@@ -338,66 +272,6 @@ QbsProductNode::QbsProductNode(const qbs::ProductData &prd) :
}
}
bool QbsProductNode::supportsAction(ProjectAction action, const Node *node) const
{
if (action == AddNewFile || action == AddExistingFile)
return true;
return supportsNodeAction(action, node);
}
bool QbsProductNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
{
QStringList notAddedDummy;
if (!notAdded)
notAdded = &notAddedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(this);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notAdded += filePaths;
return false;
}
qbs::GroupData grp = findMainQbsGroup(m_qbsProductData);
if (grp.isValid()) {
return prjNode->project()->addFilesToProduct(filePaths, m_qbsProductData, grp, notAdded);
}
QTC_ASSERT(false, return false);
}
RemovedFilesFromProject QbsProductNode::removeFiles(const QStringList &filePaths,
QStringList *notRemoved)
{
QStringList notRemovedDummy;
if (!notRemoved)
notRemoved = &notRemovedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(this);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notRemoved += filePaths;
return RemovedFilesFromProject::Error;
}
qbs::GroupData grp = findMainQbsGroup(m_qbsProductData);
if (grp.isValid()) {
return prjNode->project()->removeFilesFromProduct(filePaths, m_qbsProductData, grp,
notRemoved);
}
QTC_ASSERT(false, return RemovedFilesFromProject::Error);
}
bool QbsProductNode::renameFile(const QString &filePath, const QString &newFilePath)
{
const QbsProjectNode * prjNode = parentQbsProjectNode(this);
if (!prjNode || !prjNode->qbsProject().isValid())
return false;
const qbs::GroupData grp = findMainQbsGroup(m_qbsProductData);
QTC_ASSERT(grp.isValid(), return false);
return prjNode->project()->renameFileInProduct(filePath, newFilePath, m_qbsProductData, grp);
}
void QbsProductNode::build()
{
QbsProjectManagerPlugin::buildNamedProduct(static_cast<QbsProject *>(getProject()),
@@ -487,5 +361,146 @@ QbsRootProjectNode::QbsRootProjectNode(QbsProject *project) :
m_project(project)
{ }
// --------------------------------------------------------------------
// QbsBuildSystem:
// --------------------------------------------------------------------
QbsBuildSystem::QbsBuildSystem(QbsProject *project)
: BuildSystem(project), m_project(project)
{
}
bool QbsBuildSystem::supportsAction(Node *context, ProjectAction action, const Node *node) const
{
if (dynamic_cast<QbsGroupNode *>(context)) {
if (action == AddNewFile || action == AddExistingFile)
return true;
}
if (dynamic_cast<QbsProductNode *>(context)) {
if (action == AddNewFile || action == AddExistingFile)
return true;
}
return supportsNodeAction(action, node);
}
bool QbsBuildSystem::addFiles(Node *context, const QStringList &filePaths, QStringList *notAdded)
{
if (auto n = dynamic_cast<QbsGroupNode *>(context)) {
QStringList notAddedDummy;
if (!notAdded)
notAdded = &notAddedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(n);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notAdded += filePaths;
return false;
}
const QbsProductNode *prdNode = parentQbsProductNode(n);
if (!prdNode || !prdNode->qbsProductData().isValid()) {
*notAdded += filePaths;
return false;
}
return prjNode->project()->addFilesToProduct(filePaths, prdNode->qbsProductData(),
n->m_qbsGroupData, notAdded);
}
if (auto n = dynamic_cast<QbsProductNode *>(context)) {
QStringList notAddedDummy;
if (!notAdded)
notAdded = &notAddedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(n);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notAdded += filePaths;
return false;
}
qbs::GroupData grp = findMainQbsGroup(n->qbsProductData());
if (grp.isValid())
return prjNode->project()->addFilesToProduct(filePaths, n->qbsProductData(), grp, notAdded);
QTC_ASSERT(false, return false);
}
return BuildSystem::addFiles(context, filePaths, notAdded);
}
RemovedFilesFromProject QbsBuildSystem::removeFiles(Node *context, const QStringList &filePaths,
QStringList *notRemoved)
{
if (auto n = dynamic_cast<QbsGroupNode *>(context)) {
QStringList notRemovedDummy;
if (!notRemoved)
notRemoved = &notRemovedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(n);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notRemoved += filePaths;
return RemovedFilesFromProject::Error;
}
const QbsProductNode *prdNode = parentQbsProductNode(n);
if (!prdNode || !prdNode->qbsProductData().isValid()) {
*notRemoved += filePaths;
return RemovedFilesFromProject::Error;
}
return m_project->removeFilesFromProduct(filePaths, prdNode->qbsProductData(),
n->m_qbsGroupData, notRemoved);
}
if (auto n = dynamic_cast<QbsProductNode *>(context)) {
QStringList notRemovedDummy;
if (!notRemoved)
notRemoved = &notRemovedDummy;
const QbsProjectNode *prjNode = parentQbsProjectNode(n);
if (!prjNode || !prjNode->qbsProject().isValid()) {
*notRemoved += filePaths;
return RemovedFilesFromProject::Error;
}
qbs::GroupData grp = findMainQbsGroup(n->qbsProductData());
if (grp.isValid()) {
return prjNode->project()->removeFilesFromProduct(filePaths, n->qbsProductData(), grp,
notRemoved);
}
QTC_ASSERT(false, return RemovedFilesFromProject::Error);
}
return BuildSystem::removeFiles(context, filePaths, notRemoved);
}
bool QbsBuildSystem::renameFile(Node *context, const QString &filePath, const QString &newFilePath)
{
if (auto *n = dynamic_cast<QbsGroupNode *>(context)) {
const QbsProjectNode *prjNode = parentQbsProjectNode(n);
if (!prjNode || !prjNode->qbsProject().isValid())
return false;
const QbsProductNode *prdNode = parentQbsProductNode(n);
if (!prdNode || !prdNode->qbsProductData().isValid())
return false;
return m_project->renameFileInProduct(filePath, newFilePath,
prdNode->qbsProductData(), n->m_qbsGroupData);
}
if (auto *n = dynamic_cast<QbsProductNode *>(context)) {
const QbsProjectNode * prjNode = parentQbsProjectNode(n);
if (!prjNode || !prjNode->qbsProject().isValid())
return false;
const qbs::GroupData grp = findMainQbsGroup(n->qbsProductData());
QTC_ASSERT(grp.isValid(), return false);
return prjNode->project()->renameFileInProduct(filePath, newFilePath, n->qbsProductData(), grp);
}
return BuildSystem::renameFile(context, filePath, newFilePath);
}
} // namespace Internal
} // namespace QbsProjectManager

View File

@@ -25,6 +25,7 @@
#pragma once
#include <projectexplorer/buildsystem.h>
#include <projectexplorer/projectnodes.h>
#include <qbs.h>
@@ -35,6 +36,27 @@ namespace Internal {
class QbsNodeTreeBuilder;
class QbsProject;
class QbsBuildSystem : public ProjectExplorer::BuildSystem
{
public:
explicit QbsBuildSystem(QbsProject *project);
bool supportsAction(ProjectExplorer::Node *context,
ProjectExplorer::ProjectAction action,
const ProjectExplorer::Node *node) const final;
bool addFiles(ProjectExplorer::Node *context,
const QStringList &filePaths,
QStringList *notAdded = nullptr) override;
ProjectExplorer::RemovedFilesFromProject removeFiles(ProjectExplorer::Node *context,
const QStringList &filePaths,
QStringList *notRemoved = nullptr) override;
bool renameFile(ProjectExplorer::Node *context,
const QString &filePath, const QString &newFilePath) override;
private:
QbsProject *m_project = nullptr;
};
// --------------------------------------------------------------------
// QbsGroupNode:
// --------------------------------------------------------------------
@@ -45,13 +67,9 @@ public:
QbsGroupNode(const qbs::GroupData &grp, const QString &productPath);
bool showInSimpleTree() const final { return false; }
bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const final;
bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr) override;
ProjectExplorer::RemovedFilesFromProject removeFiles(const QStringList &filePaths,
QStringList *notRemoved = nullptr) override;
bool renameFile(const QString &filePath, const QString &newFilePath) override;
private:
friend class QbsBuildSystem;
AddNewInformation addNewInformation(const QStringList &files, Node *context) const override;
QVariant data(Core::Id role) const override;
@@ -68,11 +86,6 @@ class QbsProductNode : public ProjectExplorer::ProjectNode
public:
explicit QbsProductNode(const qbs::ProductData &prd);
bool supportsAction(ProjectExplorer::ProjectAction action, const Node *node) const final;
bool addFiles(const QStringList &filePaths, QStringList *notAdded = nullptr) override;
ProjectExplorer::RemovedFilesFromProject removeFiles(const QStringList &filePaths,
QStringList *notRemoved = nullptr) override;
bool renameFile(const QString &filePath, const QString &newFilePath) override;
void build() override;
QStringList targetApplications() const override;

View File

@@ -135,6 +135,8 @@ QbsProject::QbsProject(const FilePath &fileName)
setProjectLanguages(Context(ProjectExplorer::Constants::CXX_LANGUAGE_ID));
setCanBuildProducts();
setBuildSystem(std::make_unique<QbsBuildSystem>(this));
rebuildProjectTree();
connect(this, &Project::activeTargetChanged, this, &QbsProject::changeActiveTarget);