diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index 9300cc6f3f48eeea7986cfa160cb0a74a4ef99b1..777a609582417ef92ae09e817636f43f9bd21b76 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -286,23 +286,34 @@ bool ClientProxy::setBindingForObject(int objectDebugId, const QVariant &value, bool isLiteralValue) { - if (propertyName == QLatin1String("id") || objectDebugId == -1) + qDebug() << "setBindingForObject():" << objectDebugId << propertyName << value; + if (objectDebugId == -1) return false; -// qDebug() << "setBindingForObject():" << objectDebugId << propertyName << value << "isLiteral:" << isLiteralValue; + if (propertyName == QLatin1String("id")) + return false; // Crashes the QMLViewer. return m_client->setBindingForObject(objectDebugId, propertyName, value.toString(), isLiteralValue); } bool ClientProxy::setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody) { + qDebug() << "setMethodBodyForObject():" << objectDebugId << methodName << methodBody; if (objectDebugId == -1) return 0; - -// qDebug() << "setMethodBodyForObject():" << objectDebugId << methodName; return m_client->setMethodBody(objectDebugId, methodName, methodBody); } +bool ClientProxy::resetBindingForObject(int objectDebugId, const QString& propertyName) +{ + qDebug() << "resetBindingForObject():" << objectDebugId << propertyName; + if (objectDebugId == -1) + return false; + // if (propertyName == QLatin1String("id")) return false; + return m_client->resetBindingForObject(objectDebugId, propertyName); +} + + void ClientProxy::queryEngineContext(int id) { if (id < 0) diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h index 85d002425db36532ebde17889173d069dee91217..b231195d3a09faefbad4ad4eacad9f6382083e18 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.h +++ b/src/plugins/qmljsinspector/qmljsclientproxy.h @@ -57,6 +57,7 @@ public: bool isLiteralValue); bool setMethodBodyForObject(int objectDebugId, const QString &methodName, const QString &methodBody); + bool resetBindingForObject(int objectDebugId, const QString &propertyName); // returns the object references for the given url. QList<QDeclarativeDebugObjectReference> objectReferences(const QUrl &url = QUrl()) const; diff --git a/src/plugins/qmljsinspector/qmljsdelta.cpp b/src/plugins/qmljsinspector/qmljsdelta.cpp index 5a304dc51de44c31c025ea9c1d273411ea7307d4..35e9d7abca03d75e49130b0e4016ce97ffaa6f02 100644 --- a/src/plugins/qmljsinspector/qmljsdelta.cpp +++ b/src/plugins/qmljsinspector/qmljsdelta.cpp @@ -306,6 +306,87 @@ void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const Q } } +void QmlJSInspector::Internal::Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& oldDoc, + UiObjectDefinition* newObject, const QmlJS::Document::Ptr& newDoc, + const QList< QDeclarativeDebugObjectReference >& debugReferences) +{ + 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); + 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); + foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { + if (ref.debugId() != -1) + updateMethodBody(ref, script, methodName, methodCode); + } + } + } + } + + //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)) { + foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { + if (ref.debugId() != -1) + ClientProxy::instance()->resetBindingForObject(ref.debugId(), property); // ### remove + } + } + } + } +} + + + Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::Ptr &doc2, const DebugIdMap &debugIds) { Q_ASSERT(doc1->qmlProgram()); @@ -327,81 +408,29 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P UiObjectMember *y = todo.takeFirst(); todo += children(y); + if (!cast<UiObjectDefinition *>(y)) + continue; + if (!M.way2.contains(y)) { + qDebug () << "Delta::operator(): insert " << label(y, doc2) << " to " << label(parents2.parent.value(y), doc2); insert(y, parents2.parent.value(y), newDebuggIds.value(parents2.parent.value(y)), doc2); - qDebug () << "insert " << label(y, doc2) << " to " << label(parents2.parent.value(y), doc2); continue; } UiObjectMember *x = M.way2[y]; + Q_ASSERT(cast<UiObjectDefinition *>(x)); -//--8<--------------------------------------------------------------------------------------- if (debugIds.contains(x)) { - newDebuggIds[y] = debugIds[x]; - -#if 1 - UiObjectMember *object = y; - UiObjectMember *previousObject = x; - - for (UiObjectMemberList *objectMemberIt = objectMembers(object); objectMemberIt; objectMemberIt = objectMemberIt->next) { - if (UiScriptBinding *script = cast<UiScriptBinding *>(objectMemberIt->member)) { - bool found = false; - for (UiObjectMemberList *previousObjectMemberIt = Delta::objectMembers(previousObject); previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) { - if (UiScriptBinding *previousScript = cast<UiScriptBinding *>(previousObjectMemberIt->member)) { - if (compare(script->qualifiedId, previousScript->qualifiedId)) { - found = true; - const QString scriptCode = _scriptCode(script, doc2); - const QString previousScriptCode = _scriptCode(previousScript, doc1); - - if (scriptCode != previousScriptCode) { - const QString property = _propertyName(script->qualifiedId); - foreach (const QDeclarativeDebugObjectReference &ref, debugIds[x]) { - if (ref.debugId() != -1) - updateScriptBinding(ref, script, property, scriptCode); - } - } - } - } - } - if (!found) { - const QString scriptCode = _scriptCode(script, doc2); - const QString property = _propertyName(script->qualifiedId); - foreach (const QDeclarativeDebugObjectReference &ref, debugIds[x]) { - if (ref.debugId() != -1) - updateScriptBinding(ref, script, property, scriptCode); - } - } - } else if (UiSourceElement *uiSource = cast<UiSourceElement*>(objectMemberIt->member)) { - for (UiObjectMemberList *previousObjectMemberIt = objectMembers(previousObject); - previousObjectMemberIt; previousObjectMemberIt = previousObjectMemberIt->next) - { - if (UiSourceElement *previousSource = cast<UiSourceElement*>(previousObjectMemberIt->member)) { - if (compare(uiSource, previousSource)) - { - const QString methodCode = _methodCode(uiSource, doc2); - const QString previousMethodCode = _methodCode(previousSource, doc1); - - if (methodCode != previousMethodCode) { - const QString methodName = _methodName(uiSource); - foreach (const QDeclarativeDebugObjectReference &ref, debugIds[x]) { - if (ref.debugId() != -1) - updateMethodBody(ref, script, methodName, methodCode); - } - } - } - } - } - } - } -#endif + QList< QDeclarativeDebugObjectReference > ids = debugIds[x]; + newDebuggIds[y] = ids; + update(cast<UiObjectDefinition *>(x), doc1, cast<UiObjectDefinition *>(y), doc2, ids); } - -//--8<-------------------------------------------------------------------------------------------------- - - //qDebug() << "match "<< label(x, doc1) << "with parent " << label(parents1.parent.value(x), doc1) + //qDebug() << "Delta::operator(): match "<< label(x, doc1) << "with parent " << label(parents1.parent.value(x), doc1) // << " to "<< label(y, doc2) << "with parent " << label(parents2.parent.value(y), doc2); + + if (!M.contains(parents1.parent.value(x),parents2.parent.value(y))) { - qDebug () << "move " << label(y, doc2) << " from " << label(parents1.parent.value(x), doc1) - << " to " << label(parents2.parent.value(y), doc2); + qDebug () << "Delta::operator(): move " << label(y, doc2) << " from " << label(parents1.parent.value(x), doc1) + << " to " << label(parents2.parent.value(y), doc2) << " ### TODO"; continue; } } @@ -410,8 +439,10 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P while(!todo.isEmpty()) { UiObjectMember *x = todo.takeFirst(); todo += children(x); + if (!cast<UiObjectDefinition *>(x)) + continue; if (!M.way1.contains(x)) { - qDebug () << "remove " << label(x, doc1); + qDebug () << "Delta::operator(): remove " << label(x, doc1) << " ### TODO"; continue; } } diff --git a/src/plugins/qmljsinspector/qmljsdelta.h b/src/plugins/qmljsinspector/qmljsdelta.h index 0138e88031bbca3747068b1a927c09395d701ff1..e4220e2fbeda4d7d7169f3a11bf16311b87dedf1 100644 --- a/src/plugins/qmljsinspector/qmljsdelta.h +++ b/src/plugins/qmljsinspector/qmljsdelta.h @@ -81,6 +81,10 @@ private: void insert(UiObjectMember *member, UiObjectMember *parentMember, const QList<QDeclarativeDebugObjectReference> &debugReferences, const Document::Ptr &doc); + void update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& oldDoc, + UiObjectDefinition* newObject, const QmlJS::Document::Ptr& newDoc, + const QList<QDeclarativeDebugObjectReference >& debugReferences); + private: QmlJS::Document::Ptr _doc; QmlJS::Document::Ptr _previousDoc;