qmltypes: Handle extension property

Previously Qt Creator ignored the extension property in qmltypes leading to
auto-complete being unavailable for some properties of extended types among other things.

Change-Id: I1bc13b3daf9bbd0a835e9a25f52b9589ad942e75
Reviewed-by: Ulf Hermann <ulf.hermann@qt.io>
This commit is contained in:
Maximilian Goldstein
2021-02-04 17:29:24 +01:00
parent 54e5ff7e05
commit 5943215d99
4 changed files with 18 additions and 0 deletions

View File

@@ -369,6 +369,11 @@ QString FakeMetaObject::attachedTypeName() const
void FakeMetaObject::setAttachedTypeName(const QString &name) void FakeMetaObject::setAttachedTypeName(const QString &name)
{ m_attachedTypeName = name; } { m_attachedTypeName = name; }
QString FakeMetaObject::extensionTypeName() const
{ return m_extensionTypeName; }
void FakeMetaObject::setExtensionTypeName(const QString &name)
{ m_extensionTypeName = name; }
QByteArray FakeMetaObject::calculateFingerprint() const QByteArray FakeMetaObject::calculateFingerprint() const
{ {
QCryptographicHash hash(QCryptographicHash::Sha1); QCryptographicHash hash(QCryptographicHash::Sha1);

View File

@@ -170,6 +170,7 @@ private:
QList<FakeMetaMethod> m_methods; QList<FakeMetaMethod> m_methods;
QString m_defaultPropertyName; QString m_defaultPropertyName;
QString m_attachedTypeName; QString m_attachedTypeName;
QString m_extensionTypeName;
QByteArray m_fingerprint; QByteArray m_fingerprint;
bool m_isSingleton; bool m_isSingleton;
bool m_isCreatable; bool m_isCreatable;
@@ -212,6 +213,8 @@ public:
QString attachedTypeName() const; QString attachedTypeName() const;
void setAttachedTypeName(const QString &name); void setAttachedTypeName(const QString &name);
QString extensionTypeName() const;
void setExtensionTypeName(const QString &name);
QByteArray calculateFingerprint() const; QByteArray calculateFingerprint() const;
void updateFingerprint(); void updateFingerprint();
QByteArray fingerprint() const; QByteArray fingerprint() const;

View File

@@ -358,6 +358,14 @@ void CppComponentValue::processMembers(MemberProcessor *processor) const
attachedType->processMembers(processor); attachedType->processMembers(processor);
} }
// look at extension types
const QString &extensionTypeName = m_metaObject->extensionTypeName();
if (!extensionTypeName.isEmpty()) {
const CppComponentValue *extensionType = valueOwner()->cppQmlTypes().objectByCppName(extensionTypeName);
if (extensionType && extensionType != this) // ### only weak protection against infinite loops
extensionType->processMembers(processor);
}
ObjectValue::processMembers(processor); ObjectValue::processMembers(processor);
} }

View File

@@ -228,6 +228,8 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast)
readMetaObjectRevisions(script, fmo); readMetaObjectRevisions(script, fmo);
} else if (name == QLatin1String("attachedType")) { } else if (name == QLatin1String("attachedType")) {
fmo->setAttachedTypeName(readStringBinding(script)); fmo->setAttachedTypeName(readStringBinding(script));
} else if (name == QLatin1String("extension")) {
fmo->setExtensionTypeName(readStringBinding(script));
} else if (name == QLatin1String("isSingleton")) { } else if (name == QLatin1String("isSingleton")) {
fmo->setIsSingleton(readBoolBinding(script)); fmo->setIsSingleton(readBoolBinding(script));
} else if (name == QLatin1String("isCreatable")) { } else if (name == QLatin1String("isCreatable")) {