diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-03-01 14:01:27 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-03-01 14:01:27 -0300 |
commit | db7ce37a0de3e52f2940d8823e4308e89ffbb052 (patch) | |
tree | 31a2c3cf3e8a0dcfaef6f5094f6aafd976da5b77 | |
parent | 083d500b97e2ad5ac85402f7a6df068ca2ecbd73 (diff) |
Generator noew handles implicit conversions that are conversion operators.
Previously all implicit conversions were constructors, now they could be
conversion operators, with no explicit arguments except for the owner
class where they where defined.
-rw-r--r-- | cppgenerator.cpp | 13 | ||||
-rw-r--r-- | headergenerator.cpp | 27 | ||||
-rw-r--r-- | overloaddata.cpp | 6 |
3 files changed, 35 insertions, 11 deletions
diff --git a/cppgenerator.cpp b/cppgenerator.cpp index 2cc1a05b1..f4cc81a45 100644 --- a/cppgenerator.cpp +++ b/cppgenerator.cpp @@ -222,8 +222,11 @@ void CppGenerator::generateClass(QTextStream &s, const AbstractMetaClass *metaCl foreach (AbstractMetaFunctionList allOverloads, getFunctionGroups(metaClass).values()) { AbstractMetaFunctionList overloads; foreach (AbstractMetaFunction* func, allOverloads) { - if (!func->isAssignmentOperator() && !func->isCastOperator() && !func->isModifiedRemoved() && !func->isPrivate() && - func->ownerClass() == func->implementingClass()) + if (!func->isAssignmentOperator() + && !func->isCastOperator() + && !func->isModifiedRemoved() + && !func->isPrivate() + && func->ownerClass() == func->implementingClass()) overloads.append(func); } @@ -1028,7 +1031,11 @@ void CppGenerator::writeInvalidCppObjectCheck(QTextStream& s, QString pyArgName, QString implicitChecks; QTextStream ic(&implicitChecks); foreach (const AbstractMetaFunction* ctor, implicitConversions(type)) { - const TypeEntry* te = ctor->arguments().first()->type()->typeEntry(); + const TypeEntry* te; + if (ctor->isConversionOperator()) + te = ctor->ownerClass()->typeEntry(); + else + te = ctor->arguments().first()->type()->typeEntry(); if (te->isValue() || te->isObject()) ic << " || " << cpythonCheckFunction(te) << '(' << pyArgName << ')'; } diff --git a/headergenerator.cpp b/headergenerator.cpp index 2d5bbf52e..111809758 100644 --- a/headergenerator.cpp +++ b/headergenerator.cpp @@ -471,7 +471,10 @@ void HeaderGenerator::writeTypeConverterImpl(QTextStream& s, const TypeEntry* ty isFirst = false; else s << endl << INDENT << " || "; - s << cpythonCheckFunction(ctor->arguments().first()->type()); + if (ctor->isConversionOperator()) + s << cpythonCheckFunction(ctor->ownerClass()->typeEntry()); + else + s << cpythonCheckFunction(ctor->arguments().first()->type()); s << "(pyobj)"; } s << ';' << endl; @@ -496,18 +499,28 @@ void HeaderGenerator::writeTypeConverterImpl(QTextStream& s, const TypeEntry* ty Indentation indent(INDENT); s << INDENT; - - const AbstractMetaType* argType = ctor->arguments().first()->type(); if (firstImplicitIf) firstImplicitIf = false; else s << "else "; - s << "if (" << cpythonCheckFunction(argType) << "(pyobj))" << endl; + + QString typeCheck; + QString toCppConv; + QTextStream tcc(&toCppConv); + if (ctor->isConversionOperator()) { + const AbstractMetaClass* metaClass = ctor->ownerClass(); + typeCheck = cpythonCheckFunction(metaClass->typeEntry()); + writeToCppConversion(tcc, metaClass, "pyobj"); + } else { + const AbstractMetaType* argType = ctor->arguments().first()->type(); + typeCheck = cpythonCheckFunction(argType); + writeToCppConversion(tcc, argType, 0, "pyobj"); + } + + s << "if (" << typeCheck << "(pyobj))" << endl; { Indentation indent(INDENT); - s << INDENT << "return " << type->name() << '('; - writeToCppConversion(s, argType, 0, "pyobj"); - s << ");" << endl; + s << INDENT << "return " << type->name() << '(' << toCppConv << ");" << endl; } } s << INDENT << '}' << endl; diff --git a/overloaddata.cpp b/overloaddata.cpp index e2814c4cd..fe7b643c8 100644 --- a/overloaddata.cpp +++ b/overloaddata.cpp @@ -73,7 +73,11 @@ void OverloadData::sortNextOverloads() foreach(OverloadData* ov, m_nextOverloadData) { const AbstractMetaType* targetType = ov->argType(); foreach(AbstractMetaFunction* function, m_generator->implicitConversions(ov->argType())) { - QString convertibleType = function->arguments().first()->type()->typeEntry()->name(); + QString convertibleType; + if (function->isConversionOperator()) + convertibleType = function->ownerClass()->typeEntry()->name(); + else + convertibleType = function->arguments().first()->type()->typeEntry()->name(); if (!map.contains(convertibleType)) continue; |