aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2020-12-18 17:16:41 +0100
committerQt Cherry-pick Bot <cherrypick_bot@qt-project.org>2020-12-20 19:27:50 +0000
commit29dc723178da673139057389d78ff3f9bb17a08d (patch)
treede1e9f2ca4496e95f84ad8e916e92b15644d048d
parent2f8a17cd7452166bf7cd11b48635074d1a3110e4 (diff)
shiboken6: Refactor the class find algorithm
Search for target lang name if there is a dot present and do not search for unqualified names if there is a "::" in the name. Use iterators to prepare for the use of different container types. Change-Id: I4722cfacb4173c84035038c667ec1aaeb049c713 Reviewed-by: Christian Tismer <tismer@stackless.com> (cherry picked from commit 3139c8dddf9dfb0e935cd03b3d539541fdf0edf0) Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
-rw-r--r--sources/shiboken6/ApiExtractor/abstractmetalang.cpp47
1 files changed, 29 insertions, 18 deletions
diff --git a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp
index 32befc400..72d36bae7 100644
--- a/sources/shiboken6/ApiExtractor/abstractmetalang.cpp
+++ b/sources/shiboken6/ApiExtractor/abstractmetalang.cpp
@@ -1342,33 +1342,44 @@ std::optional<AbstractMetaEnumValue>
return {};
}
-/*!
- * Searches the list after a class that mathces \a name; either as
- * C++, Target language base name or complete Target language package.class name.
- */
+/// Searches the list after a class that matches \a name; either as C++,
+/// Target language base name or complete Target language package.class name.
-AbstractMetaClass *AbstractMetaClass::findClass(const AbstractMetaClassList &classes,
- const QString &name)
+template <class It>
+static It findClassHelper(It begin, It end, const QString &name)
{
- if (name.isEmpty())
- return nullptr;
+ if (name.isEmpty() || begin == end)
+ return end;
- for (AbstractMetaClass *c : classes) {
- if (c->qualifiedCppName() == name)
- return c;
+ if (name.contains(u'.')) { // Search target lang name
+ for (auto it = begin; it != end; ++it) {
+ if ((*it)->fullName() == name)
+ return it;
+ }
+ return end;
}
- for (AbstractMetaClass *c : classes) {
- if (c->fullName() == name)
- return c;
+ for (auto it = begin; it != end; ++it) {
+ if ((*it)->qualifiedCppName() == name)
+ return it;
}
- for (AbstractMetaClass *c : classes) {
- if (c->name() == name)
- return c;
+ if (name.contains(u"::")) // Qualified, cannot possibly match name
+ return end;
+
+ for (auto it = begin; it != end; ++it) {
+ if ((*it)->name() == name)
+ return it;
}
- return nullptr;
+ return end;
+}
+
+AbstractMetaClass *AbstractMetaClass::findClass(const AbstractMetaClassList &classes,
+ const QString &name)
+{
+ auto it =findClassHelper(classes.cbegin(), classes.cend(), name);
+ return it != classes.cend() ? *it : nullptr;
}
AbstractMetaClass *AbstractMetaClass::findClass(const AbstractMetaClassList &classes,