diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index 83131404dee..c1bfb244ff7 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -110,6 +110,8 @@ public: linkAliases(insertedAliasPropertyDeclarations, updatedAliasPropertyDeclarations); + synchronizeProjectDatas(package.projectDatas, package.updatedProjectSourceIds); + transaction.commit(); } @@ -306,9 +308,20 @@ public: &sourceId); } - Storage::ProjectDatas fetchProjectDatas(SourceId sourceId) const override + Storage::ProjectDatas fetchProjectDatas(SourceId projectSourceId) const override { - return Storage::ProjectDatas{}; + return selectProjectDatasForModuleIdStatement + .template valuesWithTransaction(64, &projectSourceId); + } + + Storage::ProjectDatas fetchProjectDatas(const SourceIds &projectSourceIds) const + { + auto projectSourceIdValues = Utils::transform(projectSourceIds, + [](SourceId id) { return &id; }); + + return selectProjectDatasForModuleIdsStatement + .template valuesWithTransaction(64, + Utils::span(projectSourceIdValues)); } private: @@ -533,6 +546,65 @@ private: relinkablePropertyDeclarations); } + void synchronizeProjectDatas(Storage::ProjectDatas &projectDatas, + const SourceIds &updatedProjectSourceIds) + { + auto updatedProjectSourceIdValues = Utils::transform(updatedProjectSourceIds, + [](SourceId id) { + return &id; + }); + + auto compareKey = [](auto &&first, auto &&second) { + auto projectSourceIdDifference = first.projectSourceId.id - second.projectSourceId.id; + if (projectSourceIdDifference != 0) + return projectSourceIdDifference; + + return first.sourceId.id - second.sourceId.id; + }; + + std::sort(projectDatas.begin(), projectDatas.end(), [&](auto &&first, auto &&second) { + return std::tie(first.projectSourceId, first.sourceId) + < std::tie(second.projectSourceId, second.sourceId); + }); + + auto range = selectProjectDatasForModuleIdsStatement.template range( + Utils::span(updatedProjectSourceIdValues)); + + auto insert = [&](const Storage::ProjectData &projectData) { + if (!projectData.projectSourceId) + throw ProjectDataHasInvalidProjectSourceId{}; + if (!projectData.sourceId) + throw ProjectDataHasInvalidSourceId{}; + if (!projectData.moduleId) + throw ProjectDataHasInvalidModuleId{}; + + insertProjectDataStatement.write(&projectData.projectSourceId, + &projectData.sourceId, + &projectData.moduleId, + static_cast(projectData.fileType)); + }; + + auto update = [&](const Storage::ProjectData &projectDataFromDatabase, + const Storage::ProjectData &projectData) { + if (!projectData.moduleId) + throw ProjectDataHasInvalidModuleId{}; + + if (projectDataFromDatabase.fileType != projectData.fileType + || projectDataFromDatabase.moduleId != projectData.moduleId) { + updateProjectDataStatement.write(&projectData.projectSourceId, + &projectData.sourceId, + &projectData.moduleId, + static_cast(projectData.fileType)); + } + }; + + auto remove = [&](const Storage::ProjectData &projectData) { + deleteProjectDataStatement.write(&projectData.projectSourceId, &projectData.sourceId); + }; + + Sqlite::insertUpdateDelete(range, projectDatas, compareKey, insert, update, remove); + } + void synchronizeFileStatuses(FileStatuses &fileStatuses, const SourceIds &updatedSourceIds) { auto updatedSourceIdValues = Utils::transform(updatedSourceIds, @@ -1766,6 +1838,7 @@ private: createSignalsTable(database); createDocumentImportsTable(database, moduleIdColumn); createFileStatusesTable(database); + createProjectDatasTable(database); transaction.commit(); @@ -2008,6 +2081,22 @@ private: table.initialize(database); } + + void createProjectDatasTable(Database &database) + { + Sqlite::Table table; + table.setUseIfNotExists(true); + table.setUseWithoutRowId(true); + table.setName("projectDatas"); + auto &projectSourceIdColumn = table.addColumn("projectSourceId"); + auto &sourceIdColumn = table.addColumn("sourceId"); + table.addColumn("moduleId"); + table.addColumn("fileType"); + + table.addPrimaryKeyContraint({projectSourceIdColumn, sourceIdColumn}); + + table.initialize(database); + } }; public: @@ -2448,6 +2537,22 @@ public: "DELETE FROM exportedTypeNames WHERE exportedTypeNameId=?", database}; WriteStatement updateExportedTypeNameTypeIdStatement{ "UPDATE exportedTypeNames SET typeId=?2 WHERE exportedTypeNameId=?1", database}; + mutable ReadStatement<4> selectProjectDatasForModuleIdsStatement{ + "SELECT projectSourceId, sourceId, moduleId, fileType FROM projectDatas WHERE " + "projectSourceId IN carray(?1) ORDER BY projectSourceId, sourceId", + database}; + WriteStatement insertProjectDataStatement{"INSERT INTO projectDatas(projectSourceId, sourceId, " + "moduleId, fileType) VALUES(?1, ?2, ?3, ?4)", + database}; + WriteStatement deleteProjectDataStatement{ + "DELETE FROM projectDatas WHERE projectSourceId=?1 AND sourceId=?2", database}; + WriteStatement updateProjectDataStatement{ + "UPDATE projectDatas SET moduleId=?3, fileType=?4 WHERE projectSourceId=?1 AND sourceId=?2", + database}; + mutable ReadStatement<4> selectProjectDatasForModuleIdStatement{ + "SELECT projectSourceId, sourceId, moduleId, fileType FROM projectDatas WHERE " + "projectSourceId=?1", + database}; }; } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageexceptions.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageexceptions.h index c95d3e00e28..9b22a6d1973 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageexceptions.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageexceptions.h @@ -113,4 +113,22 @@ public: const char *what() const noexcept override { return "Cannot parse qml types file!"; } }; +class ProjectDataHasInvalidProjectSourceId : std::exception +{ +public: + const char *what() const noexcept override { return "The project source id is invalid!"; } +}; + +class ProjectDataHasInvalidSourceId : std::exception +{ +public: + const char *what() const noexcept override { return "The source id is invalid!"; } +}; + +class ProjectDataHasInvalidModuleId : std::exception +{ +public: + const char *what() const noexcept override { return "The module id is invalid!"; } +}; + } // namespace QmlDesigner diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h index b564372a86b..927d4294661 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstoragetypes.h @@ -735,15 +735,30 @@ using Types = std::vector; class ProjectData { public: - ProjectData(ModuleId extraModuleId, SourceId sourceId, FileType fileType) - : extraModuleId{extraModuleId} + ProjectData(SourceId projectSourceId, SourceId sourceId, ModuleId moduleId, FileType fileType) + : projectSourceId{projectSourceId} , sourceId{sourceId} + , moduleId{moduleId} , fileType{fileType} {} + ProjectData(int projectSourceId, int sourceId, int moduleId, int fileType) + : projectSourceId{projectSourceId} + , sourceId{sourceId} + , moduleId{moduleId} + , fileType{static_cast(fileType)} + {} + + friend bool operator==(const ProjectData &first, const ProjectData &second) + { + return first.projectSourceId == second.projectSourceId && first.sourceId == second.sourceId + && first.moduleId == second.moduleId && first.fileType == second.fileType; + } + public: - ModuleId extraModuleId; + SourceId projectSourceId; SourceId sourceId; + ModuleId moduleId; FileType fileType; }; @@ -767,18 +782,23 @@ public: : updatedSourceIds(std::move(updatedSourceIds)) {} - SynchronizationPackage(SourceIds updatedSourceIds, FileStatuses fileStatuses) - : updatedSourceIds(std::move(updatedSourceIds)) + SynchronizationPackage(SourceIds updatedFileStatusSourceIds, FileStatuses fileStatuses) + : updatedFileStatusSourceIds(std::move(updatedFileStatusSourceIds)) , fileStatuses(std::move(fileStatuses)) {} + SynchronizationPackage(SourceIds updatedProjectSourceIds, ProjectDatas projectDatas) + : projectDatas(std::move(projectDatas)) + , updatedProjectSourceIds(std::move(updatedProjectSourceIds)) + {} + public: Imports imports; Types types; SourceIds updatedSourceIds; FileStatuses fileStatuses; ProjectDatas projectDatas; - ModuleIds updatedProjectDataModuleIds; + SourceIds updatedProjectSourceIds; SourceIds updatedFileStatusSourceIds; }; diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp index 3f3ac321664..62c5cfee8cc 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.cpp @@ -112,17 +112,19 @@ void ProjectUpdater::update() addSourceIds(package.updatedFileStatusSourceIds, qmlProjectDatas); parseTypeInfos(parser.typeInfos(), + qmlDirSourceId, directoryId, moduleId, package, notUpdatedFileStatusSourceIds, notUpdatedSourceIds); parseQmlComponents(createComponentReferences(parser.components()), + qmlDirSourceId, directoryId, moduleId, package, notUpdatedFileStatusSourceIds); - package.updatedProjectDataModuleIds.push_back(moduleId); + package.updatedProjectSourceIds.push_back(qmlDirSourceId); break; } case FileState::NotChanged: { @@ -154,6 +156,7 @@ void ProjectUpdater::update() void ProjectUpdater::pathsWithIdsChanged(const std::vector &idPaths) {} void ProjectUpdater::parseTypeInfos(const QStringList &typeInfos, + SourceId qmldirSourceId, SourceContextId directoryId, ModuleId moduleId, Storage::SynchronizationPackage &package, @@ -166,8 +169,9 @@ void ProjectUpdater::parseTypeInfos(const QStringList &typeInfos, SourceId sourceId = m_pathCache.sourceId(directoryId, Utils::SmallString{typeInfo}); QString qmltypesPath = directory + "/" + typeInfo; - auto projectData = package.projectDatas.emplace_back(moduleId, + auto projectData = package.projectDatas.emplace_back(qmldirSourceId, sourceId, + moduleId, Storage::FileType::QmlTypes); parseTypeInfo(projectData, @@ -229,6 +233,7 @@ void ProjectUpdater::parseQmlComponent(Utils::SmallStringView fileName, Utils::SmallStringView typeName, Storage::Version version, ModuleId moduleId, + SourceId qmldirSourceId, SourceContextId directoryId, Storage::SynchronizationPackage &package, SourceIds ¬UpdatedFileStatusSourceIds) @@ -254,7 +259,7 @@ void ProjectUpdater::parseQmlComponent(Utils::SmallStringView fileName, break; } - package.projectDatas.emplace_back(moduleId, sourceId, Storage::FileType::QmlDocument); + package.projectDatas.emplace_back(qmldirSourceId, sourceId, moduleId, Storage::FileType::QmlDocument); package.updatedSourceIds.push_back(sourceId); @@ -293,6 +298,7 @@ void ProjectUpdater::parseQmlComponent(Utils::SmallStringView fileName, } void ProjectUpdater::parseQmlComponents(ComponentReferences components, + SourceId qmldirSourceId, SourceContextId directoryId, ModuleId moduleId, Storage::SynchronizationPackage &package, @@ -318,6 +324,7 @@ void ProjectUpdater::parseQmlComponents(ComponentReferences components, Utils::SmallString{component.typeName}, Storage::Version{component.majorVersion, component.minorVersion}, moduleId, + qmldirSourceId, directoryId, package, notUpdatedFileStatusSourceIds); diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h index 237c75e5dab..4ab75a52548 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorageupdater.h @@ -87,6 +87,7 @@ private: }; void parseTypeInfos(const QStringList &typeInfos, + SourceId qmldirSourceId, SourceContextId directoryId, ModuleId moduleId, Storage::SynchronizationPackage &package, @@ -102,6 +103,7 @@ private: SourceIds ¬UpdatedFileStatusSourceIds, SourceIds ¬UpdatedSourceIds); void parseQmlComponents(ComponentReferences components, + SourceId qmldirSourceId, SourceContextId directoryId, ModuleId moduleId, Storage::SynchronizationPackage &package, @@ -114,6 +116,7 @@ private: Utils::SmallStringView typeName, Storage::Version version, ModuleId moduleId, + SourceId qmldirSourceId, SourceContextId directoryId, Storage::SynchronizationPackage &package, SourceIds ¬UpdatedFileStatusSourceIds); diff --git a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp index f5d09409aa3..e1b66378e62 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp +++ b/src/plugins/qmldesigner/designercore/projectstorage/qmltypesparser.cpp @@ -283,7 +283,7 @@ void addTypes(Storage::Types &types, types.reserve(Utils::usize(objects) + types.size()); for (const auto &object : objects) - addType(types, projectData.sourceId, projectData.extraModuleId, *object.get(), storage); + addType(types, projectData.sourceId, projectData.moduleId, *object.get(), storage); } } // namespace diff --git a/tests/unit/unittest/gtest-creator-printing.cpp b/tests/unit/unittest/gtest-creator-printing.cpp index 49831bab17e..772bb71e7fb 100644 --- a/tests/unit/unittest/gtest-creator-printing.cpp +++ b/tests/unit/unittest/gtest-creator-printing.cpp @@ -1117,7 +1117,8 @@ std::ostream &operator<<(std::ostream &out, const SynchronizationPackage &packag std::ostream &operator<<(std::ostream &out, const ProjectData &data) { - return out << "(" << data.extraModuleId << ", " << data.sourceId << ", " << data.fileType << ")"; + return out << "(" << data.projectSourceId << ", " << data.sourceId << ", " << data.moduleId + << ", " << data.fileType << ")"; } std::ostream &operator<<(std::ostream &out, TypeAccessSemantics accessSemantics) diff --git a/tests/unit/unittest/projectstorage-test.cpp b/tests/unit/unittest/projectstorage-test.cpp index dd46b0ae59f..69d7e90b979 100644 --- a/tests/unit/unittest/projectstorage-test.cpp +++ b/tests/unit/unittest/projectstorage-test.cpp @@ -435,6 +435,8 @@ protected: SourceId sourceId3{sourcePathCache.sourceId(path3)}; SourceId sourceId4{sourcePathCache.sourceId(path4)}; SourceId sourceId5{sourcePathCache.sourceId(path5)}; + SourceId qmlProjectSourceId{sourcePathCache.sourceId("/path1/qmldir")}; + SourceId qtQuickProjectSourceId{sourcePathCache.sourceId("/path2/qmldir")}; ModuleId qmlModuleId{storage.moduleId("Qml")}; ModuleId qmlNativeModuleId{storage.moduleId("Qml-cppnative")}; ModuleId qtQuickModuleId{storage.moduleId("QtQuick")}; @@ -3115,7 +3117,7 @@ TEST_F(ProjectStorage, UpdateFileStatus) UnorderedElementsAre(fileStatus1, fileStatus2b)); } -TEST_F(ProjectStorage, ThrowForInvalidSourceId) +TEST_F(ProjectStorage, ThrowForInvalidSourceIdInFileStatus) { FileStatus fileStatus1{SourceId{}, 100, 100}; @@ -3654,4 +3656,191 @@ TEST_F(ProjectStorage, PopulateModuleCache) ASSERT_THAT(newStorage.moduleName(id), Eq("Qml")); } +TEST_F(ProjectStorage, AddProjectDataes) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2{qmlProjectSourceId, + sourceId2, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData3{qtQuickProjectSourceId, + sourceId3, + qtQuickModuleId, + Storage::FileType::QmlTypes}; + + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId, qtQuickProjectSourceId}, + {projectData1, projectData2, projectData3}}); + + ASSERT_THAT(storage.fetchProjectDatas({qmlProjectSourceId, qtQuickProjectSourceId}), + UnorderedElementsAre(projectData1, projectData2, projectData3)); +} + +TEST_F(ProjectStorage, RemoveProjectData) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2{qmlProjectSourceId, + sourceId2, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData3{qtQuickProjectSourceId, + sourceId3, + qtQuickModuleId, + Storage::FileType::QmlTypes}; + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId, qtQuickProjectSourceId}, + {projectData1, projectData2, projectData3}}); + + storage.synchronize( + SynchronizationPackage{{qmlProjectSourceId, qtQuickProjectSourceId}, {projectData1}}); + + ASSERT_THAT(storage.fetchProjectDatas({qmlProjectSourceId, qtQuickProjectSourceId}), + UnorderedElementsAre(projectData1)); +} + +TEST_F(ProjectStorage, UpdateProjectDataFileType) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2{qmlProjectSourceId, + sourceId2, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2b{qmlProjectSourceId, + sourceId2, + qmlModuleId, + Storage::FileType::QmlTypes}; + Storage::ProjectData projectData3{qtQuickProjectSourceId, + sourceId3, + qtQuickModuleId, + Storage::FileType::QmlTypes}; + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId, qtQuickProjectSourceId}, + {projectData1, projectData2, projectData3}}); + + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId}, {projectData1, projectData2b}}); + + ASSERT_THAT(storage.fetchProjectDatas({qmlProjectSourceId, qtQuickProjectSourceId}), + UnorderedElementsAre(projectData1, projectData2b, projectData3)); +} + +TEST_F(ProjectStorage, UpdateProjectDataModuleId) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2{qmlProjectSourceId, + sourceId2, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2b{qmlProjectSourceId, + sourceId2, + qtQuickModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData3{qtQuickProjectSourceId, + sourceId3, + qtQuickModuleId, + Storage::FileType::QmlTypes}; + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId, qtQuickProjectSourceId}, + {projectData1, projectData2, projectData3}}); + + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId}, {projectData1, projectData2b}}); + + ASSERT_THAT(storage.fetchProjectDatas({qmlProjectSourceId, qtQuickProjectSourceId}), + UnorderedElementsAre(projectData1, projectData2b, projectData3)); +} + +TEST_F(ProjectStorage, ThrowForInvalidSourceIdInProjectData) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + SourceId{}, + qmlModuleId, + Storage::FileType::QmlDocument}; + + ASSERT_THROW(storage.synchronize(SynchronizationPackage{{qmlProjectSourceId}, {projectData1}}), + QmlDesigner::ProjectDataHasInvalidSourceId); +} + +TEST_F(ProjectStorage, ThrowForInvalidModuleIdInProjectData) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + ModuleId{}, + Storage::FileType::QmlDocument}; + + ASSERT_THROW(storage.synchronize(SynchronizationPackage{{qmlProjectSourceId}, {projectData1}}), + QmlDesigner::ProjectDataHasInvalidModuleId); +} + +TEST_F(ProjectStorage, ThrowForUpdatingWithInvalidModuleIdInProjectData) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + qmlModuleId, + Storage::FileType::QmlDocument}; + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId}, {projectData1}}); + projectData1.moduleId = ModuleId{}; + + ASSERT_THROW(storage.synchronize(SynchronizationPackage{{qmlProjectSourceId}, {projectData1}}), + QmlDesigner::ProjectDataHasInvalidModuleId); +} + +TEST_F(ProjectStorage, ThrowForUpdatingWithInvalidProjectSourceIdInProjectData) +{ + Storage::ProjectData projectData1{SourceId{}, sourceId1, qmlModuleId, Storage::FileType::QmlDocument}; + + ASSERT_THROW(storage.synchronize(SynchronizationPackage{{qmlProjectSourceId}, {projectData1}}), + QmlDesigner::ProjectDataHasInvalidProjectSourceId); +} + +TEST_F(ProjectStorage, FetchProjectDatasByModuleIds) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2{qmlProjectSourceId, + sourceId2, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData3{qtQuickProjectSourceId, + sourceId3, + qtQuickModuleId, + Storage::FileType::QmlTypes}; + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId, qtQuickProjectSourceId}, + {projectData1, projectData2, projectData3}}); + + auto projectDatas = storage.fetchProjectDatas({qmlProjectSourceId, qtQuickProjectSourceId}); + + ASSERT_THAT(projectDatas, UnorderedElementsAre(projectData1, projectData2, projectData3)); +} + +TEST_F(ProjectStorage, FetchProjectDatasByModuleId) +{ + Storage::ProjectData projectData1{qmlProjectSourceId, + sourceId1, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData2{qmlProjectSourceId, + sourceId2, + qmlModuleId, + Storage::FileType::QmlDocument}; + Storage::ProjectData projectData3{qtQuickProjectSourceId, + sourceId3, + qtQuickModuleId, + Storage::FileType::QmlTypes}; + storage.synchronize(SynchronizationPackage{{qmlProjectSourceId, qtQuickProjectSourceId}, + {projectData1, projectData2, projectData3}}); + + auto projectData = storage.fetchProjectDatas(qmlProjectSourceId); + + ASSERT_THAT(projectData, UnorderedElementsAre(projectData1, projectData2)); +} + } // namespace diff --git a/tests/unit/unittest/projectstorageupdater-test.cpp b/tests/unit/unittest/projectstorageupdater-test.cpp index ef3109be2a5..63da5a66287 100644 --- a/tests/unit/unittest/projectstorageupdater-test.cpp +++ b/tests/unit/unittest/projectstorageupdater-test.cpp @@ -110,17 +110,18 @@ MATCHER_P3(IsFileStatus, && fileStatus.lastModified == lastModified; } -MATCHER_P3(IsProjectData, - moduleId, +MATCHER_P4(IsProjectData, + projectSourceId, sourceId, + moduleId, fileType, std::string(negation ? "isn't " : "is ") - + PrintToString(Storage::ProjectData{moduleId, sourceId, fileType})) + + PrintToString(Storage::ProjectData{projectSourceId, sourceId, moduleId, fileType})) { const Storage::ProjectData &projectData = arg; - return projectData.sourceId == sourceId && projectData.extraModuleId == moduleId - && projectData.fileType == fileType; + return projectData.projectSourceId == projectSourceId && projectData.sourceId == sourceId + && projectData.moduleId == moduleId && projectData.fileType == fileType; } MATCHER(PackageIsEmpty, std::string(negation ? "isn't empty" : "is empty")) @@ -129,8 +130,7 @@ MATCHER(PackageIsEmpty, std::string(negation ? "isn't empty" : "is empty")) return package.imports.empty() && package.types.empty() && package.fileStatuses.empty() && package.updatedSourceIds.empty() && package.projectDatas.empty() - && package.updatedFileStatusSourceIds.empty() - && package.updatedProjectDataModuleIds.empty(); + && package.updatedFileStatusSourceIds.empty() && package.updatedProjectSourceIds.empty(); } class ProjectStorageUpdater : public testing::Test @@ -393,11 +393,12 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlTypes) UnorderedElementsAre(IsFileStatus(qmlDirPathSourceId, 21, 421), IsFileStatus(qmltypesPathSourceId, 21, 421))), Field(&SynchronizationPackage::projectDatas, - UnorderedElementsAre(IsProjectData(exampleModuleId, + UnorderedElementsAre(IsProjectData(qmlDirPathSourceId, qmltypesPathSourceId, + exampleModuleId, FileType::QmlTypes))), - Field(&SynchronizationPackage::updatedProjectDataModuleIds, - UnorderedElementsAre(exampleModuleId))))); + Field(&SynchronizationPackage::updatedProjectSourceIds, + UnorderedElementsAre(qmlDirPathSourceId))))); updater.update(); } @@ -518,13 +519,21 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocuments) IsFileStatus(qmlDocumentSourceId1, 22, 12), IsFileStatus(qmlDocumentSourceId2, 22, 13), IsFileStatus(qmlDocumentSourceId3, 22, 14))), - Field(&SynchronizationPackage::updatedProjectDataModuleIds, - UnorderedElementsAre(exampleModuleId)), + Field(&SynchronizationPackage::updatedProjectSourceIds, + UnorderedElementsAre(qmlDirPathSourceId)), Field(&SynchronizationPackage::projectDatas, - UnorderedElementsAre( - IsProjectData(exampleModuleId, qmlDocumentSourceId1, FileType::QmlDocument), - IsProjectData(exampleModuleId, qmlDocumentSourceId2, FileType::QmlDocument), - IsProjectData(exampleModuleId, qmlDocumentSourceId3, FileType::QmlDocument)))))); + UnorderedElementsAre(IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId1, + exampleModuleId, + FileType::QmlDocument), + IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId2, + exampleModuleId, + FileType::QmlDocument), + IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId3, + exampleModuleId, + FileType::QmlDocument)))))); updater.update(); } @@ -544,11 +553,11 @@ TEST_F(ProjectStorageUpdater, SynchronizeRemoved) .WillByDefault(Return(FileStatus{qmltypes2PathSourceId, 21, 421})); ON_CALL(projectStorageMock, fetchProjectDatas(Eq(qmlDirPathSourceId))) .WillByDefault(Return(QmlDesigner::Storage::ProjectDatas{ - {exampleModuleId, qmltypesPathSourceId, FileType::QmlTypes}, - {exampleModuleId, qmltypes2PathSourceId, FileType::QmlTypes}, - {exampleModuleId, qmlDocumentSourceId1, FileType::QmlDocument}, - {exampleModuleId, qmlDocumentSourceId2, FileType::QmlDocument}, - {exampleModuleId, qmlDocumentSourceId3, FileType::QmlDocument}})); + {qmlDirPathSourceId, qmltypesPathSourceId, exampleModuleId, FileType::QmlTypes}, + {qmlDirPathSourceId, qmltypes2PathSourceId, exampleModuleId, FileType::QmlTypes}, + {qmlDirPathSourceId, qmlDocumentSourceId1, exampleModuleId, FileType::QmlDocument}, + {qmlDirPathSourceId, qmlDocumentSourceId2, exampleModuleId, FileType::QmlDocument}, + {qmlDirPathSourceId, qmlDocumentSourceId3, exampleModuleId, FileType::QmlDocument}})); EXPECT_CALL( projectStorageMock, @@ -586,14 +595,25 @@ TEST_F(ProjectStorageUpdater, SynchronizeRemoved) UnorderedElementsAre(IsFileStatus(qmlDirPathSourceId, 21, 421), IsFileStatus(qmlDocumentSourceId1, 22, 12), IsFileStatus(qmltypesPathSourceId, 21, 421))), - Field(&SynchronizationPackage::updatedProjectDataModuleIds, - UnorderedElementsAre(exampleModuleId)), + Field(&SynchronizationPackage::updatedProjectSourceIds, + UnorderedElementsAre(qmlDirPathSourceId)), Field(&SynchronizationPackage::projectDatas, - UnorderedElementsAre( - IsProjectData(exampleModuleId, qmlDocumentSourceId1, FileType::QmlDocument), - IsProjectData(exampleModuleId, qmlDocumentSourceId2, FileType::QmlDocument), - IsProjectData(exampleModuleId, qmltypesPathSourceId, FileType::QmlTypes), - IsProjectData(exampleModuleId, qmltypes2PathSourceId, FileType::QmlTypes)))))); + UnorderedElementsAre(IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId1, + exampleModuleId, + FileType::QmlDocument), + IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId2, + exampleModuleId, + FileType::QmlDocument), + IsProjectData(qmlDirPathSourceId, + qmltypesPathSourceId, + exampleModuleId, + FileType::QmlTypes), + IsProjectData(qmlDirPathSourceId, + qmltypes2PathSourceId, + exampleModuleId, + FileType::QmlTypes)))))); updater.update(); } @@ -646,11 +666,21 @@ TEST_F(ProjectStorageUpdater, SynchronizeQmlDocumentsDontUpdateIfUpToDate) IsFileStatus(qmlDocumentSourceId2, 22, 13))), Field(&SynchronizationPackage::updatedFileStatusSourceIds, UnorderedElementsAre(qmlDirPathSourceId, qmlDocumentSourceId1, qmlDocumentSourceId2)), + Field(&SynchronizationPackage::updatedProjectSourceIds, + UnorderedElementsAre(qmlDirPathSourceId)), Field(&SynchronizationPackage::projectDatas, - UnorderedElementsAre( - IsProjectData(exampleModuleId, qmlDocumentSourceId1, FileType::QmlDocument), - IsProjectData(exampleModuleId, qmlDocumentSourceId2, FileType::QmlDocument), - IsProjectData(exampleModuleId, qmlDocumentSourceId3, FileType::QmlDocument)))))); + UnorderedElementsAre(IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId1, + exampleModuleId, + FileType::QmlDocument), + IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId2, + exampleModuleId, + FileType::QmlDocument), + IsProjectData(qmlDirPathSourceId, + qmlDocumentSourceId3, + exampleModuleId, + FileType::QmlDocument)))))); updater.update(); } @@ -672,8 +702,8 @@ TEST_F(ProjectStorageUpdater, AddSourceIdForForInvalidQmldirFileStatus) { ON_CALL(projectStorageMock, fetchProjectDatas(Eq(qmlDirPathSourceId))) .WillByDefault(Return(QmlDesigner::Storage::ProjectDatas{ - {exampleModuleId, qmltypesPathSourceId, FileType::QmlTypes}, - {exampleModuleId, qmltypes2PathSourceId, FileType::QmlTypes}})); + {qmlDirPathSourceId, qmltypesPathSourceId, exampleModuleId, FileType::QmlTypes}, + {qmlDirPathSourceId, qmltypes2PathSourceId, exampleModuleId, FileType::QmlTypes}})); ON_CALL(fileSystemMock, fileStatus(Eq(qmlDirPathSourceId))).WillByDefault(Return(FileStatus{})); EXPECT_CALL(projectStorageMock, @@ -693,10 +723,10 @@ TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasNotChanged) { ON_CALL(projectStorageMock, fetchProjectDatas(Eq(qmlDirPathSourceId))) .WillByDefault(Return(QmlDesigner::Storage::ProjectDatas{ - {exampleModuleId, qmltypesPathSourceId, FileType::QmlTypes}, - {exampleModuleId, qmltypes2PathSourceId, FileType::QmlTypes}, - {exampleModuleId, qmlDocumentSourceId1, FileType::QmlDocument}, - {exampleModuleId, qmlDocumentSourceId2, FileType::QmlDocument}})); + {qmlDirPathSourceId, qmltypesPathSourceId, exampleModuleId, FileType::QmlTypes}, + {qmlDirPathSourceId, qmltypes2PathSourceId, exampleModuleId, FileType::QmlTypes}, + {qmlDirPathSourceId, qmlDocumentSourceId1, exampleModuleId, FileType::QmlDocument}, + {qmlDirPathSourceId, qmlDocumentSourceId2, exampleModuleId, FileType::QmlDocument}})); ON_CALL(projectStorageMock, fetchFileStatus(Eq(qmlDirPathSourceId))) .WillByDefault(Return(FileStatus{qmlDirPathSourceId, 21, 421})); @@ -744,10 +774,10 @@ TEST_F(ProjectStorageUpdater, SynchronizIfQmldirFileHasNotChangedAndSomeUpdatedF { ON_CALL(projectStorageMock, fetchProjectDatas(Eq(qmlDirPathSourceId))) .WillByDefault(Return(QmlDesigner::Storage::ProjectDatas{ - {exampleModuleId, qmltypesPathSourceId, FileType::QmlTypes}, - {exampleModuleId, qmltypes2PathSourceId, FileType::QmlTypes}, - {exampleModuleId, qmlDocumentSourceId1, FileType::QmlDocument}, - {exampleModuleId, qmlDocumentSourceId2, FileType::QmlDocument}})); + {qmlDirPathSourceId, qmltypesPathSourceId, exampleModuleId, FileType::QmlTypes}, + {qmlDirPathSourceId, qmltypes2PathSourceId, exampleModuleId, FileType::QmlTypes}, + {qmlDirPathSourceId, qmlDocumentSourceId1, exampleModuleId, FileType::QmlDocument}, + {qmlDirPathSourceId, qmlDocumentSourceId2, exampleModuleId, FileType::QmlDocument}})); ON_CALL(projectStorageMock, fetchFileStatus(Eq(qmlDirPathSourceId))) .WillByDefault(Return(FileStatus{qmlDirPathSourceId, 21, 421})); ON_CALL(projectStorageMock, fetchFileStatus(Eq(qmltypes2PathSourceId))) diff --git a/tests/unit/unittest/qmltypesparser-test.cpp b/tests/unit/unittest/qmltypesparser-test.cpp index 0c2c3c26bb2..46c484accce 100644 --- a/tests/unit/unittest/qmltypesparser-test.cpp +++ b/tests/unit/unittest/qmltypesparser-test.cpp @@ -173,8 +173,9 @@ protected: Storage::Imports imports; Storage::Types types; SourceId qmltypesFileSourceId{sourcePathCache.sourceId("path/to/types.qmltypes")}; - QmlDesigner::Storage::ProjectData projectData{storage.moduleId("QtQml-cppnative"), + QmlDesigner::Storage::ProjectData projectData{qmltypesFileSourceId, qmltypesFileSourceId, + storage.moduleId("QtQml-cppnative"), Storage::FileType::QmlTypes}; SourceContextId qmltypesFileSourceContextId{sourcePathCache.sourceContextId(qmltypesFileSourceId)}; ModuleId directoryModuleId{storage.moduleId("path/to/")};