From 13df04ca02861dc956100c434c653f4100317f58 Mon Sep 17 00:00:00 2001 From: Rafal Stawarski Date: Fri, 24 Jan 2025 13:54:53 +0100 Subject: [PATCH] QmlDesigner::Model - changes in id generator Add undescore if given string starts with a digit, e.g. (_123). Generate consecutive id if string belongs to reserved QML keywords, e.g. (text1). Task-number: QDS-13039 Change-Id: I0d5782ae666ea6060a4f765ded58624a08b3255f Reviewed-by: Mahmoud Badri Reviewed-by: Thomas Hartmann --- .../designercore/designercoreutils/uniquename.cpp | 14 +++++++++++--- .../designercoreutils/uniquename-test.cpp | 15 +++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/plugins/qmldesigner/libs/designercore/designercoreutils/uniquename.cpp b/src/plugins/qmldesigner/libs/designercore/designercoreutils/uniquename.cpp index 1f45259b891..dbef5d45953 100644 --- a/src/plugins/qmldesigner/libs/designercore/designercoreutils/uniquename.cpp +++ b/src/plugins/qmldesigner/libs/designercore/designercoreutils/uniquename.cpp @@ -59,19 +59,27 @@ void capitalizeFirstLetter(QString &str) str.front() = str.front().toUpper(); } -void prependUnderscoreIfBanned(QString &id) +void prependUnderscoreIfDigit(QString &id) { - if (id.size() && (id.front().isDigit() || ModelUtils::isBannedQmlId(id))) + if (id.size() && id.front().isDigit()) id.prepend(u'_'); } +void appendDigitIfBannedQmlId(QString &id) +{ + if (ModelUtils::isBannedQmlId(id)) + id.append(u'1'); +} + QString toValidId(QStringView id) { QString validId = filterInvalidLettersAndCapitalizeAfterInvalidLetter(id); lowerFirstLetter(validId); - prependUnderscoreIfBanned(validId); + prependUnderscoreIfDigit(validId); + + appendDigitIfBannedQmlId(validId); return validId; } diff --git a/tests/unit/tests/unittests/designercoreutils/uniquename-test.cpp b/tests/unit/tests/unittests/designercoreutils/uniquename-test.cpp index 51c9969a894..69b14b3ea9f 100644 --- a/tests/unit/tests/unittests/designercoreutils/uniquename-test.cpp +++ b/tests/unit/tests/unittests/designercoreutils/uniquename-test.cpp @@ -61,14 +61,25 @@ TEST(UniqueName, generateId_properly_handles_dot_separated_words) ASSERT_THAT(uniqueId, "fooBarFoo"); } -TEST(UniqueName, generateId_prefixes_with_underscore_if_id_is_a_reserved_word) +TEST(UniqueName, generateId_appends_digit_if_id_is_a_reserved_word) { auto pred = [&](const QString &) -> bool { return false; }; QString id = "for"; QString uniqueId = UniqueName::generateId(id, pred); - ASSERT_THAT(uniqueId, "_for"); + ASSERT_THAT(uniqueId, "for1"); +} + +TEST(UniqueName, generateId_generates_unique_id_if_id_is_a_reserved_word) +{ + QStringList reservedIds{"for1", "for2"}; + auto pred = [&](const QString &newId) -> bool { return reservedIds.contains(newId); }; + QString id = "for"; + + QString uniqueId = UniqueName::generateId(id, pred); + + ASSERT_THAT(uniqueId, "for3"); } TEST(UniqueName, generateId_prefixes_with_underscore_if_id_is_a_number)