diff options
author | Thomas Hartmann <thomas.hartmann@qt.io> | 2022-07-12 20:31:07 +0200 |
---|---|---|
committer | Thomas Hartmann <thomas.hartmann@qt.io> | 2022-07-13 09:52:03 +0000 |
commit | e43e08d77d3314d5b438135002bd3ff4a5ab6bc0 (patch) | |
tree | 1f623d223ba17d77887503d7876f67dc8208a3f4 | |
parent | ab10372b0907019e54c941f4a9b2e614a28e65fc (diff) |
QmlDesigner: Add lookup for alised types in NodeMetaInfo
Aliased types like T.Button require a special code path.
Those lookups are only required for the rewriter and are not used
by application code, since we strip the alias qualification.
Change-Id: Ic74c352655e640b063bb01f03a699182af506de7
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: <github-actions-qt-creator@cristianadam.eu>
Reviewed-by: Thomas Hartmann <thomas.hartmann@qt.io>
-rw-r--r-- | src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp | 52 |
1 files changed, 40 insertions, 12 deletions
diff --git a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp index 634c9aa64b..ba97588952 100644 --- a/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp +++ b/src/plugins/qmldesigner/designercore/metainfo/nodemetainfo.cpp @@ -82,6 +82,15 @@ using PropertyInfo = QPair<PropertyName, TypeName>; QVector<PropertyInfo> getObjectTypes(const ObjectValue *ov, const ContextPtr &context, bool local = false, int rec = 0); + +static QByteArray getUnqualifiedName(const QByteArray &name) +{ + const QList<QByteArray> nameComponents = name.split('.'); + if (nameComponents.size() < 2) + return name; + return nameComponents.constLast(); +} + static TypeName resolveTypeName(const ASTPropertyReference *ref, const ContextPtr &context, QVector<PropertyInfo> &dotProperties) { TypeName type = "unknown"; @@ -789,22 +798,49 @@ NodeMetaInfoPrivate::NodeMetaInfoPrivate(Model *model, TypeName type, int maj, i } else { m_isFileComponent = true; const Imports *imports = context()->imports(document()); - const ImportInfo importInfo = imports->info(lookupNameComponent().constLast(), context().data()); + const ImportInfo importInfo = imports->info(lookupNameComponent().constLast(), + context().data()); + if (importInfo.isValid()) { if (importInfo.type() == ImportType::Library) { m_majorVersion = importInfo.version().majorVersion(); m_minorVersion = importInfo.version().minorVersion(); } - bool prepandName = (importInfo.type() == ImportType::Library || importInfo.type() == ImportType::Directory) - && !m_qualfiedTypeName.contains('.'); + bool prepandName = (importInfo.type() == ImportType::Library + || importInfo.type() == ImportType::Directory) + && !m_qualfiedTypeName.contains('.'); if (prepandName) - m_qualfiedTypeName.prepend(importInfo.name().toUtf8() + '.'); + m_qualfiedTypeName.prepend(importInfo.name().toUtf8() + '.'); } } m_objectValue = objectValue; m_defaultPropertyName = context()->defaultPropertyName(objectValue).toUtf8(); m_isValid = true; setupPrototypes(); + } else { + // Special case for aliased types for the rewriter + + const Imports *imports = context()->imports(document()); + const ImportInfo importInfo = imports->info(QString::fromUtf8(m_qualfiedTypeName), + context().data()); + if (importInfo.isValid()) { + if (importInfo.type() == ImportType::Library) { + m_majorVersion = importInfo.version().majorVersion(); + m_minorVersion = importInfo.version().minorVersion(); + } + + m_qualfiedTypeName = getUnqualifiedName(m_qualfiedTypeName); + + bool prepandName = (importInfo.type() == ImportType::Library + || importInfo.type() == ImportType::Directory); + if (prepandName) + m_qualfiedTypeName.prepend(importInfo.name().toUtf8() + '.'); + } + + m_objectValue = getObjectValue(); + m_defaultPropertyName = context()->defaultPropertyName(objectValue).toUtf8(); + m_isValid = true; + setupPrototypes(); } } } @@ -1033,14 +1069,6 @@ bool NodeMetaInfoPrivate::isPropertyEnum(const PropertyName &propertyName) const return qmlObjectValue->getEnum(QString::fromUtf8(propertyType(propertyName))).isValid(); } -static QByteArray getUnqualifiedName(const QByteArray &name) -{ - const QList<QByteArray> nameComponents = name.split('.'); - if (nameComponents.size() < 2) - return name; - return nameComponents.constLast(); -} - static QByteArray getPackage(const QByteArray &name) { QList<QByteArray> nameComponents = name.split('.'); |