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