qmllint: Fix updating of parent property

We need to check for the baseTypeName, not for the internalName. Also,
this is not really the scope's business but a property of how qmllint
sets up its scopes.

Task-number: QTBUG-87116
Change-Id: I8f0e558a4a5861164c6e85f90e3d88e469ea0769
Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
Reviewed-by: Evgeniy Dushistov <dushistov@mail.ru>
This commit is contained in:
Ulf Hermann 2020-10-02 11:17:29 +02:00
parent b1afde8ada
commit febb6ba891
6 changed files with 31 additions and 11 deletions

View File

@ -0,0 +1,6 @@
import QtQuick 2.15
Rectangle {
anchors.horizontalCenter: parent.horizontalCenter
anchors.verticalCenter: parent.verticalCenter
}

View File

@ -0,0 +1,6 @@
import QtQuick 2.15
Rectangle {
nanchors.horizontalCenter: parent.horizontalCenter
nanchors.verticalCenter: parent.verticalCenter
}

View File

@ -203,6 +203,10 @@ void TestQmllint::dirtyQmlCode_data()
<< QStringLiteral("nanchors1.qml")
<< QString()
<< QString();
QTest::newRow("nanchors2")
<< QStringLiteral("nanchors2.qml")
<< QString()
<< QString();
QTest::newRow("nanchors3")
<< QStringLiteral("nanchors3.qml")
<< QString()
@ -221,6 +225,7 @@ void TestQmllint::dirtyQmlCode()
QVERIFY(process.waitForFinished());
QCOMPARE(process.exitStatus(), QProcess::NormalExit);
QEXPECT_FAIL("nanchors1", "Invalid grouped properties are not detected", Abort);
QEXPECT_FAIL("nanchors2", "Invalid grouped properties are not detected", Abort);
QEXPECT_FAIL("nanchors3", "Invalid grouped properties are not detected", Abort);
QVERIFY(process.exitCode() != 0);
});
@ -262,6 +267,7 @@ void TestQmllint::cleanQmlCode_data()
<< QStringLiteral("javascriptMethodsInModuleGood.qml");
QTest::newRow("enumFromQtQml") << QStringLiteral("enumFromQtQml.qml");
QTest::newRow("anchors1") << QStringLiteral("anchors1.qml");
QTest::newRow("anchors2") << QStringLiteral("anchors2.qml");
QTest::newRow("anchors3") << QStringLiteral("anchors3.qml");
}

View File

@ -902,7 +902,19 @@ void FindWarningVisitor::endVisit(QQmlJS::AST::UiObjectDefinition *)
{
auto childScope = m_currentScope;
leaveEnvironment();
childScope->updateParentProperty(m_currentScope);
if (m_currentScope->baseTypeName() == QStringLiteral("Component")
|| m_currentScope->baseTypeName() == QStringLiteral("program")) {
return;
}
const auto properties = childScope->properties();
const auto it = properties.find(QStringLiteral("parent"));
if (it != properties.end()) {
auto property = *it;
property.setType(m_currentScope);
childScope->addProperty(property);
}
}
bool FindWarningVisitor::visit(QQmlJS::AST::FieldMemberExpression *)

View File

@ -190,15 +190,6 @@ void ScopeTree::setExportMetaObjectRevision(int exportIndex, int metaObjectRevis
m_exports[exportIndex].setMetaObjectRevision(metaObjectRevision);
}
void ScopeTree::updateParentProperty(const ScopeTree::ConstPtr &scope)
{
auto it = m_properties.find(QLatin1String("parent"));
if (it != m_properties.end()
&& scope->baseTypeName() != QLatin1String("Component")
&& scope->internalName() != QLatin1String("program"))
it->setType(scope);
}
ScopeTree::Export::Export(QString package, QString type, const ComponentVersion &version,
int metaObjectRevision) :
m_package(std::move(package)),

View File

@ -159,7 +159,6 @@ public:
void addProperty(const MetaProperty &prop) { m_properties.insert(prop.propertyName(), prop); }
QHash<QString, MetaProperty> properties() const { return m_properties; }
void updateParentProperty(const ScopeTree::ConstPtr &scope);
QString defaultPropertyName() const { return m_defaultPropertyName; }
void setDefaultPropertyName(const QString &name) { m_defaultPropertyName = name; }