[frameworks/ktexttemplate] /: Consider non-empty generic containers "true" as well
Volker Krause <[email protected]>
| Newsgroups | gmane.comp.kde.cvs |
|---|---|
| Message-ID | <[email protected]> |
Git commit 7f5d90c6f2e4696626309202a43d8c85151747a4 by Volker Krause.
Committed on 21/07/2026 at 16:26.
Pushed by vkrause into branch 'master'.
Consider non-empty generic containers "true" as well
We currently only do this for QVariant[List|Map] explicitly, but fail to
handle things like QStringList that way. We can consume those containers
just fine in e.g. loops though.
This would avoid downstream code working around that by converting e.g.
QStringLists into QVariantLists.
M +8 -0 autotests/testdefaulttags.cpp
M +12 -0 src/lib/util.cpp
https://invent.kde.org/frameworks/ktexttemplate/-/commit/7f5d90c6f2e4696626309202a43d8c85151747a4
diff --git a/autotests/testdefaulttags.cpp b/autotests/testdefaulttags.cpp
index c8940a45..00474059 100644
--- a/autotests/testdefaulttags.cpp
+++ b/autotests/testdefaulttags.cpp
@@ -19,6 +19,8 @@
#include "template.h"
#include "util.h"
+using namespace Qt::Literals;
+
using Table = QList<QVariantList>;
using Dict = QHash<QString, QVariant>;
using StringPair = std::pair<QString, QString>;
@@ -888,6 +890,12 @@ void TestDefaultTags::testIfTag_data()
dict.insert(QStringLiteral("var"), f);
QTest::newRow("if-truthiness12") << QStringLiteral("{% if var %}Yes{% else %}No{% endif %}") << dict << QStringLiteral("Yes") << NoError;
+ // generic containers
+ dict.insert(u"nostrings"_s, QStringList());
+ dict.insert(u"strings"_s, QStringList({u"foo"_s}));
+ QTest::newRow("if-thruthiness13") << u"{% if nostrings %}Yes{% else %}No{% endif %}"_s << dict << u"No"_s << NoError;
+ QTest::newRow("if-thruthiness14") << u"{% if strings %}Yes{% else %}No{% endif %}"_s << dict << u"Yes"_s << NoError;
+
dict.clear();
QTest::newRow("if-tag-badarg01") << QStringLiteral("{% if x|default_if_none:y %}yes{% endif %}") << dict << QString() << NoError;
diff --git a/src/lib/util.cpp b/src/lib/util.cpp
index c1f78c01..a1c8c4db 100644
--- a/src/lib/util.cpp
+++ b/src/lib/util.cpp
@@ -11,6 +11,8 @@
#include "metaenumvariable_p.h"
+#include <QAssociativeIterable>
+#include <QSequentialIterable>
#include <QStringList>
QString KTextTemplate::unescapeStringLiteral(const QString &input)
@@ -68,6 +70,16 @@ bool KTextTemplate::variantIsTrue(const QVariant &variant)
}
}
+ // consider any non-empty generic container also "true", like the specific vairant types
+ if (variant.canConvert<QVariantList>()) {
+ const auto iterable = variant.value<QSequentialIterable>();
+ return iterable.begin() != iterable.end();
+ }
+ if (variant.canConvert<QVariantHash>()) {
+ const auto iterable = variant.value<QAssociativeIterable>();
+ return iterable.begin() != iterable.end();
+ }
+
return !getSafeString(variant).get().isEmpty();
}