From fe1d996b93914ff5130e701bb18cb0194b3c56e7 Mon Sep 17 00:00:00 2001 From: Miikka Heikkinen Date: Thu, 13 Jun 2024 17:58:37 +0300 Subject: [PATCH] QmlDesigner: All importing a shared folder that is not a subfolder Fixes: QDS-12228 Change-Id: I60b461b6e46739a93e21adb8d864681877610de3 Reviewed-by: Thomas Hartmann --- .../designercore/model/texttomodelmerger.cpp | 49 ++++++++++++------- .../designercore/model/texttomodelmerger.h | 5 +- 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp index 9f52504c6d4..73a1ea46f7b 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.cpp @@ -781,13 +781,14 @@ bool skipModule(QStringView moduleName) } void collectPossibleFileImports(const QString &checkPath, - const QString &projectFolder, + const QDir &docDir, QSet usedImportsSet, QList &possibleImports) { const QStringList qmlList("*.qml"); const QStringList qmldirList("qmldir"); const QChar delimeter('/'); + const QString upDir("../"); if (QFileInfo(checkPath).isRoot()) return; @@ -800,30 +801,21 @@ void collectPossibleFileImports(const QString &checkPath, if (!dir.entryInfoList(qmlList, QDir::Files).isEmpty() && dir.entryInfoList(qmldirList, QDir::Files).isEmpty() && !usedImportsSet.contains(dirPath)) { - const QString importName = dir.path().mid(projectFolder.size() + 1); + const QString importName = docDir.relativeFilePath(dirPath); + + // Omit all imports that would be just "../", "../../" etc. without additional subfolder, + // as we don't want to encourage bad design. "../MySharedComps" is a legitimate + // use, though. + if (importName.startsWith(upDir) && importName.lastIndexOf(upDir) == importName.size() - 3) + continue; + QmlDesigner::Import import = QmlDesigner::Import::createFileImport(importName); possibleImports.append(import); } - collectPossibleFileImports(dirPath, projectFolder, usedImportsSet, possibleImports); + collectPossibleFileImports(dirPath, docDir, usedImportsSet, possibleImports); } } -QList generatePossibleFileImports(const QString &path, - const QList &usedImports) -{ - QSet usedImportsSet; - for (const QmlJS::Import &i : usedImports) - usedImportsSet.insert(i.info.path()); - - QList possibleImports; - - QStringList fileImportPaths; - - collectPossibleFileImports(path, path, usedImportsSet, possibleImports); - - return possibleImports; -} - QmlDesigner::Imports createQt5Modules() { return {QmlDesigner::Import::createLibraryImport("QtQuick", "2.15"), @@ -886,6 +878,25 @@ void TextToModelMerger::setupPossibleImports() if (m_rewriterView->isAttached()) m_rewriterView->model()->setPossibleImports(modules); } + +QList TextToModelMerger::generatePossibleFileImports( + const QString &path, const QList &usedImports) const +{ + if (!m_rewriterView) + return {}; + + QSet usedImportsSet; + for (const QmlJS::Import &i : usedImports) + usedImportsSet.insert(i.info.path()); + + QList possibleImports; + + collectPossibleFileImports(m_rewriterView->externalDependencies().currentResourcePath().toLocalFile(), + QDir(path), usedImportsSet, possibleImports); + + return possibleImports; +} + #endif #ifndef QDS_USE_PROJECTSTORAGE diff --git a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h index e22f747718a..8abb7bcad9f 100644 --- a/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h +++ b/src/plugins/qmldesigner/designercore/model/texttomodelmerger.h @@ -141,7 +141,10 @@ private: static QString textAt(const QmlJS::Document::Ptr &doc, const QmlJS::SourceLocation &from, const QmlJS::SourceLocation &to); - +#ifndef QDS_USE_PROJECTSTORAGE + QList generatePossibleFileImports( + const QString &path, const QList &usedImports) const; +#endif private: RewriterView *m_rewriterView; bool m_isActive;