QmlDesigner: Use proper canocial ordering for auxiliary data

When saving auxiliary data we haver to use a proper ordering
of the node to generate an index.

Change-Id: I54101c4770eec359de4fdaffbbe37308416a5714
Reviewed-by: Alessandro Portale <alessandro.portale@qt.io>
This commit is contained in:
Thomas Hartmann
2019-01-09 16:47:54 +01:00
parent ebe0f31b1e
commit e8df914ef2
2 changed files with 48 additions and 4 deletions

View File

@@ -171,6 +171,8 @@ public:
QString getRawAuxiliaryData() const;
QString auxiliaryDataAsQML() const;
ModelNode getNodeForCanonicalIndex(int index);
protected: // functions
void importAdded(const Import &import);
void importRemoved(const Import &import);
@@ -186,6 +188,7 @@ protected: // functions
private: //variables
ModelNode nodeAtTextCursorPositionRekursive(const ModelNode &root, int cursorPosition) const;
void setupCanonicalHashes() const;
TextModifier *m_textModifier = nullptr;
int transactionLevel = 0;
@@ -205,6 +208,9 @@ private: //variables
bool m_instantQmlTextUpdate = false;
std::function<void(bool)> m_setWidgetStatusCallback;
bool m_hasIncompleteTypeInformation = false;
mutable QHash<int, ModelNode> m_canonicalIntModelNode;
mutable QHash<ModelNode, int> m_canonicalModelNodeInt;
};
} //QmlDesigner

View File

@@ -53,6 +53,9 @@
#include <utils/changeset.h>
#include <utils/qtcassert.h>
#include <utility>
#include <vector>
using namespace QmlDesigner::Internal;
namespace QmlDesigner {
@@ -476,6 +479,8 @@ QString RewriterView::auxiliaryDataAsQML() const
{
bool hasAuxData = false;
setupCanonicalHashes();
QString str = "Designer {\n ";
int columnCount = 0;
@@ -490,7 +495,8 @@ QString RewriterView::auxiliaryDataAsQML() const
const int startLen = str.length();
str += "D{";
str += "i:";
str += QString::number(node.internalId());
str += QString::number(m_canonicalModelNodeInt.value(node));
str += ";";
QStringList keys = Utils::transform(data.keys(), [](const PropertyName &name) {
@@ -540,6 +546,11 @@ QString RewriterView::auxiliaryDataAsQML() const
return {};
}
ModelNode RewriterView::getNodeForCanonicalIndex(int index)
{
return m_canonicalIntModelNode.value(index);
}
Internal::ModelNodePositionStorage *RewriterView::positionStorage() const
{
return m_positionStorage.data();
@@ -705,6 +716,29 @@ ModelNode RewriterView::nodeAtTextCursorPositionRekursive(const ModelNode &root,
return root;
}
void RewriterView::setupCanonicalHashes() const
{
m_canonicalIntModelNode.clear();
m_canonicalModelNodeInt.clear();
using myPair = std::pair<ModelNode,int>;
std::vector<myPair> data;
for (const ModelNode &node : allModelNodes())
data.emplace_back(std::make_pair(node, nodeOffset(node)));
std::sort(data.begin(), data.end(), [](myPair a, myPair b) {
return a.second < b.second;
});
int i = 0;
for (const myPair &pair : data) {
m_canonicalIntModelNode.insert(i, pair.first);
m_canonicalModelNodeInt.insert(pair.first, i);
++i;
}
}
ModelNode RewriterView::nodeAtTextCursorPosition(int cursorPosition) const
{
return nodeAtTextCursorPositionRekursive(rootModelNode(), cursorPosition);
@@ -996,7 +1030,7 @@ static QString fixUpIllegalChars(const QString &str)
return ret;
}
static void checkNode(const QmlJS::SimpleReaderNode::Ptr &node, RewriterView *view)
void checkNode(const QmlJS::SimpleReaderNode::Ptr &node, RewriterView *view)
{
if (!node)
return;
@@ -1004,8 +1038,10 @@ static void checkNode(const QmlJS::SimpleReaderNode::Ptr &node, RewriterView *vi
if (!node->propertyNames().contains("i"))
return;
const int internalId = node->property("i").toInt();
const ModelNode modelNode = view->modelNodeForInternalId(internalId);
const int index = node->property("i").toInt();
const ModelNode modelNode = view->getNodeForCanonicalIndex(index);
if (!modelNode.isValid())
return;
@@ -1023,6 +1059,8 @@ void RewriterView::restoreAuxiliaryData()
{
QTC_ASSERT(m_textModifier, return);
setupCanonicalHashes();
const QString text = m_textModifier->text();
int startIndex = text.indexOf(annotationsStart());