diff options
author | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-10-01 15:49:19 +0200 |
---|---|---|
committer | Friedemann Kleint <Friedemann.Kleint@qt.io> | 2019-10-04 13:44:47 +0200 |
commit | 20b7a0a68f1360623ace93551ac68a71d4c078a0 (patch) | |
tree | 5bf3f0459b62f24ea7f1f98dd34ceccc1bdb2708 | |
parent | 4def28e7f9da33aa047f8d201ce2298364f6db42 (diff) |
shiboken: Streamline code for argument default value modification
Factor out a helper for applying the modifications
and use that in
AbstractMetaBuilderPrivate::traverseFunction(AddedFunction)
and
AbstractMetaBuilderPrivate::traverseFunction(FunctionModelItem)
consistently using the existing list of function modifications.
Streamline AbstractMetaBuilderPrivate::fixDefaultValue()
to handle empty expressions for simplicity.
Remove AbstractMetaFunction::replacedDefaultExpression()
and AbstractMetaFunction::removedDefaultExpression()
which are no longer needed.
Remove unused AbstractMetaFunction::argumentReplaced().
Task-number: PYSIDE-1095
Change-Id: I649d8aa4d2ecc8bd551ecf57303ab9b849757029
Reviewed-by: Cristian Maureira-Fredes <cristian.maureira-fredes@qt.io>
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp | 77 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetalang.cpp | 44 | ||||
-rw-r--r-- | sources/shiboken2/ApiExtractor/abstractmetalang.h | 5 |
3 files changed, 36 insertions, 90 deletions
diff --git a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp index 85e4e3778..5e9c63adc 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetabuilder.cpp @@ -1612,6 +1612,26 @@ void AbstractMetaBuilderPrivate::traverseEnums(const ScopeModelItem &scopeItem, } } +static void applyDefaultExpressionModifications(const FunctionModificationList &functionMods, + int i, AbstractMetaArgument *metaArg) +{ + // use replace/remove-default-expression for set default value + for (const auto &modification : functionMods) { + for (const auto &argumentModification : modification.argument_mods) { + if (argumentModification.index == i + 1) { + if (argumentModification.removedDefaultExpression) { + metaArg->setDefaultValueExpression(QString()); + break; + } + if (!argumentModification.replacedDefaultExpression.isEmpty()) { + metaArg->setDefaultValueExpression(argumentModification.replacedDefaultExpression); + break; + } + } + } + } +} + AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFunctionPtr &addedFunc) { return traverseFunction(addedFunc, nullptr); @@ -1670,20 +1690,13 @@ AbstractMetaFunction* AbstractMetaBuilderPrivate::traverseFunction(const AddedFu // Find the correct default values + const FunctionModificationList functionMods = metaFunction->modifications(metaClass); for (int i = 0; i < metaArguments.size(); ++i) { AbstractMetaArgument* metaArg = metaArguments.at(i); - //use relace-default-expression for set default value - QString replacedExpression; - if (metaClass) - replacedExpression = metaFunction->replacedDefaultExpression(metaClass, i + 1); - - if (!replacedExpression.isEmpty()) { - if (!metaFunction->removedDefaultExpression(metaClass, i + 1)) { - metaArg->setDefaultValueExpression(replacedExpression); - metaArg->setOriginalDefaultValueExpression(replacedExpression); - } - } + // use replace-default-expression for set default value + applyDefaultExpressionModifications(functionMods, i, metaArg); + metaArg->setOriginalDefaultValueExpression(metaArg->defaultValueExpression()); // appear unmodified } metaFunction->setOriginalAttributes(metaFunction->attributes()); @@ -2002,35 +2015,16 @@ AbstractMetaFunction *AbstractMetaBuilderPrivate::traverseFunction(const Functio const ArgumentModelItem &arg = arguments.at(i); AbstractMetaArgument* metaArg = metaArguments.at(i); - //use relace-default-expression for set default value - QString replacedExpression; - if (currentClass) { - replacedExpression = metaFunction->replacedDefaultExpression(currentClass, i + 1); - } else { - if (!functionMods.isEmpty()) { - QVector<ArgumentModification> argMods = functionMods.constFirst().argument_mods; - if (!argMods.isEmpty()) - replacedExpression = argMods.constFirst().replacedDefaultExpression; - } - } + const QString originalDefaultExpression = + fixDefaultValue(arg, metaArg->type(), metaFunction, currentClass, i); - bool hasDefaultValue = false; - if (arg->defaultValue() || !replacedExpression.isEmpty()) { - QString expr = arg->defaultValueExpression(); - expr = fixDefaultValue(arg, metaArg->type(), metaFunction, currentClass, i); - metaArg->setOriginalDefaultValueExpression(expr); + metaArg->setOriginalDefaultValueExpression(originalDefaultExpression); + metaArg->setDefaultValueExpression(originalDefaultExpression); - if (metaFunction->removedDefaultExpression(currentClass, i + 1)) { - expr.clear(); - } else if (!replacedExpression.isEmpty()) { - expr = replacedExpression; - } - metaArg->setDefaultValueExpression(expr); - hasDefaultValue = !expr.isEmpty(); - } + applyDefaultExpressionModifications(functionMods, i, metaArg); //Check for missing argument name - if (hasDefaultValue + if (!metaArg->defaultValueExpression().isEmpty() && !metaArg->hasName() && !metaFunction->isOperatorOverload() && !metaFunction->isSignal() @@ -2436,10 +2430,10 @@ QString AbstractMetaBuilderPrivate::fixDefaultValue(const ArgumentModelItem &ite AbstractMetaClass *implementingClass, int /* argumentIndex */) { - QString functionName = fnc->name(); - QString className = implementingClass ? implementingClass->qualifiedCppName() : QString(); - QString expr = item->defaultValueExpression(); + if (expr.isEmpty()) + return expr; + if (type) { if (type->isPrimitive()) { if (type->name() == QLatin1String("boolean")) { @@ -2513,11 +2507,12 @@ QString AbstractMetaBuilderPrivate::fixDefaultValue(const ArgumentModelItem &ite } } } else { + const QString className = implementingClass ? implementingClass->qualifiedCppName() : QString(); qCWarning(lcShiboken).noquote().nospace() << QStringLiteral("undefined type for default value '%3' of argument in function '%1', class '%2'") - .arg(functionName, className, item->defaultValueExpression()); + .arg(fnc->name(), className, item->defaultValueExpression()); - expr = QString(); + expr.clear(); } return expr; diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp index 4ca448d50..99e9d01a3 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.cpp +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.cpp @@ -731,37 +731,6 @@ ArgumentOwner AbstractMetaFunction::argumentOwner(const AbstractMetaClass *cls, return ArgumentOwner(); } - -QString AbstractMetaFunction::replacedDefaultExpression(const AbstractMetaClass *cls, int key) const -{ - const FunctionModificationList &modifications = this->modifications(cls); - for (const FunctionModification &modification : modifications) { - for (const ArgumentModification &argumentModification : modification.argument_mods) { - if (argumentModification.index == key - && !argumentModification.replacedDefaultExpression.isEmpty()) { - return argumentModification.replacedDefaultExpression; - } - } - } - - return QString(); -} - -bool AbstractMetaFunction::removedDefaultExpression(const AbstractMetaClass *cls, int key) const -{ - const FunctionModificationList &modifications = this->modifications(cls); - for (const FunctionModification &modification : modifications) { - for (const ArgumentModification &argumentModification : modification.argument_mods) { - if (argumentModification.index == key - && argumentModification.removedDefaultExpression) { - return true; - } - } - } - - return false; -} - QString AbstractMetaFunction::conversionRule(TypeSystem::Language language, int key) const { const FunctionModificationList &modifications = this->modifications(declaringClass()); @@ -780,19 +749,6 @@ QString AbstractMetaFunction::conversionRule(TypeSystem::Language language, int return QString(); } -QString AbstractMetaFunction::argumentReplaced(int key) const -{ - const FunctionModificationList &modifications = this->modifications(declaringClass()); - for (const FunctionModification &modification : modifications) { - for (const ArgumentModification &argumentModification : modification.argument_mods) { - if (argumentModification.index == key && !argumentModification.replace_value.isEmpty()) - return argumentModification.replace_value; - } - } - - return QString(); -} - // FIXME If we remove a arg. in the method at the base class, it will not reflect here. bool AbstractMetaFunction::argumentRemoved(int key) const { diff --git a/sources/shiboken2/ApiExtractor/abstractmetalang.h b/sources/shiboken2/ApiExtractor/abstractmetalang.h index 7f0f9fbaa..9812da001 100644 --- a/sources/shiboken2/ApiExtractor/abstractmetalang.h +++ b/sources/shiboken2/ApiExtractor/abstractmetalang.h @@ -1020,8 +1020,6 @@ public: AbstractMetaFunction *copy() const; - QString replacedDefaultExpression(const AbstractMetaClass *cls, int idx) const; - bool removedDefaultExpression(const AbstractMetaClass *cls, int idx) const; QString conversionRule(TypeSystem::Language language, int idx) const; QVector<ReferenceCount> referenceCounts(const AbstractMetaClass *cls, int idx = -2) const; ArgumentOwner argumentOwner(const AbstractMetaClass *cls, int idx) const; @@ -1034,9 +1032,6 @@ public: bool isRemovedFromAllLanguages(const AbstractMetaClass *) const; bool isRemovedFrom(const AbstractMetaClass *, TypeSystem::Language language) const; bool argumentRemoved(int) const; - - QString argumentReplaced(int key) const; - /** * Verifies if any modification to the function is an inject code. * \return true if there is inject code modifications to the function. |