aboutsummaryrefslogtreecommitdiffstats
path: root/generator
diff options
context:
space:
mode:
authorRenato Filho <renato.filho@openbossa.org>2011-07-14 15:25:04 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:17:02 -0300
commit96bd943d57b1864d1f5e7359b100c67d01934619 (patch)
tree75798c622ed3aa36ceb77fd6340152a2c60446ef /generator
parentb8611fcb1b7a4a1237c0025e5d57dd364d17ceae (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.cpp22
-rw-r--r--generator/shibokengenerator.cpp20
-rw-r--r--generator/shibokengenerator.h5
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