QmlDesigner: Remove document imports for deleted documents

Task-number: QDS-4724
Change-Id: Ie5ec1788387c224b48380fa0f256b012f2b7dbcf
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2021-07-22 12:42:30 +02:00
parent 3b33a13661
commit 3ed4c8dd05
2 changed files with 48 additions and 29 deletions

View File

@@ -71,14 +71,18 @@ public:
TypeIds deletedTypeIds;
synchronizeImports(importDependencies, deletedTypeIds, sourceIds);
synchronizeDocuments(documents);
auto sourceIdValues = Utils::transform<std::vector>(sourceIds, [](SourceId sourceId) {
return &sourceId;
});
synchronizeImports(importDependencies, deletedTypeIds, sourceIdValues);
synchronizeDocuments(documents, sourceIdValues);
synchronizeTypes(types,
updatedTypeIds,
insertedAliasPropertyDeclarations,
updatedAliasPropertyDeclarations);
deleteNotUpdatedTypes(updatedTypeIds, sourceIds, deletedTypeIds);
deleteNotUpdatedTypes(updatedTypeIds, sourceIdValues, deletedTypeIds);
linkAliases(insertedAliasPropertyDeclarations, updatedAliasPropertyDeclarations);
@@ -409,22 +413,37 @@ private:
void synchronizeImports(Storage::ImportDependencies &imports,
TypeIds &deletedTypeIds,
const SourceIds &sourceIds)
std::vector<int> &importIdValues)
{
auto importIdValues = Utils::transform<std::vector>(sourceIds, [](SourceId sourceId) {
return &sourceId;
});
synchronizeImportsAndUpdatesImportIds(imports, deletedTypeIds, importIdValues);
synchronizeImportDependencies(createSortedImportDependecies(imports), importIdValues);
}
void synchronizeDocuments(Storage::Documents &documents)
void synchronizeDocuments(Storage::Documents &documents, std::vector<int> &sourceIdValues)
{
deleteDocumentImportsForDeletedDocuments(documents, sourceIdValues);
for (auto &&document : documents)
synchronizeDocumentImports(document.sourceId, document.imports);
}
void deleteDocumentImportsForDeletedDocuments(Storage::Documents &documents,
const std::vector<int> &sourceIdValues)
{
const std::vector<int> documentSourceIds = Utils::transform<std::vector<int>>(
documents, [](const auto &document) { return &document.sourceId; });
std::vector<int> documentSourceIdsToBeDeleted;
std::set_difference(sourceIdValues.begin(),
sourceIdValues.end(),
documentSourceIds.begin(),
documentSourceIds.end(),
std::back_inserter(documentSourceIdsToBeDeleted));
deleteDocumentImportsWithSourceIdsStatement.write(Utils::span{documentSourceIdsToBeDeleted});
}
void synchronizeImportsAndUpdatesImportIds(Storage::ImportDependencies &imports,
TypeIds &deletedTypeIds,
std::vector<int> &importIds)
@@ -693,7 +712,7 @@ private:
}
void deleteNotUpdatedTypes(const TypeIds &updatedTypeIds,
const SourceIds &sourceIds,
std::vector<int> &sourceIdValues,
const TypeIds &deletedTypeIds)
{
std::vector<AliasPropertyDeclaration> relinkableAliasPropertyDeclarations;
@@ -704,10 +723,6 @@ private:
return &typeId;
});
auto sourceIdValues = Utils::transform<std::vector>(sourceIds, [](SourceId sourceId) {
return &sourceId;
});
auto callback = [&](long long typeId) {
deleteType(TypeId{typeId},
relinkableAliasPropertyDeclarations,
@@ -1660,7 +1675,7 @@ private:
Sqlite::Table table;
table.setUseIfNotExists(true);
table.setUseWithoutRowId(true);
table.setName("sourceImports");
table.setName("documentImports");
auto &sourceIdColumn = table.addColumn("sourceId");
auto &importIdColumn = table.addColumn("importId");
@@ -1748,8 +1763,9 @@ public:
mutable ReadStatement<1> selectTypeIdByImportIdsAndNameStatement{
"SELECT typeId FROM types WHERE importId IN carray(?1, ?2, 'int64') AND name=?3", database};
mutable ReadStatement<2> selectTypeIdByImportIdsFromSourceIdAndNameStatement{
"SELECT typeId, typeNameId FROM typeNames JOIN sourceImports USING(importId) WHERE name=?2 "
"AND kind=0 AND sourceImports.sourceId=?1",
"SELECT typeId, typeNameId FROM typeNames JOIN documentImports USING(importId) WHERE "
"name=?2 "
"AND kind=0 AND documentImports.sourceId=?1",
database};
mutable ReadStatement<5> selectTypeByTypeIdStatement{
"SELECT importId, name, (SELECT name FROM types WHERE typeId=outerTypes.prototypeId), "
@@ -1942,8 +1958,9 @@ public:
"kind=1",
database};
mutable ReadStatement<2> selectTypeIdByImportIdsFromSourceIdAndExportedNameStatement{
"SELECT typeId, typeNameId FROM typeNames JOIN sourceImports USING(importId) WHERE name=?2 "
"AND kind=1 AND sourceImports.sourceId=?1",
"SELECT typeId, typeNameId FROM typeNames JOIN documentImports USING(importId) WHERE "
"name=?2 "
"AND kind=1 AND documentImports.sourceId=?1",
database};
mutable ReadStatement<2> selectTypeIdByImportIdAndExportedNameStatement{
"SELECT typeId, typeNameId FROM typeNames WHERE importId=?1 AND name=?2 AND kind=1", database};
@@ -1956,11 +1973,13 @@ public:
"SELECT importId FROM importIds",
database};
mutable ReadStatement<1> selectImportIdsForSourceIdStatement{
"SELECT importId FROM sourceImports WHERE sourceId=? ORDER BY importId", database};
"SELECT importId FROM documentImports WHERE sourceId=? ORDER BY importId", database};
WriteStatement insertImportIdForSourceIdStatement{
"INSERT INTO sourceImports(sourceId, importId) VALUES (?1, ?2)", database};
"INSERT INTO documentImports(sourceId, importId) VALUES (?1, ?2)", database};
WriteStatement deleteImportIdForSourceIdStatement{
"DELETE FROM sourceImports WHERE sourceId=?1 AND importId=?2", database};
"DELETE FROM documentImports WHERE sourceId=?1 AND importId=?2", database};
WriteStatement deleteDocumentImportsWithSourceIdsStatement{
"DELETE FROM documentImports WHERE sourceId=?1 IN carray(?1)", database};
ReadStatement<1> selectPropertyDeclarationIdPrototypeChainDownStatement{
"WITH RECURSIVE "
" typeSelection(typeId, level) AS ("

View File

@@ -630,11 +630,11 @@ protected:
{
importSourceId4 = sourcePathCache.sourceId(importPath4);
auto importDependencies = createImportDependencies();
importDependencies.push_back(
auto newImportDependencies = createImportDependencies();
newImportDependencies.push_back(
Storage::ImportDependency{"Qml2", Storage::VersionNumber{3}, importSourceId4, {}});
return importDependencies;
return newImportDependencies;
}
void setUpImportDependenciesAndDocuments()
@@ -973,7 +973,7 @@ TEST_F(ProjectStorageSlowTest, SynchronizeTypesAddsNewTypesWithMissingImportAndE
TypeAccessSemantics::Reference,
sourceId4,
{Storage::ExportedType{"Object2"}, Storage::ExportedType{"Obj2"}}});
storage.synchronize({}, {Storage::Document{sourceId1, {imports[0]}}}, {}, {});
storage.synchronize({}, {Storage::Document{sourceId1, {imports[0]}}}, {}, {sourceId1});
types[1].prototype = Storage::ExportedType{"Object2"};
ASSERT_THROW(storage.synchronize({}, {}, types, {sourceId1, sourceId2}),
@@ -983,7 +983,7 @@ TEST_F(ProjectStorageSlowTest, SynchronizeTypesAddsNewTypesWithMissingImportAndE
TEST_F(ProjectStorageSlowTest, SynchronizeTypesAddsNewTypesWithMissingImport)
{
Storage::Types types{createTypes()};
storage.synchronize({}, {Storage::Document{sourceId1, {imports[0]}}}, {}, {});
storage.synchronize({}, {Storage::Document{sourceId1, {imports[0]}}}, {}, {sourceId1});
ASSERT_THROW(storage.synchronize({}, {}, types, {sourceId1, sourceId2}),
QmlDesigner::TypeNameDoesNotExists);
@@ -1280,7 +1280,7 @@ TEST_F(ProjectStorageSlowTest,
SynchronizeTypesAddPropertyDeclarationsWithMissingImportIdsForNativeTypes)
{
Storage::Types types{createTypes()};
storage.synchronize({}, {Storage::Document{sourceId1, {imports[1]}}}, {}, {});
storage.synchronize({}, {Storage::Document{sourceId1, {imports[1]}}}, {}, {sourceId1});
types[0].propertyDeclarations.pop_back();
ASSERT_THROW(storage.synchronize({}, {}, types, {}), QmlDesigner::TypeNameDoesNotExists);
@@ -1290,7 +1290,7 @@ TEST_F(ProjectStorageSlowTest,
SynchronizeTypesAddPropertyDeclarationsWithMissingImportIdsForExportedTypes)
{
Storage::Types types{createTypes()};
storage.synchronize({}, {Storage::Document{sourceId1, {imports[0]}}}, {}, {});
storage.synchronize({}, {Storage::Document{sourceId1, {imports[0]}}}, {}, {sourceId1});
types[0].propertyDeclarations[0].typeName = Storage::ExportedType{"Obj"};
ASSERT_THROW(storage.synchronize({}, {}, types, {}), QmlDesigner::TypeNameDoesNotExists);