forked from qt-creator/qt-creator
Restrict M16 warnings
Do not warn out invalid property name if the property starts with an id in the same component scope. Small refactoring: Move early-return-likely elements up before any calculations done. Fixes: QTCREATORBUG-28468 Change-Id: I2cbdbc24af42f126db0bbd6027ebe4f96d9c199f Reviewed-by: <github-actions-qt-creator@cristianadam.eu> Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io> Reviewed-by: hjk <hjk@qt.io>
This commit is contained in:
@@ -2003,10 +2003,20 @@ bool Check::visit(TypeOfExpression *ast)
|
||||
/// ### Maybe put this into the context as a helper function.
|
||||
const Value *Check::checkScopeObjectMember(const UiQualifiedId *id)
|
||||
{
|
||||
|
||||
if (!_importsOk)
|
||||
return nullptr;
|
||||
|
||||
if (!id)
|
||||
return nullptr; // ### error?
|
||||
|
||||
if (id->name.isEmpty()) // possible after error recovery
|
||||
return nullptr;
|
||||
|
||||
QString propertyName = id->name.toString();
|
||||
|
||||
if (propertyName == "id" && !id->next)
|
||||
return nullptr; // ### should probably be a special value
|
||||
|
||||
QList<const ObjectValue *> scopeObjects = _scopeChain.qmlScopeObjects();
|
||||
if (scopeObjects.isEmpty())
|
||||
return nullptr;
|
||||
@@ -2021,24 +2031,9 @@ const Value *Check::checkScopeObjectMember(const UiQualifiedId *id)
|
||||
return isAttachedProperty;
|
||||
};
|
||||
|
||||
|
||||
if (! id)
|
||||
return nullptr; // ### error?
|
||||
|
||||
if (id->name.isEmpty()) // possible after error recovery
|
||||
return nullptr;
|
||||
|
||||
QString propertyName = id->name.toString();
|
||||
|
||||
if (propertyName == "id" && !id->next)
|
||||
return nullptr; // ### should probably be a special value
|
||||
|
||||
// attached properties
|
||||
bool isAttachedProperty = getAttachedTypes(propertyName);
|
||||
|
||||
if (scopeObjects.isEmpty())
|
||||
return nullptr;
|
||||
|
||||
// global lookup for first part of id
|
||||
const Value *value = nullptr;
|
||||
for (int i = scopeObjects.size() - 1; i >= 0; --i) {
|
||||
@@ -2053,7 +2048,14 @@ const Value *Check::checkScopeObjectMember(const UiQualifiedId *id)
|
||||
return nullptr;
|
||||
|
||||
if (!value) {
|
||||
addMessage(ErrInvalidPropertyName, id->identifierToken, propertyName);
|
||||
// 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)
|
||||
addMessage(ErrInvalidPropertyName, id->identifierToken, propertyName);
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
|
39
tests/auto/qml/codemodel/check/accessById.qml
Normal file
39
tests/auto/qml/codemodel/check/accessById.qml
Normal file
@@ -0,0 +1,39 @@
|
||||
// Copyright (C) 2023 The Qt Company Ltd.
|
||||
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
|
||||
|
||||
import QtQuick
|
||||
import QtQuick.Window
|
||||
|
||||
Window {
|
||||
id: root
|
||||
width: 640
|
||||
height: 480
|
||||
visible: true
|
||||
title: qsTr("Hello World")
|
||||
|
||||
Rectangle {
|
||||
id: rect
|
||||
|
||||
Rectangle {
|
||||
id: innerRect
|
||||
}
|
||||
}
|
||||
|
||||
Text {
|
||||
id: myText
|
||||
width: 50
|
||||
wrapMode: Text.WordWrap
|
||||
text: "a text string that is longer than 50 pixels"
|
||||
|
||||
Text {
|
||||
id: innerText
|
||||
}
|
||||
states: State {
|
||||
name: "widerText"
|
||||
PropertyChanges { myText.width: undefined }
|
||||
AnchorChanges { innerRect.width: undefined } // 16 29 37
|
||||
}
|
||||
}
|
||||
|
||||
Binding {rect.width: innerText.width}
|
||||
}
|
Reference in New Issue
Block a user