qmllint: Resolve aliases in nested objects
So far we've just ignored them. Change-Id: I2ca522ef825a341a3f4bf1c2a42fb0376180cdda Reviewed-by: Fabian Kosmale <fabian.kosmale@qt.io>
This commit is contained in:
parent
ec9d125f55
commit
826b7c3b18
|
@ -30,6 +30,7 @@
|
||||||
|
|
||||||
#include <QtCore/qfileinfo.h>
|
#include <QtCore/qfileinfo.h>
|
||||||
#include <QtCore/qdir.h>
|
#include <QtCore/qdir.h>
|
||||||
|
#include <QtCore/qqueue.h>
|
||||||
|
|
||||||
QT_BEGIN_NAMESPACE
|
QT_BEGIN_NAMESPACE
|
||||||
|
|
||||||
|
@ -60,32 +61,33 @@ void QQmlJSImportVisitor::leaveEnvironment()
|
||||||
m_currentScope = m_currentScope->parentScope();
|
m_currentScope = m_currentScope->parentScope();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QQmlJSImportVisitor::resolveAliases()
|
||||||
|
{
|
||||||
|
QQueue<QQmlJSScope::Ptr> objects;
|
||||||
|
objects.enqueue(m_qmlRootScope);
|
||||||
|
|
||||||
|
while (!objects.isEmpty()) {
|
||||||
|
const QQmlJSScope::Ptr object = objects.dequeue();
|
||||||
|
const auto properties = object->properties();
|
||||||
|
for (auto property : properties) {
|
||||||
|
if (!property.isAlias())
|
||||||
|
continue;
|
||||||
|
const auto it = m_scopesById.find(property.typeName());
|
||||||
|
if (it != m_scopesById.end()) {
|
||||||
|
property.setType(QQmlJSScope::ConstPtr(*it));
|
||||||
|
object->addProperty(property);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const auto childScopes = object->childScopes();
|
||||||
|
for (const auto &childScope : childScopes)
|
||||||
|
objects.enqueue(childScope);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QQmlJSScope::Ptr QQmlJSImportVisitor::result() const
|
QQmlJSScope::Ptr QQmlJSImportVisitor::result() const
|
||||||
{
|
{
|
||||||
QQmlJSScope::Ptr result = QQmlJSScope::create();
|
return m_qmlRootScope;
|
||||||
result->setIsComposite(true);
|
|
||||||
result->setBaseTypeName(m_qmlRootScope->baseTypeName());
|
|
||||||
const auto properties = m_qmlRootScope->properties();
|
|
||||||
for (auto property : properties) {
|
|
||||||
if (property.isAlias()) {
|
|
||||||
const auto it = m_scopesById.find(property.typeName());
|
|
||||||
if (it != m_scopesById.end())
|
|
||||||
property.setType(QQmlJSScope::ConstPtr(*it));
|
|
||||||
result->addProperty(property);
|
|
||||||
} else {
|
|
||||||
result->addProperty(property);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (const auto &method : m_qmlRootScope->methods())
|
|
||||||
result->addMethod(method);
|
|
||||||
|
|
||||||
for (const auto &enumerator : m_qmlRootScope->enums())
|
|
||||||
result->addEnum(enumerator);
|
|
||||||
|
|
||||||
result->resolveTypes(m_rootScopeImports);
|
|
||||||
result->setSourceLocation(m_qmlRootScope->sourceLocation());
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void QQmlJSImportVisitor::importExportedNames(QQmlJSScope::ConstPtr scope)
|
void QQmlJSImportVisitor::importExportedNames(QQmlJSScope::ConstPtr scope)
|
||||||
|
@ -126,6 +128,11 @@ bool QQmlJSImportVisitor::visit(QQmlJS::AST::UiProgram *)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void QQmlJSImportVisitor::endVisit(UiProgram *)
|
||||||
|
{
|
||||||
|
resolveAliases();
|
||||||
|
}
|
||||||
|
|
||||||
bool QQmlJSImportVisitor::visit(UiObjectDefinition *definition)
|
bool QQmlJSImportVisitor::visit(UiObjectDefinition *definition)
|
||||||
{
|
{
|
||||||
QString superType;
|
QString superType;
|
||||||
|
|
|
@ -59,6 +59,7 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
bool visit(QQmlJS::AST::UiProgram *) override;
|
bool visit(QQmlJS::AST::UiProgram *) override;
|
||||||
|
void endVisit(QQmlJS::AST::UiProgram *) override;
|
||||||
bool visit(QQmlJS::AST::UiObjectDefinition *) override;
|
bool visit(QQmlJS::AST::UiObjectDefinition *) override;
|
||||||
void endVisit(QQmlJS::AST::UiObjectDefinition *) override;
|
void endVisit(QQmlJS::AST::UiObjectDefinition *) override;
|
||||||
bool visit(QQmlJS::AST::UiPublicMember *) override;
|
bool visit(QQmlJS::AST::UiPublicMember *) override;
|
||||||
|
@ -97,7 +98,7 @@ protected:
|
||||||
QString m_implicitImportDirectory;
|
QString m_implicitImportDirectory;
|
||||||
QStringList m_qmltypesFiles;
|
QStringList m_qmltypesFiles;
|
||||||
QQmlJSScope::Ptr m_currentScope;
|
QQmlJSScope::Ptr m_currentScope;
|
||||||
QQmlJSScope::ConstPtr m_qmlRootScope;
|
QQmlJSScope::Ptr m_qmlRootScope;
|
||||||
QQmlJSScope::ConstPtr m_globalScope;
|
QQmlJSScope::ConstPtr m_globalScope;
|
||||||
QHash<QString, QQmlJSScope::ConstPtr> m_scopesById;
|
QHash<QString, QQmlJSScope::ConstPtr> m_scopesById;
|
||||||
QHash<QString, QQmlJSScope::ConstPtr> m_rootScopeImports;
|
QHash<QString, QQmlJSScope::ConstPtr> m_rootScopeImports;
|
||||||
|
@ -110,6 +111,7 @@ protected:
|
||||||
void leaveEnvironment();
|
void leaveEnvironment();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void resolveAliases();
|
||||||
void visitFunctionExpressionHelper(QQmlJS::AST::FunctionExpression *fexpr);
|
void visitFunctionExpressionHelper(QQmlJS::AST::FunctionExpression *fexpr);
|
||||||
void importExportedNames(QQmlJSScope::ConstPtr scope);
|
void importExportedNames(QQmlJSScope::ConstPtr scope);
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Item {
|
||||||
|
QtObject { id: inner }
|
||||||
|
|
||||||
|
property alias innerObj: inner
|
||||||
|
property string name: innerObj.wrongwrongwrong
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,10 @@
|
||||||
|
import QtQuick
|
||||||
|
|
||||||
|
Item {
|
||||||
|
Item {
|
||||||
|
QtObject { id: inner }
|
||||||
|
|
||||||
|
property alias innerObj: inner
|
||||||
|
property string name: innerObj.objectName
|
||||||
|
}
|
||||||
|
}
|
|
@ -228,6 +228,10 @@ void TestQmllint::dirtyQmlCode_data()
|
||||||
<< QStringLiteral("nanchors3.qml")
|
<< QStringLiteral("nanchors3.qml")
|
||||||
<< QString()
|
<< QString()
|
||||||
<< QString();
|
<< QString();
|
||||||
|
QTest::newRow("badAliasObject")
|
||||||
|
<< QStringLiteral("badAliasObject.qml")
|
||||||
|
<< QString("Warning: Property \"wrongwrongwrong\" not found on type \"QtObject\"")
|
||||||
|
<< QString();
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestQmllint::dirtyQmlCode()
|
void TestQmllint::dirtyQmlCode()
|
||||||
|
@ -287,6 +291,7 @@ void TestQmllint::cleanQmlCode_data()
|
||||||
QTest::newRow("anchors1") << QStringLiteral("anchors1.qml");
|
QTest::newRow("anchors1") << QStringLiteral("anchors1.qml");
|
||||||
QTest::newRow("anchors2") << QStringLiteral("anchors2.qml");
|
QTest::newRow("anchors2") << QStringLiteral("anchors2.qml");
|
||||||
QTest::newRow("optionalImport") << QStringLiteral("optionalImport.qml");
|
QTest::newRow("optionalImport") << QStringLiteral("optionalImport.qml");
|
||||||
|
QTest::newRow("goodAliasObject") << QStringLiteral("goodAliasObject.qml");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TestQmllint::cleanQmlCode()
|
void TestQmllint::cleanQmlCode()
|
||||||
|
|
Loading…
Reference in New Issue