summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorErik Verbruggen <erik.verbruggen@nokia.com>2010-01-20 14:49:17 +0100
committerErik Verbruggen <erik.verbruggen@nokia.com>2010-01-20 14:49:27 +0100
commit76a106c442a5c589f9906e9190b19589000e31e8 (patch)
tree274b9ac9514a6a4a2fad93713b86d4a2e5732342 /src
parentd8188399cf944a945eb549ef0504ea4baed8239a (diff)
downloadqt-creator-76a106c442a5c589f9906e9190b19589000e31e8.tar.gz
Changed rewriting error propagation slightly to suppress the TextToModelMerger from running.
Diffstat (limited to 'src')
-rw-r--r--src/plugins/qmldesigner/core/include/rewriterview.h5
-rw-r--r--src/plugins/qmldesigner/core/model/modeltotextmerger.cpp51
-rw-r--r--src/plugins/qmldesigner/core/model/modeltotextmerger.h2
-rw-r--r--src/plugins/qmldesigner/core/model/rewriterview.cpp32
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 bbc49df2d6..7fa0cbb544 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 41f8c1d6f1..47100d39c2 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 6dca583a90..ad203d6110 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 a4814605d6..eb3dd12e0d 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();