diff options
author | Ulf Hermann <ulf.hermann@qt.io> | 2021-02-12 14:35:48 +0100 |
---|---|---|
committer | Qt Cherry-pick Bot <cherrypick_bot@qt-project.org> | 2021-02-16 14:44:48 +0000 |
commit | 04c16d7c1e06d6bfc33c61e7fda0c59e45c4daaa (patch) | |
tree | 33e9d642de6db48065894cdb6be55ca7e7973acf | |
parent | c0775e9a9cfb9541fc61d788516cfc635338b4f8 (diff) |
qmllint: Don't create properties for "on" assignments
"on" assignments are assignments to the default property, with the
property given interpreted as the target for the inner object.
Change-Id: Ia93a171f759964d2c00d6c0293a5434f588123af
Reviewed-by: Andrei Golubev <andrei.golubev@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
(cherry picked from commit 67c8afff346eae27c6fb833661d179326dd8b153)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r-- | src/qmlcompiler/qqmljsimportvisitor.cpp | 27 | ||||
-rw-r--r-- | tests/auto/qml/qmllint/data/onAssignment.qml | 7 | ||||
-rw-r--r-- | tests/auto/qml/qmllint/tst_qmllint.cpp | 4 |
3 files changed, 26 insertions, 12 deletions
diff --git a/src/qmlcompiler/qqmljsimportvisitor.cpp b/src/qmlcompiler/qqmljsimportvisitor.cpp index 5d858229dd..a1de41e3ca 100644 --- a/src/qmlcompiler/qqmljsimportvisitor.cpp +++ b/src/qmlcompiler/qqmljsimportvisitor.cpp @@ -470,21 +470,22 @@ bool QQmlJSImportVisitor::visit(QQmlJS::AST::FormalParameterList *fpl) bool QQmlJSImportVisitor::visit(QQmlJS::AST::UiObjectBinding *uiob) { // property QtObject __styleData: QtObject {...} - QString name; for (auto id = uiob->qualifiedTypeNameId; id; id = id->next) name += id->name.toString() + QLatin1Char('.'); name.chop(1); - QQmlJSMetaProperty prop; - prop.setPropertyName(uiob->qualifiedId->name.toString()); - prop.setTypeName(name); - prop.setIsWritable(true); - prop.setIsPointer(true); - prop.setIsAlias(name == QLatin1String("alias")); - prop.setType(m_rootScopeImports.value(uiob->qualifiedTypeNameId->name.toString())); - m_currentScope->addOwnProperty(prop); + if (!uiob->hasOnToken) { + QQmlJSMetaProperty prop; + prop.setPropertyName(uiob->qualifiedId->name.toString()); + prop.setTypeName(name); + prop.setIsWritable(true); + prop.setIsPointer(true); + prop.setIsAlias(name == QLatin1String("alias")); + prop.setType(m_rootScopeImports.value(uiob->qualifiedTypeNameId->name.toString())); + m_currentScope->addOwnProperty(prop); + } enterEnvironment(QQmlJSScope::QMLScope, name, uiob->qualifiedTypeNameId ? uiob->qualifiedTypeNameId->identifierToken @@ -500,9 +501,11 @@ void QQmlJSImportVisitor::endVisit(QQmlJS::AST::UiObjectBinding *uiob) const QQmlJSScope::ConstPtr childScope = m_currentScope; leaveEnvironment(); - QQmlJSMetaProperty property = m_currentScope->property(uiob->qualifiedId->name.toString()); - property.setType(childScope); - m_currentScope->addOwnProperty(property); + if (!uiob->hasOnToken) { + QQmlJSMetaProperty property = m_currentScope->property(uiob->qualifiedId->name.toString()); + property.setType(childScope); + m_currentScope->addOwnProperty(property); + } } bool QQmlJSImportVisitor::visit(ExportDeclaration *) diff --git a/tests/auto/qml/qmllint/data/onAssignment.qml b/tests/auto/qml/qmllint/data/onAssignment.qml new file mode 100644 index 0000000000..b754a7f311 --- /dev/null +++ b/tests/auto/qml/qmllint/data/onAssignment.qml @@ -0,0 +1,7 @@ +import QtQuick + +Item { + property bool pressed: false + SequentialAnimation on pressed {} + property int wrong: pressed.loops +} diff --git a/tests/auto/qml/qmllint/tst_qmllint.cpp b/tests/auto/qml/qmllint/tst_qmllint.cpp index 18b5090dcf..12b8f5619f 100644 --- a/tests/auto/qml/qmllint/tst_qmllint.cpp +++ b/tests/auto/qml/qmllint/tst_qmllint.cpp @@ -292,6 +292,10 @@ void TestQmllint::dirtyQmlCode_data() << QStringLiteral("Signal handler for \"onSig\" has more formal parameters " "than the signal it handles.") << QString(); + QTest::newRow("OnAssignment") + << QStringLiteral("onAssignment.qml") + << QStringLiteral("Property \"loops\" not found on type \"bool\"") + << QString(); } void TestQmllint::dirtyQmlCode() |