diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-04-10 14:40:40 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-04-10 19:48:46 +0000 |
commit | 28f76672a9d7bb38fd596ea27d07396dcedfc6e7 (patch) | |
tree | 039d2d0a38dfaf77c5e3dbed278478cb264984dd | |
parent | 79c170d8bdafb91da30d17a24d00457f2be478b3 (diff) |
shiboken: Refactor CodeModel::findItem()
Rewrite it to use a recursion, preparing for having several
namespaces of the same name in the scope.
Change the scope parameter to be of the ScopeModelItem type to avoid
unnessary pointer casts.
Change-Id: I9a06ff49d19f93fbc0aefc573544debeb813ef20
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
-rw-r--r-- | sources/shiboken2/ApiExtractor/parser/codemodel.cpp | 56 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/parser/codemodel.h | 6 |
2 files changed, 30 insertions, 32 deletions
diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp index 8bc9b24ac..9a845b04a 100644 --- a/sources/shiboken2/ApiExtractor/parser/codemodel.cpp +++ b/sources/shiboken2/ApiExtractor/parser/codemodel.cpp @@ -83,37 +83,35 @@ FileModelItem CodeModel::findFile(const QString &name) const return findModelItem(m_files, name); } -CodeModelItem CodeModel::findItem(const QStringList &qualifiedName, CodeModelItem scope) const -{ - for (int i = 0; i < qualifiedName.size(); ++i) { - // ### Extend to look for members etc too. - const QString &name = qualifiedName.at(i); - - if (NamespaceModelItem ns = qSharedPointerDynamicCast<_NamespaceModelItem>(scope)) { - if (NamespaceModelItem tmp_ns = ns->findNamespace(name)) { - scope = tmp_ns; - continue; - } - } - - if (ScopeModelItem ss = qSharedPointerDynamicCast<_ScopeModelItem>(scope)) { - if (ClassModelItem cs = ss->findClass(name)) { - scope = cs; - } else if (EnumModelItem es = ss->findEnum(name)) { - if (i == qualifiedName.size() - 1) - return es; - } else if (TypeDefModelItem tp = ss->findTypeDef(name)) { - if (i == qualifiedName.size() - 1) - return tp; - } else { - // If we don't find the name in the scope chain we - // need to return an empty item to indicate failure... - return CodeModelItem(); +static CodeModelItem findRecursion(const ScopeModelItem &scope, + const QStringList &qualifiedName, int segment = 0) +{ + const QString &nameSegment = qualifiedName.at(segment); + if (segment == qualifiedName.size() - 1) { // Leaf item + if (ClassModelItem cs = scope->findClass(nameSegment)) + return cs; + if (EnumModelItem es = scope->findEnum(nameSegment)) + return es; + if (TypeDefModelItem tp = scope->findTypeDef(nameSegment)) + return tp; + return CodeModelItem(); + } + if (auto nestedClass = scope->findClass(nameSegment)) + return findRecursion(nestedClass, qualifiedName, segment + 1); + if (auto namespaceItem = qSharedPointerDynamicCast<_NamespaceModelItem>(scope)) { + for (const auto &nestedNamespace : namespaceItem->namespaces()) { + if (nestedNamespace->name() == nameSegment) { + if (auto item = findRecursion(nestedNamespace, qualifiedName, segment + 1)) + return item; } } } + return CodeModelItem(); +} - return scope; +CodeModelItem CodeModel::findItem(const QStringList &qualifiedName, const ScopeModelItem &scope) const +{ + return findRecursion(scope, qualifiedName); } #ifndef QT_NO_DEBUG_STREAM @@ -160,7 +158,7 @@ bool TypeInfo::isVoid() const && m_qualifiedName.constFirst() == QLatin1String("void"); } -TypeInfo TypeInfo::resolveType(TypeInfo const &__type, CodeModelItem __scope) +TypeInfo TypeInfo::resolveType(TypeInfo const &__type, const ScopeModelItem &__scope) { CodeModel *__model = __scope->model(); Q_ASSERT(__model != 0); @@ -168,7 +166,7 @@ TypeInfo TypeInfo::resolveType(TypeInfo const &__type, CodeModelItem __scope) return TypeInfo::resolveType(__model->findItem(__type.qualifiedName(), __scope), __type, __scope); } -TypeInfo TypeInfo::resolveType(CodeModelItem __item, TypeInfo const &__type, CodeModelItem __scope) +TypeInfo TypeInfo::resolveType(CodeModelItem __item, TypeInfo const &__type, const ScopeModelItem &__scope) { // Copy the type and replace with the proper qualified name. This // only makes sence to do if we're actually getting a resolved diff --git a/sources/shiboken2/ApiExtractor/parser/codemodel.h b/sources/shiboken2/ApiExtractor/parser/codemodel.h index 0296a8cb2..64415e07b 100644 --- a/sources/shiboken2/ApiExtractor/parser/codemodel.h +++ b/sources/shiboken2/ApiExtractor/parser/codemodel.h @@ -82,7 +82,7 @@ public: void addFile(FileModelItem item); FileModelItem findFile(const QString &name) const; - CodeModelItem findItem(const QStringList &qualifiedName, CodeModelItem scope) const; + CodeModelItem findItem(const QStringList &qualifiedName, const ScopeModelItem &scope) const; private: FileList m_files; @@ -202,7 +202,7 @@ public: QString toString() const; static TypeInfo combine(const TypeInfo &__lhs, const TypeInfo &__rhs); - static TypeInfo resolveType(TypeInfo const &__type, CodeModelItem __scope); + static TypeInfo resolveType(TypeInfo const &__type, const ScopeModelItem &__scope); #ifndef QT_NO_DEBUG_STREAM void formatDebug(QDebug &d) const; @@ -219,7 +219,7 @@ public: private: friend class TypeInfoTemplateArgumentHandler; - static TypeInfo resolveType(CodeModelItem item, TypeInfo const &__type, CodeModelItem __scope); + static TypeInfo resolveType(CodeModelItem item, TypeInfo const &__type, const ScopeModelItem &__scope); QStringList m_qualifiedName; QStringList m_arrayElements; |