From a826ee722e53bcb43a2e8acbb8bbb770bc9799ee Mon Sep 17 00:00:00 2001
From: Thomas Hartmann <Thomas.Hartmann@nokia.com>
Date: Fri, 15 Jul 2011 16:41:24 +0200
Subject: [PATCH] QmlDesigner: fix in model for meta info

We have to use metaInfoProxyModel() to allow forwarding.

Since property.parentModelNode().model() might be null in
propertyIsComponentType().

I also provide a fix for this. Before calling ->metaInfo on a 0 model was
safe, since metaInfo is non virtual and the constructor and isSubCLassOf()
were safe and had checks.
This was still wrong of course.

Change-Id: If4a2371e4dceeccba7f3ddde7236a7240ed7b92a
Reviewed-on: http://codereview.qt.nokia.com/1707
Reviewed-by: Qt Sanity Bot <qt_sanity_bot@ovi.com>
Reviewed-by: Thomas Hartmann <Thomas.Hartmann@nokia.com>
---
 .../qmldesigner/designercore/model/model.cpp      |  4 ++--
 .../designercore/model/texttomodelmerger.cpp      | 15 ++++++++-------
 2 files changed, 10 insertions(+), 9 deletions(-)

diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp
index 72e8585f7d4..e80286fc606 100644
--- a/src/plugins/qmldesigner/designercore/model/model.cpp
+++ b/src/plugins/qmldesigner/designercore/model/model.cpp
@@ -1898,12 +1898,12 @@ const MetaInfo Model::metaInfo() const
 
 bool Model::hasNodeMetaInfo(const QString &typeName, int majorVersion, int minorVersion)
 {
-    return NodeMetaInfo(this, typeName, majorVersion, minorVersion).isValid();
+    return NodeMetaInfo(metaInfoProxyModel(), typeName, majorVersion, minorVersion).isValid();
 }
 
 NodeMetaInfo Model::metaInfo(const QString &typeName, int majorVersion, int minorVersion)
 {
-    return NodeMetaInfo(this, typeName, majorVersion, minorVersion);
+    return NodeMetaInfo(metaInfoProxyModel(), typeName, majorVersion, minorVersion);
 }
 
 /*!
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index d3dd08a2b0b..e3cafdab66e 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -284,9 +284,9 @@ static bool isPropertyChangesType(const QString &type)
     return  type == QLatin1String("PropertyChanges") || type == QLatin1String("QtQuick.PropertyChanges") || type == QLatin1String("Qt.PropertyChanges");
 }
 
-static bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &property, const QString &type)
+static bool propertyIsComponentType(const QmlDesigner::NodeAbstractProperty &property, const QString &type, QmlDesigner::Model *model)
 {
-    if (property.parentModelNode().model()->metaInfo(type, -1, -1).isSubclassOf(QLatin1String("QtQuick.Component"), -1, -1) && !isComponentType(type)) {
+    if (model->metaInfo(type, -1, -1).isSubclassOf(QLatin1String("QtQuick.Component"), -1, -1) && !isComponentType(type)) {
         return false; //If the type is already a subclass of Component keep it
     }
 
@@ -770,9 +770,10 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
         if (view()->checkSemanticErrors()) {
             Check check(doc, m_lookupContext->context());
             check.setOptions(check.options() & ~Check::ErrCheckTypeErrors);
-            foreach (const QmlJS::DiagnosticMessage &diagnosticMessage, check())
+            foreach (const QmlJS::DiagnosticMessage &diagnosticMessage, check()) {
                 if (diagnosticMessage.isError())
                     errors.append(RewriterView::Error(diagnosticMessage, QUrl::fromLocalFile(doc->fileName())));
+            }
 
             if (!errors.isEmpty()) {
                 m_rewriterView->setErrors(errors);
@@ -838,7 +839,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode,
         return;
     }
 
-    bool isImplicitComponent = modelNode.parentProperty().isValid() && propertyIsComponentType(modelNode.parentProperty(), typeName);
+    bool isImplicitComponent = modelNode.parentProperty().isValid() && 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.
@@ -1457,7 +1458,7 @@ void ModelAmender::shouldBeNodeProperty(AbstractProperty &modelProperty,
     ModelNode theNode = modelProperty.parentModelNode();
     NodeProperty newNodeProperty = theNode.nodeProperty(modelProperty.name());
 
-    const bool propertyTakesComponent = propertyIsComponentType(newNodeProperty, typeName);
+    const bool propertyTakesComponent = propertyIsComponentType(newNodeProperty, typeName, theNode.model());
 
     const ModelNode &newNode = m_merger->createModelNode(typeName,
                                                           majorVersion,
@@ -1506,7 +1507,7 @@ ModelNode ModelAmender::listPropertyMissingModelNode(NodeListProperty &modelProp
         return ModelNode();
     }
 
-    const bool propertyTakesComponent = propertyIsComponentType(modelProperty, typeName);
+    const bool propertyTakesComponent = propertyIsComponentType(modelProperty, typeName, m_merger->view()->model());
 
 
     const ModelNode &newNode = m_merger->createModelNode(typeName,
@@ -1542,7 +1543,7 @@ void ModelAmender::typeDiffers(bool isRootNode,
                                QmlJS::AST::UiObjectMember *astNode,
                                ReadingContext *context)
 {
-    const bool propertyTakesComponent = propertyIsComponentType(modelNode.parentProperty(), typeName);
+    const bool propertyTakesComponent = propertyIsComponentType(modelNode.parentProperty(), typeName, modelNode.model());
 
     if (isRootNode) {
         modelNode.view()->changeRootNodeType(typeName, majorVersion, minorVersion);
-- 
GitLab