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 {
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
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);
}
}
}
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);
}
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,
DifferenceHandler &differenceHandler);
void syncExpressionProperty(AbstractProperty &modelProperty,
const QString &javascript,
+ const QString &astType,
DifferenceHandler &differenceHandler);
void syncArrayProperty(AbstractProperty &modelProperty,
const QList<QmlJS::AST::UiObjectMember *> &arrayMembers,
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;
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);
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);