aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2011-07-21 16:49:08 -0300
committerHugo Parente Lima <hugo.pl@gmail.com>2012-03-08 16:17:04 -0300
commit68c8d2a8f047d0dc8384c701af49a6c6205917ed (patch)
tree92ce0ed0bc64ade6af63e3e3332e0f9801b9bddc
parent3fb03a226e59b15c4c33dc824749ceb8b18b65e8 (diff)
Moved writeMinimalConstructorCallArguments() functionality to Generator Runner.
Updated tests' type systems to reflect the behaviour of Generator::minimalConstructor().
-rw-r--r--generator/cppgenerator.cpp75
-rw-r--r--tests/minimalbinding/typesystem_minimal.xml2
-rw-r--r--tests/samplebinding/typesystem_sample.xml2
3 files changed, 5 insertions, 74 deletions
diff --git a/generator/cppgenerator.cpp b/generator/cppgenerator.cpp
index e46780cd5..663163888 100644
--- a/generator/cppgenerator.cpp
+++ b/generator/cppgenerator.cpp
@@ -651,8 +651,9 @@ void CppGenerator::writeVirtualMethodNative(QTextStream &s, const AbstractMetaFu
}
}
if (defaultReturnExpr.isEmpty()) {
- QTextStream s(&defaultReturnExpr);
- writeMinimalConstructorCallArguments(s, func->type());
+ defaultReturnExpr = minimalConstructor(func->type());
+ if (defaultReturnExpr.isEmpty())
+ ReportHandler::warning(QString("Could not find a default constructor for '%1' type.").arg(func->type()->cppSignature()));
}
}
@@ -1143,76 +1144,6 @@ void CppGenerator::writeConstructorWrapper(QTextStream& s, const AbstractMetaFun
m_currentErrorCode = 0;
}
-void CppGenerator::writeMinimalConstructorCallArguments(QTextStream& s, const AbstractMetaClass* metaClass)
-{
- if (!metaClass)
- return;
-
- AbstractMetaFunctionList ctors = metaClass->queryFunctions(AbstractMetaClass::Constructors);
- const AbstractMetaFunction* ctor = 0;
-
- foreach (const AbstractMetaFunction* candidate, ctors) {
- if (candidate->arguments().size() == 0) {
- ctor = candidate;
- break;
- }
-
- bool allPrimitives = true;
- foreach (const AbstractMetaArgument* arg, candidate->arguments()) {
- if (!arg->type()->isPrimitive() && arg->defaultValueExpression().isEmpty()) {
- allPrimitives = false;
- break;
- }
- }
- if (allPrimitives) {
- if (!ctor || candidate->arguments().size() < ctor->arguments().size())
- ctor = candidate;
- }
- }
-
- if (!ctor) {
- ReportHandler::warning("Class "+metaClass->name()+" does not have a default constructor.");
- return;
- }
-
- QStringList argValues;
- AbstractMetaArgumentList args = ctor->arguments();
- for (int i = 0; i < args.size(); i++) {
- if (args[i]->defaultValueExpression().isEmpty())
- argValues << args[i]->type()->name()+"(0)";
- }
- s << metaClass->qualifiedCppName() << '(' << argValues.join(QLatin1String(", ")) << ')';
-}
-
-void CppGenerator::writeMinimalConstructorCallArguments(QTextStream& s, const AbstractMetaType* metaType)
-{
- Q_ASSERT(metaType);
- const TypeEntry* type = metaType->typeEntry();
-
- if (isPointerToWrapperType(metaType)) {
- s << "0";
- } else if (type->isPrimitive()) {
- const PrimitiveTypeEntry* primitiveTypeEntry = reinterpret_cast<const PrimitiveTypeEntry*>(type);
- if (primitiveTypeEntry->hasDefaultConstructor())
- s << primitiveTypeEntry->defaultConstructor();
- else
- s << type->name() << "(0)";
- } else if (type->isContainer() || type->isFlags() || type->isEnum()){
- s << metaType->cppSignature() << "()";
- } else if (metaType->isNativePointer() && type->isVoid()) {
- s << "0";
- } else {
- // this is slowwwww, FIXME: Fix the API od APIExtractor, these things should be easy!
- foreach (AbstractMetaClass* metaClass, classes()) {
- if (metaClass->typeEntry() == type) {
- writeMinimalConstructorCallArguments(s, metaClass);
- return;
- }
- }
- ReportHandler::warning("Could not find a AbstractMetaClass for type "+metaType->name());
- }
-}
-
void CppGenerator::writeMethodWrapper(QTextStream& s, const AbstractMetaFunctionList overloads)
{
OverloadData overloadData(overloads, this);
diff --git a/tests/minimalbinding/typesystem_minimal.xml b/tests/minimalbinding/typesystem_minimal.xml
index 7f160ddaf..4e80aded9 100644
--- a/tests/minimalbinding/typesystem_minimal.xml
+++ b/tests/minimalbinding/typesystem_minimal.xml
@@ -3,7 +3,7 @@
<primitive-type name="bool"/>
<primitive-type name="int"/>
- <primitive-type name="MinBool" target-lang-api-name="PyBool">
+ <primitive-type name="MinBool" target-lang-api-name="PyBool" default-constructor="MinBool(false)">
<conversion-rule file="minbool_conversions.h"/>
<include file-name="minbool.h" location="global"/>
</primitive-type>
diff --git a/tests/samplebinding/typesystem_sample.xml b/tests/samplebinding/typesystem_sample.xml
index 6cd1ec7cc..728e9d77b 100644
--- a/tests/samplebinding/typesystem_sample.xml
+++ b/tests/samplebinding/typesystem_sample.xml
@@ -30,7 +30,7 @@
<include file-name="handle.h" location="local"/>
</primitive-type>
- <primitive-type name="OddBool" target-lang-api-name="PyBool">
+ <primitive-type name="OddBool" target-lang-api-name="PyBool" default-constructor="OddBool(false)">
<conversion-rule file="oddbool_conversions.h"/>
<include file-name="oddbool.h" location="global"/>
</primitive-type>