From 76a106c442a5c589f9906e9190b19589000e31e8 Mon Sep 17 00:00:00 2001
From: Erik Verbruggen <erik.verbruggen@nokia.com>
Date: Wed, 20 Jan 2010 14:49:17 +0100
Subject: [PATCH] Changed rewriting error propagation slightly to suppress the
 TextToModelMerger from running.

---
 .../qmldesigner/core/include/rewriterview.h   |  5 +-
 .../core/model/modeltotextmerger.cpp          | 51 +++++++++++--------
 .../core/model/modeltotextmerger.h            |  2 +-
 .../qmldesigner/core/model/rewriterview.cpp   | 32 +++++++-----
 4 files changed, 52 insertions(+), 38 deletions(-)

diff --git a/src/plugins/qmldesigner/core/include/rewriterview.h b/src/plugins/qmldesigner/core/include/rewriterview.h
index bbc49df2d6f..7fa0cbb5446 100644
--- a/src/plugins/qmldesigner/core/include/rewriterview.h
+++ b/src/plugins/qmldesigner/core/include/rewriterview.h
@@ -140,6 +140,9 @@ public:
     void setErrors(const QList<Error> &errors);
     void addError(const Error &error);
 
+    void enterErrorState(const QString &errorMessage);
+    bool inErrorState() const { return !m_rewritingErrorMessage.isEmpty(); }
+    void leaveErrorState() { m_rewritingErrorMessage = QString::null; }
     void resetToLastCorrectQml();
 
     QMap<ModelNode, QString> extractText(const QList<ModelNode> &nodes) const;
@@ -173,7 +176,7 @@ private: //variables
     QList<Error> m_errors;
     int transactionLevel;
     RewriterTransaction m_removeDefaultPropertyTransaction;
-    bool errorState;
+    QString m_rewritingErrorMessage;
     QString lastCorrectQmlSource;
 };
 
diff --git a/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp
index 41f8c1d6f10..47100d39c29 100644
--- a/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp
+++ b/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp
@@ -191,10 +191,10 @@ RewriterView *ModelToTextMerger::view()
     return m_rewriterView;
 }
 
-bool ModelToTextMerger::applyChanges()
+void ModelToTextMerger::applyChanges()
 {
     if (m_rewriteActions.isEmpty())
-        return true;
+        return;
 
     dumpRewriteActions(QLatin1String("Before compression"));
     RewriteActionCompressor compress(getPropertyOrder());
@@ -202,20 +202,24 @@ bool ModelToTextMerger::applyChanges()
     dumpRewriteActions(QLatin1String("After compression"));
 
     if (m_rewriteActions.isEmpty())
-        return true;
+        return;
 
     Document::Ptr tmpDocument(Document::create(QLatin1String("<ModelToTextMerger>")));
     tmpDocument->setSource(m_rewriterView->textModifier()->text());
     if (!tmpDocument->parseQml()) {
         qDebug() << "*** Possible problem: QML file wasn't parsed correctly.";
         qDebug() << "*** QML text:" << m_rewriterView->textModifier()->text();
-        return false;
+
+        QString errorMessage = QLatin1String("Error while rewriting");
+        if (!tmpDocument->diagnosticMessages().isEmpty())
+            errorMessage = tmpDocument->diagnosticMessages().first().message;
+
+        m_rewriterView->enterErrorState(errorMessage);
+        return;
     }
 
     TextModifier *textModifier = m_rewriterView->textModifier();
 
-    bool success = true;
-
     try {
         ModelNodePositionRecalculator positionRecalculator(m_rewriterView->positionStorage(), m_rewriterView->positionStorage()->modelNodes());
         positionRecalculator.connectTo(textModifier);
@@ -226,28 +230,33 @@ bool ModelToTextMerger::applyChanges()
         textModifier->startGroup();
 
         for (int i = 0; i < m_rewriteActions.size(); ++i) {
-            if (i != 0) {
-                textModifier->flushGroup();
-                success = refactoring.reparseDocument();
-            }
-
             RewriteAction* action = m_rewriteActions.at(i);
             if (DebugRewriteActions) {
                 qDebug() << "Next rewrite action:" << qPrintable(action->info());
             }
 
             ModelNodePositionStorage *positionStore = m_rewriterView->positionStorage();
-            if (success)
-                success = action->execute(refactoring, *positionStore);
+            bool success = action->execute(refactoring, *positionStore);
+
+            if (success) {
+                textModifier->flushGroup();
+                success = refactoring.reparseDocument();
+            }
+            // don't merge these two if statements, because the previous then-part changes the value
+            // of "success" !
+            if (!success) {
+                m_rewriterView->enterErrorState(QLatin1String("Error rewriting document"));
 
-            if (!success /*&& DebugRewriteActions*/) {
-                qDebug() << "*** QML source code: ***";
-                qDebug() << qPrintable(textModifier->text());
-                qDebug() << "*** End of QML source code. ***";
+                if (true || DebugRewriteActions) {
+                    qDebug() << "*** QML source code: ***";
+                    qDebug() << qPrintable(textModifier->text());
+                    qDebug() << "*** End of QML source code. ***";
+                }
 
                 break;
             }
         }
+
         qDeleteAll(m_rewriteActions);
         m_rewriteActions.clear();
 
@@ -256,16 +265,14 @@ bool ModelToTextMerger::applyChanges()
         reindent(positionRecalculator.dirtyAreas());
 
         textModifier->reactivateChangeSignals();
-    } catch (...) {
+    } catch (Exception &e) {
+        m_rewriterView->enterErrorState(e.description());
+
         qDeleteAll(m_rewriteActions);
         m_rewriteActions.clear();
         textModifier->commitGroup();
         textModifier->reactivateChangeSignals();
-
-        throw;
     }
-
-    return success;
 }
 
 void ModelToTextMerger::reindent(const QMap<int, int> &/*dirtyAreas*/) const
diff --git a/src/plugins/qmldesigner/core/model/modeltotextmerger.h b/src/plugins/qmldesigner/core/model/modeltotextmerger.h
index 6dca583a908..ad203d61104 100644
--- a/src/plugins/qmldesigner/core/model/modeltotextmerger.h
+++ b/src/plugins/qmldesigner/core/model/modeltotextmerger.h
@@ -57,7 +57,7 @@ class ModelToTextMerger
 
 public:
     ModelToTextMerger(RewriterView *reWriterView);
-    bool applyChanges(); // Note: his method might throw exceptions, as the model works this way. So to handle rewriting failures, you will also need to catch any exception coming out.
+    void applyChanges(); // Note: his method might throw exceptions, as the model works this way. So to handle rewriting failures, you will also need to catch any exception coming out.
 
     void nodeCreated(const ModelNode &createdNode);
     void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange);
diff --git a/src/plugins/qmldesigner/core/model/rewriterview.cpp b/src/plugins/qmldesigner/core/model/rewriterview.cpp
index a4814605d61..eb3dd12e0d1 100644
--- a/src/plugins/qmldesigner/core/model/rewriterview.cpp
+++ b/src/plugins/qmldesigner/core/model/rewriterview.cpp
@@ -115,8 +115,7 @@ RewriterView::RewriterView(DifferenceHandling differenceHandling, QObject *paren
         m_modelToTextMerger(new Internal::ModelToTextMerger(this)),
         m_textToModelMerger(new Internal::TextToModelMerger(this)),
         m_textModifier(0),
-        transactionLevel(0),
-        errorState(false)
+        transactionLevel(0)
 {
 }
 
@@ -393,23 +392,19 @@ void RewriterView::setupComponent(const ModelNode &node)
 
 void RewriterView::applyChanges()
 {
-    if (errorState) {
+    if (inErrorState()) {
         qDebug() << "RewriterView::applyChanges() got called while in error state. Will do a quick-exit now.";
         throw RewritingException(__LINE__, __FUNCTION__, __FILE__, "RewriterView::applyChanges() already in error state");
     }
 
-    bool success = false;
     try {
-        success = modelToTextMerger()->applyChanges();
-
-        if (!success) {
-            errorState = true;
-
-            throw RewritingException(__LINE__, __FUNCTION__, __FILE__, errors().first().description());
-        }
+        modelToTextMerger()->applyChanges();
     } catch (Exception &e) {
-        errorState = true;
-        throw RewritingException(__LINE__, __FUNCTION__, __FILE__, e.description());
+        enterErrorState(e.description());
+    }
+
+    if (inErrorState()) {
+        throw RewritingException(__LINE__, __FUNCTION__, __FILE__, m_rewritingErrorMessage);
     }
 }
 
@@ -436,11 +431,17 @@ void RewriterView::addError(const RewriterView::Error &error)
     emit errorsChanged(m_errors);
 }
 
+void RewriterView::enterErrorState(const QString &errorMessage)
+{
+    m_rewritingErrorMessage = errorMessage;
+}
+
 void RewriterView::resetToLastCorrectQml()
 {
     ModelAmender differenceHandler(m_textToModelMerger.data());
     m_textToModelMerger->load(lastCorrectQmlSource.toUtf8(), differenceHandler);
-    errorState = false;
+
+    leaveErrorState();
 }
 
 QMap<ModelNode, QString> RewriterView::extractText(const QList<ModelNode> &nodes) const
@@ -487,6 +488,9 @@ int RewriterView::firstDefinitionInsideLength(const ModelNode &node) const
 
 void RewriterView::qmlTextChanged()
 {
+    if (inErrorState())
+        return;
+
     if (m_textToModelMerger && m_textModifier) {
         const QString newQmlText = m_textModifier->text();
 
-- 
GitLab