diff options
author | Semih Yavuz <semih.yavuz@qt.io> | 2023-08-28 15:35:14 +0200 |
---|---|---|
committer | Semih Yavuz <semih.yavuz@qt.io> | 2023-08-30 15:54:24 +0000 |
commit | fd2d1ceeae8d0b677a41188d7ff2b6ff04e9a01f (patch) | |
tree | ac95a3ad367e8e430a9976d144b897e976014e11 | |
parent | 0bbb5ebccbf7a79c1c5bcd830a903ee3e4e8349a (diff) |
Fix M16 warning restrictions
In case id is not ancestor, we cannot find that ID in m_idStack by
design. The ID of an uncle type could be either popped out or not pushed
in yet. The previous implementation, therefore, doesn't restrict M16
messages if non-ancestor ID is referred.
As a workaround, disable M16 warnings completely if the enclosing type
uses ImmediateProperties.
Amends 012f984c27d8513e304d894f986977548d3c1add
Task-number: QTCREATORBUG-28468
Change-Id: I47326e005753ff7b94057732602cfeb6dc525bbb
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
-rw-r--r-- | src/libs/qmljs/qmljscheck.cpp | 14 | ||||
-rw-r--r-- | tests/auto/qml/codemodel/check/accessById.qml | 21 |
2 files changed, 23 insertions, 12 deletions
diff --git a/src/libs/qmljs/qmljscheck.cpp b/src/libs/qmljs/qmljscheck.cpp index f1e72a7dc2..c1cf61d9dc 100644 --- a/src/libs/qmljs/qmljscheck.cpp +++ b/src/libs/qmljs/qmljscheck.cpp @@ -2048,14 +2048,14 @@ const Value *Check::checkScopeObjectMember(const UiQualifiedId *id) return nullptr; if (!value) { - // We omit M16 messages if the type using ImmediateProperties - // Ideally, we should obtain them through metaobject information - const bool omitMessage = !m_typeStack.isEmpty() - && ((m_typeStack.last() == "PropertyChanges") - || m_typeStack.last() == "Binding") - && !m_idStack.isEmpty() && m_idStack.last().contains(propertyName); - if (!omitMessage) + // We omit M16 messages if the enclosing type have ImmediateProperties classinfo. + // Ideally, we should get this information from metaobject by checking the index + // metaObject->indexOfClassInfo("ImmediatePropertyNames"), for now it's hard coded. + if ( !m_typeStack.isEmpty() + && ((m_typeStack.last() != "PropertyChanges") + && m_typeStack.last() != "Binding")) { addMessage(ErrInvalidPropertyName, id->identifierToken, propertyName); + } return nullptr; } diff --git a/tests/auto/qml/codemodel/check/accessById.qml b/tests/auto/qml/codemodel/check/accessById.qml index dd91ac671e..1fd4b34ca8 100644 --- a/tests/auto/qml/codemodel/check/accessById.qml +++ b/tests/auto/qml/codemodel/check/accessById.qml @@ -28,11 +28,22 @@ Window { Text { id: innerText } - states: State { - name: "widerText" - PropertyChanges { myText.width: undefined } - AnchorChanges { innerRect.width: undefined } // 16 29 37 - } + states: [ + State { + name: "widerText" + PropertyChanges { myText.width: undefined } + AnchorChanges { innerRect.width: undefined } // 16 29 37 + }, + State { + when: root.visible + PropertyChanges { + // change an object property that is not an ancestor + innerRect { + color: "blue" + } + } + } + ] } Binding {rect.width: innerText.width} |