summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2022-02-16 17:56:22 +0100
committerMarco Bubke <marco.bubke@qt.io>2022-02-16 18:10:59 +0000
commitf54867e844682db7fe0a6297617c84c77935aa56 (patch)
treef0076194391d5f1b519eddda84261daf70c7a5ba
parent3ece40c31eb715a46dcb9a611307ebb9d71bcacf (diff)
downloadqt-creator-f54867e844682db7fe0a6297617c84c77935aa56.tar.gz
QmlDesigner: Filter colliding imports to dependencies
Imports from qmldir are added as dependencies too. In the case as a import is the same as a dependency it has do be filtered out. Change-Id: Ibecc505ccf7c001d3267665ee4fe2e374bea8a7d Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp18
-rw-r--r--tests/unit/unittest/projectstorageupdater-test.cpp26
2 files changed, 42 insertions, 2 deletions
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp
index d144647fd2..df83d96bac 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp
+++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp
@@ -64,6 +64,18 @@ QList<QmlDirParser::Import> filterMultipleEntries(QList<QmlDirParser::Import> im
return imports;
}
+QList<QmlDirParser::Import> joinImports(const QList<QmlDirParser::Import> &firstImports,
+ const QList<QmlDirParser::Import> &secondImports)
+{
+ QList<QmlDirParser::Import> imports;
+ imports.reserve(firstImports.size() + secondImports.size());
+ imports.append(firstImports);
+ imports.append(secondImports);
+ imports = filterMultipleEntries(std::move(imports));
+
+ return imports;
+}
+
ComponentReferences createComponentReferences(const QMultiHash<QString, QmlDirParser::Component> &components)
{
ComponentReferences componentReferences;
@@ -291,8 +303,10 @@ void ProjectStorageUpdater::parseTypeInfos(const QStringList &typeInfos,
{directory, "/", Utils::SmallString{typeInfo}});
SourceId sourceId = m_pathCache.sourceId(SourcePathView{qmltypesPath});
- addDependencies(package.moduleDependencies, sourceId, qmldirDependencies, m_projectStorage);
- addDependencies(package.moduleDependencies, sourceId, qmldirImports, m_projectStorage);
+ addDependencies(package.moduleDependencies,
+ sourceId,
+ joinImports(qmldirDependencies, qmldirImports),
+ m_projectStorage);
package.updatedModuleDependencySourceIds.push_back(sourceId);
auto projectData = package.projectDatas.emplace_back(qmldirSourceId,
diff --git a/tests/unit/unittest/projectstorageupdater-test.cpp b/tests/unit/unittest/projectstorageupdater-test.cpp
index b33c1a89e5..051959a74c 100644
--- a/tests/unit/unittest/projectstorageupdater-test.cpp
+++ b/tests/unit/unittest/projectstorageupdater-test.cpp
@@ -1102,6 +1102,32 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithDoubleEntries)
updater.update(qmlDirs, {});
}
+TEST_F(ProjectStorageUpdater, SynchronizeQmldirDependenciesWithCollidingImports)
+{
+ QString qmldir{R"(module Example
+ depends Qml
+ depends QML
+ import Qml
+ typeinfo example.qmltypes
+ typeinfo types/example2.qmltypes
+ )"};
+ ON_CALL(fileSystemMock, contentAsQString(Eq(QString("/path/qmldir")))).WillByDefault(Return(qmldir));
+
+ EXPECT_CALL(
+ projectStorageMock,
+ synchronize(AllOf(
+ Field(&SynchronizationPackage::moduleDependencies,
+ UnorderedElementsAre(
+ Import{qmlCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId},
+ Import{builtinCppNativeModuleId, Storage::Version{}, qmltypesPathSourceId},
+ Import{qmlCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId},
+ Import{builtinCppNativeModuleId, Storage::Version{}, qmltypes2PathSourceId})),
+ Field(&SynchronizationPackage::updatedModuleDependencySourceIds,
+ UnorderedElementsAre(qmltypesPathSourceId, qmltypes2PathSourceId)))));
+
+ updater.update(qmlDirs, {});
+}
+
TEST_F(ProjectStorageUpdater, SynchronizeQmldirWithNoDependencies)
{
QString qmldir{R"(module Example