qmllint: fix wrong warning about enum usage

Fixes: QTBUG-83796
Change-Id: I635bbfd98cf7be8418b454626ba7725e92b71c2c
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
Evgeniy A. Dushistov 2020-06-16 23:52:24 +03:00
parent 1b10ce6a08
commit 3615c72b66
6 changed files with 39 additions and 0 deletions

View File

@ -0,0 +1,9 @@
import QtQuick 2.0
Item {
enum Status {
On, Off
}
property int status: EnumAccess1.Off
}

View File

@ -0,0 +1,9 @@
import QtQuick 2.0
Item {
enum Status {
On, Off
}
property int status: EnumAccess1.Status.Off
}

View File

@ -220,6 +220,8 @@ void TestQmllint::cleanQmlCode_data()
QTest::newRow("unknownBuiltinFont") << QStringLiteral("ButtonLoader.qml");
QTest::newRow("confusingImport") << QStringLiteral("Dialog.qml");
QTest::newRow("qualifiedAttached") << QStringLiteral("Drawer.qml");
QTest::newRow("EnumAccess1") << QStringLiteral("EnumAccess1.qml");
QTest::newRow("EnumAccess2") << QStringLiteral("EnumAccess2.qml");
}
void TestQmllint::cleanQmlCode()

View File

@ -173,6 +173,12 @@ bool CheckIdentifiers::checkMemberAccess(const QVector<ScopeTree::FieldMember> &
const auto enums = scope->enums();
for (const auto &enumerator : enums) {
if (enumerator.name() == access.m_name) {
detectedRestrictiveKind = QLatin1String("enum");
detectedRestrictiveName = access.m_name;
expectedNext.append(enumerator.keys());
break;
}
for (const QString &key : enumerator.keys()) {
if (access.m_name == key) {
detectedRestrictiveKind = QLatin1String("enum");

View File

@ -51,6 +51,9 @@ ScopeTree::Ptr ImportedMembersVisitor::result(const QString &scopeName) const
for (const auto &method : m_rootObject->methods())
result->addMethod(method);
for (const auto &enumerator : m_rootObject->enums())
result->addEnum(enumerator);
return result;
}
@ -151,6 +154,15 @@ bool ImportedMembersVisitor::visit(UiScriptBinding *scriptBinding)
return true;
}
bool ImportedMembersVisitor::visit(QQmlJS::AST::UiEnumDeclaration *uied)
{
MetaEnum qmlEnum(uied->name.toString());
for (const auto *member = uied->members; member; member = member->next)
qmlEnum.addKey(member->member.toString());
currentObject()->addEnum(qmlEnum);
return true;
}
void ImportedMembersVisitor::throwRecursionDepthError()
{
m_colorOut->write(QStringLiteral("Error"), Error);

View File

@ -59,6 +59,7 @@ private:
bool visit(QQmlJS::AST::UiPublicMember *) override;
bool visit(QQmlJS::AST::UiSourceElement *) override;
bool visit(QQmlJS::AST::UiScriptBinding *) override;
bool visit(QQmlJS::AST::UiEnumDeclaration *uied) override;
void throwRecursionDepthError() override;
ScopeTree::Ptr currentObject() const { return m_currentObjects.back(); }