diff options
author | Fabian Kosmale <fabian.kosmale@qt.io> | 2021-12-06 22:07:41 +0100 |
---|---|---|
committer | Fabian Kosmale <fabian.kosmale@qt.io> | 2021-12-08 14:38:21 +0100 |
commit | d7119d327cacf08b1b2ce678a002a760226b3d0b (patch) | |
tree | e3419fcb561df820b8cfa1884b103ee7dcf4858f /src/qmlcompiler/qqmljsimportvisitor.cpp | |
parent | fa2569262faeaa67a0b040e72ac5897f10980286 (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.cpp | 39 |
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; } |