From 6886142306b45abb39193774afe8b1abe9b5140e Mon Sep 17 00:00:00 2001 From: Thomas Hartmann Date: Mon, 31 May 2021 16:16:08 +0200 Subject: [PATCH] QmlDesigner: Get version from possible imports If the version is missing in the import, then get the highest possible version. * Collect possible imports before the setup of imports * Do not skip all QtQuick.* imports. Task-number: QDS-4403 Change-Id: I676a1f698c39c28e447ab66f81a6edd32fb78651 Reviewed-by: Miikka Heikkinen --- .../designercore/model/texttomodelmerger.cpp | 39 ++++++++++++++----- .../designercore/model/texttomodelmerger.h | 3 ++ 2 files changed, 32 insertions(+), 10 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 21b47c312bf..e021f8bd754 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -812,9 +812,11 @@ void TextToModelMerger::setupImports(const Document::Ptr &doc, } else { QString importUri = toString(import->importUri); if (version.isEmpty()) - version = "2.15"; - const Import newImport = - Import::createLibraryImport(importUri, version, as, m_rewriterView->importDirectories()); + version = getHighestPossibleImport(importUri); + const Import newImport = Import::createLibraryImport(importUri, + version, + as, + m_rewriterView->importDirectories()); if (!existingImports.removeOne(newImport)) differenceHandler.modelMissesImport(newImport); @@ -869,8 +871,6 @@ static bool isBlacklistImport(const ImportKey &importKey, Model *model) || importKey.libraryQualifiedPath() == QStringLiteral("QtBluetooth") || importKey.libraryQualifiedPath() == QStringLiteral("Enginio") - // Don't show Quick X.X imports - || (importKey.splitPath.count() == 1 && importPathFirst == QStringLiteral("QtQuick")) || filterByMetaInfo(importKey, model); } @@ -932,8 +932,9 @@ static QList generatePossibleLibraryImports(const QHash filteredPossibleImportKeys = - filterPossibleImportKeys(snapshot.importDependencies()->libraryImports(viewContext), m_rewriterView->model()); + m_possibleImportKeys = snapshot.importDependencies()->libraryImports(viewContext); + QHash filteredPossibleImportKeys + = filterPossibleImportKeys(m_possibleImportKeys, m_rewriterView->model()); const QmlJS::Imports *imports = m_scopeChain->context()->imports(m_document.data()); if (imports) @@ -968,8 +969,10 @@ void TextToModelMerger::setupUsedImports() for (const QmlJS::Import &import : allImports) { QString version = import.info.version().toString(); - if (version.isEmpty()) - version = "2.15"; + + if (!import.info.version().isValid()) + version = getHighestPossibleImport(import.info.name()); + if (!import.info.name().isEmpty() && usedImportsSet.contains(import.info.name())) { if (import.info.type() == ImportType::Library) usedImports.append( @@ -1062,8 +1065,8 @@ bool TextToModelMerger::load(const QString &data, DifferenceHandler &differenceH qCInfo(rewriterBenchmark) << "linked:" << time.elapsed(); collectLinkErrors(&errors, ctxt); - setupImports(m_document, differenceHandler); setupPossibleImports(snapshot, m_vContext); + setupImports(m_document, differenceHandler); qCInfo(rewriterBenchmark) << "imports setup:" << time.elapsed(); @@ -2266,3 +2269,19 @@ QString TextToModelMerger::textAt(const Document::Ptr &doc, { return doc->source().mid(from.offset, to.end() - from.begin()); } + +QString TextToModelMerger::getHighestPossibleImport(const QString &importName) const +{ + QString version = "2.15"; + int maj = -1; + const auto imports = m_possibleImportKeys.values(); + for (const ImportKey &import : imports) { + if (importName == import.libraryQualifiedPath()) { + if (import.majorVersion > maj) { + version = QString("%1.%2").arg(import.majorVersion).arg(import.minorVersion); + maj = import.majorVersion; + } + } + } + return version; +} diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index 71856eff320..0390fc2a946 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -153,6 +153,8 @@ private: const QmlJS::SourceLocation &from, const QmlJS::SourceLocation &to); + QString getHighestPossibleImport(const QString &importName) const; + private: RewriterView *m_rewriterView; bool m_isActive; @@ -163,6 +165,7 @@ private: QSet m_setupCustomParserList; QmlJS::ViewerContext m_vContext; QSet > m_qrcMapping; + QSet m_possibleImportKeys; }; class DifferenceHandler