diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 6fbe894cfcf41497453e74fc098cd4e9b55700b9..e454e97bf5bd0545eda423faa4607ab110037d3a 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -744,7 +744,7 @@ void TextToModelMerger::syncNode(ModelNode &modelNode, const QVariant variantValue = convertDynamicPropertyValueToVariant(astValue, astType); syncVariantProperty(modelProperty, variantValue, astType, differenceHandler); } else { - syncExpressionProperty(modelProperty, astValue, differenceHandler); + syncExpressionProperty(modelProperty, astValue, astType, differenceHandler); } modelPropertyNames.remove(astName); } else { @@ -836,12 +836,12 @@ QString TextToModelMerger::syncScriptBinding(ModelNode &modelNode, const QVariant enumValue = context->convertToEnum(script->statement, prefix, script->qualifiedId); if (enumValue.isValid()) { // It is a qualified enum: AbstractProperty modelProperty = modelNode.property(astPropertyName); - syncVariantProperty(modelProperty, enumValue, QString(), differenceHandler); + syncVariantProperty(modelProperty, enumValue, QString(), differenceHandler); // TODO: parse type return astPropertyName; } else { // Not an enum, so: if (modelNode.type() == QLatin1String("Qt/PropertyChanges") || context->lookupProperty(prefix, script->qualifiedId)) { AbstractProperty modelProperty = modelNode.property(astPropertyName); - syncExpressionProperty(modelProperty, astValue, differenceHandler); + syncExpressionProperty(modelProperty, astValue, QString(), differenceHandler); // TODO: parse type return astPropertyName; } else { qWarning() << "Skipping invalid expression property" << astPropertyName @@ -900,15 +900,18 @@ void TextToModelMerger::syncNodeProperty(AbstractProperty &modelProperty, void TextToModelMerger::syncExpressionProperty(AbstractProperty &modelProperty, const QString &javascript, + const QString &astType, DifferenceHandler &differenceHandler) { if (modelProperty.isBindingProperty()) { BindingProperty bindingProperty = modelProperty.toBindingProperty(); - if (bindingProperty.expression() != javascript) { - differenceHandler.bindingExpressionsDiffer(bindingProperty, javascript); + if (bindingProperty.expression() != javascript + || !astType.isEmpty() != bindingProperty.isDynamic() + || astType != bindingProperty.dynamicTypeName()) { + differenceHandler.bindingExpressionsDiffer(bindingProperty, javascript, astType); } } else { - differenceHandler.shouldBeBindingProperty(modelProperty, javascript); + differenceHandler.shouldBeBindingProperty(modelProperty, javascript, astType); } } @@ -1025,14 +1028,17 @@ void ModelValidator::importAbsentInQMl(const Import &import) } void ModelValidator::bindingExpressionsDiffer(BindingProperty &modelProperty, - const QString &javascript) + const QString &javascript, + const QString &astType) { Q_ASSERT(modelProperty.expression() == javascript); + Q_ASSERT(modelProperty.dynamicTypeName() == astType); Q_ASSERT(0); } void ModelValidator::shouldBeBindingProperty(AbstractProperty &modelProperty, - const QString &/*javascript*/) + const QString &/*javascript*/, + const QString &/*astType*/) { Q_ASSERT(modelProperty.isBindingProperty()); Q_ASSERT(0); @@ -1125,17 +1131,27 @@ void ModelAmender::importAbsentInQMl(const Import &import) } void ModelAmender::bindingExpressionsDiffer(BindingProperty &modelProperty, - const QString &javascript) + const QString &javascript, + const QString &astType) { - modelProperty.toBindingProperty().setExpression(javascript); + if (astType.isEmpty()) { + modelProperty.setExpression(javascript); + } else { + modelProperty.setDynamicTypeNameAndExpression(astType, javascript); + } } void ModelAmender::shouldBeBindingProperty(AbstractProperty &modelProperty, - const QString &javascript) + const QString &javascript, + const QString &astType) { ModelNode theNode = modelProperty.parentModelNode(); BindingProperty newModelProperty = theNode.bindingProperty(modelProperty.name()); - newModelProperty.setExpression(javascript); + if (astType.isEmpty()) { + newModelProperty.setExpression(javascript); + } else { + newModelProperty.setDynamicTypeNameAndExpression(astType, javascript); + } } void ModelAmender::shouldBeNodeListProperty(AbstractProperty &modelProperty, diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index 9924ea56038da6b135b64912ee3c7b855f63a4b2..1c0050a471d6323c9d3d69afd93124444e2067db 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -84,6 +84,7 @@ public: DifferenceHandler &differenceHandler); void syncExpressionProperty(AbstractProperty &modelProperty, const QString &javascript, + const QString &astType, DifferenceHandler &differenceHandler); void syncArrayProperty(AbstractProperty &modelProperty, const QList<QmlJS::AST::UiObjectMember *> &arrayMembers, @@ -135,9 +136,11 @@ public: virtual void modelMissesImport(const Import &import) = 0; virtual void importAbsentInQMl(const Import &import) = 0; virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, - const QString &javascript) = 0; + const QString &javascript, + const QString &astType) = 0; virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, - const QString &javascript) = 0; + const QString &javascript, + const QString &astType) = 0; virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList<QmlJS::AST::UiObjectMember *> arrayMembers, ReadingContext *context) = 0; @@ -179,9 +182,11 @@ public: virtual void modelMissesImport(const Import &import); virtual void importAbsentInQMl(const Import &import); virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, - const QString &javascript); + const QString &javascript, + const QString &astType); virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, - const QString &javascript); + const QString &javascript, + const QString &astType); virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList<QmlJS::AST::UiObjectMember *> arrayMembers, ReadingContext *context); @@ -220,9 +225,11 @@ public: virtual void modelMissesImport(const Import &import); virtual void importAbsentInQMl(const Import &import); virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, - const QString &javascript); + const QString &javascript, + const QString &astType); virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, - const QString &javascript); + const QString &javascript, + const QString &astType); virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QList<QmlJS::AST::UiObjectMember *> arrayMembers, ReadingContext *context);