From 8c17e3b3a26fd33ce14c0ae9c0980ce6e3f04c28 Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 8 Sep 2014 12:08:00 +0200 Subject: [PATCH] QmlDesigner: Fix regression for import paths The imports paths used by the sub component manger and meta info system were not correctly resolved. The main reason was that the textDocument in the text modifiers are just plain text buffers and do not containt any url for the document. This patch removes importPaths() from the TextModifier. The ViewerContext can be stored in the TextToModelMerger and does not have to be recreated when needed. Change-Id: I17281caee23ddd51f6e36d5346bc3bd7c53005e8 Reviewed-by: Fawzi Mohamed --- .../designercore/include/componenttextmodifier.h | 2 -- .../designercore/include/plaintexteditmodifier.h | 2 -- .../designercore/include/rewriterview.h | 2 ++ .../designercore/include/textmodifier.h | 1 - .../designercore/model/componenttextmodifier.cpp | 3 --- .../qmldesigner/designercore/model/model.cpp | 9 +++++---- .../designercore/model/plaintexteditmodifier.cpp | 14 -------------- .../designercore/model/rewriterview.cpp | 5 +++++ .../designercore/model/texttomodelmerger.cpp | 13 ++++++------- .../designercore/model/texttomodelmerger.h | 4 ++++ 10 files changed, 22 insertions(+), 33 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h b/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h index b31d6506a3b..6314568fe43 100644 --- a/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/componenttextmodifier.h @@ -58,8 +58,6 @@ public: virtual void deactivateChangeSignals(); virtual void reactivateChangeSignals(); - virtual QStringList importPaths() const; - virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } public slots: diff --git a/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h b/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h index 730722ea1eb..d5b28558e87 100644 --- a/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/plaintexteditmodifier.h @@ -73,8 +73,6 @@ public: virtual void deactivateChangeSignals(); virtual void reactivateChangeSignals(); - virtual QStringList importPaths() const; - virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } protected: diff --git a/src/plugins/qmldesigner/designercore/include/rewriterview.h b/src/plugins/qmldesigner/designercore/include/rewriterview.h index 97217929070..770b2424645 100644 --- a/src/plugins/qmldesigner/designercore/include/rewriterview.h +++ b/src/plugins/qmldesigner/designercore/include/rewriterview.h @@ -203,6 +203,8 @@ public: QString pathForImport(const Import &import); + QStringList importDirectories() const; + signals: void errorsChanged(const QList &errors); diff --git a/src/plugins/qmldesigner/designercore/include/textmodifier.h b/src/plugins/qmldesigner/designercore/include/textmodifier.h index d95405e0477..c9187baf982 100644 --- a/src/plugins/qmldesigner/designercore/include/textmodifier.h +++ b/src/plugins/qmldesigner/designercore/include/textmodifier.h @@ -84,7 +84,6 @@ public: virtual void reactivateChangeSignals() = 0; static QmlJS::Snapshot qmljsSnapshot(); - virtual QStringList importPaths() const = 0; virtual bool renameId(const QString &oldId, const QString &newId) = 0; diff --git a/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp b/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp index d78a03e6f29..1d0b047598a 100644 --- a/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/componenttextmodifier.cpp @@ -128,6 +128,3 @@ void ComponentTextModifier::reactivateChangeSignals() void ComponentTextModifier::contentsChange(int /*position*/, int /*charsRemoved*/, int /*charsAdded*/) { } - -QStringList ComponentTextModifier::importPaths() const -{ return m_originalModifier->importPaths(); } diff --git a/src/plugins/qmldesigner/designercore/model/model.cpp b/src/plugins/qmldesigner/designercore/model/model.cpp index 2fe40bd15e7..94b19ee38a1 100644 --- a/src/plugins/qmldesigner/designercore/model/model.cpp +++ b/src/plugins/qmldesigner/designercore/model/model.cpp @@ -61,6 +61,8 @@ #include "invalididexception.h" #include "textmodifier.h" +#include + /*! \defgroup CoreModel */ @@ -1823,6 +1825,9 @@ QString Model::pathForImport(const Import &import) QStringList Model::importPaths() const { + if (rewriterView()) + return rewriterView()->importDirectories(); + QStringList importPathList; QString documentDirectoryPath = QFileInfo(fileUrl().toLocalFile()).absolutePath(); @@ -1830,10 +1835,6 @@ QStringList Model::importPaths() const if (!documentDirectoryPath.isEmpty()) importPathList.append(documentDirectoryPath); - if (textModifier()) { - importPathList.append(textModifier()->importPaths()); - } - return importPathList; } diff --git a/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp b/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp index 71c22c9d3d5..62354bfe6ed 100644 --- a/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp +++ b/src/plugins/qmldesigner/designercore/model/plaintexteditmodifier.cpp @@ -196,17 +196,3 @@ void PlainTextEditModifier::reactivateChangeSignals() emit textChanged(); } } - -QStringList PlainTextEditModifier::importPaths() const -{ - QmlJS::ModelManagerInterface *modelManager = QmlJS::ModelManagerInterface::instance(); - if (modelManager && textDocument()) { - QString documentFilePath = textDocument()->baseUrl().toLocalFile(); - if (!documentFilePath.isEmpty()) { - QmlJS::Document::Ptr qmljsDocument = modelManager->snapshot().document(documentFilePath); - return modelManager->defaultVContext(QmlJS::Language::Qml, qmljsDocument, true).paths; - } - } - - return QStringList(); -} diff --git a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp index 9711723f85b..7498f0fb25f 100644 --- a/src/plugins/qmldesigner/designercore/model/rewriterview.cpp +++ b/src/plugins/qmldesigner/designercore/model/rewriterview.cpp @@ -745,6 +745,11 @@ QString RewriterView::pathForImport(const Import &import) return QString(); } +QStringList RewriterView::importDirectories() const +{ + return m_textToModelMerger->vContext().paths; +} + void RewriterView::qmlTextChanged() { if (inErrorState()) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index b13e359c93a..dc646979fc1 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -715,7 +715,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, if (!import->fileName.isEmpty()) { const QString strippedFileName = stripQuotes(import->fileName.toString()); const Import newImport = Import::createFileImport(strippedFileName, - version, as, m_rewriterView->textModifier()->importPaths()); + version, as, m_rewriterView->importDirectories()); if (!existingImports.removeOne(newImport)) differenceHandler.modelMissesImport(newImport); @@ -727,7 +727,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, } const Import newImport = - Import::createLibraryImport(importUri, version, as, m_rewriterView->textModifier()->importPaths()); + Import::createLibraryImport(importUri, version, as, m_rewriterView->importDirectories()); if (!existingImports.removeOne(newImport)) differenceHandler.modelMissesImport(newImport); @@ -833,9 +833,8 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH // qDebug() << "TextToModelMerger::load with data:" << data; const QUrl url = m_rewriterView->model()->fileUrl(); - const QStringList importPaths = m_rewriterView->textModifier()->importPaths(); - setActive(true); + setActive(true); try { Snapshot snapshot = m_rewriterView->textModifier()->qmljsSnapshot(); @@ -853,8 +852,8 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH return false; } snapshot.insert(doc); - QmlJS::ViewerContext vContext = QmlJS::ModelManagerInterface::instance()->defaultVContext(Language::Qml, doc, true); - ReadingContext ctxt(snapshot, doc, vContext); + m_vContext = QmlJS::ModelManagerInterface::instance()->defaultVContext(Language::Qml, doc, true); + ReadingContext ctxt(snapshot, doc, m_vContext); m_scopeChain = QSharedPointer( new ScopeChain(ctxt.scopeChain())); m_document = doc; @@ -867,7 +866,7 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH } setupImports(doc, differenceHandler); - setupPossibleImports(snapshot, vContext); + setupPossibleImports(snapshot, m_vContext); if (m_rewriterView->model()->imports().isEmpty()) { const QmlJS::DiagnosticMessage diagnosticMessage(QmlJS::Severity::Error, AST::SourceLocation(0, 0, 0, 0), QCoreApplication::translate("QmlDesigner::TextToModelMerger", "No import statements found")); diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index 833cdc7cfbc..0e98fade2c4 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -72,6 +72,9 @@ public: const QmlJS::Document *document() const { return m_document.data(); } + const QmlJS::ViewerContext &vContext() const + { return m_vContext; } + protected: void setActive(bool active); @@ -145,6 +148,7 @@ private: QTimer m_setupTimer; QSet m_setupComponentList; QSet m_setupCustomParserList; + QmlJS::ViewerContext m_vContext; }; class DifferenceHandler