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 <miikka.heikkinen@qt.io>
This commit is contained in:
Thomas Hartmann
2021-05-31 16:16:08 +02:00
parent c9860ae2d3
commit 6886142306
2 changed files with 32 additions and 10 deletions

View File

@@ -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<QmlDesigner::Import> generatePossibleLibraryImports(const QHash<QSt
void TextToModelMerger::setupPossibleImports(const QmlJS::Snapshot &snapshot, const QmlJS::ViewerContext &viewContext)
{
QHash<QString, ImportKey> filteredPossibleImportKeys =
filterPossibleImportKeys(snapshot.importDependencies()->libraryImports(viewContext), m_rewriterView->model());
m_possibleImportKeys = snapshot.importDependencies()->libraryImports(viewContext);
QHash<QString, ImportKey> 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;
}

View File

@@ -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<ModelNode> m_setupCustomParserList;
QmlJS::ViewerContext m_vContext;
QSet<QPair<QString, QString> > m_qrcMapping;
QSet<QmlJS::ImportKey> m_possibleImportKeys;
};
class DifferenceHandler