From 5943215d9995956de80b29e0adea903670f0d483 Mon Sep 17 00:00:00 2001 From: Maximilian Goldstein Date: Thu, 4 Feb 2021 17:29:24 +0100 Subject: [PATCH] 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 --- src/libs/languageutils/fakemetaobject.cpp | 5 +++++ src/libs/languageutils/fakemetaobject.h | 3 +++ src/libs/qmljs/qmljsinterpreter.cpp | 8 ++++++++ src/libs/qmljs/qmljstypedescriptionreader.cpp | 2 ++ 4 files changed, 18 insertions(+) diff --git a/src/libs/languageutils/fakemetaobject.cpp b/src/libs/languageutils/fakemetaobject.cpp index bf0192509fb..686f1a8123e 100644 --- a/src/libs/languageutils/fakemetaobject.cpp +++ b/src/libs/languageutils/fakemetaobject.cpp @@ -369,6 +369,11 @@ QString FakeMetaObject::attachedTypeName() const void FakeMetaObject::setAttachedTypeName(const QString &name) { m_attachedTypeName = name; } +QString FakeMetaObject::extensionTypeName() const +{ return m_extensionTypeName; } +void FakeMetaObject::setExtensionTypeName(const QString &name) +{ m_extensionTypeName = name; } + QByteArray FakeMetaObject::calculateFingerprint() const { QCryptographicHash hash(QCryptographicHash::Sha1); diff --git a/src/libs/languageutils/fakemetaobject.h b/src/libs/languageutils/fakemetaobject.h index a629ebedf8f..fc8e957776a 100644 --- a/src/libs/languageutils/fakemetaobject.h +++ b/src/libs/languageutils/fakemetaobject.h @@ -170,6 +170,7 @@ private: QList m_methods; QString m_defaultPropertyName; QString m_attachedTypeName; + QString m_extensionTypeName; QByteArray m_fingerprint; bool m_isSingleton; bool m_isCreatable; @@ -212,6 +213,8 @@ public: QString attachedTypeName() const; void setAttachedTypeName(const QString &name); + QString extensionTypeName() const; + void setExtensionTypeName(const QString &name); QByteArray calculateFingerprint() const; void updateFingerprint(); QByteArray fingerprint() const; diff --git a/src/libs/qmljs/qmljsinterpreter.cpp b/src/libs/qmljs/qmljsinterpreter.cpp index 48df835d264..0efe52d45bc 100644 --- a/src/libs/qmljs/qmljsinterpreter.cpp +++ b/src/libs/qmljs/qmljsinterpreter.cpp @@ -358,6 +358,14 @@ void CppComponentValue::processMembers(MemberProcessor *processor) const 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); } diff --git a/src/libs/qmljs/qmljstypedescriptionreader.cpp b/src/libs/qmljs/qmljstypedescriptionreader.cpp index 7d311ec4759..dcff13e68c4 100644 --- a/src/libs/qmljs/qmljstypedescriptionreader.cpp +++ b/src/libs/qmljs/qmljstypedescriptionreader.cpp @@ -228,6 +228,8 @@ void TypeDescriptionReader::readComponent(UiObjectDefinition *ast) readMetaObjectRevisions(script, fmo); } else if (name == QLatin1String("attachedType")) { fmo->setAttachedTypeName(readStringBinding(script)); + } else if (name == QLatin1String("extension")) { + fmo->setExtensionTypeName(readStringBinding(script)); } else if (name == QLatin1String("isSingleton")) { fmo->setIsSingleton(readBoolBinding(script)); } else if (name == QLatin1String("isCreatable")) {