diff --git a/src/plugins/qmljsinspector/qmljsdelta.cpp b/src/plugins/qmljsinspector/qmljsdelta.cpp index 17787fd9d0c4571520c746f2931dc57974bb91a4..cf3a69fa940c62642eda4d53eea24d9df41458b4 100644 --- a/src/plugins/qmljsinspector/qmljsdelta.cpp +++ b/src/plugins/qmljsinspector/qmljsdelta.cpp @@ -276,8 +276,43 @@ static QString _methodName(UiSourceElement *source) return QString(); } +static UiObjectMemberList *objectMembers(UiObjectMember *object) +{ + if (UiObjectDefinition *def = cast<UiObjectDefinition *>(object)) + return def->initializer->members; + else if (UiObjectBinding *binding = cast<UiObjectBinding *>(object)) + return binding->initializer->members; + + return 0; } + +static QHash<QString, UiObjectMember*> extractProperties(UiObjectDefinition *object) +{ + QHash<QString, UiObjectMember*> result; + for (UiObjectMemberList *objectMemberIt = objectMembers(object); objectMemberIt; objectMemberIt = objectMemberIt->next) { + if (UiScriptBinding *script = cast<UiScriptBinding *>(objectMemberIt->member)) { + const QString property = _propertyName(script->qualifiedId); + result.insert(property, script); + } else if (UiObjectDefinition *uiObject = cast<UiObjectDefinition *>(objectMemberIt->member)) { + const QString l = label(uiObject->qualifiedTypeNameId); + if (!l.isEmpty() && !l[0].isUpper()) { + QHash<QString, UiObjectMember *> recursiveResult = extractProperties(uiObject); + for (QHash<QString, UiObjectMember *>::const_iterator it = recursiveResult.constBegin(); + it != recursiveResult.constEnd(); ++it) { + result.insert(l + QLatin1Char('.') + it.key(), it.value()); + } + } + } else if (UiSourceElement *uiSource = cast<UiSourceElement*>(objectMemberIt->member)) { + const QString methodName = _methodName(uiSource); + result.insert(methodName, uiSource); + } + } + return result; +} + +} //end namespace + void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const QList<QDeclarativeDebugObjectReference > &debugReferences, const Document::Ptr &doc) { if (doNotSendChanges) @@ -314,9 +349,10 @@ void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const Q } } + void Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& oldDoc, - UiObjectDefinition* newObject, const QmlJS::Document::Ptr& newDoc, - const QList< QDeclarativeDebugObjectReference >& debugReferences) + UiObjectDefinition* newObject, const QmlJS::Document::Ptr& newDoc, + const QList< QDeclarativeDebugObjectReference >& debugReferences) { if (doNotSendChanges) return; @@ -324,56 +360,29 @@ void Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& ol Q_ASSERT (oldObject && newObject); QSet<QString> presentBinding; - for (UiObjectMemberList *objectMemberIt = objectMembers(newObject); objectMemberIt; objectMemberIt = objectMemberIt->next) { - if (UiScriptBinding *script = cast<UiScriptBinding *>(objectMemberIt->member)) { - bool found = false; - const QString property = _propertyName(script->qualifiedId); - presentBinding.insert(property); - for (UiObjectMemberList *previousObjectMemberIt = Delta::objectMembers(oldObject); previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) { - if (UiScriptBinding *previousScript = cast<UiScriptBinding *>(previousObjectMemberIt->member)) { - if (compare(script->qualifiedId, previousScript->qualifiedId)) { - found = true; - const QString scriptCode = _scriptCode(script, newDoc); - const QString previousScriptCode = _scriptCode(previousScript, oldDoc); - - if (scriptCode != previousScriptCode) { - foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { - if (ref.debugId() != -1) - updateScriptBinding(ref, script, property, scriptCode); - } - } - } - } - } - if (!found) { - const QString scriptCode = _scriptCode(script, newDoc); + const QHash<QString, UiObjectMember *> oldProperties = extractProperties(oldObject); + const QHash<QString, UiObjectMember *> newProperties = extractProperties(newObject); + + for (QHash<QString, UiObjectMember *>::const_iterator it = newProperties.constBegin(); + it != newProperties.constEnd(); ++it) { + + UiObjectMember *oldMember = oldProperties.value(it.key()); + if (UiScriptBinding *script = cast<UiScriptBinding *>(*it)) { + const QString property = it.key(); + const QString scriptCode = _scriptCode(script, newDoc); + UiScriptBinding *previousScript = cast<UiScriptBinding *>(oldMember); + if (!previousScript || _scriptCode(previousScript, oldDoc) != scriptCode) { foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { if (ref.debugId() != -1) updateScriptBinding(ref, script, property, scriptCode); } } - } else if (UiSourceElement *uiSource = cast<UiSourceElement*>(objectMemberIt->member)) { - bool found = false; - const QString methodName = _methodName(uiSource); - for (UiObjectMemberList *previousObjectMemberIt = objectMembers(oldObject); - previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) { - if (UiSourceElement *previousSource = cast<UiSourceElement*>(previousObjectMemberIt->member)) { - if (compare(uiSource, previousSource)) { - found = true; - const QString methodCode = _methodCode(uiSource, newDoc); - const QString previousMethodCode = _methodCode(previousSource, oldDoc); - - if (methodCode != previousMethodCode) { - foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { - if (ref.debugId() != -1) - updateMethodBody(ref, script, methodName, methodCode); - } - } - } - } - } - if (!found) { - const QString methodCode = _methodCode(uiSource, newDoc); + } else if (UiSourceElement *uiSource = cast<UiSourceElement*>(*it)) { + const QString methodName = it.key(); + const QString methodCode = _methodCode(uiSource, newDoc); + UiSourceElement *previousSource = cast<UiSourceElement*>(oldMember); + + if (!previousSource || _methodCode(previousSource, oldDoc) != methodCode) { foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { if (ref.debugId() != -1) updateMethodBody(ref, script, methodName, methodCode); @@ -382,18 +391,18 @@ void Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& ol } } - if (doNotSendChanges) return; //reset property that are not present in the new object. - for (UiObjectMemberList *previousObjectMemberIt = Delta::objectMembers(oldObject); previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) { - if (UiScriptBinding *previousScript = cast<UiScriptBinding *>(previousObjectMemberIt->member)) { - const QString property = _propertyName(previousScript->qualifiedId); - if (!presentBinding.contains(property)) { + for (QHash<QString, UiObjectMember *>::const_iterator it2 = oldProperties.constBegin(); + it2 != oldProperties.constEnd(); ++it2) { + + if (!newProperties.contains(it2.key())) { + if (UiScriptBinding *previousScript = cast<UiScriptBinding *>(*it2)) { foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { if (ref.debugId() != -1) - ClientProxy::instance()->resetBindingForObject(ref.debugId(), property); // ### remove + ClientProxy::instance()->resetBindingForObject(ref.debugId(), it2.key()); // ### remove } } } @@ -409,8 +418,6 @@ void Delta::remove(const QList< QDeclarativeDebugObjectReference >& debugReferen } - - Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::Ptr &doc2, const DebugIdMap &debugIds) { Q_ASSERT(doc1->qmlProgram()); @@ -643,16 +650,6 @@ bool Delta::compare(UiSourceElement *source, UiSourceElement *other) return false; } -UiObjectMemberList *Delta::objectMembers(UiObjectMember *object) -{ - if (UiObjectDefinition *def = cast<UiObjectDefinition *>(object)) - return def->initializer->members; - else if (UiObjectBinding *binding = cast<UiObjectBinding *>(object)) - return binding->initializer->members; - - return 0; -} - Document::Ptr Delta::document() const { return _doc;