aboutsummaryrefslogtreecommitdiffstats
path: root/src/lib/corelib/language
diff options
context:
space:
mode:
authorJoerg Bornemann <joerg.bornemann@digia.com>2014-10-13 16:41:38 +0200
committerJoerg Bornemann <joerg.bornemann@digia.com>2014-10-13 18:02:01 +0200
commite0f246edf7a1e89f9ad30b1e5f6e340d21fc0435 (patch)
tree3e9224a6b42aaccc1a1b5c760a0b1596a78daf0f /src/lib/corelib/language
parent8f79bb3b8cc9cde18b6c7f1843494cc23fa524e5 (diff)
let Item::clone() create a deep copy of the item tree
Product multiplexing uses Item::clone() to create a product item per profile. Cloning the product is not enough, however. We must create clones of the children and item properties too. Task-number: QBS-690 Change-Id: I8f46488ffa5df255ee9c2b0571145c7ff034c204 Reviewed-by: Christian Kandeler <christian.kandeler@digia.com>
Diffstat (limited to 'src/lib/corelib/language')
-rw-r--r--src/lib/corelib/language/builtinvalue.cpp5
-rw-r--r--src/lib/corelib/language/builtinvalue.h1
-rw-r--r--src/lib/corelib/language/item.cpp15
-rw-r--r--src/lib/corelib/language/value.cpp16
-rw-r--r--src/lib/corelib/language/value.h4
5 files changed, 39 insertions, 2 deletions
diff --git a/src/lib/corelib/language/builtinvalue.cpp b/src/lib/corelib/language/builtinvalue.cpp
index d7f98083d..ab05ac534 100644
--- a/src/lib/corelib/language/builtinvalue.cpp
+++ b/src/lib/corelib/language/builtinvalue.cpp
@@ -43,5 +43,10 @@ BuiltinValuePtr BuiltinValue::create(Builtin builtin)
return BuiltinValuePtr(new BuiltinValue(builtin));
}
+ValuePtr BuiltinValue::clone() const
+{
+ return BuiltinValuePtr(new BuiltinValue(*this));
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/corelib/language/builtinvalue.h b/src/lib/corelib/language/builtinvalue.h
index 77c6fd14a..2788d117d 100644
--- a/src/lib/corelib/language/builtinvalue.h
+++ b/src/lib/corelib/language/builtinvalue.h
@@ -49,6 +49,7 @@ public:
static BuiltinValuePtr create(Builtin builtin);
void apply(ValueHandler *handler) { handler->handle(this); }
+ ValuePtr clone() const;
Builtin builtin() const { return m_builtin; }
void setBuiltin(const Builtin &builtin) { m_builtin = builtin; }
diff --git a/src/lib/corelib/language/item.cpp b/src/lib/corelib/language/item.cpp
index 84d5edd24..57347b97d 100644
--- a/src/lib/corelib/language/item.cpp
+++ b/src/lib/corelib/language/item.cpp
@@ -70,12 +70,23 @@ Item *Item::clone(ItemPool *pool) const
dup->m_scope = m_scope;
dup->m_outerItem = m_outerItem;
dup->m_parent = m_parent;
- dup->m_children = m_children;
dup->m_file = m_file;
- dup->m_properties = m_properties;
dup->m_propertyDeclarations = m_propertyDeclarations;
dup->m_functions = m_functions;
dup->m_modules = m_modules;
+
+ dup->m_children.reserve(m_children.count());
+ foreach (const Item *child, m_children) {
+ Item *clonedChild = child->clone(pool);
+ clonedChild->m_parent = dup;
+ dup->m_children.append(clonedChild);
+ }
+
+ for (PropertyMap::const_iterator it = m_properties.constBegin(); it != m_properties.constEnd();
+ ++it) {
+ dup->m_properties.insert(it.key(), it.value()->clone());
+ }
+
return dup;
}
diff --git a/src/lib/corelib/language/value.cpp b/src/lib/corelib/language/value.cpp
index f39b1bc0c..27164995a 100644
--- a/src/lib/corelib/language/value.cpp
+++ b/src/lib/corelib/language/value.cpp
@@ -57,6 +57,11 @@ JSSourceValue::~JSSourceValue()
{
}
+ValuePtr JSSourceValue::clone() const
+{
+ return JSSourceValuePtr(new JSSourceValue(*this));
+}
+
QString JSSourceValue::sourceCodeForEvaluation() const
{
if (!hasFunctionForm())
@@ -103,6 +108,12 @@ ItemValue::~ItemValue()
{
}
+ValuePtr ItemValue::clone() const
+{
+ Item *clonedItem = m_item ? m_item->clone(m_item->pool()) : 0;
+ return ItemValuePtr(new ItemValue(clonedItem));
+}
+
VariantValue::VariantValue(const QVariant &v)
: Value(VariantValueType)
, m_value(v)
@@ -114,5 +125,10 @@ VariantValuePtr VariantValue::create(const QVariant &v)
return VariantValuePtr(new VariantValue(v));
}
+ValuePtr VariantValue::clone() const
+{
+ return VariantValuePtr(new VariantValue(*this));
+}
+
} // namespace Internal
} // namespace qbs
diff --git a/src/lib/corelib/language/value.h b/src/lib/corelib/language/value.h
index 6114f6b89..6694d9982 100644
--- a/src/lib/corelib/language/value.h
+++ b/src/lib/corelib/language/value.h
@@ -56,6 +56,7 @@ public:
Type type() const { return m_type; }
virtual void apply(ValueHandler *) = 0;
+ virtual ValuePtr clone() const = 0;
virtual CodeLocation location() const { return CodeLocation(); }
private:
@@ -90,6 +91,7 @@ public:
~JSSourceValue();
void apply(ValueHandler *handler) { handler->handle(this); }
+ ValuePtr clone() const;
void setSourceCode(const QStringRef &sourceCode) { m_sourceCode = sourceCode; }
const QStringRef &sourceCode() const { return m_sourceCode; }
@@ -141,6 +143,7 @@ public:
~ItemValue();
void apply(ValueHandler *handler) { handler->handle(this); }
+ ValuePtr clone() const;
Item *item() const;
void setItem(Item *ptr);
@@ -166,6 +169,7 @@ public:
static VariantValuePtr create(const QVariant &v = QVariant());
void apply(ValueHandler *handler) { handler->handle(this); }
+ ValuePtr clone() const;
void setValue(const QVariant &v) { m_value = v; }
const QVariant &value() const { return m_value; }