aboutsummaryrefslogtreecommitdiffstats
path: root/src/qmlcompiler/qqmljsregistercontent.cpp
diff options
context:
space:
mode:
authorMaximilian Goldstein <max.goldstein@qt.io>2021-06-29 13:19:21 +0200
committerMaximilian Goldstein <max.goldstein@qt.io>2021-06-30 10:08:03 +0200
commit3308e56b2d9802ec8092a348dce44f464617505b (patch)
treeefaa28a6f9c32663369559238e79be8b9818f786 /src/qmlcompiler/qqmljsregistercontent.cpp
parentbf173184bcae532955d158f37376d4da2e8d800c (diff)
qmlcompiler: Port type inference code from qmlcachegenplus
Move the type inference code so qmllint can benefit from the improved type analysis. Change-Id: I00b2fad8334ec19fb33a45b3ceec9d6c49d12e93 Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Diffstat (limited to 'src/qmlcompiler/qqmljsregistercontent.cpp')
-rw-r--r--src/qmlcompiler/qqmljsregistercontent.cpp149
1 files changed, 149 insertions, 0 deletions
diff --git a/src/qmlcompiler/qqmljsregistercontent.cpp b/src/qmlcompiler/qqmljsregistercontent.cpp
new file mode 100644
index 0000000000..99c49279f8
--- /dev/null
+++ b/src/qmlcompiler/qqmljsregistercontent.cpp
@@ -0,0 +1,149 @@
+/****************************************************************************
+**
+** Copyright (C) 2021 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of the tools applications of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:GPL-EXCEPT$
+** Commercial License Usage
+** Licensees holding valid commercial Qt licenses may use this file in
+** accordance with the commercial license agreement provided with the
+** Software or, alternatively, in accordance with the terms contained in
+** a written agreement between you and The Qt Company. For licensing terms
+** and conditions see https://www.qt.io/terms-conditions. For further
+** information use the contact form at https://www.qt.io/contact-us.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU
+** General Public License version 3 as published by the Free Software
+** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
+** included in the packaging of this file. Please review the following
+** information to ensure the GNU General Public License requirements will
+** be met: https://www.gnu.org/licenses/gpl-3.0.html.
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#include "qqmljsregistercontent_p.h"
+#include "qqmljstyperesolver_p.h"
+
+QT_BEGIN_NAMESPACE
+
+QString QQmlJSRegisterContent::descriptiveName() const
+{
+ QString result = m_storedType->internalName() + u" of "_qs;
+ const auto scope = [this]() -> QString {
+ return (m_scope->internalName().isEmpty()
+ ? (m_scope->fileName().isEmpty()
+ ? u"??"_qs
+ : (u"(component in "_qs + m_scope->fileName() + u")"_qs))
+ : m_scope->internalName())
+ + u"::"_qs;
+ };
+
+ switch (m_content.index()) {
+ case Type:
+ return result + std::get<QQmlJSScope::ConstPtr>(m_content)->internalName();
+ case Property: {
+ const QQmlJSMetaProperty prop = std::get<QQmlJSMetaProperty>(m_content);
+ return result + scope() + prop.propertyName() + u" with type "_qs + prop.typeName();
+ }
+ case Method: {
+ const auto methods = std::get<QList<QQmlJSMetaMethod>>(m_content);
+ if (methods.isEmpty())
+ return result + scope() + u"(unknown method)"_qs;
+ else
+ return result + scope() + methods[0].methodName() + u"(...)"_qs;
+ }
+ case Enum: {
+ const auto e = std::get<std::pair<QQmlJSMetaEnum, QString>>(m_content);
+ if (e.second.isEmpty())
+ return result + scope() + e.first.name();
+ else
+ return result + scope() + e.first.name() + u"::"_qs + e.second;
+ }
+ }
+ Q_UNREACHABLE();
+ return result + u"wat?"_qs;
+}
+
+bool QQmlJSRegisterContent::isList() const
+{
+ switch (m_content.index()) {
+ case Type:
+ return std::get<QQmlJSScope::ConstPtr>(m_content)->accessSemantics()
+ == QQmlJSScope::AccessSemantics::Sequence;
+ case Property: {
+ const auto prop = std::get<QQmlJSMetaProperty>(m_content);
+ return prop.isList()
+ || prop.type()->accessSemantics() == QQmlJSScope::AccessSemantics::Sequence;
+ }
+ default:
+ return false;
+ }
+}
+
+bool QQmlJSRegisterContent::isWritable() const
+{
+ switch (m_content.index()) {
+ case Property:
+ return std::get<QQmlJSMetaProperty>(m_content).isWritable();
+
+ // TODO: What can we actually write?
+ default:
+ break;
+ }
+
+ return true;
+}
+
+QQmlJSRegisterContent QQmlJSRegisterContent::create(const QQmlJSScope::ConstPtr &storedType,
+ const QQmlJSScope::ConstPtr &type,
+ QQmlJSRegisterContent::ContentVariant variant,
+ const QQmlJSScope::ConstPtr &scope)
+{
+ QQmlJSRegisterContent result(storedType, scope, variant);
+ result.m_content = type;
+ return result;
+}
+
+QQmlJSRegisterContent QQmlJSRegisterContent::create(const QQmlJSScope::ConstPtr &storedType,
+ const QQmlJSMetaProperty &property,
+ QQmlJSRegisterContent::ContentVariant variant,
+ const QQmlJSScope::ConstPtr &scope)
+{
+ QQmlJSRegisterContent result(storedType, scope, variant);
+ result.m_content = property;
+ return result;
+}
+
+QQmlJSRegisterContent QQmlJSRegisterContent::create(const QQmlJSScope::ConstPtr &storedType,
+ const QQmlJSMetaEnum &enumeration,
+ const QString &enumMember,
+ QQmlJSRegisterContent::ContentVariant variant,
+ const QQmlJSScope::ConstPtr &scope)
+{
+ QQmlJSRegisterContent result(storedType, scope, variant);
+ result.m_content = std::make_pair(enumeration, enumMember);
+ return result;
+}
+
+QQmlJSRegisterContent QQmlJSRegisterContent::create(const QQmlJSScope::ConstPtr &storedType,
+ const QList<QQmlJSMetaMethod> &methods,
+ QQmlJSRegisterContent::ContentVariant variant,
+ const QQmlJSScope::ConstPtr &scope)
+{
+ QQmlJSRegisterContent result(storedType, scope, variant);
+ result.m_content = methods;
+ return result;
+}
+
+bool operator==(const QQmlJSRegisterContent &a, const QQmlJSRegisterContent &b)
+{
+ return a.m_storedType == b.m_storedType && a.m_variant == b.m_variant && a.m_scope == b.m_scope
+ && a.m_content == b.m_content;
+}
+
+QT_END_NAMESPACE