diff options
author | Thomas Hartmann <Thomas.Hartmann@digia.com> | 2013-11-21 14:43:39 +0100 |
---|---|---|
committer | Thomas Hartmann <Thomas.Hartmann@digia.com> | 2013-11-21 15:26:35 +0100 |
commit | 14659c09871a9edc0e755777f568549d6709d370 (patch) | |
tree | 05f18a19eeb80a9783eaf18fb4527337c2dcfefd /src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp | |
parent | f10dfe8679536ec978b88b870bad6282c77d638d (diff) | |
download | qt-creator-14659c09871a9edc0e755777f568549d6709d370.tar.gz |
QmlDesigner: Get imports from the code model
Change-Id: I96928025aede350bf4ff084555f612568d9389d8
Reviewed-by: Fawzi Mohamed <fawzi.mohamed@digia.com>
Diffstat (limited to 'src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp')
-rw-r--r-- | src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index e37d271160..7b0b170d23 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -48,6 +48,7 @@ #include <qmljs/qmljsutils.h> #include <qmljs/qmljsmodelmanagerinterface.h> #include <qmljs/qmljsqrcparser.h> +#include <qmljs/qmljsinterpreter.h> #include <utils/qtcassert.h> @@ -726,6 +727,67 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, differenceHandler.importAbsentInQMl(import); } +void TextToModelMerger::setupPossibleImports(const QmlJS::Snapshot &snapshot, const QmlJS::ViewerContext &viewContext) +{ + QList<Import> possibleImports; + + QSet<ImportKey> possibleImportKeys = snapshot.importDependencies()->libraryImports(viewContext); + + QHash<QString, ImportKey> filteredPossibleImportKeys; + foreach (const ImportKey &importKey, possibleImportKeys) { + if (!filteredPossibleImportKeys.contains(importKey.path()) + || filteredPossibleImportKeys.value(importKey.path()).majorVersion < importKey.majorVersion + || (filteredPossibleImportKeys.value(importKey.path()).majorVersion == importKey.majorVersion + && filteredPossibleImportKeys.value(importKey.path()).minorVersion < importKey.minorVersion)) + filteredPossibleImportKeys.insert(importKey.path(), importKey); + } + + filteredPossibleImportKeys.remove(QLatin1String("<cpp>")); + filteredPossibleImportKeys.remove(QLatin1String("QML")); + filteredPossibleImportKeys.remove(QLatin1String("QtQml")); + filteredPossibleImportKeys.remove(QLatin1String("QtQuick/PrivateWidgets")); + + QList<QmlJS::Import> allImports = m_scopeChain->context()->imports(m_document.data())->all(); + + foreach (const QmlJS::Import &import, allImports) { + filteredPossibleImportKeys.remove(import.info.path()); + } + + foreach (const ImportKey &importKey, filteredPossibleImportKeys) { + QString libraryName = importKey.splitPath.join(QLatin1Char('.')); + QString version = QString(QStringLiteral("%1.%2").arg(importKey.majorVersion).arg(importKey.minorVersion)); + possibleImports.append(Import::createLibraryImport(libraryName, version)); + } + + if ( m_rewriterView->isAttached()) + m_rewriterView->model()->setPossibleImports(possibleImports); +} + +void TextToModelMerger::setupUsedImports() +{ + QList<QmlJS::Import> allImports = m_scopeChain->context()->imports(m_document.data())->all(); + + QList<Import> usedImports; + + foreach (const QmlJS::Import &import, allImports) { + if (import.used) { + if (import.info.type() == ImportType::Library) { + usedImports.append(Import::createLibraryImport(import.info.name(), import.info.version().toString(), import.info.as())); + } else if (import.info.type() == ImportType::Directory || import.info.type() == ImportType::File) { + usedImports.append(Import::createFileImport(import.info.name(), import.info.version().toString(), import.info.as())); + } + } + } + // even if not explicitly used we probably want to keep QtQuick imports + usedImports.append(Import::createLibraryImport("QtQuick", "1.0")); + usedImports.append(Import::createLibraryImport("QtQuick", "1.1")); + usedImports.append(Import::createLibraryImport("QtQuick", "2.0")); + usedImports.append(Import::createLibraryImport("QtQuick", "2.1")); + + if (m_rewriterView->isAttached()) + m_rewriterView->model()->setUsedImports(usedImports); +} + bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceHandler) { // qDebug() << "TextToModelMerger::load with data:" << data; @@ -768,6 +830,8 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH } setupImports(doc, differenceHandler); + setupPossibleImports(snapshot, vContext); + setupUsedImports(); 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")); |