From 96bd943d57b1864d1f5e7359b100c67d01934619 Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Thu, 14 Jul 2011 15:25:04 -0300 Subject: Propagate default args modification during the overload data descisor. Fix bug #919. Reviewer: Marcelo Lira Hugo Parente Lima --- generator/overloaddata.cpp | 22 ++++++++++++---------- generator/shibokengenerator.cpp | 20 ++++++++++++++++++-- generator/shibokengenerator.h | 5 +++++ 3 files changed, 35 insertions(+), 12 deletions(-) (limited to 'generator') diff --git a/generator/overloaddata.cpp b/generator/overloaddata.cpp index 7ec8cf07f..9dc353cee 100644 --- a/generator/overloaddata.cpp +++ b/generator/overloaddata.cpp @@ -78,6 +78,7 @@ static bool typesAreEqual(const AbstractMetaType* typeA, const AbstractMetaType* return false; } + /** * OverloadSortData just helps writing clearer code in the * OverloadData::sortNextOverloads method. @@ -474,7 +475,7 @@ void OverloadData::addOverload(const AbstractMetaFunction* func) for (int i = 0; m_headOverloadData->m_minArgs > 0 && i < origNumArgs; i++) { if (func->argumentRemoved(i + 1)) continue; - if (!func->arguments()[i]->defaultValueExpression().isEmpty()) { + if (!ShibokenGenerator::getDefaultValue(func, func->arguments()[i]).isEmpty()) { int fixedArgIndex = i - removed; if (fixedArgIndex < m_headOverloadData->m_minArgs) m_headOverloadData->m_minArgs = fixedArgIndex; @@ -706,7 +707,7 @@ const AbstractMetaFunction* OverloadData::getFunctionWithDefaultValue() const if (func->argumentRemoved(i + 1)) removedArgs++; } - if (!func->arguments()[m_argPos + removedArgs]->defaultValueExpression().isEmpty()) + if (!ShibokenGenerator::getDefaultValue(func, func->arguments()[m_argPos + removedArgs]).isEmpty()) return func; } return 0; @@ -723,7 +724,7 @@ QList OverloadData::invalidArgumentLengths() const if (func->argumentRemoved(i+1)) { offset++; } else { - if (!args[i]->defaultValueExpression().isEmpty()) + if (!ShibokenGenerator::getDefaultValue(func, args[i]).isEmpty()) validArgLengths << i-offset; } } @@ -773,7 +774,7 @@ QPair OverloadData::getMinMaxArguments(const AbstractMetaFunctionList& if (func->argumentRemoved(j + 1)) continue; int fixedArgIndex = j - removed; - if (fixedArgIndex < minArgs && !func->arguments()[j]->defaultValueExpression().isEmpty()) + if (fixedArgIndex < minArgs && !ShibokenGenerator::getDefaultValue(func, func->arguments()[j]).isEmpty()) minArgs = fixedArgIndex; } } @@ -911,13 +912,14 @@ QString OverloadData::dumpGraph() const const AbstractMetaArgument* arg = argument(func); if (!arg) continue; - if (!arg->defaultValueExpression().isEmpty() || - arg->defaultValueExpression() != arg->originalDefaultValueExpression()) { + QString argDefault = ShibokenGenerator::getDefaultValue(func, arg); + if (!argDefault.isEmpty() || + argDefault != arg->originalDefaultValueExpression()) { s << "f" << functionNumber(func); s << "-default"; - s << arg->defaultValueExpression() << ""; + s << argDefault << ""; } - if (arg->defaultValueExpression() != arg->originalDefaultValueExpression()) { + if (argDefault != arg->originalDefaultValueExpression()) { s << "f" << functionNumber(func); s << "-orig-default"; s << arg->originalDefaultValueExpression() << ""; @@ -980,7 +982,7 @@ bool OverloadData::hasArgumentWithDefaultValue(const AbstractMetaFunction* func) foreach (const AbstractMetaArgument* arg, func->arguments()) { if (func->argumentRemoved(arg->argumentIndex() + 1)) continue; - if (!arg->defaultValueExpression().isEmpty()) + if (!ShibokenGenerator::getDefaultValue(func, arg).isEmpty()) return true; } return false; @@ -990,7 +992,7 @@ AbstractMetaArgumentList OverloadData::getArgumentsWithDefaultValues(const Abstr { AbstractMetaArgumentList args; foreach (AbstractMetaArgument* arg, func->arguments()) { - if (arg->defaultValueExpression().isEmpty() + if (ShibokenGenerator::getDefaultValue(func, arg).isEmpty() || func->argumentRemoved(arg->argumentIndex() + 1)) continue; args << arg; diff --git a/generator/shibokengenerator.cpp b/generator/shibokengenerator.cpp index 1f405bbc1..a700b5a27 100644 --- a/generator/shibokengenerator.cpp +++ b/generator/shibokengenerator.cpp @@ -382,11 +382,11 @@ static QString searchForEnumScope(const AbstractMetaClass* metaClass, const QStr */ QString ShibokenGenerator::guessScopeForDefaultValue(const AbstractMetaFunction* func, const AbstractMetaArgument* arg) { - if (arg->defaultValueExpression().isEmpty()) + QString value = getDefaultValue(func, arg); + if (value.isEmpty()) return QString(); static QRegExp enumValueRegEx("^([A-Za-z_]\\w*)?$"); - QString value = arg->defaultValueExpression(); QString prefix; QString suffix; @@ -1790,3 +1790,19 @@ Generator::Options ShibokenGenerator::getConverterOptions(const AbstractMetaType return flags; } +QString ShibokenGenerator::getDefaultValue(const AbstractMetaFunction* func, const AbstractMetaArgument* arg) +{ + if (!arg->defaultValueExpression().isEmpty()) + return arg->defaultValueExpression(); + + //Check modifications + foreach(FunctionModification m, func->modifications()) { + foreach(ArgumentModification am, m.argument_mods) { + if (am.index == (arg->argumentIndex() + 1)) + return am.replacedDefaultExpression; + } + } + return QString(); +} + + diff --git a/generator/shibokengenerator.h b/generator/shibokengenerator.h index abf74c5fe..526e5ac13 100644 --- a/generator/shibokengenerator.h +++ b/generator/shibokengenerator.h @@ -334,6 +334,11 @@ public: * it needs to write some converter code. */ static Options getConverterOptions(const AbstractMetaType* metaType); + + /** + * Helper function to find for argument default value + */ + static QString getDefaultValue(const AbstractMetaFunction* func, const AbstractMetaArgument* arg); protected: bool doSetup(const QMap& args); // verify whether the class is copyable -- cgit v1.2.3