summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Hunger <tobias.hunger@digia.com>2013-01-16 18:25:01 +0100
committerTobias Hunger <tobias.hunger@digia.com>2013-01-24 15:11:22 +0100
commiteba5dbb9e1a2ad373aa94f7e3d5a2910559aab8f (patch)
treeb7510c35323cb46d614969108006af14ff80bca4
parent3e05e52f5c7fe0772a8d4366ce8f10380da56f9a (diff)
downloadqt-creator-eba5dbb9e1a2ad373aa94f7e3d5a2910559aab8f.tar.gz
Qbs: Fix possible crash when reparsing the project
Change-Id: I61a1ca5745639681e3dda879414dfeca9101f64c
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.cpp22
-rw-r--r--src/plugins/qbsprojectmanager/qbsnodes.h2
2 files changed, 20 insertions, 4 deletions
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.cpp b/src/plugins/qbsprojectmanager/qbsnodes.cpp
index cdc775b93c..f26df774f1 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.cpp
+++ b/src/plugins/qbsprojectmanager/qbsnodes.cpp
@@ -223,6 +223,16 @@ bool QbsProductNode::isEnabled() const
return product->isEnabled();
}
+void QbsProductNode::updateProductData(const qbs::ProductData *prd)
+{
+ product = prd;
+
+ for (int i = 0; i < subProjectNodes().count(); ++i) {
+ QbsGroupNode *gn = static_cast<QbsGroupNode *>(subProjectNodes().at(i));
+ gn->group = &(prd->groups().at(i));
+ }
+}
+
// --------------------------------------------------------------------
// QbsProjectNode:
// --------------------------------------------------------------------
@@ -248,12 +258,11 @@ void QbsProjectNode::update(const qbs::Project *prj)
QList<ProjectExplorer::ProjectNode *> oldNodeList = subProjectNodes();
- delete m_projectData;
- m_projectData = 0;
+ qbs::ProjectData *newData = 0;
if (prj) {
- m_projectData = new qbs::ProjectData(prj->projectData());
- foreach (const qbs::ProductData &prd, m_projectData->products()) {
+ newData = new qbs::ProjectData(prj->projectData());
+ foreach (const qbs::ProductData &prd, newData->products()) {
QbsProductNode *qn = findProductNode(prd.name());
if (!qn) {
toAdd << new QbsProductNode(&prd);
@@ -263,12 +272,17 @@ void QbsProjectNode::update(const qbs::Project *prj)
if (*qn->product != prd) {
toRemove << qn;
toAdd << new QbsProductNode(&prd);
+ } else {
+ qn->updateProductData(&prd);
}
}
}
}
toRemove.append(oldNodeList);
+ delete m_projectData;
+ m_projectData = newData;
+
if (m_project) {
delete m_project;
m_project = 0;
diff --git a/src/plugins/qbsprojectmanager/qbsnodes.h b/src/plugins/qbsprojectmanager/qbsnodes.h
index b921f8a104..acde5a31ad 100644
--- a/src/plugins/qbsprojectmanager/qbsnodes.h
+++ b/src/plugins/qbsprojectmanager/qbsnodes.h
@@ -122,6 +122,8 @@ public:
bool isEnabled() const;
+ void updateProductData(const qbs::ProductData *prd);
+
const qbs::ProductData *product;
};