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