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 012f984c27

Task-number: QTCREATORBUG-28468
Change-Id: I47326e005753ff7b94057732602cfeb6dc525bbb
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
Semih Yavuz
2023-08-28 15:35:14 +02:00
parent 0bbb5ebccb
commit fd2d1ceeae
2 changed files with 23 additions and 12 deletions

View File

@@ -2048,14 +2048,14 @@ const Value *Check::checkScopeObjectMember(const UiQualifiedId *id)
return nullptr; return nullptr;
if (!value) { if (!value) {
// We omit M16 messages if the type using ImmediateProperties // We omit M16 messages if the enclosing type have ImmediateProperties classinfo.
// Ideally, we should obtain them through metaobject information // Ideally, we should get this information from metaobject by checking the index
const bool omitMessage = !m_typeStack.isEmpty() // metaObject->indexOfClassInfo("ImmediatePropertyNames"), for now it's hard coded.
&& ((m_typeStack.last() == "PropertyChanges") if ( !m_typeStack.isEmpty()
|| m_typeStack.last() == "Binding") && ((m_typeStack.last() != "PropertyChanges")
&& !m_idStack.isEmpty() && m_idStack.last().contains(propertyName); && m_typeStack.last() != "Binding")) {
if (!omitMessage)
addMessage(ErrInvalidPropertyName, id->identifierToken, propertyName); addMessage(ErrInvalidPropertyName, id->identifierToken, propertyName);
}
return nullptr; return nullptr;
} }

View File

@@ -28,11 +28,22 @@ Window {
Text { Text {
id: innerText id: innerText
} }
states: State { states: [
name: "widerText" State {
PropertyChanges { myText.width: undefined } name: "widerText"
AnchorChanges { innerRect.width: undefined } // 16 29 37 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} Binding {rect.width: innerText.width}