diff options
author | Marco Bubke <marco.bubke@qt.io> | 2022-02-16 17:56:22 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2022-02-16 18:10:59 +0000 |
commit | f54867e844682db7fe0a6297617c84c77935aa56 (patch) | |
tree | f0076194391d5f1b519eddda84261daf70c7a5ba | |
parent | 3ece40c31eb715a46dcb9a611307ebb9d71bcacf (diff) |
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.cpp | 18 | ||||
-rw-r--r-- | tests/unit/unittest/projectstorageupdater-test.cpp | 26 |
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 |