diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-07-21 16:49:08 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:17:04 -0300 |
commit | 68c8d2a8f047d0dc8384c701af49a6c6205917ed (patch) | |
tree | 92ce0ed0bc64ade6af63e3e3332e0f9801b9bddc | |
parent | 3fb03a226e59b15c4c33dc824749ceb8b18b65e8 (diff) |
Moved writeMinimalConstructorCallArguments() functionality to Generator Runner.
Updated tests' type systems to reflect the behaviour of
Generator::minimalConstructor().
-rw-r--r-- | generator/cppgenerator.cpp | 75 | ||||
-rw-r--r-- | tests/minimalbinding/typesystem_minimal.xml | 2 | ||||
-rw-r--r-- | tests/samplebinding/typesystem_sample.xml | 2 |
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> |