diff options
author | Renato Araujo Oliveira Filho <renato.filho@openbossa.org> | 2009-09-15 18:57:16 -0300 |
---|---|---|
committer | Renato Araujo Oliveira Filho <renato.filho@openbossa.org> | 2009-09-18 18:35:22 -0300 |
commit | 50bfbf524e84fee2b3e7cb7a6e74eab73cc99ab1 (patch) | |
tree | 587bec6b9fadd2c583ddd9d400f88cb35c6dffcf | |
parent | 1484802d654fb18ea5da9c10c1a4f3a72ba34e9e (diff) |
Fixed generation of fields for non wrapped class.
Fixed copy constructor generation.
-rw-r--r-- | generators/boostpython/boostpythongenerator.cpp | 4 | ||||
-rw-r--r-- | generators/boostpython/cppgenerator.cpp | 56 | ||||
-rw-r--r-- | generators/boostpython/cppgenerator.h | 1 |
3 files changed, 40 insertions, 21 deletions
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::init<const "; - s << cppClass->qualifiedCppName() << "&>());" << 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<QString> 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::init<const "; + s << cppClass->qualifiedCppName() << "&>());" << 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); |