diff options
3 files changed, 72 insertions, 53 deletions
diff --git a/src/plugins/qmldesigner/CMakeLists.txt b/src/plugins/qmldesigner/CMakeLists.txt index 80273e863b8..0d7c39784c9 100644 --- a/src/plugins/qmldesigner/CMakeLists.txt +++ b/src/plugins/qmldesigner/CMakeLists.txt @@ -11,6 +11,10 @@ endif() add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,Clang>:-Wno-error=maybe-uninitialized>") add_compile_options("$<$<COMPILE_LANG_AND_ID:CXX,GNU>:-Wno-error=maybe-uninitialized>") +env_with_default("QDS_USE_PROJECTSTORAGE" ENV_QDS_USE_PROJECTSTORAGE OFF) +option(USE_PROJECTSTORAGE "Use ProjectStorage" ${ENV_QDS_USE_PROJECTSTORAGE}) +add_feature_info("ProjectStorage" ${USE_PROJECTSTORAGE} "") + add_qtc_library(QmlDesignerUtils STATIC DEPENDS Qt::Gui Utils Qt::QmlPrivate Core @@ -64,7 +68,10 @@ add_qtc_library(QmlDesignerCore STATIC QmlDesignerUtils TextEditor Sqlite - DEFINES QMLDESIGNERCORE_LIBRARY QMLDESIGNERUTILS_LIBRARY + DEFINES + QMLDESIGNERCORE_LIBRARY + QMLDESIGNERUTILS_LIBRARY + $<$<BOOL:${USE_PROJECTSTORAGE}>:QDS_USE_PROJECTSTORAGE> INCLUDES ${CMAKE_CURRENT_LIST_DIR} PUBLIC_INCLUDES @@ -76,13 +83,6 @@ add_qtc_library(QmlDesignerCore STATIC rewritertransaction.h ) - -if(TARGET QmlDesignerCore) - env_with_default("QDS_USE_PROJECTSTORAGE" ENV_QDS_USE_PROJECTSTORAGE OFF) - option(USE_PROJECTSTORAGE "Use ProjectStorage" ${ENV_QDS_USE_PROJECTSTORAGE}) - add_feature_info("ProjectStorage" ${USE_PROJECTSTORAGE} "") -endif() - extend_qtc_library(QmlDesignerCore CONDITION ENABLE_COMPILE_WARNING_AS_ERROR PROPERTIES COMPILE_WARNING_AS_ERROR ON diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h index 3f47eb3f018..cc4de52663e 100644 --- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h +++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h @@ -559,6 +559,12 @@ public: return selectPropertyEditorPathIdStatement.template valueWithTransaction<SourceId>(typeId); } + Storage::Imports fetchDocumentImports() const + { + return selectAllDocumentImportForSourceIdStatement + .template valuesWithTransaction<Storage::Imports>(); + } + private: class ModuleStorageAdapter { @@ -1577,32 +1583,31 @@ private: PropertyCompare<AliasPropertyDeclaration>{}); } - void insertDocumentImport(const Storage::Import &import, - Storage::Synchronization::ImportKind importKind, - ModuleId sourceModuleId, - ModuleExportedImportId moduleExportedImportId) + ImportId insertDocumentImport(const Storage::Import &import, + Storage::Synchronization::ImportKind importKind, + ModuleId sourceModuleId, + ImportId parentImportId) { if (import.version.minor) { - insertDocumentImportWithVersionStatement.write(import.sourceId, - import.moduleId, - sourceModuleId, - importKind, - import.version.major.value, - import.version.minor.value, - moduleExportedImportId); + return insertDocumentImportWithVersionStatement + .template value<ImportId>(import.sourceId, + import.moduleId, + sourceModuleId, + importKind, + import.version.major.value, + import.version.minor.value, + parentImportId); } else if (import.version.major) { - insertDocumentImportWithMajorVersionStatement.write(import.sourceId, - import.moduleId, - sourceModuleId, - importKind, - import.version.major.value, - moduleExportedImportId); + return insertDocumentImportWithMajorVersionStatement + .template value<ImportId>(import.sourceId, + import.moduleId, + sourceModuleId, + importKind, + import.version.major.value, + parentImportId); } else { - insertDocumentImportWithoutVersionStatement.write(import.sourceId, - import.moduleId, - sourceModuleId, - importKind, - moduleExportedImportId); + return insertDocumentImportWithoutVersionStatement.template value<ImportId>( + import.sourceId, import.moduleId, sourceModuleId, importKind, parentImportId); } } @@ -1638,11 +1643,8 @@ private: }; auto insert = [&](const Storage::Import &import) { - insertDocumentImport(import, importKind, import.moduleId, ModuleExportedImportId{}); - auto callback = [&](ModuleId exportedModuleId, - int majorVersion, - int minorVersion, - ModuleExportedImportId moduleExportedImportId) { + auto importId = insertDocumentImport(import, importKind, import.moduleId, ImportId{}); + auto callback = [&](ModuleId exportedModuleId, int majorVersion, int minorVersion) { Storage::Import additionImport{exportedModuleId, Storage::Version{majorVersion, minorVersion}, import.sourceId}; @@ -1651,10 +1653,7 @@ private: ? Storage::Synchronization::ImportKind::ModuleExportedImport : Storage::Synchronization::ImportKind::ModuleExportedModuleDependency; - insertDocumentImport(additionImport, - exportedImportKind, - import.moduleId, - moduleExportedImportId); + insertDocumentImport(additionImport, exportedImportKind, import.moduleId, importId); }; selectModuleExportedImportsForModuleIdStatement.readCallback(callback, @@ -1669,6 +1668,7 @@ private: auto remove = [&](const Storage::Synchronization::ImportView &view) { deleteDocumentImportStatement.write(view.importId); + deleteDocumentImportsWithParentImportIdStatement.write(view.sourceId, view.importId); }; Sqlite::insertUpdateDelete(range, imports, compareKey, insert, update, remove); @@ -2700,21 +2700,21 @@ private: Sqlite::StrictColumnType::Integer); auto &minorVersionColumn = table.addColumn("minorVersion", Sqlite::StrictColumnType::Integer); - auto &moduleExportedModuleIdColumn = table.addColumn("moduleExportedModuleId", - Sqlite::StrictColumnType::Integer); + auto &parentImportIdColumn = table.addColumn("parentImportId", + Sqlite::StrictColumnType::Integer); table.addUniqueIndex({sourceIdColumn, moduleIdColumn, kindColumn, sourceModuleIdColumn, - moduleExportedModuleIdColumn}, + parentImportIdColumn}, "majorVersion IS NULL AND minorVersion IS NULL"); table.addUniqueIndex({sourceIdColumn, moduleIdColumn, kindColumn, sourceModuleIdColumn, majorVersionColumn, - moduleExportedModuleIdColumn}, + parentImportIdColumn}, "majorVersion IS NOT NULL AND minorVersion IS NULL"); table.addUniqueIndex({sourceIdColumn, moduleIdColumn, @@ -2722,7 +2722,7 @@ private: sourceModuleIdColumn, majorVersionColumn, minorVersionColumn, - moduleExportedModuleIdColumn}, + parentImportIdColumn}, "majorVersion IS NOT NULL AND minorVersion IS NOT NULL"); table.initialize(database); @@ -3064,25 +3064,32 @@ public: "SELECT typeId FROM exportedTypeNames WHERE moduleId IN carray(?1, ?2, 'int32') AND " "name=?3", database}; + mutable ReadStatement<4> selectAllDocumentImportForSourceIdStatement{ + "SELECT moduleId, majorVersion, minorVersion, sourceId " + "FROM documentImports ", + database}; mutable ReadStatement<5, 2> selectDocumentImportForSourceIdStatement{ "SELECT importId, sourceId, moduleId, majorVersion, minorVersion " "FROM documentImports WHERE sourceId IN carray(?1) AND kind=?2 ORDER BY sourceId, " "moduleId, majorVersion, minorVersion", database}; - WriteStatement<5> insertDocumentImportWithoutVersionStatement{ + ReadWriteStatement<1, 5> insertDocumentImportWithoutVersionStatement{ "INSERT INTO documentImports(sourceId, moduleId, sourceModuleId, kind, " - "moduleExportedModuleId) VALUES (?1, ?2, ?3, ?4, ?5)", + "parentImportId) VALUES (?1, ?2, ?3, ?4, ?5) RETURNING importId", database}; - WriteStatement<6> insertDocumentImportWithMajorVersionStatement{ + ReadWriteStatement<1, 6> insertDocumentImportWithMajorVersionStatement{ "INSERT INTO documentImports(sourceId, moduleId, sourceModuleId, kind, majorVersion, " - "moduleExportedModuleId) VALUES (?1, ?2, ?3, ?4, ?5, ?6)", + "parentImportId) VALUES (?1, ?2, ?3, ?4, ?5, ?6) RETURNING importId", database}; - WriteStatement<7> insertDocumentImportWithVersionStatement{ + ReadWriteStatement<1, 7> insertDocumentImportWithVersionStatement{ "INSERT INTO documentImports(sourceId, moduleId, sourceModuleId, kind, majorVersion, " - "minorVersion, moduleExportedModuleId) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7)", + "minorVersion, parentImportId) VALUES (?1, ?2, ?3, ?4, ?5, ?6, ?7) RETURNING " + "importId", database}; WriteStatement<1> deleteDocumentImportStatement{"DELETE FROM documentImports WHERE importId=?1", database}; + WriteStatement<2> deleteDocumentImportsWithParentImportIdStatement{ + "DELETE FROM documentImports WHERE sourceId=?1 AND parentImportId=?2", database}; WriteStatement<1> deleteDocumentImportsWithSourceIdsStatement{ "DELETE FROM documentImports WHERE sourceId IN carray(?1)", database}; ReadStatement<1, 2> selectPropertyDeclarationIdPrototypeChainDownStatement{ @@ -3328,7 +3335,7 @@ public: database}; WriteStatement<1> deleteModuleExportedImportStatement{ "DELETE FROM moduleExportedImports WHERE moduleExportedImportId=?1", database}; - mutable ReadStatement<4, 3> selectModuleExportedImportsForModuleIdStatement{ + mutable ReadStatement<3, 3> selectModuleExportedImportsForModuleIdStatement{ "WITH RECURSIVE " " imports(moduleId, majorVersion, minorVersion, moduleExportedImportId) AS ( " " SELECT exportedModuleId, " @@ -3342,8 +3349,7 @@ public: " iif(mei.isAutoVersion=1, i.minorVersion, mei.minorVersion), " " mei.moduleExportedImportId " " FROM moduleExportedImports AS mei JOIN imports AS i USING(moduleId)) " - "SELECT DISTINCT moduleId, ifnull(majorVersion, -1), ifnull(minorVersion, -1), " - " moduleExportedImportId " + "SELECT DISTINCT moduleId, ifnull(majorVersion, -1), ifnull(minorVersion, -1) " "FROM imports", database}; mutable ReadStatement<1, 1> selectPropertyDeclarationIdsForTypeStatement{ diff --git a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp index 14974f71232..f6ea7a015a7 100644 --- a/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp +++ b/tests/unit/tests/unittests/projectstorage/projectstorage-test.cpp @@ -5332,6 +5332,19 @@ TEST_F(ProjectStorage, module_exported_import) UnorderedElementsAre(IsExportedType(myModuleModuleId, "MyItem")))))); } +TEST_F(ProjectStorage, module_exported_import_deletes_indirect_imports_too) +{ + auto package{createModuleExportedImportSynchronizationPackage()}; + storage.synchronize(package); + SynchronizationPackage packageWhichDeletesImports; + packageWhichDeletesImports.updatedSourceIds = package.updatedSourceIds; + storage.synchronize(packageWhichDeletesImports); + + auto imports = storage.fetchDocumentImports(); + + ASSERT_THAT(imports, IsEmpty()); +} + TEST_F(ProjectStorage, module_exported_import_with_different_versions) { auto package{createModuleExportedImportSynchronizationPackage()}; |