diff options
author | Renato Filho <renato.filho@openbossa.org> | 2011-07-14 15:25:04 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:17:02 -0300 |
commit | 96bd943d57b1864d1f5e7359b100c67d01934619 (patch) | |
tree | 75798c622ed3aa36ceb77fd6340152a2c60446ef /generator | |
parent | b8611fcb1b7a4a1237c0025e5d57dd364d17ceae (diff) |
Propagate default args modification during the overload data descisor.
Fix bug #919.
Reviewer: Marcelo Lira <marcelo.lira@openbossa.org>
Hugo Parente Lima <hugo.pl@gmail.com>
Diffstat (limited to 'generator')
-rw-r--r-- | generator/overloaddata.cpp | 22 | ||||
-rw-r--r-- | generator/shibokengenerator.cpp | 20 | ||||
-rw-r--r-- | generator/shibokengenerator.h | 5 |
3 files changed, 35 insertions, 12 deletions
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<int> 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<int, int> 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 << "<tr><td bgcolor=\"gray\" align=\"right\">f" << functionNumber(func); s << "-default</td><td bgcolor=\"gray\" align=\"left\">"; - s << arg->defaultValueExpression() << "</td></tr>"; + s << argDefault << "</td></tr>"; } - if (arg->defaultValueExpression() != arg->originalDefaultValueExpression()) { + if (argDefault != arg->originalDefaultValueExpression()) { s << "<tr><td bgcolor=\"gray\" align=\"right\">f" << functionNumber(func); s << "-orig-default</td><td bgcolor=\"gray\" align=\"left\">"; s << arg->originalDefaultValueExpression() << "</td></tr>"; @@ -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<QString, QString>& args); // verify whether the class is copyable |