diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-09-08 08:33:04 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2021-09-08 12:01:14 +0200 |
commit | 61fb8894ff8402cbb34c9dca114f4037b70beb82 (patch) | |
tree | 4e9243052377301f33bfd2d59f7ebe61f261895c | |
parent | 7085fc97a7ce0cb58b7f93bcc0e915a46f5d4da1 (diff) |
shiboken6: Refactor min/max argument count calculation in OverloadData
Write one function that determines it instead of fixing it up
in a later phase.
Change-Id: I0605ec72fcbb585eb990a94dfb0123d0223f2e6b
Reviewed-by: Christian Tismer <tismer@stackless.com>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r-- | sources/shiboken6/generator/shiboken/overloaddata.cpp | 46 |
1 files changed, 26 insertions, 20 deletions
diff --git a/sources/shiboken6/generator/shiboken/overloaddata.cpp b/sources/shiboken6/generator/shiboken/overloaddata.cpp index ad358542b..2a1acad9a 100644 --- a/sources/shiboken6/generator/shiboken/overloaddata.cpp +++ b/sources/shiboken6/generator/shiboken/overloaddata.cpp @@ -42,6 +42,7 @@ #include <QtCore/QTemporaryFile> #include <algorithm> +#include <utility> static const TypeEntry *getReferencedTypeEntry(const TypeEntry *typeEntry) { @@ -423,6 +424,25 @@ void OverloadData::sortNextOverloads() } } +// Determine the minimum (first default argument)/maximum arguments (size) +// of a function (taking into account the removed arguments). +static std::pair<int, int> getMinMaxArgs(const AbstractMetaFunctionCPtr &func) +{ + int defaultValueIndex = -1; + const auto &arguments = func->arguments(); + int argIndex = 0; + for (qsizetype i = 0, size = arguments.size(); i < size; ++i) { + if (!func->argumentRemoved(int(i + 1))) { + if (defaultValueIndex < 0 && arguments.at(i).hasDefaultValueExpression()) + defaultValueIndex = argIndex; + ++argIndex; + } + } + const int maxArgs = argIndex; + const int minArgs = defaultValueIndex >= 0 ? defaultValueIndex : maxArgs; + return {minArgs, maxArgs}; +} + /** * Root constructor for OverloadData * @@ -442,15 +462,14 @@ void OverloadData::sortNextOverloads() */ OverloadData::OverloadData(const AbstractMetaFunctionCList &overloads, const ApiExtractorResult &api) - : m_argType(), m_headOverloadData(this), m_api(api) + : m_argType(), m_overloads(overloads), m_headOverloadData(this), m_api(api) { for (const auto &func : overloads) { - m_overloads.append(func); - int argSize = func->arguments().size() - numberOfRemovedArguments(func); - if (m_minArgs > argSize) - m_minArgs = argSize; - if (m_maxArgs < argSize) - m_maxArgs = argSize; + const auto minMaxArgs = getMinMaxArgs(func); + if (minMaxArgs.first < m_minArgs) + m_minArgs = minMaxArgs.first; + if (minMaxArgs.second > m_maxArgs) + m_maxArgs = minMaxArgs.second; OverloadData *currentOverloadData = this; const AbstractMetaArgumentList &arguments = func->arguments(); for (const AbstractMetaArgument &arg : arguments) { @@ -477,19 +496,6 @@ OverloadData::OverloadData(OverloadData *headOverloadData, const AbstractMetaFun void OverloadData::addOverload(const AbstractMetaFunctionCPtr &func) { - int origNumArgs = func->arguments().size(); - int removed = numberOfRemovedArguments(func); - - for (int i = 0; m_headOverloadData->m_minArgs > 0 && i < origNumArgs; i++) { - if (func->argumentRemoved(i + 1)) - continue; - if (func->arguments().at(i).hasDefaultValueExpression()) { - int fixedArgIndex = i - removed; - if (fixedArgIndex < m_headOverloadData->m_minArgs) - m_headOverloadData->m_minArgs = fixedArgIndex; - } - } - m_overloads.append(func); } |