aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFriedemann Kleint <Friedemann.Kleint@qt.io>2019-10-01 15:49:19 +0200
committerFriedemann Kleint <Friedemann.Kleint@qt.io>2019-10-04 13:44:47 +0200
commit20b7a0a68f1360623ace93551ac68a71d4c078a0 (patch)
tree5bf3f0459b62f24ea7f1f98dd34ceccc1bdb2708
parent4def28e7f9da33aa047f8d201ce2298364f6db42 (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.cpp77
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.cpp44
-rw-r--r--sources/shiboken2/ApiExtractor/abstractmetalang.h5
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.