diff options
author | Maximilian Goldstein <max.goldstein@qt.io> | 2021-06-29 13:19:21 +0200 |
---|---|---|
committer | Maximilian Goldstein <max.goldstein@qt.io> | 2021-06-30 10:08:03 +0200 |
commit | 3308e56b2d9802ec8092a348dce44f464617505b (patch) | |
tree | efaa28a6f9c32663369559238e79be8b9818f786 /src/qmlcompiler/qqmljsregistercontent.cpp | |
parent | bf173184bcae532955d158f37376d4da2e8d800c (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.cpp | 149 |
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 |