From 392c466b20a449772257e15916c91a0de38f8e11 Mon Sep 17 00:00:00 2001 From: Mahmoud Badri Date: Wed, 31 Mar 2021 18:47:14 +0300 Subject: [PATCH] QmlDesigner: Fix used imports not working correctly The existing logic (in qmljsinterpreter.cpp) for updating used imports doesn't work correctly. It takes into consideration items that are not part of the currently open document. Fixed by checking current model items in the document and updating used imports based on it. Fixes: QDS-3785 Change-Id: Ia50c3c7e7ca41b9bca0d69e7c2e253f29892933e Reviewed-by: Thomas Hartmann --- .../itemlibrary/itemlibrarymodel.cpp | 2 ++ .../designercore/model/texttomodelmerger.cpp | 18 +++++++++++++----- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp index 6c395fbd686..91a930b7831 100644 --- a/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp +++ b/src/plugins/qmldesigner/components/itemlibrary/itemlibrarymodel.cpp @@ -212,6 +212,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) QString projectName = project ? project->displayName() : ""; // create import sections + const QList usedImports = model->usedImports(); QHash importHash; for (const Import &import : model->imports()) { if (import.url() != projectName) { @@ -239,6 +240,7 @@ void ItemLibraryModel::update(ItemLibraryInfo *itemLibraryInfo, Model *model) auto sectionType = isQuick3DAsset ? ItemLibraryImport::SectionType::Quick3DAssets : ItemLibraryImport::SectionType::Default; ItemLibraryImport *itemLibImport = new ItemLibraryImport(import, this, sectionType); + itemLibImport->setImportUsed(usedImports.contains(import)); importHash.insert(importUrl, itemLibImport); } } diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 2a23466e094..432667c63a4 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -934,15 +934,23 @@ void TextToModelMerger::setupUsedImports() const QList allImports = imports->all(); + QSet usedImportsSet; QList usedImports; - foreach (const QmlJS::Import &import, allImports) { - if (import.used && !import.info.name().isEmpty()) { - if (import.info.type() == ImportType::Library) { + // populate usedImportsSet from current model nodes + const QList allModelNodes = m_rewriterView->allModelNodes(); + for (const ModelNode &modelNode : allModelNodes) { + QString type = QString::fromUtf8(modelNode.type()); + if (type.contains('.')) + usedImportsSet.insert(type.left(type.lastIndexOf('.'))); + } + + for (const QmlJS::Import &import : allImports) { + if (!import.info.name().isEmpty() && usedImportsSet.contains(import.info.name())) { + 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) { + 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())); - } } }