summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMarco Bubke <marco.bubke@qt.io>2022-02-17 17:51:09 +0100
committerMarco Bubke <marco.bubke@qt.io>2022-04-21 09:30:11 +0000
commit4e1dc8542ad7068383e2fd38a31050c65e0b6bb4 (patch)
tree7b7767dd3c6b6a79f3dce5982c53df45fc37ffd4
parent6772aab7c285d3dbf75e790a5c15092a911c08d0 (diff)
downloadqt-creator-4e1dc8542ad7068383e2fd38a31050c65e0b6bb4.tar.gz
QmlDesigner: Handle function overloads
Functions can be overloaded and we should handle that case. Task-number: QDS-6669 Change-Id: Id4ea197032a61bcba6c30f13d27619768689aff9 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Henning Gründl <henning.gruendl@qt.io>
-rw-r--r--src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h43
-rw-r--r--tests/unit/unittest/projectstorage-test.cpp59
2 files changed, 87 insertions, 15 deletions
diff --git a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h
index 72ff942af2..a24b798f7a 100644
--- a/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h
+++ b/src/plugins/qmldesigner/designercore/projectstorage/projectstorage.h
@@ -1403,7 +1403,7 @@ private:
Sqlite::insertUpdateDelete(range, imports, compareKey, insert, update, remove);
}
- Utils::PathString createJson(const Storage::ParameterDeclarations &parameters)
+ static Utils::PathString createJson(const Storage::ParameterDeclarations &parameters)
{
Utils::PathString json;
json.append("[");
@@ -1437,7 +1437,16 @@ private:
std::sort(functionsDeclarations.begin(),
functionsDeclarations.end(),
[](auto &&first, auto &&second) {
- return Sqlite::compare(first.name, second.name) < 0;
+ auto compare = Sqlite::compare(first.name, second.name);
+
+ if (compare == 0) {
+ Utils::PathString firstSignature{createJson(first.parameters)};
+ Utils::PathString secondSignature{createJson(second.parameters)};
+
+ return Sqlite::compare(firstSignature, secondSignature) < 0;
+ }
+
+ return compare < 0;
});
auto range = selectFunctionDeclarationsForTypeIdStatement
@@ -1445,7 +1454,13 @@ private:
auto compareKey = [](const Storage::FunctionDeclarationView &view,
const Storage::FunctionDeclaration &value) {
- return Sqlite::compare(view.name, value.name);
+ auto nameKey = Sqlite::compare(view.name, value.name);
+ if (nameKey != 0)
+ return nameKey;
+
+ Utils::PathString valueSignature{createJson(value.parameters)};
+
+ return Sqlite::compare(view.signature, valueSignature);
};
auto insert = [&](const Storage::FunctionDeclaration &value) {
@@ -1458,10 +1473,10 @@ private:
const Storage::FunctionDeclaration &value) {
Utils::PathString signature{createJson(value.parameters)};
- if (value.returnTypeName == view.returnTypeName && signature == view.signature)
+ if (value.returnTypeName == view.returnTypeName)
return Sqlite::UpdateChange::No;
- updateFunctionDeclarationStatement.write(&view.id, value.returnTypeName, signature);
+ updateFunctionDeclarationStatement.write(&view.id, value.returnTypeName);
return Sqlite::UpdateChange::Update;
};
@@ -1512,7 +1527,7 @@ private:
Sqlite::insertUpdateDelete(range, signalDeclarations, compareKey, insert, update, remove);
}
- Utils::PathString createJson(const Storage::EnumeratorDeclarations &enumeratorDeclarations)
+ static Utils::PathString createJson(const Storage::EnumeratorDeclarations &enumeratorDeclarations)
{
Utils::PathString json;
json.append("{");
@@ -2121,10 +2136,10 @@ private:
{Sqlite::PrimaryKey{}});
auto &typeIdColumn = table.addColumn("typeId");
auto &nameColumn = table.addColumn("name");
- table.addColumn("signature");
+ auto &signatureColumn = table.addColumn("signature");
table.addColumn("returnTypeName");
- table.addUniqueIndex({typeIdColumn, nameColumn});
+ table.addUniqueIndex({typeIdColumn, nameColumn, signatureColumn});
table.initialize(database);
}
@@ -2137,9 +2152,9 @@ private:
table.addColumn("signalDeclarationId", Sqlite::ColumnType::Integer, {Sqlite::PrimaryKey{}});
auto &typeIdColumn = table.addColumn("typeId");
auto &nameColumn = table.addColumn("name");
- table.addColumn("signature");
+ auto &signatureColumn = table.addColumn("signature");
- table.addUniqueIndex({typeIdColumn, nameColumn});
+ table.addUniqueIndex({typeIdColumn, nameColumn, signatureColumn});
table.initialize(database);
}
@@ -2429,7 +2444,7 @@ public:
database};
mutable ReadStatement<4, 1> selectFunctionDeclarationsForTypeIdStatement{
"SELECT name, returnTypeName, signature, functionDeclarationId FROM "
- "functionDeclarations WHERE typeId=? ORDER BY name",
+ "functionDeclarations WHERE typeId=? ORDER BY name, signature",
database};
mutable ReadStatement<3, 1> selectFunctionDeclarationsForTypeIdWithoutSignatureStatement{
"SELECT name, returnTypeName, functionDeclarationId FROM "
@@ -2444,10 +2459,8 @@ public:
"INSERT INTO functionDeclarations(typeId, name, returnTypeName, signature) VALUES(?1, ?2, "
"?3, ?4)",
database};
- WriteStatement<3> updateFunctionDeclarationStatement{
- "UPDATE functionDeclarations SET returnTypeName=?2, signature=?3 WHERE "
- "functionDeclarationId=?1",
- database};
+ WriteStatement<2> updateFunctionDeclarationStatement{
+ "UPDATE functionDeclarations SET returnTypeName=?2 WHERE functionDeclarationId=?1", database};
WriteStatement<1> deleteFunctionDeclarationStatement{
"DELETE FROM functionDeclarations WHERE functionDeclarationId=?", database};
mutable ReadStatement<3, 1> selectSignalDeclarationsForTypeIdStatement{
diff --git a/tests/unit/unittest/projectstorage-test.cpp b/tests/unit/unittest/projectstorage-test.cpp
index 0f9c4d35ee..3af206fad3 100644
--- a/tests/unit/unittest/projectstorage-test.cpp
+++ b/tests/unit/unittest/projectstorage-test.cpp
@@ -1514,6 +1514,65 @@ TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclaration)
Eq(package.types[0].functionDeclarations[2]))))));
}
+TEST_F(ProjectStorage, SynchronizeTypesAddFunctionDeclarationsWithOverloads)
+{
+ auto package{createSimpleSynchronizationPackage()};
+ package.types[0].functionDeclarations.push_back(Storage::FunctionDeclaration{"execute", "", {}});
+
+ storage.synchronize(package);
+
+ ASSERT_THAT(storage.fetchTypes(),
+ Contains(
+ AllOf(IsStorageType(sourceId1,
+ "QQuickItem",
+ fetchTypeId(sourceId2, "QObject"),
+ TypeAccessSemantics::Reference),
+ Field(&Storage::Type::functionDeclarations,
+ UnorderedElementsAre(Eq(package.types[0].functionDeclarations[0]),
+ Eq(package.types[0].functionDeclarations[1]),
+ Eq(package.types[0].functionDeclarations[2]))))));
+}
+
+TEST_F(ProjectStorage, SynchronizeTypesFunctionDeclarationsAddingOverload)
+{
+ auto package{createSimpleSynchronizationPackage()};
+ storage.synchronize(package);
+ package.types[0].functionDeclarations.push_back(Storage::FunctionDeclaration{"execute", "", {}});
+
+ storage.synchronize(package);
+
+ ASSERT_THAT(storage.fetchTypes(),
+ Contains(
+ AllOf(IsStorageType(sourceId1,
+ "QQuickItem",
+ fetchTypeId(sourceId2, "QObject"),
+ TypeAccessSemantics::Reference),
+ Field(&Storage::Type::functionDeclarations,
+ UnorderedElementsAre(Eq(package.types[0].functionDeclarations[0]),
+ Eq(package.types[0].functionDeclarations[1]),
+ Eq(package.types[0].functionDeclarations[2]))))));
+}
+
+TEST_F(ProjectStorage, SynchronizeTypesFunctionDeclarationsRemovingOverload)
+{
+ auto package{createSimpleSynchronizationPackage()};
+ package.types[0].functionDeclarations.push_back(Storage::FunctionDeclaration{"execute", "", {}});
+ storage.synchronize(package);
+ package.types[0].functionDeclarations.pop_back();
+
+ storage.synchronize(package);
+
+ ASSERT_THAT(storage.fetchTypes(),
+ Contains(
+ AllOf(IsStorageType(sourceId1,
+ "QQuickItem",
+ fetchTypeId(sourceId2, "QObject"),
+ TypeAccessSemantics::Reference),
+ Field(&Storage::Type::functionDeclarations,
+ UnorderedElementsAre(Eq(package.types[0].functionDeclarations[0]),
+ Eq(package.types[0].functionDeclarations[1]))))));
+}
+
TEST_F(ProjectStorage, SynchronizeTypesAddSignalDeclarations)
{
auto package{createSimpleSynchronizationPackage()};