From f54867e844682db7fe0a6297617c84c77935aa56 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 16 Feb 2022 17:56:22 +0100 Subject: 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 --- .../projectstorage/projectstorageupdater.cpp | 18 +++++++++++++-- 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 filterMultipleEntries(QList im return imports; } +QList joinImports(const QList &firstImports, + const QList &secondImports) +{ + QList imports; + imports.reserve(firstImports.size() + secondImports.size()); + imports.append(firstImports); + imports.append(secondImports); + imports = filterMultipleEntries(std::move(imports)); + + return imports; +} + ComponentReferences createComponentReferences(const QMultiHash &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 -- cgit v1.2.3