Changed import reading to use the DifferenceHandler.

This commit is contained in:
Erik Verbruggen
2010-02-01 12:25:35 +01:00
parent 2e0fa4fc84
commit 7d79f4f87a
3 changed files with 58 additions and 12 deletions

View File

@@ -57,7 +57,13 @@ class ModelToTextMerger
public: public:
ModelToTextMerger(RewriterView *reWriterView); ModelToTextMerger(RewriterView *reWriterView);
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.
/**
* 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();
void nodeCreated(const ModelNode &createdNode); void nodeCreated(const ModelNode &createdNode);
void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange); void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange);

View File

@@ -68,20 +68,33 @@ bool TextToModelMerger::isActive() const
return m_isActive; return m_isActive;
} }
void TextToModelMerger::setupImports(QmlDomDocument &doc) void TextToModelMerger::setupImports(QmlDomDocument &doc,
DifferenceHandler &differenceHandler)
{ {
foreach (const Import &import, m_rewriterView->model()->imports()) QSet<Import> existingImports = m_rewriterView->model()->imports();
m_rewriterView->model()->removeImport(import);
foreach (const QmlDomImport &qmlImport, doc.imports()) { foreach (const QmlDomImport &qmlImport, doc.imports()) {
if (qmlImport.type() == QmlDomImport::Library) { if (qmlImport.type() == QmlDomImport::Library) {
Import import(Import::createLibraryImport(QUrl(qmlImport.uri()), qmlImport.version(), qmlImport.qualifier())); Import import(Import::createLibraryImport(QUrl(qmlImport.uri()),
m_rewriterView->model()->addImport(import); qmlImport.version(),
} qmlImport.qualifier()));
if (qmlImport.type() == QmlDomImport::File) {
Import import(Import:: createFileImport(qmlImport.uri(), qmlImport.version(), qmlImport.qualifier())); if (!existingImports.remove(import))
m_rewriterView->model()->addImport(import); differenceHandler.modelMissesImport(m_rewriterView->model(),
import);
} else if (qmlImport.type() == QmlDomImport::File) {
Import import(Import:: createFileImport(qmlImport.uri(),
qmlImport.version(),
qmlImport.qualifier()));
if (!existingImports.remove(import))
differenceHandler.modelMissesImport(m_rewriterView->model(),
import);
} }
} }
foreach (const Import &import, existingImports)
differenceHandler.importAbsentInQMl(m_rewriterView->model(), import);
} }
bool TextToModelMerger::load(const QByteArray &data, DifferenceHandler &differenceHandler) bool TextToModelMerger::load(const QByteArray &data, DifferenceHandler &differenceHandler)
@@ -95,7 +108,7 @@ bool TextToModelMerger::load(const QByteArray &data, DifferenceHandler &differen
const bool success = doc.load(&engine, data, url); const bool success = doc.load(&engine, data, url);
if (success) { if (success) {
setupImports(doc); setupImports(doc, differenceHandler);
const QmlDomObject rootDomObject = doc.rootObject(); const QmlDomObject rootDomObject = doc.rootObject();
ModelNode modelRootNode = m_rewriterView->rootModelNode(); ModelNode modelRootNode = m_rewriterView->rootModelNode();
@@ -370,6 +383,16 @@ QVariant TextToModelMerger::convertToVariant(const ModelNode &node, const QmlDom
} }
} }
void ModelValidator::modelMissesImport(Model *model, const Import &import)
{
Q_ASSERT(model->imports().contains(import));
}
void ModelValidator::importAbsentInQMl(Model *model, const Import &import)
{
Q_ASSERT(! model->imports().contains(import));
}
void ModelValidator::bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding) void ModelValidator::bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding)
{ {
Q_ASSERT(modelProperty.expression() == qmlBinding); Q_ASSERT(modelProperty.expression() == qmlBinding);
@@ -443,6 +466,16 @@ void ModelValidator::idsDiffer(ModelNode &modelNode, const QString &qmlId)
Q_ASSERT(0); Q_ASSERT(0);
} }
void ModelAmender::modelMissesImport(Model *model, const Import &import)
{
model->addImport(import);
}
void ModelAmender::importAbsentInQMl(Model *model, const Import &import)
{
model->removeImport(import);
}
void ModelAmender::bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding) void ModelAmender::bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding)
{ {
modelProperty.toBindingProperty().setExpression(qmlBinding); modelProperty.toBindingProperty().setExpression(qmlBinding);

View File

@@ -31,6 +31,7 @@
#define TEXTTOMODELMERGER_H #define TEXTTOMODELMERGER_H
#include "corelib_global.h" #include "corelib_global.h"
#include "import.h"
#include "nodelistproperty.h" #include "nodelistproperty.h"
#include "modelnode.h" #include "modelnode.h"
@@ -53,7 +54,7 @@ public:
TextToModelMerger(RewriterView *reWriterView); TextToModelMerger(RewriterView *reWriterView);
bool isActive() const; bool isActive() const;
void setupImports(QmlDomDocument &doc); void setupImports(QmlDomDocument &doc, DifferenceHandler &differenceHandler);
bool load(const QByteArray &data, DifferenceHandler &differenceHandler); bool load(const QByteArray &data, DifferenceHandler &differenceHandler);
protected: protected:
@@ -95,6 +96,8 @@ public:
virtual ~DifferenceHandler() virtual ~DifferenceHandler()
{} {}
virtual void modelMissesImport(Model *model, const Import &import) = 0;
virtual void importAbsentInQMl(Model *model, const Import &import) = 0;
virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding) = 0; virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding) = 0;
virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &qmlBinding) = 0; virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &qmlBinding) = 0;
virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QmlDomList &domList) = 0; virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QmlDomList &domList) = 0;
@@ -120,6 +123,8 @@ public:
~ModelValidator() ~ModelValidator()
{} {}
virtual void modelMissesImport(Model *model, const Import &import);
virtual void importAbsentInQMl(Model *model, const Import &import);
virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding); virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding);
virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &qmlBinding); virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &qmlBinding);
virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QmlDomList &domList); virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QmlDomList &domList);
@@ -142,6 +147,8 @@ public:
~ModelAmender() ~ModelAmender()
{} {}
virtual void modelMissesImport(Model *model, const Import &import);
virtual void importAbsentInQMl(Model *model, const Import &import);
virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding); virtual void bindingExpressionsDiffer(BindingProperty &modelProperty, const QString &qmlBinding);
virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &qmlBinding); virtual void shouldBeBindingProperty(AbstractProperty &modelProperty, const QString &qmlBinding);
virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QmlDomList &domList); virtual void shouldBeNodeListProperty(AbstractProperty &modelProperty, const QmlDomList &domList);