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 <fawzi.mohamed@digia.com>
This commit is contained in:
Thomas Hartmann
2014-09-08 12:08:00 +02:00
parent b66155cf17
commit 8c17e3b3a2
10 changed files with 22 additions and 33 deletions

View File

@@ -58,8 +58,6 @@ public:
virtual void deactivateChangeSignals(); virtual void deactivateChangeSignals();
virtual void reactivateChangeSignals(); virtual void reactivateChangeSignals();
virtual QStringList importPaths() const;
virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; }
public slots: public slots:

View File

@@ -73,8 +73,6 @@ public:
virtual void deactivateChangeSignals(); virtual void deactivateChangeSignals();
virtual void reactivateChangeSignals(); virtual void reactivateChangeSignals();
virtual QStringList importPaths() const;
virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; } virtual bool renameId(const QString & /* oldId */, const QString & /* newId */) { return false; }
protected: protected:

View File

@@ -203,6 +203,8 @@ public:
QString pathForImport(const Import &import); QString pathForImport(const Import &import);
QStringList importDirectories() const;
signals: signals:
void errorsChanged(const QList<RewriterView::Error> &errors); void errorsChanged(const QList<RewriterView::Error> &errors);

View File

@@ -84,7 +84,6 @@ public:
virtual void reactivateChangeSignals() = 0; virtual void reactivateChangeSignals() = 0;
static QmlJS::Snapshot qmljsSnapshot(); static QmlJS::Snapshot qmljsSnapshot();
virtual QStringList importPaths() const = 0;
virtual bool renameId(const QString &oldId, const QString &newId) = 0; virtual bool renameId(const QString &oldId, const QString &newId) = 0;

View File

@@ -128,6 +128,3 @@ void ComponentTextModifier::reactivateChangeSignals()
void ComponentTextModifier::contentsChange(int /*position*/, int /*charsRemoved*/, int /*charsAdded*/) void ComponentTextModifier::contentsChange(int /*position*/, int /*charsRemoved*/, int /*charsAdded*/)
{ {
} }
QStringList ComponentTextModifier::importPaths() const
{ return m_originalModifier->importPaths(); }

View File

@@ -61,6 +61,8 @@
#include "invalididexception.h" #include "invalididexception.h"
#include "textmodifier.h" #include "textmodifier.h"
#include <qmljs/qmljsmodelmanagerinterface.h>
/*! /*!
\defgroup CoreModel \defgroup CoreModel
*/ */
@@ -1823,6 +1825,9 @@ QString Model::pathForImport(const Import &import)
QStringList Model::importPaths() const QStringList Model::importPaths() const
{ {
if (rewriterView())
return rewriterView()->importDirectories();
QStringList importPathList; QStringList importPathList;
QString documentDirectoryPath = QFileInfo(fileUrl().toLocalFile()).absolutePath(); QString documentDirectoryPath = QFileInfo(fileUrl().toLocalFile()).absolutePath();
@@ -1830,10 +1835,6 @@ QStringList Model::importPaths() const
if (!documentDirectoryPath.isEmpty()) if (!documentDirectoryPath.isEmpty())
importPathList.append(documentDirectoryPath); importPathList.append(documentDirectoryPath);
if (textModifier()) {
importPathList.append(textModifier()->importPaths());
}
return importPathList; return importPathList;
} }

View File

@@ -196,17 +196,3 @@ void PlainTextEditModifier::reactivateChangeSignals()
emit textChanged(); 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();
}

View File

@@ -745,6 +745,11 @@ QString RewriterView::pathForImport(const Import &import)
return QString(); return QString();
} }
QStringList RewriterView::importDirectories() const
{
return m_textToModelMerger->vContext().paths;
}
void RewriterView::qmlTextChanged() void RewriterView::qmlTextChanged()
{ {
if (inErrorState()) if (inErrorState())

View File

@@ -715,7 +715,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc,
if (!import->fileName.isEmpty()) { if (!import->fileName.isEmpty()) {
const QString strippedFileName = stripQuotes(import->fileName.toString()); const QString strippedFileName = stripQuotes(import->fileName.toString());
const Import newImport = Import::createFileImport(strippedFileName, const Import newImport = Import::createFileImport(strippedFileName,
version, as, m_rewriterView->textModifier()->importPaths()); version, as, m_rewriterView->importDirectories());
if (!existingImports.removeOne(newImport)) if (!existingImports.removeOne(newImport))
differenceHandler.modelMissesImport(newImport); differenceHandler.modelMissesImport(newImport);
@@ -727,7 +727,7 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc,
} }
const Import newImport = const Import newImport =
Import::createLibraryImport(importUri, version, as, m_rewriterView->textModifier()->importPaths()); Import::createLibraryImport(importUri, version, as, m_rewriterView->importDirectories());
if (!existingImports.removeOne(newImport)) if (!existingImports.removeOne(newImport))
differenceHandler.modelMissesImport(newImport); differenceHandler.modelMissesImport(newImport);
@@ -833,9 +833,8 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
// qDebug() << "TextToModelMerger::load with data:" << data; // qDebug() << "TextToModelMerger::load with data:" << data;
const QUrl url = m_rewriterView->model()->fileUrl(); const QUrl url = m_rewriterView->model()->fileUrl();
const QStringList importPaths = m_rewriterView->textModifier()->importPaths();
setActive(true);
setActive(true);
try { try {
Snapshot snapshot = m_rewriterView->textModifier()->qmljsSnapshot(); Snapshot snapshot = m_rewriterView->textModifier()->qmljsSnapshot();
@@ -853,8 +852,8 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
return false; return false;
} }
snapshot.insert(doc); snapshot.insert(doc);
QmlJS::ViewerContext vContext = QmlJS::ModelManagerInterface::instance()->defaultVContext(Language::Qml, doc, true); m_vContext = QmlJS::ModelManagerInterface::instance()->defaultVContext(Language::Qml, doc, true);
ReadingContext ctxt(snapshot, doc, vContext); ReadingContext ctxt(snapshot, doc, m_vContext);
m_scopeChain = QSharedPointer<const ScopeChain>( m_scopeChain = QSharedPointer<const ScopeChain>(
new ScopeChain(ctxt.scopeChain())); new ScopeChain(ctxt.scopeChain()));
m_document = doc; m_document = doc;
@@ -867,7 +866,7 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH
} }
setupImports(doc, differenceHandler); setupImports(doc, differenceHandler);
setupPossibleImports(snapshot, vContext); setupPossibleImports(snapshot, m_vContext);
if (m_rewriterView->model()->imports().isEmpty()) { 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")); const QmlJS::DiagnosticMessage diagnosticMessage(QmlJS::Severity::Error, AST::SourceLocation(0, 0, 0, 0), QCoreApplication::translate("QmlDesigner::TextToModelMerger", "No import statements found"));

View File

@@ -72,6 +72,9 @@ public:
const QmlJS::Document *document() const const QmlJS::Document *document() const
{ return m_document.data(); } { return m_document.data(); }
const QmlJS::ViewerContext &vContext() const
{ return m_vContext; }
protected: protected:
void setActive(bool active); void setActive(bool active);
@@ -145,6 +148,7 @@ private:
QTimer m_setupTimer; QTimer m_setupTimer;
QSet<ModelNode> m_setupComponentList; QSet<ModelNode> m_setupComponentList;
QSet<ModelNode> m_setupCustomParserList; QSet<ModelNode> m_setupCustomParserList;
QmlJS::ViewerContext m_vContext;
}; };
class DifferenceHandler class DifferenceHandler