diff options
author | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-10-13 16:41:38 +0200 |
---|---|---|
committer | Joerg Bornemann <joerg.bornemann@digia.com> | 2014-10-13 18:02:01 +0200 |
commit | e0f246edf7a1e89f9ad30b1e5f6e340d21fc0435 (patch) | |
tree | 3e9224a6b42aaccc1a1b5c760a0b1596a78daf0f /src/lib/corelib/language | |
parent | 8f79bb3b8cc9cde18b6c7f1843494cc23fa524e5 (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.cpp | 5 | ||||
-rw-r--r-- | src/lib/corelib/language/builtinvalue.h | 1 | ||||
-rw-r--r-- | src/lib/corelib/language/item.cpp | 15 | ||||
-rw-r--r-- | src/lib/corelib/language/value.cpp | 16 | ||||
-rw-r--r-- | src/lib/corelib/language/value.h | 4 |
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; } |