From 0d3dfdbc39ac9d9c6bbb22f864815fb1813156e9 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Tue, 23 Mar 2010 10:22:29 +0100
Subject: [PATCH] Removed the QML DOM, and changed verification to use the
 QDeclarativeComponent.

---
 .../qmldesigner/core/include/rewriterview.h   |  8 +-
 .../qmldesigner/core/model/rewriterview.cpp   |  9 +++
 .../core/model/texttomodelmerger.cpp          | 76 +++++++++++--------
 .../core/model/texttomodelmerger.h            |  2 -
 4 files changed, 60 insertions(+), 35 deletions(-)

diff --git a/src/plugins/qmldesigner/core/include/rewriterview.h b/src/plugins/qmldesigner/core/include/rewriterview.h
index 570dd1f649b..a365cf3113d 100644
--- a/src/plugins/qmldesigner/core/include/rewriterview.h
+++ b/src/plugins/qmldesigner/core/include/rewriterview.h
@@ -72,13 +72,19 @@ public:
         enum Type {
             NoError = 0,
             InternalError = 1,
-            ParseError = 2
+            ParseError = 2,
+            EngineError = 3
         };
 
     public:
         Error();
         Error(const QDeclarativeError &qmlError);
         Error(Exception *exception);
+        Error(const QUrl &url,
+              const QString &description,
+              int line = -1,
+              int column = -1,
+              Type type = EngineError);
 
         Type type() const
         { return m_type; }
diff --git a/src/plugins/qmldesigner/core/model/rewriterview.cpp b/src/plugins/qmldesigner/core/model/rewriterview.cpp
index afb57334a90..361e459bb3d 100644
--- a/src/plugins/qmldesigner/core/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/core/model/rewriterview.cpp
@@ -71,6 +71,15 @@ RewriterView::Error::Error(const QDeclarativeError &qmlError):
 {
 }
 
+RewriterView::Error::Error(const QUrl &url, const QString &description, int line,
+                           int column, Type type):
+    m_type(type),
+    m_line(line),
+    m_column(column),
+    m_description(description),
+    m_url(url)
+{}
+
 QString RewriterView::Error::toString() const
 {
     QString str;
diff --git a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp
index f81b7c64084..0d5d808277f 100644
--- a/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/core/model/texttomodelmerger.cpp
@@ -41,9 +41,9 @@
 #include <qmljs/qmljsinterpreter.h>
 #include <qmljs/parser/qmljsast_p.h>
 
-#include <QDeclarativeEngine>
-#include <QSet>
-#include <private/qdeclarativedom_p.h>
+#include <QtDeclarative/QDeclarativeComponent>
+#include <QtDeclarative/QDeclarativeEngine>
+#include <QtCore/QSet>
 
 using namespace QmlJS;
 using namespace QmlJS::AST;
@@ -249,43 +249,55 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc,
 
 bool TextToModelMerger::load(const QByteArray &data, DifferenceHandler &differenceHandler)
 {
+    const QUrl url = m_rewriterView->model()->fileUrl();
+    const QStringList importPaths = m_rewriterView->textModifier()->importPaths();
     setActive(true);
 
-    try {
+    { // Have the QML engine check if the document is valid:
         QDeclarativeEngine engine;
-        QDeclarativeDomDocument domDoc;
-        const QUrl url = m_rewriterView->model()->fileUrl();
-        const bool success = domDoc.load(&engine, data, url);
-
-        if (success) {
-            Snapshot snapshot = m_rewriterView->textModifier()->getSnapshot();
-            const QStringList importPaths = m_rewriterView->textModifier()->importPaths();
-            const QString fileName = url.toLocalFile();
-            Document::Ptr doc = Document::create(fileName);
-            doc->setSource(QString::fromUtf8(data.constData()));
-            doc->parseQml();
-            snapshot.insert(doc);
-            ReadingContext ctxt(snapshot, doc, importPaths);
-
-            setupImports(doc, differenceHandler);
-
-            UiObjectMember *astRootNode = 0;
-            if (UiProgram *program = doc->qmlProgram())
-                if (program->members)
-                    astRootNode = program->members->member;
-            ModelNode modelRootNode = m_rewriterView->rootModelNode();
-            syncNode(modelRootNode, astRootNode, &ctxt, differenceHandler);
-            m_rewriterView->positionStorage()->cleanupInvalidOffsets();
-            m_rewriterView->clearErrors();
-        } else {
+        foreach (const QString &importPath, importPaths)
+            engine.addImportPath(importPath);
+        QDeclarativeComponent comp(&engine);
+        comp.setData(data, url);
+        if (comp.status() == QDeclarativeComponent::Error) {
+            QList<RewriterView::Error> errors;
+            foreach (const QDeclarativeError &error, comp.errors())
+                errors.append(RewriterView::Error(error));
+            m_rewriterView->setErrors(errors);
+            setActive(false);
+            return false;
+        } else if (comp.status() == QDeclarativeComponent::Loading) {
+            // Probably loading remote components. Previous DOM behaviour was:
             QList<RewriterView::Error> errors;
-            foreach (const QDeclarativeError &qmlError, domDoc.errors())
-                errors.append(RewriterView::Error(qmlError));
+            errors.append(RewriterView::Error());
             m_rewriterView->setErrors(errors);
+            setActive(false);
+            return false;
         }
+    }
+
+    try {
+        Snapshot snapshot = m_rewriterView->textModifier()->getSnapshot();
+        const QString fileName = url.toLocalFile();
+        Document::Ptr doc = Document::create(fileName);
+        doc->setSource(QString::fromUtf8(data.constData()));
+        doc->parseQml();
+        snapshot.insert(doc);
+        ReadingContext ctxt(snapshot, doc, importPaths);
+
+        setupImports(doc, differenceHandler);
+
+        UiObjectMember *astRootNode = 0;
+        if (UiProgram *program = doc->qmlProgram())
+            if (program->members)
+                astRootNode = program->members->member;
+        ModelNode modelRootNode = m_rewriterView->rootModelNode();
+        syncNode(modelRootNode, astRootNode, &ctxt, differenceHandler);
+        m_rewriterView->positionStorage()->cleanupInvalidOffsets();
+        m_rewriterView->clearErrors();
 
         setActive(false);
-        return success;
+        return true;
     } catch (Exception &e) {
         RewriterView::Error error(&e);
         // Somehow, the error below gets eaten in upper levels, so printing the
diff --git a/src/plugins/qmldesigner/core/model/texttomodelmerger.h b/src/plugins/qmldesigner/core/model/texttomodelmerger.h
index e30fe1a75a5..8933e0866fa 100644
--- a/src/plugins/qmldesigner/core/model/texttomodelmerger.h
+++ b/src/plugins/qmldesigner/core/model/texttomodelmerger.h
@@ -36,8 +36,6 @@
 #include "modelnode.h"
 #include <qmljs/qmljsdocument.h>
 
-#include <private/qdeclarativedom_p.h>
-
 namespace QmlDesigner {
 
 class CORESHARED_EXPORT RewriterView;
-- 
GitLab