aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsimportvisitor.cpp
diff options
context:
space:
mode:
authorFabian Kosmale <fabian.kosmale@qt.io>2021-12-06 22:07:41 +0100
committerFabian Kosmale <fabian.kosmale@qt.io>2021-12-08 14:38:21 +0100
commitd7119d327cacf08b1b2ce678a002a760226b3d0b (patch)
treee3419fcb561df820b8cfa1884b103ee7dcf4858f /src/qmlcompiler/qqmljsimportvisitor.cpp
parentfa2569262faeaa67a0b040e72ac5897f10980286 (diff)
qmllint: Initial translation binding support
We will need to distinguish between script and translation bindings in the future (to correctly assign script binding indices). Moreover, the NOOP translation functions actually produce string literal bindings, not translation bindings. To unify the classification of translation bindings, the code from the IRBuilder has been converted into a template taking a few callbacks. This change does not add validation for translation bindings yet, but a failing autotest for a case where it would be necesseray is already provided. Change-Id: Icccba98edbdcd15068188807e8622c1bd513725c Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Diffstat (limited to 'src/qmlcompiler/qqmljsimportvisitor.cpp')
-rw-r--r--src/qmlcompiler/qqmljsimportvisitor.cpp39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/qmlcompiler/qqmljsimportvisitor.cpp b/src/qmlcompiler/qqmljsimportvisitor.cpp
index 254c282e26..fab5982c2a 100644
--- a/src/qmlcompiler/qqmljsimportvisitor.cpp
+++ b/src/qmlcompiler/qqmljsimportvisitor.cpp
@@ -39,6 +39,7 @@
#include <QtQml/private/qv4codegen_p.h>
#include <QtQml/private/qqmlstringconverters_p.h>
+#include <QtQml/private/qqmlirbuilder_p.h>
#include <algorithm>
@@ -1323,6 +1324,32 @@ void QQmlJSImportVisitor::endVisit(QQmlJS::AST::ClassExpression *)
leaveEnvironment();
}
+
+// ### TODO: add warning about suspicious translation binding when returning false?
+static std::optional<QQmlJSMetaPropertyBinding> handleTranslationBinding(QStringView base, QQmlJS::AST::ArgumentList *args,
+ const QHash<QString, QQmlJSScope::ConstPtr> &rootScopeImports)
+{
+ std::optional<QQmlJSMetaPropertyBinding> maybeBinding = std::nullopt;
+ QStringView mainString;
+ auto registerMainString = [&](QStringView string) {
+ mainString = string;
+ return 0;
+ };
+ auto discardCommentString = [](QStringView) {return -1;};
+ auto finalizeBinding = [&](QV4::CompiledData::Binding::ValueType type, QV4::CompiledData::TranslationData) {
+ QQmlJSMetaPropertyBinding binding;
+ if (type == QV4::CompiledData::Binding::Type_Translation)
+ binding.setTranslation(mainString);
+ else if (type == QV4::CompiledData::Binding::Type_TranslationById)
+ binding.setTarnslationId(mainString);
+ else
+ binding.setLiteral(QQmlJSMetaPropertyBinding::StringLiteral, u"string"_qs, mainString.toString(), rootScopeImports[u"string"_qs]);
+ maybeBinding = binding;
+ };
+ QmlIR::tryGeneratingTranslationBindingBase(base, args, registerMainString, discardCommentString, finalizeBinding);
+ return maybeBinding;
+}
+
void QQmlJSImportVisitor::parseLiteralBinding(const QString name,
const QQmlJS::AST::Statement *statement)
{
@@ -1389,6 +1416,18 @@ void QQmlJSImportVisitor::parseLiteralBinding(const QString name,
bindingType = QQmlJSMetaPropertyBinding::NumberLiteral;
value = -lit->value;
}
+ } else if (QQmlJS::AST::CallExpression *call = QQmlJS::AST::cast<QQmlJS::AST::CallExpression *>(expr)) {
+ if (QQmlJS::AST::IdentifierExpression *base = QQmlJS::AST::cast<QQmlJS::AST::IdentifierExpression *>(call->base)) {
+ if (auto translationBindingOpt = handleTranslationBinding(base->name, call->arguments, m_rootScopeImports)) {
+ auto translationBinding = translationBindingOpt.value();
+ translationBinding.setPropertyName(name);
+ translationBinding.setSourceLocation(expr->firstSourceLocation());
+ m_currentScope->addOwnPropertyBinding(translationBinding);
+ if (translationBinding.bindingType() == QQmlJSMetaPropertyBinding::BindingType::StringLiteral)
+ m_literalScopesToCheck << m_currentScope;
+ return;
+ }
+ }
}
break;
}