From 50bfbf524e84fee2b3e7cb7a6e74eab73cc99ab1 Mon Sep 17 00:00:00 2001 From: Renato Araujo Oliveira Filho Date: Tue, 15 Sep 2009 18:57:16 -0300 Subject: Fixed generation of fields for non wrapped class. Fixed copy constructor generation. --- generators/boostpython/boostpythongenerator.cpp | 4 +- generators/boostpython/cppgenerator.cpp | 56 ++++++++++++++++--------- generators/boostpython/cppgenerator.h | 1 + 3 files changed, 40 insertions(+), 21 deletions(-) (limited to 'generators') diff --git a/generators/boostpython/boostpythongenerator.cpp b/generators/boostpython/boostpythongenerator.cpp index c25fc09be..9c64a510b 100644 --- a/generators/boostpython/boostpythongenerator.cpp +++ b/generators/boostpython/boostpythongenerator.cpp @@ -280,7 +280,9 @@ QStringList BoostPythonGenerator::getBaseClasses(const AbstractMetaClass *cppCla bool BoostPythonGenerator::isCopyable(const AbstractMetaClass *cppClass) { - if (cppClass->typeEntry()->copyable() == ComplexTypeEntry::Unknown) + if (cppClass->isNamespace()) + return false; + else if (cppClass->typeEntry()->copyable() == ComplexTypeEntry::Unknown) return cppClass->hasCloneOperator(); else return (cppClass->typeEntry()->copyable() == ComplexTypeEntry::CopyableSet); diff --git a/generators/boostpython/cppgenerator.cpp b/generators/boostpython/cppgenerator.cpp index 05b0153a4..648bf9daa 100644 --- a/generators/boostpython/cppgenerator.cpp +++ b/generators/boostpython/cppgenerator.cpp @@ -575,9 +575,26 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *cppCla if (cppClass->isPolymorphic() && !cppClass->hasPrivateDestructor()) writeDestructor(s, cppClass); } + + writeFieldsAccessFunctions(s, cppClass); + + //inject code native end + writeCodeSnips(s, cppClass->typeEntry()->codeSnips(), + CodeSnip::End, TypeSystem::NativeCode); + writeBoostDeclaration(s, cppClass); } +void CppGenerator::writeFieldsAccessFunctions(QTextStream& s, const AbstractMetaClass* cppClass) +{ + //Fields + foreach (AbstractMetaField *field, cppClass->fields()) { + if (field->isPublic()) { + writeFieldAccess(s, cppClass, field); + } + } +} + void CppGenerator::writePrelude(QTextStream& s, const AbstractMetaClass* cppClass) { //inject code native beginner @@ -601,17 +618,6 @@ void CppGenerator::writePrelude(QTextStream& s, const AbstractMetaClass* cppClas writeGlobalOperatorOverloadImpl(s, func); } } - - //Fields - foreach (AbstractMetaField *field, cppClass->fields()) { - if (field->isPublic()) { - writeFieldAccess(s, cppClass, field); - } - } - - //inject code native end - writeCodeSnips(s, cppClass->typeEntry()->codeSnips(), - CodeSnip::End, TypeSystem::NativeCode); } @@ -850,11 +856,15 @@ void CppGenerator::writeNonVirtualModifiedFunctionImpl(QTextStream& s, const Abs AbstractMetaFunction* CppGenerator::findMainConstructor(const AbstractMetaClass* clazz) { - foreach (AbstractMetaFunction* func, clazz->functions()) { + foreach (AbstractMetaFunction* func, filterFunctions(clazz)) { if (func->isConstructor() && func->isPublic() && !func->isModifiedRemoved() && !func->isPrivate()) { + + //do not use copy constructor here + if (func->isCopyConstructor()) + continue; return func; } } @@ -992,10 +1002,6 @@ void CppGenerator::writeBoostDeclaration(QTextStream& s, const AbstractMetaClass << INDENT << "python_cls.def(qcontainer_indexing_suite< " << cppClass->qualifiedCppName() << " >());" << endl << endl; } - if (isCopyable(cppClass) && !cppClass->isNamespace()) { - s << INDENT << "python_cls.def(python::initqualifiedCppName() << "&>());" << endl; - } if (cppClass->isPolymorphic() && !cppClass->hasPrivateDestructor() && canCreateWrapperFor(cppClass)) { QString heldType = cppClass->typeEntry()->heldTypeValue(); @@ -1040,17 +1046,18 @@ void CppGenerator::writeBoostDeclaration(QTextStream& s, const AbstractMetaClass CodeSnip::Beginning, TypeSystem::TargetLangCode); QSet staticMethods; + AbstractMetaFunctionList functionList = filterFunctions(cppClass); if (!cppClass->isNamespace()) { //search for all static methods to match with normal functions //to rename when match with one member function - foreach (AbstractMetaFunction *func, filterFunctions(cppClass)) { + foreach (AbstractMetaFunction *func, functionList) { if (func->isStatic() && !func->isOperatorOverload()) staticMethods << func->name(); } } - foreach (AbstractMetaFunction *func, filterFunctions(cppClass)) { + foreach (AbstractMetaFunction *func, functionList) { if (func->isModifiedRemoved() || func->isPrivate() || func->isSignal()) continue; @@ -1073,8 +1080,10 @@ void CppGenerator::writeBoostDeclaration(QTextStream& s, const AbstractMetaClass if (func->originalName() == func->name()) writeOperatorOverload(s, func); } else if (func->isConstructor()) { - if (mainCtorHasModifications || func != mainCtor) + //Use same rule as hpp genenrator for copy constructor + if ((mainCtorHasModifications || func != mainCtor) && !func->isCopyConstructor()) { writeConstructor(s, func); + } } else if (!func->isVirtual() && (func->hasInjectedCode() || func->isThread() || func->allowThread())) { @@ -1088,6 +1097,12 @@ void CppGenerator::writeBoostDeclaration(QTextStream& s, const AbstractMetaClass s << INDENT << "python_cls.staticmethod(\"" << func->name() << "\");" << endl; } + //write copy constructor here + if (isCopyable(cppClass) && !cppClass->isNamespace()) { + s << INDENT << "python_cls.def(python::initqualifiedCppName() << "&>());" << endl; + } + writeCodeSnips(s, cppClass->typeEntry()->codeSnips(), CodeSnip::End, TypeSystem::TargetLangCode); @@ -1415,12 +1430,13 @@ void CppGenerator::finishGeneration() } s << endl; + + s << INDENT << "register_type_converters_" << moduleName().toLower() << "();" << endl << endl << classPythonDefines << endl << INDENT << "register_global_functions_" << moduleName().toLower() << "();" << endl << INDENT << "//Namespaces" << endl; - s << "}" << endl << endl; } diff --git a/generators/boostpython/cppgenerator.h b/generators/boostpython/cppgenerator.h index 7e4795d0a..d2d65a4e5 100644 --- a/generators/boostpython/cppgenerator.h +++ b/generators/boostpython/cppgenerator.h @@ -83,6 +83,7 @@ private: void writeSetterFieldFunction(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaField *field); void writeGetterFieldFunction(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaField *field); void writeFieldAccess(QTextStream &s, const AbstractMetaClass *cppClass, const AbstractMetaField *field); + void writeFieldsAccessFunctions(QTextStream& s, const AbstractMetaClass* cppClass); // call policy related QString verifyDefaultReturnPolicy(const AbstractMetaFunction *func, const QString &callPolicy); -- cgit v1.2.3