From 6772aab7c285d3dbf75e790a5c15092a911c08d0 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Thu, 17 Feb 2022 15:10:11 +0100 Subject: [PATCH] QmlDesigner: Distinguish between dependency and import reexports Sometimes there can be the same import from a dependency and an import. It will be needed for later updates of the reexports too. Change-Id: I18cf7d5a03ccbfa3857b54b7d5a5148b6797e718 Reviewed-by: Qt CI Bot Reviewed-by: Thomas Hartmann --- .../projectstorage/projectstorage.h | 12 ++++--- .../projectstorage/projectstoragetypes.h | 7 +++- tests/unit/unittest/projectstorage-test.cpp | 32 +++++++++++++++++++ 3 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index 734c9366d22..72ff942af2b 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -1374,10 +1374,14 @@ private: Storage::Version{majorVersion, minorVersion}, import.sourceId}; - insertDocumentImport(additionImport, - Storage::ImportKind::ModuleExportedImport, - import.moduleId, - ModuleExportedImportId{moduleExportedImportId}); + auto exportedImportKind = importKind == Storage::ImportKind::Import + ? Storage::ImportKind::ModuleExportedImport + : Storage::ImportKind::ModuleExportedModuleDependency; + + insertDocumentImport(additionImport, + exportedImportKind, + import.moduleId, + ModuleExportedImportId{moduleExportedImportId}); return Sqlite::CallbackControl::Continue; }; diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h index 041f278f0a9..4fd92a9475f 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h @@ -152,7 +152,12 @@ inline int operator<(IsQualified first, IsQualified second) return static_cast(first) < static_cast(second); } -enum class ImportKind : char { Import, ModuleDependency, ModuleExportedImport }; +enum class ImportKind : char { + Import, + ModuleDependency, + ModuleExportedImport, + ModuleExportedModuleDependency +}; class Import { diff --git a/tests/unit/unittest/projectstorage-test.cpp b/tests/unit/unittest/projectstorage-test.cpp index 4ae429a3ffc..0f9c4d35eec 100644 --- a/tests/unit/unittest/projectstorage-test.cpp +++ b/tests/unit/unittest/projectstorage-test.cpp @@ -4126,4 +4126,36 @@ TEST_F(ProjectStorage, DistinguishBetweenImportKinds) IsExportedType(qtQuickNativeModuleId, "QQuickItem")))))); } +TEST_F(ProjectStorage, ModuleExportedImportDistinguishBetweenDependencyAndImportReExports) +{ + auto package{createModuleExportedImportSynchronizationPackage()}; + package.moduleDependencies.emplace_back(qtQuick3DModuleId, Storage::Version{1}, sourceId4); + + storage.synchronize(std::move(package)); + + ASSERT_THAT(storage.fetchTypes(), + UnorderedElementsAre( + AllOf(IsStorageType(sourceId1, + "QQuickItem", + fetchTypeId(sourceId2, "QObject"), + TypeAccessSemantics::Reference), + Field(&Storage::Type::exportedTypes, + UnorderedElementsAre(IsExportedType(qtQuickModuleId, "Item")))), + AllOf(IsStorageType(sourceId2, "QObject", TypeId{}, TypeAccessSemantics::Reference), + Field(&Storage::Type::exportedTypes, + UnorderedElementsAre(IsExportedType(qmlModuleId, "Object")))), + AllOf(IsStorageType(sourceId3, + "QQuickItem3d", + fetchTypeId(sourceId1, "QQuickItem"), + TypeAccessSemantics::Reference), + Field(&Storage::Type::exportedTypes, + UnorderedElementsAre(IsExportedType(qtQuick3DModuleId, "Item3D")))), + AllOf(IsStorageType(sourceId4, + "MyItem", + fetchTypeId(sourceId2, "QObject"), + TypeAccessSemantics::Reference), + Field(&Storage::Type::exportedTypes, + UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); +} + } // namespace