QmlDesigner: All importing a shared folder that is not a subfolder

Fixes: QDS-12228
Change-Id: I60b461b6e46739a93e21adb8d864681877610de3
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Miikka Heikkinen
2024-06-13 17:58:37 +03:00
parent cd0cc93467
commit fe1d996b93
2 changed files with 34 additions and 20 deletions

View File

@@ -781,13 +781,14 @@ bool skipModule(QStringView moduleName)
} }
void collectPossibleFileImports(const QString &checkPath, void collectPossibleFileImports(const QString &checkPath,
const QString &projectFolder, const QDir &docDir,
QSet<QString> usedImportsSet, QSet<QString> usedImportsSet,
QList<QmlDesigner::Import> &possibleImports) QList<QmlDesigner::Import> &possibleImports)
{ {
const QStringList qmlList("*.qml"); const QStringList qmlList("*.qml");
const QStringList qmldirList("qmldir"); const QStringList qmldirList("qmldir");
const QChar delimeter('/'); const QChar delimeter('/');
const QString upDir("../");
if (QFileInfo(checkPath).isRoot()) if (QFileInfo(checkPath).isRoot())
return; return;
@@ -800,30 +801,21 @@ void collectPossibleFileImports(const QString &checkPath,
if (!dir.entryInfoList(qmlList, QDir::Files).isEmpty() if (!dir.entryInfoList(qmlList, QDir::Files).isEmpty()
&& dir.entryInfoList(qmldirList, QDir::Files).isEmpty() && dir.entryInfoList(qmldirList, QDir::Files).isEmpty()
&& !usedImportsSet.contains(dirPath)) { && !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); QmlDesigner::Import import = QmlDesigner::Import::createFileImport(importName);
possibleImports.append(import); possibleImports.append(import);
} }
collectPossibleFileImports(dirPath, projectFolder, usedImportsSet, possibleImports); collectPossibleFileImports(dirPath, docDir, usedImportsSet, possibleImports);
} }
} }
QList<QmlDesigner::Import> generatePossibleFileImports(const QString &path,
const QList<QmlJS::Import> &usedImports)
{
QSet<QString> usedImportsSet;
for (const QmlJS::Import &i : usedImports)
usedImportsSet.insert(i.info.path());
QList<QmlDesigner::Import> possibleImports;
QStringList fileImportPaths;
collectPossibleFileImports(path, path, usedImportsSet, possibleImports);
return possibleImports;
}
QmlDesigner::Imports createQt5Modules() QmlDesigner::Imports createQt5Modules()
{ {
return {QmlDesigner::Import::createLibraryImport("QtQuick", "2.15"), return {QmlDesigner::Import::createLibraryImport("QtQuick", "2.15"),
@@ -886,6 +878,25 @@ void TextToModelMerger::setupPossibleImports()
if (m_rewriterView->isAttached()) if (m_rewriterView->isAttached())
m_rewriterView->model()->setPossibleImports(modules); m_rewriterView->model()->setPossibleImports(modules);
} }
QList<QmlDesigner::Import> TextToModelMerger::generatePossibleFileImports(
const QString &path, const QList<QmlJS::Import> &usedImports) const
{
if (!m_rewriterView)
return {};
QSet<QString> usedImportsSet;
for (const QmlJS::Import &i : usedImports)
usedImportsSet.insert(i.info.path());
QList<QmlDesigner::Import> possibleImports;
collectPossibleFileImports(m_rewriterView->externalDependencies().currentResourcePath().toLocalFile(),
QDir(path), usedImportsSet, possibleImports);
return possibleImports;
}
#endif #endif
#ifndef QDS_USE_PROJECTSTORAGE #ifndef QDS_USE_PROJECTSTORAGE

View File

@@ -141,7 +141,10 @@ private:
static QString textAt(const QmlJS::Document::Ptr &doc, static QString textAt(const QmlJS::Document::Ptr &doc,
const QmlJS::SourceLocation &from, const QmlJS::SourceLocation &from,
const QmlJS::SourceLocation &to); const QmlJS::SourceLocation &to);
#ifndef QDS_USE_PROJECTSTORAGE
QList<QmlDesigner::Import> generatePossibleFileImports(
const QString &path, const QList<QmlJS::Import> &usedImports) const;
#endif
private: private:
RewriterView *m_rewriterView; RewriterView *m_rewriterView;
bool m_isActive; bool m_isActive;