diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2021-02-22 09:31:30 +0100 |
---|---|---|
committer | Ulf Hermann <ulf.hermann@qt.io> | 2021-02-24 08:33:28 +0100 |
commit | e3ac1db9abe0cef47648072dbe2327be7299c7d4 (patch) | |
tree | 5a75b1277af3d7ea42ce7ba58cc24b0a1758a350 | |
parent | 120eb155ef1f0da51c473b080880169a85e5ceb2 (diff) |
qmllint: Support enum types from other scopes
In qmltypes, enum types can be scoped, just like in C++. Resolve those
scopes.
Also, resolve the enum scopes only once, in order not to duplicate the
types.
Change-Id: I095ec11f0ffec8e0e5f1034023c8956d2d39f660
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit 75b99a10b3229c7ed14ded8622f3334c3cd02af5)
-rw-r--r-- | src/qmlcompiler/qqmljsscope.cpp | 15 | ||||
-rw-r--r-- | tests/auto/qml/qmllint/data/Things/plugins.qmltypes | 1 | ||||
-rw-r--r-- | tests/auto/qml/qmllint/data/externalEnumProperty.qml | 5 | ||||
-rw-r--r-- | tests/auto/qml/qmllint/tst_qmllint.cpp | 1 |
4 files changed, 21 insertions, 1 deletions
diff --git a/src/qmlcompiler/qqmljsscope.cpp b/src/qmlcompiler/qqmljsscope.cpp index 5c3ce8d139..ce4897d20e 100644 --- a/src/qmlcompiler/qqmljsscope.cpp +++ b/src/qmlcompiler/qqmljsscope.cpp @@ -193,11 +193,22 @@ QQmlJSScope::findJSIdentifier(const QString &id) const void QQmlJSScope::resolveTypes(const QQmlJSScope::Ptr &self, const QHash<QString, QQmlJSScope::ConstPtr> &contextualTypes) { - auto findType = [&](const QString &name) { + auto findType = [&](const QString &name) -> QQmlJSScope::ConstPtr { auto type = contextualTypes.constFind(name); if (type != contextualTypes.constEnd()) return *type; + const auto colonColon = name.indexOf(QStringLiteral("::")); + if (colonColon > 0) { + const auto outerType = contextualTypes.constFind(name.left(colonColon)); + if (outerType != contextualTypes.constEnd()) { + for (const auto &innerType : qAsConst((*outerType)->m_childScopes)) { + if (innerType->m_internalName == name) + return innerType; + } + } + } + return QQmlJSScope::ConstPtr(); }; @@ -217,6 +228,8 @@ void QQmlJSScope::resolveTypes(const QQmlJSScope::Ptr &self, Q_ASSERT(intType); // There always has to be a builtin "int" type for (auto it = self->m_enumerations.begin(), end = self->m_enumerations.end(); it != end; ++it) { + if (it->type()) + continue; auto enumScope = QQmlJSScope::create(EnumScope, self); enumScope->m_baseTypeName = QStringLiteral("int"); enumScope->m_baseType = intType; diff --git a/tests/auto/qml/qmllint/data/Things/plugins.qmltypes b/tests/auto/qml/qmllint/data/Things/plugins.qmltypes index 99e1fdc466..9ad8c71468 100644 --- a/tests/auto/qml/qmllint/data/Things/plugins.qmltypes +++ b/tests/auto/qml/qmllint/data/Things/plugins.qmltypes @@ -62,5 +62,6 @@ Module { exports: [ "Things/ItemDerived 1.0" ] + Property { name: "alignment"; type: "Qt::Alignment" } } } diff --git a/tests/auto/qml/qmllint/data/externalEnumProperty.qml b/tests/auto/qml/qmllint/data/externalEnumProperty.qml new file mode 100644 index 0000000000..2ba56a03a4 --- /dev/null +++ b/tests/auto/qml/qmllint/data/externalEnumProperty.qml @@ -0,0 +1,5 @@ +import Things + +ItemDerived { + alignment: Qt.AlignCenter +} diff --git a/tests/auto/qml/qmllint/tst_qmllint.cpp b/tests/auto/qml/qmllint/tst_qmllint.cpp index db44193871..9c0077582e 100644 --- a/tests/auto/qml/qmllint/tst_qmllint.cpp +++ b/tests/auto/qml/qmllint/tst_qmllint.cpp @@ -382,6 +382,7 @@ void TestQmllint::cleanQmlCode_data() QTest::newRow("layouts depends quick") << QStringLiteral("layouts.qml"); QTest::newRow("attached") << QStringLiteral("attached.qml"); QTest::newRow("enumProperty") << QStringLiteral("enumProperty.qml"); + QTest::newRow("externalEnumProperty") << QStringLiteral("externalEnumProperty.qml"); } void TestQmllint::cleanQmlCode() |