From 644f98483a9bbf6dfd16af9563523c2a59b23c04 Mon Sep 17 00:00:00 2001
From: Kai Koehne <kai.koehne@nokia.com>
Date: Thu, 10 Jun 2010 11:58:23 +0200
Subject: [PATCH] QmlDesigner: Fix import handling in rewriter

Task-number: BAUHAUS-602
Reviewed-by: Erik Verbruggen
---
 .../filemanager/changeimportsvisitor.cpp      |   2 +-
 .../designercore/model/rewriteaction.cpp      |   2 +-
 .../designercore/model/texttomodelmerger.cpp  |   2 +-
 .../qml/qmldesigner/coretests/testcore.cpp    | 125 ++++++++++++++++++
 .../auto/qml/qmldesigner/coretests/testcore.h |   2 +
 .../auto/qml/qmldesigner/data/fx/imports.qml  |   6 +
 6 files changed, 136 insertions(+), 3 deletions(-)
 create mode 100644 tests/auto/qml/qmldesigner/data/fx/imports.qml

diff --git a/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp b/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp
index c79e115af62..55534d5d9a2 100644
--- a/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp
+++ b/src/plugins/qmldesigner/designercore/filemanager/changeimportsvisitor.cpp
@@ -62,7 +62,7 @@ bool ChangeImportsVisitor::add(QmlJS::AST::UiProgram *ast, const Import &import)
             if (!c.isSpace() && c != QLatin1Char(';'))
                 break;
         }
-        replace(insertionPoint, 0, QLatin1String("\n") + import.toString(false));
+        replace(insertionPoint+1, 0, QLatin1String("\n") + import.toString(false));
     } else {
         replace(0, 0, import.toString(false) + QLatin1String("\n\n"));
     }
diff --git a/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp b/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp
index 6475137688b..1d344887ad5 100644
--- a/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp
+++ b/src/plugins/qmldesigner/designercore/model/rewriteaction.cpp
@@ -369,7 +369,7 @@ QString AddImportRewriteAction::info() const
 bool RemoveImportRewriteAction::execute(QmlDesigner::QmlRefactoring &refactoring,
                                         ModelNodePositionStorage &/*positionStore*/)
 {
-    const bool result = refactoring.addImport(m_import);
+    const bool result = refactoring.removeImport(m_import);
 
     if (!result)
         qDebug() << "*** RemoveImportRewriteAction::execute failed in changeImports ("
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
index 909487cfcc6..6288aabe5f3 100644
--- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
+++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp
@@ -514,7 +514,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc,
                 differenceHandler.modelMissesImport(newImport);
         } else {
             const Import newImport =
-                    Import::createLibraryImport(flatten(import->importUri), as, version);
+                    Import::createLibraryImport(flatten(import->importUri), version, as);
 
             if (!existingImports.removeOne(newImport))
                 differenceHandler.modelMissesImport(newImport);
diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.cpp b/tests/auto/qml/qmldesigner/coretests/testcore.cpp
index b3a36212ce4..8ff2caba1bc 100644
--- a/tests/auto/qml/qmldesigner/coretests/testcore.cpp
+++ b/tests/auto/qml/qmldesigner/coretests/testcore.cpp
@@ -767,6 +767,131 @@ void TestCore::testRewriterActionCompression()
     QCOMPARE(textEdit.toPlainText(), expected);
 }
 
+void TestCore::testRewriterImports()
+{
+    QString fileName = QString(QTCREATORDIR) + "/tests/auto/qml/qmldesigner/data/fx/imports.qml";
+    QFile file(fileName);
+    QVERIFY(file.open(QIODevice::ReadOnly | QIODevice::Text));
+
+    QPlainTextEdit textEdit;
+    textEdit.setPlainText(file.readAll());
+    NotIndentingTextEditModifier modifier(&textEdit);
+
+    QScopedPointer<Model> model(Model::create("Qt/Item"));
+    model->setFileUrl(QUrl::fromLocalFile(fileName));
+
+    QScopedPointer<TestRewriterView> testRewriterView(new TestRewriterView());
+    testRewriterView->setTextModifier(&modifier);
+    model->attachView(testRewriterView.data());
+
+    QVERIFY(testRewriterView->errors().isEmpty());
+
+    QVERIFY(model->imports().size() == 3);
+
+    // import Qt 4.7
+    Import import = model->imports().at(0);
+    QVERIFY(import.isLibraryImport());
+    QCOMPARE(import.url(), QString("Qt"));
+    QVERIFY(import.hasVersion());
+    QCOMPARE(import.version(), QString("4.7"));
+    QVERIFY(!import.hasAlias());
+
+    // import "subitems"
+    import = model->imports().at(1);
+    QVERIFY(import.isFileImport());
+    QCOMPARE(import.file(), QString("subitems"));
+    QVERIFY(!import.hasVersion());
+    QVERIFY(!import.hasAlias());
+
+    // import org.webkit 1.0 as Web
+    import = model->imports().at(2);
+    QVERIFY(import.isLibraryImport());
+    QCOMPARE(import.url(), QString("org.webkit"));
+    QVERIFY(import.hasVersion());
+    QCOMPARE(import.version(), QString("1.0"));
+    QVERIFY(import.hasAlias());
+    QCOMPARE(import.alias(), QString("Web"));
+}
+
+void TestCore::testRewriterChangeImports()
+{
+    const QLatin1String qmlString("\n"
+                                  "import Qt 4.7\n"
+                                  "\n"
+                                  "Rectangle {}\n");
+
+    QPlainTextEdit textEdit;
+    textEdit.setPlainText(qmlString);
+    NotIndentingTextEditModifier modifier(&textEdit);
+
+    QScopedPointer<Model> model(Model::create("Qt/Rectangle"));
+
+    QScopedPointer<TestRewriterView> testRewriterView(new TestRewriterView(0, RewriterView::Amend));
+    testRewriterView->setTextModifier(&modifier);
+    model->attachView(testRewriterView.data());
+
+    QVERIFY(testRewriterView->errors().isEmpty());
+
+    //
+    // Add / Remove an import in the model
+    //
+    Import webkitImport = Import::createLibraryImport("org.webkit", "1.0");
+    model->addImport(webkitImport);
+
+    const QLatin1String qmlWithImport("\n"
+                                 "import Qt 4.7\n"
+                                 "import org.webkit 1.0\n"
+                                 "\n"
+                                 "Rectangle {}\n");
+    QCOMPARE(textEdit.toPlainText(), qmlWithImport);
+
+    model->removeImport(webkitImport);
+
+    QCOMPARE(model->imports().size(), 1);
+    QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7"));
+
+    QCOMPARE(textEdit.toPlainText(), qmlString);
+
+
+    //
+    // Add / Remove an import in the model (with alias)
+    //
+    webkitImport = Import::createLibraryImport("org.webkit", "1.0", "Web");
+    model->addImport(webkitImport);
+
+    const QLatin1String qmlWithAliasImport("\n"
+                                 "import Qt 4.7\n"
+                                 "import org.webkit 1.0 as Web\n"
+                                 "\n"
+                                 "Rectangle {}\n");
+    QCOMPARE(textEdit.toPlainText(), qmlWithAliasImport);
+
+    model->removeImport(webkitImport);
+
+    QCOMPARE(model->imports().size(), 1);
+    QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7"));
+
+    QCOMPARE(textEdit.toPlainText(), qmlString);
+
+
+    //
+    // Add / Remove an import in text
+    //
+    textEdit.setPlainText(qmlWithImport);
+    QCOMPARE(model->imports().size(), 2);
+    QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7"));
+    QCOMPARE(model->imports().last(), Import::createLibraryImport("org.webkit", "1.0"));
+
+    textEdit.setPlainText(qmlWithAliasImport);
+    QCOMPARE(model->imports().size(), 2);
+    QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7"));
+    QCOMPARE(model->imports().last(), Import::createLibraryImport("org.webkit", "1.0", "Web"));
+
+    textEdit.setPlainText(qmlString);
+    QCOMPARE(model->imports().size(), 1);
+    QCOMPARE(model->imports().first(), Import::createLibraryImport("Qt", "4.7"));
+}
+
 void TestCore::testRewriterForGradientMagic()
 {
     const QLatin1String qmlString("\n"
diff --git a/tests/auto/qml/qmldesigner/coretests/testcore.h b/tests/auto/qml/qmldesigner/coretests/testcore.h
index 685a1e6a729..3f29d22be15 100644
--- a/tests/auto/qml/qmldesigner/coretests/testcore.h
+++ b/tests/auto/qml/qmldesigner/coretests/testcore.h
@@ -129,6 +129,8 @@ private slots:
     void testRewriterGroupedProperties();
     void testRewriterPreserveOrder();
     void testRewriterActionCompression();
+    void testRewriterImports();
+    void testRewriterChangeImports();
 
     //
     // unit tests QmlModelNodeFacade/QmlModelState
diff --git a/tests/auto/qml/qmldesigner/data/fx/imports.qml b/tests/auto/qml/qmldesigner/data/fx/imports.qml
new file mode 100644
index 00000000000..0c528046e0f
--- /dev/null
+++ b/tests/auto/qml/qmldesigner/data/fx/imports.qml
@@ -0,0 +1,6 @@
+import Qt 4.7
+import "subitems"
+import org.webkit 1.0 as Web
+
+Rectangle {
+}
-- 
GitLab