From 7f66d8fe03227f3e5010e7704f253399159e7ab1 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Tue, 6 Aug 2013 16:11:11 +0200 Subject: [PATCH] QmlDesigner: Raise exception for a invalid parent property Change-Id: I0272b0aefc0598ad524aa1d9e6b434ef2dcd79a9 Reviewed-by: Thomas Hartmann --- .../components/componentcore/modelnodeoperations.cpp | 2 +- .../qmldesigner/components/formeditor/formeditorview.cpp | 2 +- .../qmldesigner/components/integration/designdocument.cpp | 2 +- src/plugins/qmldesigner/designercore/model/modelnode.cpp | 8 ++++++-- .../designercore/model/nodeabstractproperty.cpp | 2 +- .../qmldesigner/designercore/model/texttomodelmerger.cpp | 4 ++-- 6 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp index ec64d6c9f04..deee6f9401a 100644 --- a/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp +++ b/src/plugins/qmldesigner/components/componentcore/modelnodeoperations.cpp @@ -56,7 +56,7 @@ static inline QList siblingsForNode(const QmlItemNode &itemNode) { QList siblingList; - if (itemNode.isValid() && itemNode.modelNode().parentProperty().isValid()) { + if (itemNode.isValid() && itemNode.modelNode().hasParentProperty()) { QList modelNodes = itemNode.modelNode().parentProperty().parentModelNode().allDirectSubModelNodes(); foreach (const ModelNode &node, modelNodes) { QmlItemNode childItemNode = node; diff --git a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp index c4489a59a11..9a75898651d 100644 --- a/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp +++ b/src/plugins/qmldesigner/components/formeditor/formeditorview.cpp @@ -236,7 +236,7 @@ void FormEditorView::propertiesAboutToBeRemoved(const QList& p static inline bool hasNodeSourceParent(const ModelNode &node) { - if (node.parentProperty().isValid() && node.parentProperty().parentModelNode().isValid()) { + if (node.hasParentProperty() && node.parentProperty().parentModelNode().isValid()) { ModelNode parent = node.parentProperty().parentModelNode(); if (parent.nodeSourceType() != ModelNode::NodeWithoutSource) return true; diff --git a/src/plugins/qmldesigner/components/integration/designdocument.cpp b/src/plugins/qmldesigner/components/integration/designdocument.cpp index ac6a19d11be..a83631abf78 100644 --- a/src/plugins/qmldesigner/components/integration/designdocument.cpp +++ b/src/plugins/qmldesigner/components/integration/designdocument.cpp @@ -488,7 +488,7 @@ void DesignDocument::paste() targetNode = view.selectedModelNodes().first(); //In case we copy and paste a selection we paste in the parent item - if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.parentProperty().isValid()) + if ((view.selectedModelNodes().count() == selectedNodes.count()) && targetNode.isValid() && targetNode.hasParentProperty()) targetNode = targetNode.parentProperty().parentModelNode(); if (!targetNode.isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/modelnode.cpp b/src/plugins/qmldesigner/designercore/model/modelnode.cpp index e19324e5a80..7925ee468e7 100644 --- a/src/plugins/qmldesigner/designercore/model/modelnode.cpp +++ b/src/plugins/qmldesigner/designercore/model/modelnode.cpp @@ -38,6 +38,7 @@ #include "invalidargumentexception.h" #include "invalididexception.h" #include "invalidmodelnodeexception.h" +#include "invalidpropertyexception.h" #include "model_p.h" #include "variantproperty.h" #include "bindingproperty.h" @@ -277,8 +278,11 @@ NodeAbstractProperty ModelNode::parentProperty() const Q_ASSERT_X(isValid(), Q_FUNC_INFO, "model node is invalid"); throw InvalidModelNodeException(__LINE__, __FUNCTION__, __FILE__); } - if (m_internalNode->parentProperty().isNull()) - return NodeAbstractProperty(); + + if (m_internalNode->parentProperty().isNull()) { + Q_ASSERT_X(m_internalNode->parentProperty(), Q_FUNC_INFO, "parentProperty is invalid"); + throw InvalidPropertyException(__LINE__, __FUNCTION__, __FILE__, "parent"); + } return NodeAbstractProperty(m_internalNode->parentProperty()->name(), m_internalNode->parentProperty()->propertyOwner(), m_model.data(), view()); } diff --git a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp index 3741d4fa904..b2435712378 100644 --- a/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp +++ b/src/plugins/qmldesigner/designercore/model/nodeabstractproperty.cpp @@ -65,7 +65,7 @@ void NodeAbstractProperty::reparentHere(const ModelNode &modelNode) void NodeAbstractProperty::reparentHere(const ModelNode &modelNode, bool isNodeList) { - if (modelNode.parentProperty() == *this) + if (modelNode.hasParentProperty() && modelNode.parentProperty() == *this) return; Internal::WriteLocker locker(model()); if (!isValid()) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 8948278ec29..48a56838eb3 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -901,7 +901,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, } } - bool isImplicitComponent = modelNode.parentProperty().isValid() && propertyIsComponentType(modelNode.parentProperty(), typeName, modelNode.model()); + bool isImplicitComponent = modelNode.hasParentProperty() && propertyIsComponentType(modelNode.parentProperty(), typeName, modelNode.model()); if (modelNode.type() != typeName //If there is no valid parentProperty //the node has just been created. The type is correct then. @@ -1656,7 +1656,7 @@ void ModelAmender::typeDiffers(bool isRootNode, QmlJS::AST::UiObjectMember *astNode, ReadingContext *context) { - const bool propertyTakesComponent = propertyIsComponentType(modelNode.parentProperty(), typeName, modelNode.model()); + const bool propertyTakesComponent = modelNode.hasParentProperty() && propertyIsComponentType(modelNode.parentProperty(), typeName, modelNode.model()); if (isRootNode) { modelNode.view()->changeRootNodeType(typeName, majorVersion, minorVersion);