QmlDesigner: Use error notifier for property type name resolving

We can polish it later. But so far the architecture works and the
problematics cases of missing types is handled.

Task-number: QDS-12761
Change-Id: Ifb55a5772fddfa7719a4d690b24b0539679f79ec
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Marco Bubke
2024-05-29 14:37:07 +02:00
parent 55fed73ee4
commit 4046f47174
5 changed files with 1048 additions and 263 deletions

View File

@@ -64,8 +64,11 @@ struct ProjectStorage::Statements
"ORDER BY minorVersion DESC " "ORDER BY minorVersion DESC "
"LIMIT 1", "LIMIT 1",
database}; database};
mutable Sqlite::ReadStatement<3, 1> selectPropertyDeclarationResultByPropertyDeclarationIdStatement{ mutable Sqlite::ReadStatement<4, 1> selectPropertyDeclarationResultByPropertyDeclarationIdStatement{
"SELECT propertyTypeId, propertyDeclarationId, propertyTraits " "SELECT propertyImportedTypeNameId, "
" propertyTypeId, "
" propertyDeclarationId, "
" propertyTraits "
"FROM propertyDeclarations " "FROM propertyDeclarations "
"WHERE propertyDeclarationId=?1 " "WHERE propertyDeclarationId=?1 "
"LIMIT 1", "LIMIT 1",
@@ -141,25 +144,63 @@ struct ProjectStorage::Statements
Sqlite::WriteStatement<1> deleteSignalDeclarationByTypeIdStatement{ Sqlite::WriteStatement<1> deleteSignalDeclarationByTypeIdStatement{
"DELETE FROM signalDeclarations WHERE typeId=?", database}; "DELETE FROM signalDeclarations WHERE typeId=?", database};
Sqlite::WriteStatement<1> deleteTypeStatement{"DELETE FROM types WHERE typeId=?", database}; Sqlite::WriteStatement<1> deleteTypeStatement{"DELETE FROM types WHERE typeId=?", database};
mutable Sqlite::ReadStatement<4, 1> selectPropertyDeclarationsByTypeIdStatement{ mutable Sqlite::ReadStatement<6, 1> selectPropertyDeclarationsByTypeIdStatement{
"SELECT name, propertyTypeId, propertyTraits, (SELECT name FROM " "SELECT "
"propertyDeclarations WHERE propertyDeclarationId=pd.aliasPropertyDeclarationId) FROM " " propertyDeclarationId, "
"propertyDeclarations AS pd WHERE typeId=?", " name, "
" propertyTypeId, "
" propertyTraits, "
" (SELECT name "
" FROM propertyDeclarations "
" WHERE propertyDeclarationId=pd.aliasPropertyDeclarationId), "
" typeId "
"FROM propertyDeclarations AS pd "
"WHERE typeId=?",
database}; database};
Sqlite::ReadStatement<6, 1> selectPropertyDeclarationsForTypeIdStatement{ Sqlite::ReadStatement<6, 1> selectPropertyDeclarationsForTypeIdStatement{
"SELECT name, propertyTraits, propertyTypeId, propertyImportedTypeNameId, " "SELECT "
"propertyDeclarationId, aliasPropertyDeclarationId FROM propertyDeclarations " " name, "
"WHERE typeId=? ORDER BY name", " propertyTraits, "
" propertyTypeId, "
" propertyImportedTypeNameId, "
" propertyDeclarationId, "
" aliasPropertyDeclarationId "
"FROM propertyDeclarations "
"WHERE typeId=? "
"ORDER BY name",
database}; database};
Sqlite::ReadWriteStatement<1, 5> insertPropertyDeclarationStatement{ Sqlite::ReadWriteStatement<1, 5> insertPropertyDeclarationStatement{
"INSERT INTO propertyDeclarations(typeId, name, propertyTypeId, propertyTraits, " "INSERT INTO propertyDeclarations("
"propertyImportedTypeNameId, aliasPropertyDeclarationId) VALUES(?1, ?2, ?3, ?4, ?5, NULL) " " typeId, "
" name, "
" propertyTypeId, "
" propertyTraits, "
" propertyImportedTypeNameId, "
" aliasPropertyDeclarationId) "
"VALUES(?1, ?2, ?3, ?4, ?5, NULL) "
"RETURNING propertyDeclarationId", "RETURNING propertyDeclarationId",
database}; database};
Sqlite::WriteStatement<4> updatePropertyDeclarationStatement{ Sqlite::WriteStatement<4> updatePropertyDeclarationStatement{
"UPDATE propertyDeclarations SET propertyTypeId=?2, propertyTraits=?3, " "UPDATE propertyDeclarations "
"propertyImportedTypeNameId=?4, aliasPropertyDeclarationId=NULL WHERE " "SET "
"propertyDeclarationId=?1", " propertyTypeId=?2, "
" propertyTraits=?3, "
" propertyImportedTypeNameId=?4, "
" aliasPropertyImportedTypeNameId=NULL, "
" aliasPropertyDeclarationName=NULL, "
" aliasPropertyDeclarationTailName=NULL, "
" aliasPropertyDeclarationId=NULL, "
" aliasPropertyDeclarationTailId=NULL "
"WHERE propertyDeclarationId=?1",
database};
Sqlite::WriteStatement<2> resetAliasPropertyDeclarationStatement{
"UPDATE propertyDeclarations "
"SET propertyTypeId=NULL, "
" propertyTraits=?2, "
" propertyImportedTypeNameId=NULL, "
" aliasPropertyDeclarationId=NULL, "
" aliasPropertyDeclarationTailId=NULL "
"WHERE propertyDeclarationId=?1",
database}; database};
Sqlite::WriteStatement<3> updatePropertyAliasDeclarationRecursivelyWithTypeAndTraitsStatement{ Sqlite::WriteStatement<3> updatePropertyAliasDeclarationRecursivelyWithTypeAndTraitsStatement{
"WITH RECURSIVE " "WITH RECURSIVE "
@@ -193,17 +234,30 @@ struct ProjectStorage::Statements
Sqlite::WriteStatement<1> deletePropertyDeclarationStatement{ Sqlite::WriteStatement<1> deletePropertyDeclarationStatement{
"DELETE FROM propertyDeclarations WHERE propertyDeclarationId=?", database}; "DELETE FROM propertyDeclarations WHERE propertyDeclarationId=?", database};
Sqlite::ReadStatement<3, 1> selectPropertyDeclarationsWithAliasForTypeIdStatement{ Sqlite::ReadStatement<3, 1> selectPropertyDeclarationsWithAliasForTypeIdStatement{
"SELECT name, propertyDeclarationId, aliasPropertyDeclarationId FROM propertyDeclarations " "SELECT name, "
"WHERE typeId=? AND aliasPropertyDeclarationId IS NOT NULL ORDER BY name", " propertyDeclarationId, "
" aliasPropertyDeclarationId "
"FROM propertyDeclarations "
"WHERE typeId=? AND aliasPropertyDeclarationId IS NOT NULL "
"ORDER BY name",
database}; database};
Sqlite::WriteStatement<5> updatePropertyDeclarationWithAliasAndTypeStatement{ Sqlite::WriteStatement<5> updatePropertyDeclarationWithAliasAndTypeStatement{
"UPDATE propertyDeclarations SET propertyTypeId=?2, propertyTraits=?3, " "UPDATE propertyDeclarations "
"propertyImportedTypeNameId=?4, aliasPropertyDeclarationId=?5 WHERE " "SET propertyTypeId=?2, "
"propertyDeclarationId=?1", " propertyTraits=?3, "
" propertyImportedTypeNameId=?4, "
" aliasPropertyDeclarationId=?5 "
"WHERE propertyDeclarationId=?1",
database}; database};
Sqlite::ReadWriteStatement<1, 2> insertAliasPropertyDeclarationStatement{ Sqlite::ReadWriteStatement<1, 5> insertAliasPropertyDeclarationStatement{
"INSERT INTO propertyDeclarations(typeId, name) VALUES(?1, ?2) RETURNING " "INSERT INTO propertyDeclarations("
"propertyDeclarationId", " typeId, "
" name, "
" aliasPropertyImportedTypeNameId, "
" aliasPropertyDeclarationName, "
" aliasPropertyDeclarationTailName) "
"VALUES(?1, ?2, ?3, ?4, ?5) "
"RETURNING propertyDeclarationId",
database}; database};
mutable Sqlite::ReadStatement<4, 1> selectFunctionDeclarationsForTypeIdStatement{ mutable Sqlite::ReadStatement<4, 1> selectFunctionDeclarationsForTypeIdStatement{
"SELECT name, returnTypeName, signature, functionDeclarationId FROM " "SELECT name, returnTypeName, signature, functionDeclarationId FROM "
@@ -334,26 +388,26 @@ struct ProjectStorage::Statements
"NULL OR propertyTypeId IS NOT NULL OR propertyTraits IS NOT NULL)", "NULL OR propertyTypeId IS NOT NULL OR propertyTraits IS NOT NULL)",
database}; database};
Sqlite::ReadStatement<5, 1> selectAliasPropertiesDeclarationForPropertiesWithTypeIdStatement{ Sqlite::ReadStatement<5, 1> selectAliasPropertiesDeclarationForPropertiesWithTypeIdStatement{
"SELECT alias.typeId, alias.propertyDeclarationId, alias.propertyImportedTypeNameId, " "SELECT alias.typeId, alias.propertyDeclarationId, alias.aliasPropertyImportedTypeNameId, "
" alias.aliasPropertyDeclarationId, alias.aliasPropertyDeclarationTailId " " alias.aliasPropertyDeclarationId, alias.aliasPropertyDeclarationTailId "
"FROM propertyDeclarations AS alias JOIN propertyDeclarations AS target " "FROM propertyDeclarations AS alias JOIN propertyDeclarations AS target "
" ON alias.aliasPropertyDeclarationId=target.propertyDeclarationId OR " " ON alias.aliasPropertyDeclarationId=target.propertyDeclarationId OR "
" alias.aliasPropertyDeclarationTailId=target.propertyDeclarationId " " alias.aliasPropertyDeclarationTailId=target.propertyDeclarationId "
"WHERE alias.propertyTypeId=?1 " "WHERE alias.propertyTypeId=?1 "
"UNION ALL " "UNION ALL "
"SELECT alias.typeId, alias.propertyDeclarationId, alias.propertyImportedTypeNameId, " "SELECT alias.typeId, alias.propertyDeclarationId, alias.aliasPropertyImportedTypeNameId, "
" alias.aliasPropertyDeclarationId, alias.aliasPropertyDeclarationTailId " " alias.aliasPropertyDeclarationId, alias.aliasPropertyDeclarationTailId "
"FROM propertyDeclarations AS alias JOIN propertyDeclarations AS target " "FROM propertyDeclarations AS alias JOIN propertyDeclarations AS target "
" ON alias.aliasPropertyDeclarationId=target.propertyDeclarationId OR " " ON alias.aliasPropertyDeclarationId=target.propertyDeclarationId OR "
" alias.aliasPropertyDeclarationTailId=target.propertyDeclarationId " " alias.aliasPropertyDeclarationTailId=target.propertyDeclarationId "
"WHERE target.typeId=?1 " "WHERE target.typeId=?1 "
"UNION ALL " "UNION ALL "
"SELECT alias.typeId, alias.propertyDeclarationId, alias.propertyImportedTypeNameId, " "SELECT alias.typeId, alias.propertyDeclarationId, alias.aliasPropertyImportedTypeNameId, "
" alias.aliasPropertyDeclarationId, alias.aliasPropertyDeclarationTailId " " alias.aliasPropertyDeclarationId, alias.aliasPropertyDeclarationTailId "
"FROM propertyDeclarations AS alias JOIN propertyDeclarations AS target " "FROM propertyDeclarations AS alias JOIN propertyDeclarations AS target "
" ON alias.aliasPropertyDeclarationId=target.propertyDeclarationId OR " " ON alias.aliasPropertyDeclarationId=target.propertyDeclarationId OR "
" alias.aliasPropertyDeclarationTailId=target.propertyDeclarationId " " alias.aliasPropertyDeclarationTailId=target.propertyDeclarationId "
"WHERE alias.propertyImportedTypeNameId IN " "WHERE alias.aliasPropertyImportedTypeNameId IN "
" (SELECT importedTypeNameId FROM exportedTypeNames JOIN importedTypeNames USING(name) " " (SELECT importedTypeNameId FROM exportedTypeNames JOIN importedTypeNames USING(name) "
" WHERE typeId=?1)", " WHERE typeId=?1)",
database}; database};
@@ -376,6 +430,30 @@ struct ProjectStorage::Statements
"aliasPropertyDeclarationId IS NULL RETURNING typeId, propertyDeclarationId, " "aliasPropertyDeclarationId IS NULL RETURNING typeId, propertyDeclarationId, "
"propertyImportedTypeNameId", "propertyImportedTypeNameId",
database}; database};
Sqlite::ReadWriteStatement<3, 2> selectPropertyDeclarationForPrototypeIdAndTypeNameStatement{
"SELECT typeId, propertyDeclarationId, propertyImportedTypeNameId "
"FROM propertyDeclarations "
"WHERE propertyTypeId IS ?2 "
" AND propertyImportedTypeNameId IN (SELECT importedTypeNameId "
" FROM "
" importedTypeNames WHERE name=?1)",
database};
Sqlite::ReadWriteStatement<5, 2> selectAliasPropertyDeclarationForPrototypeIdAndTypeNameStatement{
"SELECT alias.typeId, "
" alias.propertyDeclarationId, "
" alias.aliasPropertyImportedTypeNameId, "
" alias.aliasPropertyDeclarationId, "
" alias.aliasPropertyDeclarationTailId "
"FROM propertyDeclarations AS alias "
" JOIN propertyDeclarations AS target "
" ON alias.aliasPropertyDeclarationId=target.propertyDeclarationId "
" OR alias.aliasPropertyDeclarationTailId=target.propertyDeclarationId "
"WHERE alias.propertyTypeId IS ?2 "
" AND target.propertyImportedTypeNameId IN "
" (SELECT importedTypeNameId "
" FROM importedTypeNames "
" WHERE name=?1)",
database};
mutable Sqlite::ReadStatement<1, 1> selectPropertyNameStatement{ mutable Sqlite::ReadStatement<1, 1> selectPropertyNameStatement{
"SELECT name FROM propertyDeclarations WHERE propertyDeclarationId=?", database}; "SELECT name FROM propertyDeclarations WHERE propertyDeclarationId=?", database};
Sqlite::WriteStatement<2> updatePropertyDeclarationTypeStatement{ Sqlite::WriteStatement<2> updatePropertyDeclarationTypeStatement{
@@ -418,7 +496,7 @@ struct ProjectStorage::Statements
"RETURNING typeId, prototypeNameId, extensionNameId", "RETURNING typeId, prototypeNameId, extensionNameId",
database}; database};
Sqlite::ReadStatement<2, 2> selectTypeIdForExtensionIdAndTypeNameStatement{ Sqlite::ReadStatement<2, 2> selectTypeIdForExtensionIdAndTypeNameStatement{
"SELECT typeId , prototypeNameId " "SELECT typeId , extensionNameId "
"FROM types " "FROM types "
"WHERE extensionNameId IN ( " "WHERE extensionNameId IN ( "
" SELECT importedTypeNameId " " SELECT importedTypeNameId "
@@ -443,11 +521,12 @@ struct ProjectStorage::Statements
"SELECT typeId FROM prototypes WHERE typeId IS NOT NULL", "SELECT typeId FROM prototypes WHERE typeId IS NOT NULL",
database}; database};
Sqlite::WriteStatement<3> updatePropertyDeclarationAliasIdAndTypeNameIdStatement{ Sqlite::WriteStatement<3> updatePropertyDeclarationAliasIdAndTypeNameIdStatement{
"UPDATE propertyDeclarations SET aliasPropertyDeclarationId=?2, " "UPDATE propertyDeclarations "
"propertyImportedTypeNameId=?3 WHERE propertyDeclarationId=?1 AND " "SET aliasPropertyDeclarationId=?2, "
"(aliasPropertyDeclarationId IS NOT ?2 OR propertyImportedTypeNameId IS NOT ?3)", " propertyImportedTypeNameId=?3 "
"WHERE propertyDeclarationId=?1",
database}; database};
Sqlite::WriteStatement<1> updatetPropertiesDeclarationValuesOfAliasStatement{ Sqlite::WriteStatement<1> updatePropertiesDeclarationValuesOfAliasStatement{
"WITH RECURSIVE " "WITH RECURSIVE "
" properties(propertyDeclarationId, propertyTypeId, propertyTraits) AS ( " " properties(propertyDeclarationId, propertyTypeId, propertyTraits) AS ( "
" SELECT aliasPropertyDeclarationId, propertyTypeId, propertyTraits FROM " " SELECT aliasPropertyDeclarationId, propertyTypeId, propertyTraits FROM "
@@ -794,6 +873,20 @@ struct ProjectStorage::Statements
" WHERE prototypeId=ts.typeId OR extensionId=ts.typeId)" " WHERE prototypeId=ts.typeId OR extensionId=ts.typeId)"
"SELECT typeId FROM typeSelection", "SELECT typeId FROM typeSelection",
database}; database};
mutable Sqlite::ReadStatement<6, 0> selectBrokenAliasPropertyDeclarationsStatement{
"SELECT typeId, "
" propertyDeclarationId, "
" aliasPropertyImportedTypeNameId, "
" aliasPropertyDeclarationName, "
" aliasPropertyDeclarationTailName, "
" sourceId "
"FROM propertyDeclarations JOIN types USING(typeId) "
"WHERE "
" aliasPropertyImportedTypeNameId IS NOT NULL "
" AND "
" propertyImportedTypeNameId IS NULL "
"LIMIT 1",
database};
}; };
class ProjectStorage::Initializer class ProjectStorage::Initializer
@@ -893,14 +986,17 @@ public:
{Sqlite::PrimaryKey{}}); {Sqlite::PrimaryKey{}});
auto &typeIdColumn = propertyDeclarationTable.addColumn("typeId"); auto &typeIdColumn = propertyDeclarationTable.addColumn("typeId");
auto &nameColumn = propertyDeclarationTable.addColumn("name"); auto &nameColumn = propertyDeclarationTable.addColumn("name");
auto &propertyTypeIdColumn = propertyDeclarationTable.addForeignKeyColumn( auto &propertyTypeIdColumn = propertyDeclarationTable.addColumn(
"propertyTypeId", "propertyTypeId", Sqlite::StrictColumnType::Integer);
typesTable,
Sqlite::ForeignKeyAction::NoAction,
Sqlite::ForeignKeyAction::Restrict);
propertyDeclarationTable.addColumn("propertyTraits", Sqlite::StrictColumnType::Integer); propertyDeclarationTable.addColumn("propertyTraits", Sqlite::StrictColumnType::Integer);
propertyDeclarationTable.addColumn("propertyImportedTypeNameId", auto &propertyImportedTypeNameIdColumn = propertyDeclarationTable.addColumn(
Sqlite::StrictColumnType::Integer); "propertyImportedTypeNameId", Sqlite::StrictColumnType::Integer);
auto &aliasPropertyImportedTypeNameIdColumn = propertyDeclarationTable.addColumn(
"aliasPropertyImportedTypeNameId", Sqlite::StrictColumnType::Integer);
propertyDeclarationTable.addColumn("aliasPropertyDeclarationName",
Sqlite::StrictColumnType::Text);
propertyDeclarationTable.addColumn("aliasPropertyDeclarationTailName",
Sqlite::StrictColumnType::Text);
auto &aliasPropertyDeclarationIdColumn = propertyDeclarationTable.addForeignKeyColumn( auto &aliasPropertyDeclarationIdColumn = propertyDeclarationTable.addForeignKeyColumn(
"aliasPropertyDeclarationId", "aliasPropertyDeclarationId",
propertyDeclarationTable, propertyDeclarationTable,
@@ -913,7 +1009,9 @@ public:
Sqlite::ForeignKeyAction::Restrict); Sqlite::ForeignKeyAction::Restrict);
propertyDeclarationTable.addUniqueIndex({typeIdColumn, nameColumn}); propertyDeclarationTable.addUniqueIndex({typeIdColumn, nameColumn});
propertyDeclarationTable.addIndex({propertyTypeIdColumn}); propertyDeclarationTable.addIndex({propertyTypeIdColumn, propertyImportedTypeNameIdColumn});
propertyDeclarationTable.addIndex(
{aliasPropertyImportedTypeNameIdColumn, propertyImportedTypeNameIdColumn});
propertyDeclarationTable.addIndex({aliasPropertyDeclarationIdColumn}, propertyDeclarationTable.addIndex({aliasPropertyDeclarationIdColumn},
"aliasPropertyDeclarationId IS NOT NULL"); "aliasPropertyDeclarationId IS NOT NULL");
propertyDeclarationTable.addIndex({aliasPropertyDeclarationTailIdColumn}, propertyDeclarationTable.addIndex({aliasPropertyDeclarationTailIdColumn},
@@ -1217,8 +1315,7 @@ void ProjectStorage::synchronize(Storage::Synchronization::SynchronizationPackag
TypeIds deletedTypeIds; TypeIds deletedTypeIds;
Sqlite::withImmediateTransaction(database, [&] { Sqlite::withImmediateTransaction(database, [&] {
AliasPropertyDeclarations insertedAliasPropertyDeclarations; AliasPropertyDeclarations aliasPropertyDeclarationsToLink;
AliasPropertyDeclarations updatedAliasPropertyDeclarations;
AliasPropertyDeclarations relinkableAliasPropertyDeclarations; AliasPropertyDeclarations relinkableAliasPropertyDeclarations;
PropertyDeclarations relinkablePropertyDeclarations; PropertyDeclarations relinkablePropertyDeclarations;
@@ -1243,8 +1340,7 @@ void ProjectStorage::synchronize(Storage::Synchronization::SynchronizationPackag
relinkableExtensions); relinkableExtensions);
synchronizeTypes(package.types, synchronizeTypes(package.types,
updatedTypeIds, updatedTypeIds,
insertedAliasPropertyDeclarations, aliasPropertyDeclarationsToLink,
updatedAliasPropertyDeclarations,
relinkableAliasPropertyDeclarations, relinkableAliasPropertyDeclarations,
relinkablePropertyDeclarations, relinkablePropertyDeclarations,
relinkablePrototypes, relinkablePrototypes,
@@ -1269,7 +1365,9 @@ void ProjectStorage::synchronize(Storage::Synchronization::SynchronizationPackag
relinkableExtensions, relinkableExtensions,
deletedTypeIds); deletedTypeIds);
linkAliases(insertedAliasPropertyDeclarations, updatedAliasPropertyDeclarations); repairBrokenAliasPropertyDeclarations();
linkAliases(aliasPropertyDeclarationsToLink, RaiseError::Yes);
synchronizeDirectoryInfos(package.directoryInfos, package.updatedDirectoryInfoSourceIds); synchronizeDirectoryInfos(package.directoryInfos, package.updatedDirectoryInfoSourceIds);
@@ -2001,6 +2099,7 @@ Storage::Synchronization::Type ProjectStorage::fetchTypeByTypeId(TypeId typeId)
type.functionDeclarations = fetchFunctionDeclarations(type.typeId); type.functionDeclarations = fetchFunctionDeclarations(type.typeId);
type.signalDeclarations = fetchSignalDeclarations(type.typeId); type.signalDeclarations = fetchSignalDeclarations(type.typeId);
type.enumerationDeclarations = fetchEnumerationDeclarations(type.typeId); type.enumerationDeclarations = fetchEnumerationDeclarations(type.typeId);
type.typeId = typeId;
return type; return type;
}); });
@@ -2530,8 +2629,7 @@ void ProjectStorage::synchronizeTypeTrait(const Storage::Synchronization::Type &
void ProjectStorage::synchronizeTypes(Storage::Synchronization::Types &types, void ProjectStorage::synchronizeTypes(Storage::Synchronization::Types &types,
TypeIds &updatedTypeIds, TypeIds &updatedTypeIds,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
AliasPropertyDeclarations &relinkableAliasPropertyDeclarations, AliasPropertyDeclarations &relinkableAliasPropertyDeclarations,
PropertyDeclarations &relinkablePropertyDeclarations, PropertyDeclarations &relinkablePropertyDeclarations,
Prototypes &relinkablePrototypes, Prototypes &relinkablePrototypes,
@@ -2584,10 +2682,7 @@ void ProjectStorage::synchronizeTypes(Storage::Synchronization::Types &types,
syncPrototypesAndExtensions(types, relinkablePrototypes, relinkableExtensions); syncPrototypesAndExtensions(types, relinkablePrototypes, relinkableExtensions);
resetDefaultPropertiesIfChanged(types); resetDefaultPropertiesIfChanged(types);
resetRemovedAliasPropertyDeclarationsToNull(types, relinkableAliasPropertyDeclarations); resetRemovedAliasPropertyDeclarationsToNull(types, relinkableAliasPropertyDeclarations);
syncDeclarations(types, syncDeclarations(types, aliasPropertyDeclarationsToLink, relinkablePropertyDeclarations);
insertedAliasPropertyDeclarations,
updatedAliasPropertyDeclarations,
relinkablePropertyDeclarations);
syncDefaultProperties(types); syncDefaultProperties(types);
} }
@@ -2869,7 +2964,7 @@ void ProjectStorage::handleAliasPropertyDeclarationsWithPropertyType(
auto callback = [&](TypeId typeId_, auto callback = [&](TypeId typeId_,
PropertyDeclarationId propertyDeclarationId, PropertyDeclarationId propertyDeclarationId,
ImportedTypeNameId propertyImportedTypeNameId, ImportedTypeNameId aliasPropertyImportedTypeNameId,
PropertyDeclarationId aliasPropertyDeclarationId, PropertyDeclarationId aliasPropertyDeclarationId,
PropertyDeclarationId aliasPropertyDeclarationTailId) { PropertyDeclarationId aliasPropertyDeclarationTailId) {
auto aliasPropertyName = s->selectPropertyNameStatement.value<Utils::SmallString>( auto aliasPropertyName = s->selectPropertyNameStatement.value<Utils::SmallString>(
@@ -2880,10 +2975,11 @@ void ProjectStorage::handleAliasPropertyDeclarationsWithPropertyType(
aliasPropertyDeclarationTailId); aliasPropertyDeclarationTailId);
relinkableAliasPropertyDeclarations.emplace_back(TypeId{typeId_}, relinkableAliasPropertyDeclarations.emplace_back(TypeId{typeId_},
PropertyDeclarationId{propertyDeclarationId}, propertyDeclarationId,
ImportedTypeNameId{propertyImportedTypeNameId}, aliasPropertyImportedTypeNameId,
std::move(aliasPropertyName), std::move(aliasPropertyName),
std::move(aliasPropertyNameTail)); std::move(aliasPropertyNameTail),
fetchTypeSourceId(typeId_));
s->updateAliasPropertyDeclarationToNullStatement.write(propertyDeclarationId); s->updateAliasPropertyDeclarationToNullStatement.write(propertyDeclarationId);
}; };
@@ -2905,6 +3001,62 @@ void ProjectStorage::handlePropertyDeclarationWithPropertyType(
typeId); typeId);
} }
void ProjectStorage::handlePropertyDeclarationsWithExportedTypeNameAndTypeId(
Utils::SmallStringView exportedTypeName,
TypeId typeId,
PropertyDeclarations &relinkablePropertyDeclarations)
{
using NanotraceHR::keyValue;
NanotraceHR::Tracer tracer{"handle property declarations with exported type name and type id"_t,
projectStorageCategory(),
keyValue("type name", exportedTypeName),
keyValue("type id", typeId),
keyValue("relinkable property declarations",
relinkablePropertyDeclarations)};
s->selectPropertyDeclarationForPrototypeIdAndTypeNameStatement.readTo(relinkablePropertyDeclarations,
exportedTypeName,
typeId);
}
void ProjectStorage::handleAliasPropertyDeclarationsWithExportedTypeNameAndTypeId(
Utils::SmallStringView exportedTypeName,
TypeId typeId,
AliasPropertyDeclarations &relinkableAliasPropertyDeclarations)
{
using NanotraceHR::keyValue;
NanotraceHR::Tracer tracer{"handle alias property declarations with exported type name and type id"_t,
projectStorageCategory(),
keyValue("type name", exportedTypeName),
keyValue("type id", typeId),
keyValue("relinkable alias property declarations",
relinkableAliasPropertyDeclarations)};
auto callback = [&](TypeId typeId_,
PropertyDeclarationId propertyDeclarationId,
ImportedTypeNameId aliasPropertyImportedTypeNameId,
PropertyDeclarationId aliasPropertyDeclarationId,
PropertyDeclarationId aliasPropertyDeclarationTailId) {
auto aliasPropertyName = s->selectPropertyNameStatement.value<Utils::SmallString>(
aliasPropertyDeclarationId);
Utils::SmallString aliasPropertyNameTail;
if (aliasPropertyDeclarationTailId)
aliasPropertyNameTail = s->selectPropertyNameStatement.value<Utils::SmallString>(
aliasPropertyDeclarationTailId);
relinkableAliasPropertyDeclarations.emplace_back(TypeId{typeId_},
propertyDeclarationId,
aliasPropertyImportedTypeNameId,
std::move(aliasPropertyName),
std::move(aliasPropertyNameTail),
fetchTypeSourceId(typeId_));
};
s->selectAliasPropertyDeclarationForPrototypeIdAndTypeNameStatement.readCallback(callback,
exportedTypeName,
typeId);
}
void ProjectStorage::handlePrototypes(TypeId prototypeId, Prototypes &relinkablePrototypes) void ProjectStorage::handlePrototypes(TypeId prototypeId, Prototypes &relinkablePrototypes)
{ {
using NanotraceHR::keyValue; using NanotraceHR::keyValue;
@@ -3002,6 +3154,7 @@ void ProjectStorage::relinkAliasPropertyDeclarations(AliasPropertyDeclarations &
keyValue("deleted type ids", deletedTypeIds)}; keyValue("deleted type ids", deletedTypeIds)};
std::sort(aliasPropertyDeclarations.begin(), aliasPropertyDeclarations.end()); std::sort(aliasPropertyDeclarations.begin(), aliasPropertyDeclarations.end());
// todo remove duplicates
Utils::set_greedy_difference( Utils::set_greedy_difference(
aliasPropertyDeclarations.cbegin(), aliasPropertyDeclarations.cbegin(),
@@ -3011,17 +3164,22 @@ void ProjectStorage::relinkAliasPropertyDeclarations(AliasPropertyDeclarations &
[&](const AliasPropertyDeclaration &alias) { [&](const AliasPropertyDeclaration &alias) {
auto typeId = fetchTypeId(alias.aliasImportedTypeNameId); auto typeId = fetchTypeId(alias.aliasImportedTypeNameId);
if (!typeId) if (typeId) {
throw TypeNameDoesNotExists{fetchImportedTypeName(alias.aliasImportedTypeNameId)}; auto [propertyImportedTypeNameId, propertyTypeId, aliasId, propertyTraits]
= fetchPropertyDeclarationByTypeIdAndNameUngarded(typeId, alias.aliasPropertyName);
auto [propertyTypeId, aliasId, propertyTraits] = fetchPropertyDeclarationByTypeIdAndNameUngarded( s->updatePropertyDeclarationWithAliasAndTypeStatement.write(alias.propertyDeclarationId,
typeId, alias.aliasPropertyName); propertyTypeId,
propertyTraits,
s->updatePropertyDeclarationWithAliasAndTypeStatement.write(alias.propertyDeclarationId, propertyImportedTypeNameId,
propertyTypeId, aliasId);
propertyTraits, } else {
alias.aliasImportedTypeNameId, errorNotifier->typeNameCannotBeResolved(fetchImportedTypeName(
aliasId); alias.aliasImportedTypeNameId),
fetchTypeSourceId(alias.typeId));
s->resetAliasPropertyDeclarationStatement.write(alias.propertyDeclarationId,
Storage::PropertyDeclarationTraits{});
}
}, },
TypeCompare<AliasPropertyDeclaration>{}); TypeCompare<AliasPropertyDeclaration>{});
} }
@@ -3037,6 +3195,9 @@ void ProjectStorage::relinkPropertyDeclarations(PropertyDeclarations &relinkable
keyValue("deleted type ids", deletedTypeIds)}; keyValue("deleted type ids", deletedTypeIds)};
std::sort(relinkablePropertyDeclaration.begin(), relinkablePropertyDeclaration.end()); std::sort(relinkablePropertyDeclaration.begin(), relinkablePropertyDeclaration.end());
relinkablePropertyDeclaration.erase(std::unique(relinkablePropertyDeclaration.begin(),
relinkablePropertyDeclaration.end()),
relinkablePropertyDeclaration.end());
Utils::set_greedy_difference( Utils::set_greedy_difference(
relinkablePropertyDeclaration.cbegin(), relinkablePropertyDeclaration.cbegin(),
@@ -3046,8 +3207,12 @@ void ProjectStorage::relinkPropertyDeclarations(PropertyDeclarations &relinkable
[&](const PropertyDeclaration &property) { [&](const PropertyDeclaration &property) {
TypeId propertyTypeId = fetchTypeId(property.importedTypeNameId); TypeId propertyTypeId = fetchTypeId(property.importedTypeNameId);
if (!propertyTypeId) if (!propertyTypeId) {
throw TypeNameDoesNotExists{fetchImportedTypeName(property.importedTypeNameId)}; errorNotifier->typeNameCannotBeResolved(fetchImportedTypeName(
property.importedTypeNameId),
fetchTypeSourceId(property.typeId));
propertyTypeId = TypeId{};
}
s->updatePropertyDeclarationTypeStatement.write(property.propertyDeclarationId, s->updatePropertyDeclarationTypeStatement.write(property.propertyDeclarationId,
propertyTypeId); propertyTypeId);
@@ -3160,7 +3325,8 @@ PropertyDeclarationId ProjectStorage::fetchAliasId(TypeId aliasTypeId,
aliasPropertyNameTail); aliasPropertyNameTail);
} }
void ProjectStorage::linkAliasPropertyDeclarationAliasIds(const AliasPropertyDeclarations &aliasDeclarations) void ProjectStorage::linkAliasPropertyDeclarationAliasIds(
const AliasPropertyDeclarations &aliasDeclarations, RaiseError raiseError)
{ {
using NanotraceHR::keyValue; using NanotraceHR::keyValue;
NanotraceHR::Tracer tracer{"link alias property declarations alias ids"_t, NanotraceHR::Tracer tracer{"link alias property declarations alias ids"_t,
@@ -3170,17 +3336,22 @@ void ProjectStorage::linkAliasPropertyDeclarationAliasIds(const AliasPropertyDec
for (const auto &aliasDeclaration : aliasDeclarations) { for (const auto &aliasDeclaration : aliasDeclarations) {
auto aliasTypeId = fetchTypeId(aliasDeclaration.aliasImportedTypeNameId); auto aliasTypeId = fetchTypeId(aliasDeclaration.aliasImportedTypeNameId);
if (!aliasTypeId) { if (aliasTypeId) {
throw TypeNameDoesNotExists{ auto aliasId = fetchAliasId(aliasTypeId,
fetchImportedTypeName(aliasDeclaration.aliasImportedTypeNameId)}; aliasDeclaration.aliasPropertyName,
aliasDeclaration.aliasPropertyNameTail);
s->updatePropertyDeclarationAliasIdAndTypeNameIdStatement
.write(aliasDeclaration.propertyDeclarationId,
aliasId,
aliasDeclaration.aliasImportedTypeNameId);
} else if (raiseError == RaiseError::Yes) {
errorNotifier->typeNameCannotBeResolved(fetchImportedTypeName(
aliasDeclaration.aliasImportedTypeNameId),
aliasDeclaration.sourceId);
s->resetAliasPropertyDeclarationStatement.write(aliasDeclaration.propertyDeclarationId,
Storage::PropertyDeclarationTraits{});
} }
auto aliasId = fetchAliasId(aliasTypeId,
aliasDeclaration.aliasPropertyName,
aliasDeclaration.aliasPropertyNameTail);
s->updatePropertyDeclarationAliasIdAndTypeNameIdStatement.write(
aliasDeclaration.propertyDeclarationId, aliasId, aliasDeclaration.aliasImportedTypeNameId);
} }
} }
@@ -3192,7 +3363,7 @@ void ProjectStorage::updateAliasPropertyDeclarationValues(const AliasPropertyDec
keyValue("alias property declarations", aliasDeclarations)}; keyValue("alias property declarations", aliasDeclarations)};
for (const auto &aliasDeclaration : aliasDeclarations) { for (const auto &aliasDeclaration : aliasDeclarations) {
s->updatetPropertiesDeclarationValuesOfAliasStatement.write( s->updatePropertiesDeclarationValuesOfAliasStatement.write(
aliasDeclaration.propertyDeclarationId); aliasDeclaration.propertyDeclarationId);
s->updatePropertyAliasDeclarationRecursivelyStatement.write( s->updatePropertyAliasDeclarationRecursivelyStatement.write(
aliasDeclaration.propertyDeclarationId); aliasDeclaration.propertyDeclarationId);
@@ -3209,20 +3380,29 @@ void ProjectStorage::checkAliasPropertyDeclarationCycles(const AliasPropertyDecl
checkForAliasChainCycle(aliasDeclaration.propertyDeclarationId); checkForAliasChainCycle(aliasDeclaration.propertyDeclarationId);
} }
void ProjectStorage::linkAliases(const AliasPropertyDeclarations &insertedAliasPropertyDeclarations, void ProjectStorage::linkAliases(const AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
const AliasPropertyDeclarations &updatedAliasPropertyDeclarations) RaiseError raiseError)
{ {
using NanotraceHR::keyValue; using NanotraceHR::keyValue;
NanotraceHR::Tracer tracer{"link aliases"_t, projectStorageCategory()}; NanotraceHR::Tracer tracer{"link aliases"_t, projectStorageCategory()};
linkAliasPropertyDeclarationAliasIds(insertedAliasPropertyDeclarations); linkAliasPropertyDeclarationAliasIds(aliasPropertyDeclarationsToLink, raiseError);
linkAliasPropertyDeclarationAliasIds(updatedAliasPropertyDeclarations);
checkAliasPropertyDeclarationCycles(insertedAliasPropertyDeclarations); checkAliasPropertyDeclarationCycles(aliasPropertyDeclarationsToLink);
checkAliasPropertyDeclarationCycles(updatedAliasPropertyDeclarations);
updateAliasPropertyDeclarationValues(insertedAliasPropertyDeclarations); updateAliasPropertyDeclarationValues(aliasPropertyDeclarationsToLink);
updateAliasPropertyDeclarationValues(updatedAliasPropertyDeclarations); }
void ProjectStorage::repairBrokenAliasPropertyDeclarations()
{
using NanotraceHR::keyValue;
NanotraceHR::Tracer tracer{"repair broken alias property declarations"_t,
projectStorageCategory()};
auto brokenAliasPropertyDeclarations = s->selectBrokenAliasPropertyDeclarationsStatement
.values<AliasPropertyDeclaration>();
linkAliases(brokenAliasPropertyDeclarations, RaiseError::No);
} }
void ProjectStorage::synchronizeExportedTypes(const TypeIds &updatedTypeIds, void ProjectStorage::synchronizeExportedTypes(const TypeIds &updatedTypeIds,
@@ -3303,6 +3483,12 @@ void ProjectStorage::synchronizeExportedTypes(const TypeIds &updatedTypeIds,
throw QmlDesigner::ExportedTypeCannotBeInserted{type.name}; throw QmlDesigner::ExportedTypeCannotBeInserted{type.name};
} }
handlePropertyDeclarationsWithExportedTypeNameAndTypeId(type.name,
TypeId{},
relinkablePropertyDeclarations);
handleAliasPropertyDeclarationsWithExportedTypeNameAndTypeId(type.name,
TypeId{},
relinkableAliasPropertyDeclarations);
handlePrototypesWithExportedTypeNameAndTypeId(type.name, unresolvedTypeId, relinkablePrototypes); handlePrototypesWithExportedTypeNameAndTypeId(type.name, unresolvedTypeId, relinkablePrototypes);
handleExtensionsWithExportedTypeNameAndTypeId(type.name, unresolvedTypeId, relinkableExtensions); handleExtensionsWithExportedTypeNameAndTypeId(type.name, unresolvedTypeId, relinkableExtensions);
}; };
@@ -3348,7 +3534,7 @@ void ProjectStorage::synchronizeExportedTypes(const TypeIds &updatedTypeIds,
} }
void ProjectStorage::synchronizePropertyDeclarationsInsertAlias( void ProjectStorage::synchronizePropertyDeclarationsInsertAlias(
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
const Storage::Synchronization::PropertyDeclaration &value, const Storage::Synchronization::PropertyDeclaration &value,
SourceId sourceId, SourceId sourceId,
TypeId typeId) TypeId typeId)
@@ -3358,17 +3544,24 @@ void ProjectStorage::synchronizePropertyDeclarationsInsertAlias(
projectStorageCategory(), projectStorageCategory(),
keyValue("property declaration", value)}; keyValue("property declaration", value)};
auto propertyImportedTypeNameId = fetchImportedTypeNameId(value.typeName, sourceId);
auto callback = [&](PropertyDeclarationId propertyDeclarationId) { auto callback = [&](PropertyDeclarationId propertyDeclarationId) {
insertedAliasPropertyDeclarations.emplace_back(typeId, aliasPropertyDeclarationsToLink.emplace_back(typeId,
propertyDeclarationId, propertyDeclarationId,
fetchImportedTypeNameId(value.typeName, propertyImportedTypeNameId,
sourceId), value.aliasPropertyName,
value.aliasPropertyName, value.aliasPropertyNameTail,
value.aliasPropertyNameTail); sourceId);
return Sqlite::CallbackControl::Abort; return Sqlite::CallbackControl::Abort;
}; };
s->insertAliasPropertyDeclarationStatement.readCallback(callback, typeId, value.name); s->insertAliasPropertyDeclarationStatement.readCallback(callback,
typeId,
value.name,
propertyImportedTypeNameId,
value.aliasPropertyName,
value.aliasPropertyNameTail);
} }
QVarLengthArray<PropertyDeclarationId, 128> ProjectStorage::fetchPropertyDeclarationIds( QVarLengthArray<PropertyDeclarationId, 128> ProjectStorage::fetchPropertyDeclarationIds(
@@ -3452,8 +3645,12 @@ void ProjectStorage::synchronizePropertyDeclarationsInsertProperty(
auto propertyImportedTypeNameId = fetchImportedTypeNameId(value.typeName, sourceId); auto propertyImportedTypeNameId = fetchImportedTypeNameId(value.typeName, sourceId);
auto propertyTypeId = fetchTypeId(propertyImportedTypeNameId); auto propertyTypeId = fetchTypeId(propertyImportedTypeNameId);
if (!propertyTypeId) if (!propertyTypeId) {
throw TypeNameDoesNotExists{fetchImportedTypeName(propertyImportedTypeNameId), sourceId}; auto typeName = std::visit([](auto &&importedTypeName) { return importedTypeName.name; },
value.typeName);
errorNotifier->typeNameCannotBeResolved(typeName, sourceId);
propertyTypeId = TypeId{};
}
auto propertyDeclarationId = s->insertPropertyDeclarationStatement.value<PropertyDeclarationId>( auto propertyDeclarationId = s->insertPropertyDeclarationStatement.value<PropertyDeclarationId>(
typeId, value.name, propertyTypeId, value.traits, propertyImportedTypeNameId); typeId, value.name, propertyTypeId, value.traits, propertyImportedTypeNameId);
@@ -3468,7 +3665,7 @@ void ProjectStorage::synchronizePropertyDeclarationsInsertProperty(
} }
void ProjectStorage::synchronizePropertyDeclarationsUpdateAlias( void ProjectStorage::synchronizePropertyDeclarationsUpdateAlias(
AliasPropertyDeclarations &updatedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
const Storage::Synchronization::PropertyDeclarationView &view, const Storage::Synchronization::PropertyDeclarationView &view,
const Storage::Synchronization::PropertyDeclaration &value, const Storage::Synchronization::PropertyDeclaration &value,
SourceId sourceId) SourceId sourceId)
@@ -3479,12 +3676,13 @@ void ProjectStorage::synchronizePropertyDeclarationsUpdateAlias(
keyValue("property declaration", value), keyValue("property declaration", value),
keyValue("property declaration view", view)}; keyValue("property declaration view", view)};
updatedAliasPropertyDeclarations.emplace_back(view.typeId, aliasPropertyDeclarationsToLink.emplace_back(view.propertyTypeId,
view.id, view.id,
fetchImportedTypeNameId(value.typeName, sourceId), fetchImportedTypeNameId(value.typeName, sourceId),
value.aliasPropertyName, value.aliasPropertyName,
value.aliasPropertyNameTail, value.aliasPropertyNameTail,
view.aliasId); sourceId,
view.aliasId);
} }
Sqlite::UpdateChange ProjectStorage::synchronizePropertyDeclarationsUpdateProperty( Sqlite::UpdateChange ProjectStorage::synchronizePropertyDeclarationsUpdateProperty(
@@ -3503,10 +3701,15 @@ Sqlite::UpdateChange ProjectStorage::synchronizePropertyDeclarationsUpdateProper
auto propertyTypeId = fetchTypeId(propertyImportedTypeNameId); auto propertyTypeId = fetchTypeId(propertyImportedTypeNameId);
if (!propertyTypeId) if (!propertyTypeId) {
throw TypeNameDoesNotExists{fetchImportedTypeName(propertyImportedTypeNameId), sourceId}; auto typeName = std::visit([](auto &&importedTypeName) { return importedTypeName.name; },
value.typeName);
errorNotifier->typeNameCannotBeResolved(typeName, sourceId);
propertyTypeId = TypeId{};
propertyDeclarationIds.push_back(view.id);
}
if (view.traits == value.traits && propertyTypeId == view.typeId if (view.traits == value.traits && compareId(propertyTypeId, view.propertyTypeId)
&& propertyImportedTypeNameId == view.typeNameId) && propertyImportedTypeNameId == view.typeNameId)
return Sqlite::UpdateChange::No; return Sqlite::UpdateChange::No;
@@ -3528,8 +3731,7 @@ void ProjectStorage::synchronizePropertyDeclarations(
TypeId typeId, TypeId typeId,
Storage::Synchronization::PropertyDeclarations &propertyDeclarations, Storage::Synchronization::PropertyDeclarations &propertyDeclarations,
SourceId sourceId, SourceId sourceId,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
PropertyDeclarationIds &propertyDeclarationIds) PropertyDeclarationIds &propertyDeclarationIds)
{ {
NanotraceHR::Tracer tracer{"synchronize property declaration"_t, projectStorageCategory()}; NanotraceHR::Tracer tracer{"synchronize property declaration"_t, projectStorageCategory()};
@@ -3548,7 +3750,7 @@ void ProjectStorage::synchronizePropertyDeclarations(
auto insert = [&](const Storage::Synchronization::PropertyDeclaration &value) { auto insert = [&](const Storage::Synchronization::PropertyDeclaration &value) {
if (value.kind == Storage::Synchronization::PropertyKind::Alias) { if (value.kind == Storage::Synchronization::PropertyKind::Alias) {
synchronizePropertyDeclarationsInsertAlias(insertedAliasPropertyDeclarations, synchronizePropertyDeclarationsInsertAlias(aliasPropertyDeclarationsToLink,
value, value,
sourceId, sourceId,
typeId); typeId);
@@ -3560,7 +3762,7 @@ void ProjectStorage::synchronizePropertyDeclarations(
auto update = [&](const Storage::Synchronization::PropertyDeclarationView &view, auto update = [&](const Storage::Synchronization::PropertyDeclarationView &view,
const Storage::Synchronization::PropertyDeclaration &value) { const Storage::Synchronization::PropertyDeclaration &value) {
if (value.kind == Storage::Synchronization::PropertyKind::Alias) { if (value.kind == Storage::Synchronization::PropertyKind::Alias) {
synchronizePropertyDeclarationsUpdateAlias(updatedAliasPropertyDeclarations, synchronizePropertyDeclarationsUpdateAlias(aliasPropertyDeclarationsToLink,
view, view,
value, value,
sourceId); sourceId);
@@ -4254,8 +4456,7 @@ TypeId ProjectStorage::declareType(Storage::Synchronization::Type &type)
} }
void ProjectStorage::syncDeclarations(Storage::Synchronization::Type &type, void ProjectStorage::syncDeclarations(Storage::Synchronization::Type &type,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
PropertyDeclarationIds &propertyDeclarationIds) PropertyDeclarationIds &propertyDeclarationIds)
{ {
NanotraceHR::Tracer tracer{"synchronize declaration per type"_t, projectStorageCategory()}; NanotraceHR::Tracer tracer{"synchronize declaration per type"_t, projectStorageCategory()};
@@ -4266,8 +4467,7 @@ void ProjectStorage::syncDeclarations(Storage::Synchronization::Type &type,
synchronizePropertyDeclarations(type.typeId, synchronizePropertyDeclarations(type.typeId,
type.propertyDeclarations, type.propertyDeclarations,
type.sourceId, type.sourceId,
insertedAliasPropertyDeclarations, aliasPropertyDeclarationsToLink,
updatedAliasPropertyDeclarations,
propertyDeclarationIds); propertyDeclarationIds);
synchronizeFunctionDeclarations(type.typeId, type.functionDeclarations); synchronizeFunctionDeclarations(type.typeId, type.functionDeclarations);
synchronizeSignalDeclarations(type.typeId, type.signalDeclarations); synchronizeSignalDeclarations(type.typeId, type.signalDeclarations);
@@ -4275,8 +4475,7 @@ void ProjectStorage::syncDeclarations(Storage::Synchronization::Type &type,
} }
void ProjectStorage::syncDeclarations(Storage::Synchronization::Types &types, void ProjectStorage::syncDeclarations(Storage::Synchronization::Types &types,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
PropertyDeclarations &relinkablePropertyDeclarations) PropertyDeclarations &relinkablePropertyDeclarations)
{ {
NanotraceHR::Tracer tracer{"synchronize declaration"_t, projectStorageCategory()}; NanotraceHR::Tracer tracer{"synchronize declaration"_t, projectStorageCategory()};
@@ -4285,10 +4484,7 @@ void ProjectStorage::syncDeclarations(Storage::Synchronization::Types &types,
propertyDeclarationIds.reserve(types.size() * 10); propertyDeclarationIds.reserve(types.size() * 10);
for (auto &&type : types) for (auto &&type : types)
syncDeclarations(type, syncDeclarations(type, aliasPropertyDeclarationsToLink, propertyDeclarationIds);
insertedAliasPropertyDeclarations,
updatedAliasPropertyDeclarations,
propertyDeclarationIds);
removeRelinkableEntries(relinkablePropertyDeclarations, removeRelinkableEntries(relinkablePropertyDeclarations,
propertyDeclarationIds, propertyDeclarationIds,

View File

@@ -40,6 +40,7 @@ class ProjectStorage final : public ProjectStorageInterface
friend Storage::Info::CommonTypeCache<ProjectStorageType>; friend Storage::Info::CommonTypeCache<ProjectStorageType>;
enum class Relink { No, Yes }; enum class Relink { No, Yes };
enum class RaiseError { No, Yes };
public: public:
ProjectStorage(Database &database, ProjectStorage(Database &database,
@@ -352,6 +353,7 @@ private:
ImportedTypeNameId aliasImportedTypeNameId, ImportedTypeNameId aliasImportedTypeNameId,
Utils::SmallString aliasPropertyName, Utils::SmallString aliasPropertyName,
Utils::SmallString aliasPropertyNameTail, Utils::SmallString aliasPropertyNameTail,
SourceId sourceId,
PropertyDeclarationId aliasPropertyDeclarationId = PropertyDeclarationId{}) PropertyDeclarationId aliasPropertyDeclarationId = PropertyDeclarationId{})
: typeId{typeId} : typeId{typeId}
, propertyDeclarationId{propertyDeclarationId} , propertyDeclarationId{propertyDeclarationId}
@@ -359,6 +361,21 @@ private:
, aliasPropertyName{std::move(aliasPropertyName)} , aliasPropertyName{std::move(aliasPropertyName)}
, aliasPropertyNameTail{std::move(aliasPropertyNameTail)} , aliasPropertyNameTail{std::move(aliasPropertyNameTail)}
, aliasPropertyDeclarationId{aliasPropertyDeclarationId} , aliasPropertyDeclarationId{aliasPropertyDeclarationId}
, sourceId{sourceId}
{}
AliasPropertyDeclaration(TypeId typeId,
PropertyDeclarationId propertyDeclarationId,
ImportedTypeNameId aliasImportedTypeNameId,
Utils::SmallStringView aliasPropertyName,
Utils::SmallStringView aliasPropertyNameTail,
SourceId sourceId)
: typeId{typeId}
, propertyDeclarationId{propertyDeclarationId}
, aliasImportedTypeNameId{aliasImportedTypeNameId}
, aliasPropertyName{aliasPropertyName}
, aliasPropertyNameTail{aliasPropertyNameTail}
, sourceId{sourceId}
{} {}
friend bool operator<(const AliasPropertyDeclaration &first, friend bool operator<(const AliasPropertyDeclaration &first,
@@ -368,6 +385,13 @@ private:
< std::tie(second.typeId, second.propertyDeclarationId); < std::tie(second.typeId, second.propertyDeclarationId);
} }
friend bool operator==(const AliasPropertyDeclaration &first,
const AliasPropertyDeclaration &second)
{
return std::tie(first.typeId, first.propertyDeclarationId)
== std::tie(second.typeId, second.propertyDeclarationId);
}
template<typename String> template<typename String>
friend void convertToString(String &string, friend void convertToString(String &string,
const AliasPropertyDeclaration &aliasPropertyDeclaration) const AliasPropertyDeclaration &aliasPropertyDeclaration)
@@ -394,6 +418,7 @@ private:
Utils::SmallString aliasPropertyName; Utils::SmallString aliasPropertyName;
Utils::SmallString aliasPropertyNameTail; Utils::SmallString aliasPropertyNameTail;
PropertyDeclarationId aliasPropertyDeclarationId; PropertyDeclarationId aliasPropertyDeclarationId;
SourceId sourceId;
}; };
using AliasPropertyDeclarations = std::vector<AliasPropertyDeclaration>; using AliasPropertyDeclarations = std::vector<AliasPropertyDeclaration>;
@@ -409,6 +434,12 @@ private:
, importedTypeNameId{std::move(importedTypeNameId)} , importedTypeNameId{std::move(importedTypeNameId)}
{} {}
friend bool operator==(const PropertyDeclaration &first, const PropertyDeclaration &second)
{
return std::tie(first.typeId, first.propertyDeclarationId)
== std::tie(second.typeId, second.propertyDeclarationId);
}
friend bool operator<(const PropertyDeclaration &first, const PropertyDeclaration &second) friend bool operator<(const PropertyDeclaration &first, const PropertyDeclaration &second)
{ {
return std::tie(first.typeId, first.propertyDeclarationId) return std::tie(first.typeId, first.propertyDeclarationId)
@@ -569,8 +600,7 @@ private:
void synchronizeTypes(Storage::Synchronization::Types &types, void synchronizeTypes(Storage::Synchronization::Types &types,
TypeIds &updatedTypeIds, TypeIds &updatedTypeIds,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
AliasPropertyDeclarations &relinkableAliasPropertyDeclarations, AliasPropertyDeclarations &relinkableAliasPropertyDeclarations,
PropertyDeclarations &relinkablePropertyDeclarations, PropertyDeclarations &relinkablePropertyDeclarations,
Prototypes &relinkablePrototypes, Prototypes &relinkablePrototypes,
@@ -605,7 +635,14 @@ private:
void handlePropertyDeclarationWithPropertyType(TypeId typeId, void handlePropertyDeclarationWithPropertyType(TypeId typeId,
PropertyDeclarations &relinkablePropertyDeclarations); PropertyDeclarations &relinkablePropertyDeclarations);
void handlePropertyDeclarationsWithExportedTypeNameAndTypeId(
Utils::SmallStringView exportedTypeName,
TypeId typeId,
PropertyDeclarations &relinkablePropertyDeclarations);
void handleAliasPropertyDeclarationsWithExportedTypeNameAndTypeId(
Utils::SmallStringView exportedTypeName,
TypeId typeId,
AliasPropertyDeclarations &relinkableAliasPropertyDeclarations);
void handlePrototypes(TypeId prototypeId, Prototypes &relinkablePrototypes); void handlePrototypes(TypeId prototypeId, Prototypes &relinkablePrototypes);
void handlePrototypesWithExportedTypeNameAndTypeId(Utils::SmallStringView exportedTypeName, void handlePrototypesWithExportedTypeNameAndTypeId(Utils::SmallStringView exportedTypeName,
TypeId typeId, TypeId typeId,
@@ -651,14 +688,17 @@ private:
Utils::SmallStringView aliasPropertyName, Utils::SmallStringView aliasPropertyName,
Utils::SmallStringView aliasPropertyNameTail); Utils::SmallStringView aliasPropertyNameTail);
void linkAliasPropertyDeclarationAliasIds(const AliasPropertyDeclarations &aliasDeclarations); void linkAliasPropertyDeclarationAliasIds(const AliasPropertyDeclarations &aliasDeclarations,
RaiseError raiseError);
void updateAliasPropertyDeclarationValues(const AliasPropertyDeclarations &aliasDeclarations); void updateAliasPropertyDeclarationValues(const AliasPropertyDeclarations &aliasDeclarations);
void checkAliasPropertyDeclarationCycles(const AliasPropertyDeclarations &aliasDeclarations); void checkAliasPropertyDeclarationCycles(const AliasPropertyDeclarations &aliasDeclarations);
void linkAliases(const AliasPropertyDeclarations &insertedAliasPropertyDeclarations, void linkAliases(const AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
const AliasPropertyDeclarations &updatedAliasPropertyDeclarations); RaiseError raiseError);
void repairBrokenAliasPropertyDeclarations();
void synchronizeExportedTypes(const TypeIds &updatedTypeIds, void synchronizeExportedTypes(const TypeIds &updatedTypeIds,
Storage::Synchronization::ExportedTypes &exportedTypes, Storage::Synchronization::ExportedTypes &exportedTypes,
@@ -689,7 +729,7 @@ private:
const Storage::Synchronization::PropertyDeclaration &value, SourceId sourceId, TypeId typeId); const Storage::Synchronization::PropertyDeclaration &value, SourceId sourceId, TypeId typeId);
void synchronizePropertyDeclarationsUpdateAlias( void synchronizePropertyDeclarationsUpdateAlias(
AliasPropertyDeclarations &updatedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
const Storage::Synchronization::PropertyDeclarationView &view, const Storage::Synchronization::PropertyDeclarationView &view,
const Storage::Synchronization::PropertyDeclaration &value, const Storage::Synchronization::PropertyDeclaration &value,
SourceId sourceId); SourceId sourceId);
@@ -700,13 +740,11 @@ private:
SourceId sourceId, SourceId sourceId,
PropertyDeclarationIds &propertyDeclarationIds); PropertyDeclarationIds &propertyDeclarationIds);
void synchronizePropertyDeclarations( void synchronizePropertyDeclarations(TypeId typeId,
TypeId typeId, Storage::Synchronization::PropertyDeclarations &propertyDeclarations,
Storage::Synchronization::PropertyDeclarations &propertyDeclarations, SourceId sourceId,
SourceId sourceId, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, PropertyDeclarationIds &propertyDeclarationIds);
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
PropertyDeclarationIds &propertyDeclarationIds);
class AliasPropertyDeclarationView class AliasPropertyDeclarationView
{ {
@@ -832,8 +870,7 @@ private:
TypeId declareType(Storage::Synchronization::Type &type); TypeId declareType(Storage::Synchronization::Type &type);
void syncDeclarations(Storage::Synchronization::Type &type, void syncDeclarations(Storage::Synchronization::Type &type,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
PropertyDeclarationIds &propertyDeclarationIds); PropertyDeclarationIds &propertyDeclarationIds);
template<typename Relinkable, typename Ids, typename Compare> template<typename Relinkable, typename Ids, typename Compare>
@@ -859,8 +896,7 @@ private:
} }
void syncDeclarations(Storage::Synchronization::Types &types, void syncDeclarations(Storage::Synchronization::Types &types,
AliasPropertyDeclarations &insertedAliasPropertyDeclarations, AliasPropertyDeclarations &aliasPropertyDeclarationsToLink,
AliasPropertyDeclarations &updatedAliasPropertyDeclarations,
PropertyDeclarations &relinkablePropertyDeclarations); PropertyDeclarations &relinkablePropertyDeclarations);
class TypeWithDefaultPropertyView class TypeWithDefaultPropertyView
@@ -924,10 +960,12 @@ private:
class FetchPropertyDeclarationResult class FetchPropertyDeclarationResult
{ {
public: public:
FetchPropertyDeclarationResult(TypeId propertyTypeId, FetchPropertyDeclarationResult(ImportedTypeNameId propertyImportedTypeNameId,
TypeId propertyTypeId,
PropertyDeclarationId propertyDeclarationId, PropertyDeclarationId propertyDeclarationId,
Storage::PropertyDeclarationTraits propertyTraits) Storage::PropertyDeclarationTraits propertyTraits)
: propertyTypeId{propertyTypeId} : propertyImportedTypeNameId{propertyImportedTypeNameId}
, propertyTypeId{propertyTypeId}
, propertyDeclarationId{propertyDeclarationId} , propertyDeclarationId{propertyDeclarationId}
, propertyTraits{propertyTraits} , propertyTraits{propertyTraits}
{} {}
@@ -937,7 +975,9 @@ private:
{ {
using NanotraceHR::dictonary; using NanotraceHR::dictonary;
using NanotraceHR::keyValue; using NanotraceHR::keyValue;
auto dict = dictonary(keyValue("property type id", result.propertyTypeId), auto dict = dictonary(keyValue("property imported type name id",
result.propertyImportedTypeNameId),
keyValue("property type id", result.propertyTypeId),
keyValue("property declaration id", result.propertyDeclarationId), keyValue("property declaration id", result.propertyDeclarationId),
keyValue("property traits", result.propertyTraits)); keyValue("property traits", result.propertyTraits));
@@ -945,6 +985,7 @@ private:
} }
public: public:
ImportedTypeNameId propertyImportedTypeNameId;
TypeId propertyTypeId; TypeId propertyTypeId;
PropertyDeclarationId propertyDeclarationId; PropertyDeclarationId propertyDeclarationId;
Storage::PropertyDeclarationTraits propertyTraits; Storage::PropertyDeclarationTraits propertyTraits;

View File

@@ -870,6 +870,21 @@ public:
, kind{PropertyKind::Property} , kind{PropertyKind::Property}
{} {}
explicit PropertyDeclaration(PropertyDeclarationId propertyDeclarationId,
::Utils::SmallStringView name,
TypeId propertyTypeId,
PropertyDeclarationTraits traits,
::Utils::SmallStringView aliasPropertyName,
TypeId typeId)
: name{name}
, aliasPropertyName{aliasPropertyName}
, traits{traits}
, propertyTypeId{propertyTypeId}
, typeId{typeId}
, propertyDeclarationId{propertyDeclarationId}
, kind{PropertyKind::Property}
{}
explicit PropertyDeclaration(::Utils::SmallStringView name, explicit PropertyDeclaration(::Utils::SmallStringView name,
ImportedTypeName aliasTypeName, ImportedTypeName aliasTypeName,
::Utils::SmallStringView aliasPropertyName, ::Utils::SmallStringView aliasPropertyName,
@@ -916,6 +931,7 @@ public:
PropertyDeclarationTraits traits = {}; PropertyDeclarationTraits traits = {};
TypeId propertyTypeId; TypeId propertyTypeId;
TypeId typeId; TypeId typeId;
PropertyDeclarationId propertyDeclarationId;
PropertyKind kind = PropertyKind::Property; PropertyKind kind = PropertyKind::Property;
}; };
@@ -926,13 +942,13 @@ class PropertyDeclarationView
public: public:
explicit PropertyDeclarationView(::Utils::SmallStringView name, explicit PropertyDeclarationView(::Utils::SmallStringView name,
PropertyDeclarationTraits traits, PropertyDeclarationTraits traits,
TypeId typeId, TypeId propertyTypeId,
ImportedTypeNameId typeNameId, ImportedTypeNameId typeNameId,
PropertyDeclarationId id, PropertyDeclarationId id,
PropertyDeclarationId aliasId) PropertyDeclarationId aliasId)
: name{name} : name{name}
, traits{traits} , traits{traits}
, typeId{typeId} , propertyTypeId{propertyTypeId}
, typeNameId{typeNameId} , typeNameId{typeNameId}
, id{id} , id{id}
, aliasId{aliasId} , aliasId{aliasId}
@@ -945,7 +961,7 @@ public:
using NanotraceHR::keyValue; using NanotraceHR::keyValue;
auto dict = dictonary(keyValue("name", propertyDeclaration.name), auto dict = dictonary(keyValue("name", propertyDeclaration.name),
keyValue("traits", propertyDeclaration.traits), keyValue("traits", propertyDeclaration.traits),
keyValue("type id", propertyDeclaration.typeId), keyValue("type id", propertyDeclaration.propertyTypeId),
keyValue("type name id", propertyDeclaration.typeNameId), keyValue("type name id", propertyDeclaration.typeNameId),
keyValue("id", propertyDeclaration.id), keyValue("id", propertyDeclaration.id),
keyValue("alias id", propertyDeclaration.aliasId)); keyValue("alias id", propertyDeclaration.aliasId));
@@ -956,7 +972,7 @@ public:
public: public:
::Utils::SmallStringView name; ::Utils::SmallStringView name;
PropertyDeclarationTraits traits = {}; PropertyDeclarationTraits traits = {};
TypeId typeId; TypeId propertyTypeId;
ImportedTypeNameId typeNameId; ImportedTypeNameId typeNameId;
PropertyDeclarationId id; PropertyDeclarationId id;
PropertyDeclarationId aliasId; PropertyDeclarationId aliasId;

View File

@@ -705,8 +705,7 @@ std::ostream &operator<<(std::ostream &out, const PropertyDeclaration &propertyD
{ {
using Utils::operator<<; using Utils::operator<<;
return out << "(\"" << propertyDeclaration.typeId << "\", " << propertyDeclaration.name << ", " return out << "(\"" << propertyDeclaration.typeId << "\", " << propertyDeclaration.name << ", "
<< propertyDeclaration.typeId << ", " << propertyDeclaration.traits << ", " << propertyDeclaration.traits << ", " << propertyDeclaration.propertyTypeId << ")";
<< propertyDeclaration.propertyTypeId << ")";
} }
std::ostream &operator<<(std::ostream &out, const Type &type) std::ostream &operator<<(std::ostream &out, const Type &type)