From f7f65b9ea47f5467cda807699cd0bea9825d3498 Mon Sep 17 00:00:00 2001 From: Marco Bubke Date: Wed, 12 Jul 2023 14:35:47 +0200 Subject: [PATCH] QmlDesigner: Get exported type names for type id and source id It is matching the document imports with the exported type names. Task-number: DS-10265 Change-Id: I0623cd0b3d04fa1a8c05354a194f10f3d8948b21 Reviewed-by: Vikas Pachdha --- .../projectstorage/projectstorage.h | 12 ++++++ .../projectstorage/projectstorageinterface.h | 3 ++ tests/unit/tests/mocks/projectstoragemock.h | 4 ++ .../projectstorage/projectstorage-test.cpp | 37 +++++++++++++++++++ 4 files changed, 56 insertions(+) diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index d2eb46bed8d..78064fedab0 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -159,6 +159,13 @@ public: .template valuesWithTransaction(4, typeId); } + Storage::Info::ExportedTypeNames exportedTypeNames(TypeId typeId, + SourceId sourceId) const override + { + return selectExportedTypesByTypeIdAndSourceIdStatement + .template valuesWithTransaction(4, typeId, sourceId); + } + ImportId importId(const Storage::Import &import) const override { return Sqlite::withDeferredTransaction(database, [&] { @@ -2757,6 +2764,11 @@ public: "SELECT moduleId, name, ifnull(majorVersion, -1), ifnull(minorVersion, -1) FROM " "exportedTypeNames WHERE typeId=?", database}; + mutable ReadStatement<4, 2> selectExportedTypesByTypeIdAndSourceIdStatement{ + "SELECT etn.moduleId, name, ifnull(etn.majorVersion, -1), ifnull(etn.minorVersion, -1) " + "FROM exportedTypeNames AS etn JOIN documentImports USING(moduleId) WHERE typeId=?1 AND " + "sourceId=?2", + database}; mutable ReadStatement<7> selectTypesStatement{ "SELECT sourceId, t.name, t.typeId, prototypeId, extensionId, traits, pd.name " "FROM types AS t LEFT JOIN propertyDeclarations AS pd " diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinterface.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinterface.h index f0672606162..adbbfcac4c3 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinterface.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageinterface.h @@ -27,6 +27,9 @@ public: = 0; virtual TypeId typeId(ImportedTypeNameId typeNameId) const = 0; virtual Storage::Info::ExportedTypeNames exportedTypeNames(TypeId typeId) const = 0; + virtual Storage::Info::ExportedTypeNames exportedTypeNames(TypeId typeId, + SourceId sourceId) const + = 0; virtual ImportId importId(const Storage::Import &import) const = 0; virtual ImportedTypeNameId importedTypeNameId(ImportId sourceId, Utils::SmallStringView typeName) = 0; diff --git a/tests/unit/tests/mocks/projectstoragemock.h b/tests/unit/tests/mocks/projectstoragemock.h index 17a8beed70f..7d0dfd9924f 100644 --- a/tests/unit/tests/mocks/projectstoragemock.h +++ b/tests/unit/tests/mocks/projectstoragemock.h @@ -118,6 +118,10 @@ public: exportedTypeNames, (QmlDesigner::TypeId), (const, override)); + MOCK_METHOD(QmlDesigner::Storage::Info::ExportedTypeNames, + exportedTypeNames, + (QmlDesigner::TypeId, QmlDesigner::SourceId), + (const, override)); MOCK_METHOD(QmlDesigner::ImportId, importId, diff --git a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp index acfb6cff9fa..fbf07ed9a54 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp @@ -6970,4 +6970,41 @@ TEST_F(ProjectStorage, get_no_exported_type_names_if_type_id_is_invalid) ASSERT_THAT(exportedTypeNames, IsEmpty()); } +TEST_F(ProjectStorage, get_exported_type_names_for_source_id) +{ + auto package{createSimpleSynchronizationPackage()}; + package.imports.emplace_back(qmlModuleId, Storage::Version{}, sourceId3); + storage.synchronize(package); + auto typeId = fetchTypeId(sourceId2, "QObject"); + + auto exportedTypeNames = storage.exportedTypeNames(typeId, sourceId3); + + ASSERT_THAT(exportedTypeNames, + UnorderedElementsAre(IsInfoExportTypeNames(qmlModuleId, "Object", 2, -1), + IsInfoExportTypeNames(qmlModuleId, "Obj", 2, -1))); +} + +TEST_F(ProjectStorage, get_no_exported_type_names_for_source_id_for_invalid_type_id) +{ + auto package{createSimpleSynchronizationPackage()}; + package.imports.emplace_back(qmlModuleId, Storage::Version{}, sourceId3); + storage.synchronize(package); + TypeId typeId; + + auto exportedTypeNames = storage.exportedTypeNames(typeId, sourceId3); + + ASSERT_THAT(exportedTypeNames, IsEmpty()); +} + +TEST_F(ProjectStorage, get_no_exported_type_names_for_source_id_for_non_matching_import) +{ + auto package{createSimpleSynchronizationPackage()}; + package.imports.emplace_back(qtQuickModuleId, Storage::Version{}, sourceId3); + storage.synchronize(package); + auto typeId = fetchTypeId(sourceId2, "QObject"); + + auto exportedTypeNames = storage.exportedTypeNames(typeId, sourceId3); + + ASSERT_THAT(exportedTypeNames, IsEmpty()); +} } // namespace