aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsmetatypes.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qmlcompiler/qqmljsmetatypes.cpp')
-rw-r--r--src/qmlcompiler/qqmljsmetatypes.cpp110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/qmlcompiler/qqmljsmetatypes.cpp b/src/qmlcompiler/qqmljsmetatypes.cpp
new file mode 100644
index 0000000000..4155e58728
--- /dev/null
+++ b/src/qmlcompiler/qqmljsmetatypes.cpp
@@ -0,0 +1,110 @@
+// Copyright (C) 2022 The Qt Company Ltd.
+// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only WITH Qt-GPL-exception-1.0
+
+#include "qqmljsmetatypes_p.h"
+#include "qqmljstyperesolver_p.h"
+
+#include "QtQml/private/qqmltranslation_p.h"
+
+QT_BEGIN_NAMESPACE
+
+/*!
+ \internal
+ A binding is valid when it has both a target (m_propertyName is set)
+ and some content set (m_bindingType != Invalid).
+*/
+bool QQmlJSMetaPropertyBinding::isValid() const
+{
+ return !m_propertyName.isEmpty() && bindingType() != QQmlSA::BindingType::Invalid;
+}
+
+bool QQmlJSMetaPropertyBinding::boolValue() const
+{
+ if (auto boolLit = std::get_if<Content::BoolLiteral>(&m_bindingContent))
+ return boolLit->value;
+ // warn
+ return false;
+}
+
+double QQmlJSMetaPropertyBinding::numberValue() const
+{
+ if (auto numberLit = std::get_if<Content::NumberLiteral>(&m_bindingContent))
+ return numberLit->value;
+ // warn
+ return 0;
+}
+
+QString QQmlJSMetaPropertyBinding::stringValue() const
+{
+ if (auto stringLiteral = std::get_if<Content::StringLiteral>(&m_bindingContent))
+ return stringLiteral->value;
+ // warn
+ return {};
+}
+
+QString QQmlJSMetaPropertyBinding::regExpValue() const
+{
+ if (auto regexpLiteral = std::get_if<Content::RegexpLiteral>(&m_bindingContent))
+ return regexpLiteral->value;
+ // warn
+ return {};
+}
+
+ /*!
+ * Extracts the information about translations from a binding.
+ * An additional context string is needed for text based translation (e.g. with qsTr())
+ * and can be obtained from the name of the qml file.
+ *
+ * \sa QQmlTranslation
+ */
+QQmlTranslation QQmlJSMetaPropertyBinding::translationDataValue(QString qmlFileNameForContext) const
+{
+ QQmlTranslation::Data data;
+ if (auto translation = std::get_if<Content::TranslationById>(&m_bindingContent)) {
+ data = QQmlTranslation::QsTrIdData(translation->id, translation->number);
+ } else if (auto translation = std::get_if<Content::TranslationString>(&m_bindingContent)) {
+ const QString context = translation->context.isEmpty()
+ ? QQmlTranslation::contextFromQmlFilename(qmlFileNameForContext)
+ : translation->context;
+ data = QQmlTranslation::QsTrData(context, translation->text, translation->comment,
+ translation->number);
+ }
+ return QQmlTranslation(data);
+}
+
+/*!
+ \internal
+ Uses \a resolver to return the correct type for the stored literal
+ and a null scope pointer if the binding does not contain a literal
+ */
+QSharedPointer<const QQmlJSScope> QQmlJSMetaPropertyBinding::literalType(const QQmlJSTypeResolver *resolver) const
+{
+ Q_ASSERT(resolver);
+ switch (bindingType()) {
+ case BindingType::BoolLiteral:
+ return resolver->boolType();
+ case BindingType::NumberLiteral:
+ return resolver->typeForName(QLatin1String("double"));
+ case BindingType::Translation: // translations are strings
+ case BindingType::TranslationById:
+ case BindingType::StringLiteral:
+ return resolver->stringType();
+ case BindingType::RegExpLiteral:
+ return resolver->typeForName(QLatin1String("regexp"));
+ case BindingType::Null:
+ return resolver->nullType();
+ case BindingType::Invalid:
+ case BindingType::Script:
+ case BindingType::Object:
+ case BindingType::Interceptor:
+ case BindingType::ValueSource:
+ case BindingType::AttachedProperty:
+ case BindingType::GroupProperty:
+ return {};
+ }
+ Q_UNREACHABLE_RETURN({});
+}
+
+QQmlJSMetaPropertyBinding::QQmlJSMetaPropertyBinding() = default;
+
+QT_END_NAMESPACE