diff --git a/src/libs/qmljs/qmljs-lib.pri b/src/libs/qmljs/qmljs-lib.pri index e471af49458..0c4cb8e17a9 100644 --- a/src/libs/qmljs/qmljs-lib.pri +++ b/src/libs/qmljs/qmljs-lib.pri @@ -27,7 +27,8 @@ HEADERS += \ $$PWD/qmljsicontextpane.h \ $$PWD/qmljspropertyreader.h \ $$PWD/qmljsrewriter.h \ - $$PWD/qmljsicons.h + $$PWD/qmljsicons.h \ + $$PWD/qmljsdelta.h SOURCES += \ $$PWD/qmljsbind.cpp \ @@ -45,7 +46,8 @@ SOURCES += \ $$PWD/qmljsmodelmanagerinterface.cpp \ $$PWD/qmljspropertyreader.cpp \ $$PWD/qmljsrewriter.cpp \ - $$PWD/qmljsicons.cpp + $$PWD/qmljsicons.cpp \ + $$PWD/qmljsdelta.cpp RESOURCES += \ $$PWD/qmljs.qrc diff --git a/src/plugins/qmljsinspector/qmljsdelta.cpp b/src/libs/qmljs/qmljsdelta.cpp similarity index 89% rename from src/plugins/qmljsinspector/qmljsdelta.cpp rename to src/libs/qmljs/qmljsdelta.cpp index 2cc5ac5c018..f7b115aa48a 100644 --- a/src/plugins/qmljsinspector/qmljsdelta.cpp +++ b/src/libs/qmljs/qmljsdelta.cpp @@ -28,12 +28,14 @@ **************************************************************************/ #include "qmljsdelta.h" -#include "qmljsclientproxy.h" #include #include + #include #include +#include + using namespace QmlJS::AST; @@ -314,7 +316,7 @@ static QHash extractProperties(UiObjectDefinition *obj namespace QmlJS { -void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const QList &debugReferences, const Document::Ptr &doc) +void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const QList &debugReferences, const Document::Ptr &doc) { if (!member || !parentMember) return; @@ -337,9 +339,9 @@ void Delta::insert(UiObjectMember *member, UiObjectMember *parentMember, const Q QString filename = doc->fileName() + QLatin1Char('_') + QString::number(doc->editorRevision()) + QLatin1Char(':') + QString::number(uiObjectDef->firstSourceLocation().startLine-importList.count()); - foreach(const QDeclarativeDebugObjectReference &ref, debugReferences) { - if (ref.debugId() != -1) { - createObject(qmlText, ref, importList, filename); + foreach(DebugId debugId, debugReferences) { + if (debugId != -1) { + createObject(qmlText, debugId, importList, filename); } } newObjects += member; @@ -349,7 +351,7 @@ 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) + const QList& debugReferences) { Q_ASSERT (oldObject && newObject); QSet presentBinding; @@ -366,8 +368,8 @@ void Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& ol const QString scriptCode = _scriptCode(script, newDoc); UiScriptBinding *previousScript = cast(oldMember); if (!previousScript || _scriptCode(previousScript, oldDoc) != scriptCode) { - foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { - if (ref.debugId() != -1) + foreach (DebugId ref, debugReferences) { + if (ref != -1) updateScriptBinding(ref, script, property, scriptCode); } } @@ -377,8 +379,8 @@ void Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& ol UiSourceElement *previousSource = cast(oldMember); if (!previousSource || _methodCode(previousSource, oldDoc) != methodCode) { - foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { - if (ref.debugId() != -1) + foreach (DebugId ref, debugReferences) { + if (ref != -1) updateMethodBody(ref, script, methodName, methodCode); } } @@ -391,20 +393,20 @@ void Delta::update(UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& ol if (!newProperties.contains(it2.key())) { if (cast(*it2)) { - foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { - if (ref.debugId() != -1) - resetBindingForObject(ref.debugId(), it2.key()); + foreach (DebugId ref, debugReferences) { + if (ref != -1) + resetBindingForObject(ref, it2.key()); } } } } } -void Delta::remove(const QList< QDeclarativeDebugObjectReference >& debugReferences) +void Delta::remove(const QList& debugReferences) { - foreach (const QDeclarativeDebugObjectReference &ref, debugReferences) { - if (ref.debugId() != -1) - removeObject(ref.debugId()); + foreach (DebugId ref, debugReferences) { + if (ref != -1) + removeObject(ref); } } @@ -414,7 +416,7 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P Q_ASSERT(doc1->qmlProgram()); Q_ASSERT(doc2->qmlProgram()); - QHash< UiObjectMember*, QList > newDebuggIds; + Delta::DebugIdMap newDebuggIds; Map M = Mapping(doc1, doc2); @@ -445,7 +447,7 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P Q_ASSERT(cast(x)); if (debugIds.contains(x)) { - QList< QDeclarativeDebugObjectReference > ids = debugIds[x]; + QList ids = debugIds[x]; newDebuggIds[y] = ids; update(cast(x), doc1, cast(y), doc2, ids); } @@ -467,7 +469,7 @@ Delta::DebugIdMap Delta::operator()(const Document::Ptr &doc1, const Document::P continue; if (!M.way1.contains(x)) { qDebug () << "Delta::operator(): remove " << label(x, doc1); - QList< QDeclarativeDebugObjectReference > ids = debugIds.value(x); + QList ids = debugIds.value(x); if (!ids.isEmpty()) remove(ids); continue; @@ -486,19 +488,16 @@ Document::Ptr Delta::previousDocument() const return m_previousDoc; } -void Delta::createObject(const QString &, const QDeclarativeDebugObjectReference &, - const QStringList &, const QString&) +void Delta::createObject(const QString &, DebugId, const QStringList &, const QString&) {} void Delta::removeObject(int) {} void Delta::resetBindingForObject(int, const QString &) {} -void Delta::updateMethodBody(const QDeclarativeDebugObjectReference &, - UiScriptBinding *, const QString &, const QString &) +void Delta::updateMethodBody(DebugId, UiScriptBinding *, const QString &, const QString &) {} -void Delta::updateScriptBinding(const QDeclarativeDebugObjectReference &, - UiScriptBinding *, const QString &, const QString &) +void Delta::updateScriptBinding(DebugId, UiScriptBinding *, const QString &, const QString &) {} } //namespace QmlJs diff --git a/src/plugins/qmljsinspector/qmljsdelta.h b/src/libs/qmljs/qmljsdelta.h similarity index 73% rename from src/plugins/qmljsinspector/qmljsdelta.h rename to src/libs/qmljs/qmljsdelta.h index c5f9b78005e..26a874186af 100644 --- a/src/plugins/qmljsinspector/qmljsdelta.h +++ b/src/libs/qmljs/qmljsdelta.h @@ -30,48 +30,44 @@ #ifndef QMLJSDELTA_H #define QMLJSDELTA_H -#include "qmljsprivateapi.h" - #include -#include -#include -#include +#include namespace QmlJS { -class Delta +class QMLJS_EXPORT Delta { public: - QSet newObjects; - - typedef QHash > DebugIdMap; + typedef int DebugId; + typedef QHash > DebugIdMap; DebugIdMap operator()(const QmlJS::Document::Ptr &doc1, const QmlJS::Document::Ptr &doc2, const DebugIdMap &debugIds); + QSet newObjects; QmlJS::Document::Ptr document() const; QmlJS::Document::Ptr previousDocument() const; private: void insert(AST::UiObjectMember *member, AST::UiObjectMember *parentMember, - const QList &debugReferences, const Document::Ptr &doc); + const QList &debugReferences, const Document::Ptr &doc); void update(AST::UiObjectDefinition* oldObject, const QmlJS::Document::Ptr& oldDoc, AST::UiObjectDefinition* newObject, const QmlJS::Document::Ptr& newDoc, - const QList& debugReferences); - void remove(const QList< QDeclarativeDebugObjectReference > &debugReferences); + const QList& debugReferences); + void remove(const QList &debugReferences); protected: - virtual void updateScriptBinding(const QDeclarativeDebugObjectReference &objectReference, + virtual void updateScriptBinding(DebugId objectReference, AST::UiScriptBinding *scriptBinding, const QString &propertyName, const QString &scriptCode); - virtual void updateMethodBody(const QDeclarativeDebugObjectReference &objectReference, + virtual void updateMethodBody(DebugId objectReference, AST::UiScriptBinding *scriptBinding, const QString &methodName, const QString &methodBody); virtual void resetBindingForObject(int debugId, const QString &propertyName); virtual void removeObject(int debugId); - virtual void createObject(const QString &qmlText, const QDeclarativeDebugObjectReference &ref, - const QStringList &importList, const QString &filename); + virtual void createObject(const QString &qmlText, DebugId ref, + const QStringList &importList, const QString &filename); private: QmlJS::Document::Ptr m_currentDoc; diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.cpp b/src/plugins/qmljsinspector/qmljsclientproxy.cpp index f8de468ebac..0c09172f62e 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.cpp +++ b/src/plugins/qmljsinspector/qmljsclientproxy.cpp @@ -445,11 +445,11 @@ void ClientProxy::changeToSelectMarqueeTool() m_designClient->changeToSelectMarqueeTool(); } -void ClientProxy::createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parentRef, +void ClientProxy::createQmlObject(const QString &qmlText, int parentDebugId, const QStringList &imports, const QString &filename) { if (isDesignClientConnected()) - m_designClient->createQmlObject(qmlText, parentRef, imports, filename); + m_designClient->createQmlObject(qmlText, parentDebugId, imports, filename); } void QmlJSInspector::Internal::ClientProxy::destroyQmlObject(int debugId) diff --git a/src/plugins/qmljsinspector/qmljsclientproxy.h b/src/plugins/qmljsinspector/qmljsclientproxy.h index f266e3d09b6..a3694818629 100644 --- a/src/plugins/qmljsinspector/qmljsclientproxy.h +++ b/src/plugins/qmljsinspector/qmljsclientproxy.h @@ -106,7 +106,7 @@ public slots: void changeToZoomTool(); void changeToSelectTool(); void changeToSelectMarqueeTool(); - void createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parent, + void createQmlObject(const QString &qmlText, int parentDebugId, const QStringList &imports, const QString &filename = QString()); void destroyQmlObject(int debugId); diff --git a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp index 85d775f3c35..d76f75fbd49 100644 --- a/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp +++ b/src/plugins/qmljsinspector/qmljsdesigndebugclient.cpp @@ -215,7 +215,7 @@ void QmlJSDesignDebugClient::changeToZoomTool() sendMessage(message); } -void QmlJSDesignDebugClient::createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parentRef, +void QmlJSDesignDebugClient::createQmlObject(const QString &qmlText, int parentDebugId, const QStringList &imports, const QString &filename) { if (!m_connection || !m_connection->isConnected()) @@ -226,7 +226,7 @@ void QmlJSDesignDebugClient::createQmlObject(const QString &qmlText, const QDecl ds << QByteArray("CREATE_OBJECT") << qmlText - << parentRef.debugId() + << parentDebugId << imports << filename; diff --git a/src/plugins/qmljsinspector/qmljsdesigndebugclient.h b/src/plugins/qmljsinspector/qmljsdesigndebugclient.h index e49b3587c07..f1f45a9242b 100644 --- a/src/plugins/qmljsinspector/qmljsdesigndebugclient.h +++ b/src/plugins/qmljsinspector/qmljsdesigndebugclient.h @@ -64,7 +64,7 @@ public: void changeToSelectMarqueeTool(); void changeToZoomTool(); - void createQmlObject(const QString &qmlText, const QDeclarativeDebugObjectReference &parentRef, + void createQmlObject(const QString &qmlText, int parentDebugId, const QStringList &imports, const QString &filename); void destroyQmlObject(int debugId); diff --git a/src/plugins/qmljsinspector/qmljsinspector.cpp b/src/plugins/qmljsinspector/qmljsinspector.cpp index 6aaf01fe0dd..fc01d67c304 100644 --- a/src/plugins/qmljsinspector/qmljsinspector.cpp +++ b/src/plugins/qmljsinspector/qmljsinspector.cpp @@ -30,7 +30,6 @@ #include "qmljsinspector.h" #include "qmljsclientproxy.h" #include "qmljsinspectorcontext.h" -#include "qmljsdelta.h" #include "qmljslivetextpreview.h" #include "qmljsprivateapi.h" @@ -38,6 +37,7 @@ #include #include +#include #include #include diff --git a/src/plugins/qmljsinspector/qmljsinspector.pro b/src/plugins/qmljsinspector/qmljsinspector.pro index 22f65cf3a98..d543ca86938 100644 --- a/src/plugins/qmljsinspector/qmljsinspector.pro +++ b/src/plugins/qmljsinspector/qmljsinspector.pro @@ -17,7 +17,6 @@ qmljsinspectorcontext.h \ qmljsinspectorplugin.h \ qmljsclientproxy.h \ qmljsinspector.h \ -qmljsdelta.h \ qmlinspectortoolbar.h \ qmljslivetextpreview.h \ qmljsdesigndebugclient.h @@ -28,7 +27,6 @@ qmljsinspectorcontext.cpp \ qmljsinspectorplugin.cpp \ qmljsclientproxy.cpp \ qmljsinspector.cpp \ -qmljsdelta.cpp \ qmlinspectortoolbar.cpp \ qmljslivetextpreview.cpp \ qmljsdesigndebugclient.cpp diff --git a/src/plugins/qmljsinspector/qmljslivetextpreview.cpp b/src/plugins/qmljsinspector/qmljslivetextpreview.cpp index e79d7662ed5..c4cde654450 100644 --- a/src/plugins/qmljsinspector/qmljslivetextpreview.cpp +++ b/src/plugins/qmljsinspector/qmljslivetextpreview.cpp @@ -31,11 +31,12 @@ #include "qmljsclientproxy.h" #include "qmljslivetextpreview.h" -#include "qmljsdelta.h" #include "qmljsprivateapi.h" #include #include +#include +#include #include #include @@ -59,6 +60,7 @@ namespace Internal { class MapObjectWithDebugReference : public Visitor { public: + typedef QList DebugIdList; MapObjectWithDebugReference() : activated(0) {} virtual void endVisit(UiObjectDefinition *ast) ; virtual void endVisit(UiObjectBinding *ast) ; @@ -67,7 +69,7 @@ class MapObjectWithDebugReference : public Visitor QDeclarativeDebugObjectReference root; QString filename; - QHash > result; + QHash result; QSet lookupObjects; Document::Ptr doc; private: @@ -115,12 +117,12 @@ void MapObjectWithDebugReference::processRecursive(const QDeclarativeDebugObject if (object.source().columnNumber() == int(loc.startColumn)) { QString objectFileName = object.source().url().toLocalFile(); if (object.source().lineNumber() == int(loc.startLine) && objectFileName == filename) { - result[ast] += object; + result[ast] += object.debugId(); } else if (doc && objectFileName.startsWith(filename + QLatin1Char('_') + QString::number(doc->editorRevision()) + QLatin1Char(':'))) { bool ok; int line = objectFileName.mid(objectFileName.lastIndexOf(':') + 1).toInt(&ok); if (ok && int(loc.startLine) == line + object.source().lineNumber() - 1) - result[ast] += object; + result[ast] += object.debugId(); } } @@ -185,10 +187,10 @@ void QmlJSLiveTextPreview::resetInitialDoc(const QmlJS::Document::Ptr &doc) } -QList QmlJSLiveTextPreview::objectReferencesForOffset(quint32 offset) const +QList QmlJSLiveTextPreview::objectReferencesForOffset(quint32 offset) const { - QList result; - QHashIterator > iter(m_debugIds); + QList result; + QHashIterator > iter(m_debugIds); while(iter.hasNext()) { iter.next(); QmlJS::AST::UiObjectMember *member = iter.key(); @@ -217,16 +219,16 @@ void QmlJSLiveTextPreview::changeSelectedElements(QList offsets, const QStr } } - QList selectedReferences; + QList selectedReferences; bool containsReference = false; foreach(int offset, offsets) { if (offset >= 0) { - QList list = objectReferencesForOffset(offset); + QList list = objectReferencesForOffset(offset); if (!containsReference && objectRefUnderCursor.debugId() != -1) { - foreach(const QDeclarativeDebugObjectReference &ref, list) { - if (ref.debugId() == objectRefUnderCursor.debugId()) { + foreach(int id, list) { + if (id == objectRefUnderCursor.debugId()) { containsReference = true; break; } @@ -237,17 +239,21 @@ void QmlJSLiveTextPreview::changeSelectedElements(QList offsets, const QStr } if (!containsReference && objectRefUnderCursor.debugId() != -1) - selectedReferences << objectRefUnderCursor; + selectedReferences << objectRefUnderCursor.debugId(); - if (!selectedReferences.isEmpty()) - emit selectedItemsChanged(selectedReferences); + if (!selectedReferences.isEmpty()) { + QList refs; + foreach(int i, selectedReferences) + refs << QDeclarativeDebugObjectReference(i); + emit selectedItemsChanged(refs); + } } -static QList findRootObjectRecursive(const QDeclarativeDebugObjectReference &object, const Document::Ptr &doc) +static QList findRootObjectRecursive(const QDeclarativeDebugObjectReference &object, const Document::Ptr &doc) { - QList result; + QList result; if (object.className() == doc->componentName()) - result += object; + result += object.debugId(); foreach (const QDeclarativeDebugObjectReference &it, object.children()) { result += findRootObjectRecursive(it, doc); @@ -281,7 +287,7 @@ void QmlJSLiveTextPreview::updateDebugIds(const QDeclarativeDebugObjectReference // Map the root nodes of the document. if(doc->qmlProgram()->members && doc->qmlProgram()->members->member) { UiObjectMember* root = doc->qmlProgram()->members->member; - QList< QDeclarativeDebugObjectReference > r = findRootObjectRecursive(rootReference, doc); + QList r = findRootObjectRecursive(rootReference, doc); if (!r.isEmpty()) m_debugIds[root] += r; } @@ -406,21 +412,21 @@ private: } protected: - virtual void updateMethodBody(const QDeclarativeDebugObjectReference& objectReference, - UiScriptBinding* scriptBinding, const QString& methodName, const QString& methodBody) + virtual void updateMethodBody(DebugId debugId, UiScriptBinding* scriptBinding, + const QString& methodName, const QString& methodBody) { Q_UNUSED(scriptBinding); - ClientProxy::instance()->setMethodBodyForObject(objectReference.debugId(), methodName, methodBody); + ClientProxy::instance()->setMethodBodyForObject(debugId, methodName, methodBody); } - virtual void updateScriptBinding(const QDeclarativeDebugObjectReference& objectReference, - UiScriptBinding* scriptBinding, const QString& propertyName, const QString& scriptCode) +virtual void updateScriptBinding(DebugId debugId, UiScriptBinding* scriptBinding, + const QString& propertyName, const QString& scriptCode) { QVariant expr = scriptCode; const bool isLiteral = isLiteralValue(scriptBinding); if (isLiteral) expr = castToLiteral(scriptCode, scriptBinding); - ClientProxy::instance()->setBindingForObject(objectReference.debugId(), propertyName, expr, isLiteral); + ClientProxy::instance()->setBindingForObject(debugId, propertyName, expr, isLiteral); } virtual void resetBindingForObject(int debugId, const QString &propertyName) @@ -433,7 +439,7 @@ protected: ClientProxy::instance()->destroyQmlObject(debugId); } - virtual void createObject(const QString& qmlText, const QDeclarativeDebugObjectReference& ref, + virtual void createObject(const QString& qmlText, DebugId ref, const QStringList& importList, const QString& filename) { referenceRefreshRequired = true; diff --git a/src/plugins/qmljsinspector/qmljslivetextpreview.h b/src/plugins/qmljsinspector/qmljslivetextpreview.h index 922c2659541..e93e2b8393e 100644 --- a/src/plugins/qmljsinspector/qmljslivetextpreview.h +++ b/src/plugins/qmljsinspector/qmljslivetextpreview.h @@ -82,11 +82,11 @@ public slots: void updateDebugIds(const QDeclarativeDebugObjectReference &rootReference); private: - QList objectReferencesForOffset(quint32 offset) const; + QList objectReferencesForOffset(quint32 offset) const; QVariant castToLiteral(const QString &expression, QmlJS::AST::UiScriptBinding *scriptBinding); private: - QHash > m_debugIds; + QHash > m_debugIds; QHash > m_createdObjects; QmlJS::Document::Ptr m_previousDoc;