forked from qt-creator/qt-creator
QbsProjectManager: No reparse after programmatic project file changes.
qbs knows the effect of adding and removing files. There is no need to set up the project from scratch. Change-Id: I8938c7cfb3e3ac2deb3fb0d2175f447391a669cb Reviewed-by: Joerg Bornemann <joerg.bornemann@digia.com>
This commit is contained in:
@@ -35,7 +35,6 @@
|
|||||||
|
|
||||||
#include <coreplugin/fileiconprovider.h>
|
#include <coreplugin/fileiconprovider.h>
|
||||||
#include <coreplugin/idocument.h>
|
#include <coreplugin/idocument.h>
|
||||||
#include <coreplugin/messagemanager.h>
|
|
||||||
#include <projectexplorer/projectexplorerconstants.h>
|
#include <projectexplorer/projectexplorerconstants.h>
|
||||||
#include <projectexplorer/target.h>
|
#include <projectexplorer/target.h>
|
||||||
#include <qtsupport/qtsupportconstants.h>
|
#include <qtsupport/qtsupportconstants.h>
|
||||||
@@ -116,46 +115,6 @@ static qbs::GroupData findMainQbsGroup(const qbs::ProductData &productData)
|
|||||||
return qbs::GroupData();
|
return qbs::GroupData();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool addQbsFiles(QbsBaseProjectNode *node, const QStringList &filePaths, qbs::Project prj,
|
|
||||||
const qbs::ProductData &productData, const qbs::GroupData &groupData,
|
|
||||||
const QString &productPath, QStringList *notAdded)
|
|
||||||
{
|
|
||||||
QStringList allPaths = groupData.allFilePaths();
|
|
||||||
foreach (const QString &path, filePaths) {
|
|
||||||
qbs::ErrorInfo err = prj.addFiles(productData, groupData, QStringList() << path);
|
|
||||||
if (err.hasError()) {
|
|
||||||
Core::MessageManager::write(err.toString());
|
|
||||||
*notAdded += path;
|
|
||||||
} else {
|
|
||||||
allPaths += path;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (notAdded->count() != filePaths.count())
|
|
||||||
QbsGroupNode::setupFiles(node, allPaths, productPath, true);
|
|
||||||
return notAdded->isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool removeQbsFiles(QbsBaseProjectNode *node, const QStringList &filePaths, qbs::Project prj,
|
|
||||||
const qbs::ProductData &productData, const qbs::GroupData &groupData,
|
|
||||||
const QString &productPath, QStringList *notRemoved)
|
|
||||||
{
|
|
||||||
QStringList allPaths = groupData.allFilePaths();
|
|
||||||
foreach (const QString &path, filePaths) {
|
|
||||||
qbs::ErrorInfo err = prj.removeFiles(productData, groupData, QStringList() << path);
|
|
||||||
if (err.hasError()) {
|
|
||||||
Core::MessageManager::write(err.toString());
|
|
||||||
*notRemoved += path;
|
|
||||||
} else {
|
|
||||||
allPaths.removeOne(path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (notRemoved->count() != filePaths.count())
|
|
||||||
QbsGroupNode::setupFiles(node, allPaths, productPath, true);
|
|
||||||
return notRemoved->isEmpty();
|
|
||||||
}
|
|
||||||
|
|
||||||
class FileTreeNode {
|
class FileTreeNode {
|
||||||
public:
|
public:
|
||||||
explicit FileTreeNode(const QString &n = QString(), FileTreeNode *p = 0, bool f = false) :
|
explicit FileTreeNode(const QString &n = QString(), FileTreeNode *p = 0, bool f = false) :
|
||||||
@@ -428,8 +387,8 @@ bool QbsGroupNode::addFiles(const QStringList &filePaths, QStringList *notAdded)
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return addQbsFiles(this, filePaths, prjNode->qbsProject(), prdNode->qbsProductData(),
|
return prjNode->project()->addFilesToProduct(this, filePaths, prdNode->qbsProductData(),
|
||||||
*m_qbsGroupData, m_productPath, notAdded);
|
*m_qbsGroupData, notAdded);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool QbsGroupNode::removeFiles(const QStringList &filePaths, QStringList *notRemoved)
|
bool QbsGroupNode::removeFiles(const QStringList &filePaths, QStringList *notRemoved)
|
||||||
@@ -450,8 +409,8 @@ bool QbsGroupNode::removeFiles(const QStringList &filePaths, QStringList *notRem
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return removeQbsFiles(this, filePaths, prjNode->qbsProject(), prdNode->qbsProductData(),
|
return prjNode->project()->removeFilesFromProduct(this, filePaths, prdNode->qbsProductData(),
|
||||||
*m_qbsGroupData, m_productPath, notRemoved);
|
*m_qbsGroupData, notRemoved);
|
||||||
}
|
}
|
||||||
|
|
||||||
void QbsGroupNode::updateQbsGroupData(const qbs::GroupData *grp, const QString &productPath,
|
void QbsGroupNode::updateQbsGroupData(const qbs::GroupData *grp, const QString &productPath,
|
||||||
@@ -632,8 +591,8 @@ bool QbsProductNode::addFiles(const QStringList &filePaths, QStringList *notAdde
|
|||||||
|
|
||||||
qbs::GroupData grp = findMainQbsGroup(m_qbsProductData);
|
qbs::GroupData grp = findMainQbsGroup(m_qbsProductData);
|
||||||
if (grp.isValid()) {
|
if (grp.isValid()) {
|
||||||
const QString &productPath = QFileInfo(m_qbsProductData.location().fileName()).absolutePath();
|
return prjNode->project()->addFilesToProduct(this, filePaths, m_qbsProductData, grp,
|
||||||
return addQbsFiles(this, filePaths, prjNode->qbsProject(), m_qbsProductData, grp, productPath, notAdded);
|
notAdded);
|
||||||
}
|
}
|
||||||
|
|
||||||
QTC_ASSERT(false, return false);
|
QTC_ASSERT(false, return false);
|
||||||
@@ -653,8 +612,8 @@ bool QbsProductNode::removeFiles(const QStringList &filePaths, QStringList *notR
|
|||||||
|
|
||||||
qbs::GroupData grp = findMainQbsGroup(m_qbsProductData);
|
qbs::GroupData grp = findMainQbsGroup(m_qbsProductData);
|
||||||
if (grp.isValid()) {
|
if (grp.isValid()) {
|
||||||
const QString &productPath = QFileInfo(m_qbsProductData.location().fileName()).absolutePath();
|
return prjNode->project()->removeFilesFromProduct(this, filePaths, m_qbsProductData, grp,
|
||||||
return removeQbsFiles(this, filePaths, prjNode->qbsProject(), m_qbsProductData, grp, productPath, notRemoved);
|
notRemoved);
|
||||||
}
|
}
|
||||||
|
|
||||||
QTC_ASSERT(false, return false);
|
QTC_ASSERT(false, return false);
|
||||||
|
@@ -37,10 +37,9 @@
|
|||||||
#include "qbsnodes.h"
|
#include "qbsnodes.h"
|
||||||
|
|
||||||
#include <coreplugin/documentmanager.h>
|
#include <coreplugin/documentmanager.h>
|
||||||
#include <utils/qtcassert.h>
|
|
||||||
|
|
||||||
#include <coreplugin/icontext.h>
|
#include <coreplugin/icontext.h>
|
||||||
#include <coreplugin/id.h>
|
#include <coreplugin/id.h>
|
||||||
|
#include <coreplugin/messagemanager.h>
|
||||||
#include <coreplugin/progressmanager/progressmanager.h>
|
#include <coreplugin/progressmanager/progressmanager.h>
|
||||||
#include <coreplugin/mimedatabase.h>
|
#include <coreplugin/mimedatabase.h>
|
||||||
#include <cpptools/cppmodelmanagerinterface.h>
|
#include <cpptools/cppmodelmanagerinterface.h>
|
||||||
@@ -62,6 +61,7 @@
|
|||||||
#include <qmljstools/qmljsmodelmanager.h>
|
#include <qmljstools/qmljsmodelmanager.h>
|
||||||
#include <qmljs/qmljsmodelmanagerinterface.h>
|
#include <qmljs/qmljsmodelmanagerinterface.h>
|
||||||
#include <utils/hostosinfo.h>
|
#include <utils/hostosinfo.h>
|
||||||
|
#include <utils/qtcassert.h>
|
||||||
|
|
||||||
#include <qbs.h>
|
#include <qbs.h>
|
||||||
|
|
||||||
@@ -185,6 +185,84 @@ QStringList QbsProject::files(Project::FilesMode fileMode) const
|
|||||||
return result.toList();
|
return result.toList();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class ChangeExpector
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
ChangeExpector(const QString &filePath, const QSet<Core::IDocument *> &documents)
|
||||||
|
: m_document(0)
|
||||||
|
{
|
||||||
|
foreach (Core::IDocument * const doc, documents) {
|
||||||
|
if (doc->filePath() == filePath) {
|
||||||
|
m_document = doc;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QTC_ASSERT(m_document, return);
|
||||||
|
Core::DocumentManager::expectFileChange(filePath);
|
||||||
|
m_wasInDocumentManager = Core::DocumentManager::removeDocument(m_document);
|
||||||
|
QTC_CHECK(m_wasInDocumentManager);
|
||||||
|
}
|
||||||
|
|
||||||
|
~ChangeExpector()
|
||||||
|
{
|
||||||
|
QTC_ASSERT(m_document, return);
|
||||||
|
Core::DocumentManager::addDocument(m_document);
|
||||||
|
Core::DocumentManager::unexpectFileChange(m_document->filePath());
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
Core::IDocument *m_document;
|
||||||
|
bool m_wasInDocumentManager;
|
||||||
|
};
|
||||||
|
|
||||||
|
bool QbsProject::addFilesToProduct(QbsBaseProjectNode *node, const QStringList &filePaths,
|
||||||
|
const qbs::ProductData &productData, const qbs::GroupData &groupData, QStringList *notAdded)
|
||||||
|
{
|
||||||
|
QTC_ASSERT(m_qbsProject.isValid(), return false);
|
||||||
|
QStringList allPaths = groupData.allFilePaths();
|
||||||
|
const QString productFilePath = productData.location().fileName();
|
||||||
|
ChangeExpector expector(productFilePath, m_qbsDocuments);
|
||||||
|
foreach (const QString &path, filePaths) {
|
||||||
|
qbs::ErrorInfo err = m_qbsProject.addFiles(productData, groupData, QStringList() << path);
|
||||||
|
if (err.hasError()) {
|
||||||
|
Core::MessageManager::write(err.toString());
|
||||||
|
*notAdded += path;
|
||||||
|
} else {
|
||||||
|
allPaths += path;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (notAdded->count() != filePaths.count()) {
|
||||||
|
m_projectData = m_qbsProject.projectData();
|
||||||
|
QbsGroupNode::setupFiles(node, allPaths, QFileInfo(productFilePath).absolutePath(), true);
|
||||||
|
}
|
||||||
|
return notAdded->isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
|
bool QbsProject::removeFilesFromProduct(QbsBaseProjectNode *node, const QStringList &filePaths,
|
||||||
|
const qbs::ProductData &productData, const qbs::GroupData &groupData,
|
||||||
|
QStringList *notRemoved)
|
||||||
|
{
|
||||||
|
QTC_ASSERT(m_qbsProject.isValid(), return false);
|
||||||
|
QStringList allPaths = groupData.allFilePaths();
|
||||||
|
const QString productFilePath = productData.location().fileName();
|
||||||
|
ChangeExpector expector(productFilePath, m_qbsDocuments);
|
||||||
|
foreach (const QString &path, filePaths) {
|
||||||
|
qbs::ErrorInfo err
|
||||||
|
= m_qbsProject.removeFiles(productData, groupData, QStringList() << path);
|
||||||
|
if (err.hasError()) {
|
||||||
|
Core::MessageManager::write(err.toString());
|
||||||
|
*notRemoved += path;
|
||||||
|
} else {
|
||||||
|
allPaths.removeOne(path);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (notRemoved->count() != filePaths.count()) {
|
||||||
|
m_projectData = m_qbsProject.projectData();
|
||||||
|
QbsGroupNode::setupFiles(node, allPaths, QFileInfo(productFilePath).absolutePath(), true);
|
||||||
|
}
|
||||||
|
return notRemoved->isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
void QbsProject::invalidate()
|
void QbsProject::invalidate()
|
||||||
{
|
{
|
||||||
prepareForParsing();
|
prepareForParsing();
|
||||||
|
@@ -48,6 +48,8 @@ namespace qbs {
|
|||||||
class BuildJob;
|
class BuildJob;
|
||||||
class CleanJob;
|
class CleanJob;
|
||||||
class Error;
|
class Error;
|
||||||
|
class GroupData;
|
||||||
|
class ProductData;
|
||||||
class ProjectData;
|
class ProjectData;
|
||||||
class CleanOptions;
|
class CleanOptions;
|
||||||
class InstallJob;
|
class InstallJob;
|
||||||
@@ -62,7 +64,7 @@ namespace ProjectExplorer { class BuildConfiguration; }
|
|||||||
|
|
||||||
namespace QbsProjectManager {
|
namespace QbsProjectManager {
|
||||||
namespace Internal {
|
namespace Internal {
|
||||||
|
class QbsBaseProjectNode;
|
||||||
class QbsProjectNode;
|
class QbsProjectNode;
|
||||||
class QbsRootProjectNode;
|
class QbsRootProjectNode;
|
||||||
class QbsProjectParser;
|
class QbsProjectParser;
|
||||||
@@ -84,6 +86,13 @@ public:
|
|||||||
|
|
||||||
QStringList files(FilesMode fileMode) const;
|
QStringList files(FilesMode fileMode) const;
|
||||||
|
|
||||||
|
bool addFilesToProduct(QbsBaseProjectNode *node, const QStringList &filePaths,
|
||||||
|
const qbs::ProductData &productData, const qbs::GroupData &groupData,
|
||||||
|
QStringList *notAdded);
|
||||||
|
bool removeFilesFromProduct(QbsBaseProjectNode *node, const QStringList &filePaths,
|
||||||
|
const qbs::ProductData &productData, const qbs::GroupData &groupData,
|
||||||
|
QStringList *notRemoved);
|
||||||
|
|
||||||
qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products = QStringList());
|
qbs::BuildJob *build(const qbs::BuildOptions &opts, QStringList products = QStringList());
|
||||||
qbs::CleanJob *clean(const qbs::CleanOptions &opts);
|
qbs::CleanJob *clean(const qbs::CleanOptions &opts);
|
||||||
qbs::InstallJob *install(const qbs::InstallOptions &opts);
|
qbs::InstallJob *install(const qbs::InstallOptions &opts);
|
||||||
|
Reference in New Issue
Block a user