aboutsummaryrefslogtreecommitdiffstats
path: root/generators
diff options
context:
space:
mode:
authorRenato Araujo Oliveira Filho <renato.filho@openbossa.org>2009-09-15 18:57:16 -0300
committerRenato Araujo Oliveira Filho <renato.filho@openbossa.org>2009-09-18 18:35:22 -0300
commit50bfbf524e84fee2b3e7cb7a6e74eab73cc99ab1 (patch)
tree587bec6b9fadd2c583ddd9d400f88cb35c6dffcf /generators
parent1484802d654fb18ea5da9c10c1a4f3a72ba34e9e (diff)
Fixed generation of fields for non wrapped class.
Fixed copy constructor generation.
Diffstat (limited to 'generators')
-rw-r--r--generators/boostpython/boostpythongenerator.cpp4
-rw-r--r--generators/boostpython/cppgenerator.cpp56
-rw-r--r--generators/boostpython/cppgenerator.h1
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);