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 <mahmoud.badri@qt.io>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
This commit is contained in:
Rafal Stawarski
2025-01-24 13:54:53 +01:00
parent 40c2c1bbdb
commit 13df04ca02
2 changed files with 24 additions and 5 deletions

View File

@@ -59,19 +59,27 @@ void capitalizeFirstLetter(QString &str)
str.front() = str.front().toUpper(); 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'_'); id.prepend(u'_');
} }
void appendDigitIfBannedQmlId(QString &id)
{
if (ModelUtils::isBannedQmlId(id))
id.append(u'1');
}
QString toValidId(QStringView id) QString toValidId(QStringView id)
{ {
QString validId = filterInvalidLettersAndCapitalizeAfterInvalidLetter(id); QString validId = filterInvalidLettersAndCapitalizeAfterInvalidLetter(id);
lowerFirstLetter(validId); lowerFirstLetter(validId);
prependUnderscoreIfBanned(validId); prependUnderscoreIfDigit(validId);
appendDigitIfBannedQmlId(validId);
return validId; return validId;
} }

View File

@@ -61,14 +61,25 @@ TEST(UniqueName, generateId_properly_handles_dot_separated_words)
ASSERT_THAT(uniqueId, "fooBarFoo"); 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; }; auto pred = [&](const QString &) -> bool { return false; };
QString id = "for"; QString id = "for";
QString uniqueId = UniqueName::generateId(id, pred); 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) TEST(UniqueName, generateId_prefixes_with_underscore_if_id_is_a_number)