diff options
author | Marco Bubke <marco.bubke@qt.io> | 2022-02-17 17:51:09 +0100 |
---|---|---|
committer | Marco Bubke <marco.bubke@qt.io> | 2022-04-21 09:30:11 +0000 |
commit | 4e1dc8542ad7068383e2fd38a31050c65e0b6bb4 (patch) | |
tree | 7b7767dd3c6b6a79f3dce5982c53df45fc37ffd4 | |
parent | 6772aab7c285d3dbf75e790a5c15092a911c08d0 (diff) | |
download | qt-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.h | 43 | ||||
-rw-r--r-- | tests/unit/unittest/projectstorage-test.cpp | 59 |
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 ¶meters) + static Utils::PathString createJson(const Storage::ParameterDeclarations ¶meters) { 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()}; |