aboutsummaryrefslogtreecommitdiffstats
path: root/abstractmetabuilder.cpp
diff options
context:
space:
mode:
authorMarcelo Lira <marcelo.lira@openbossa.org>2010-02-26 21:26:13 -0300
committerMarcelo Lira <marcelo.lira@openbossa.org>2010-02-26 21:26:13 -0300
commit6dbd55084104eea9a3e950456a4bf0d966ee9ac9 (patch)
tree0a0db526cdf66de75b8dd65d68d1e37beb92f1df /abstractmetabuilder.cpp
parent6f8cde0951da369d0b2960d8634ab9cf2a4b08d3 (diff)
Adds the AbstractMetaBuilder::setupExternalConversions(metaClass) method.
The code to add the external conversion operators for a class found in another class was moved to its own function, setupExternalConversions, that is called after all classes were traversed. Not all classes are ready when fixReturnTypeOfConversionOperator(metaFunc), the method where the moved code dwelt, is called.
Diffstat (limited to 'abstractmetabuilder.cpp')
-rw-r--r--abstractmetabuilder.cpp16
1 files changed, 13 insertions, 3 deletions
diff --git a/abstractmetabuilder.cpp b/abstractmetabuilder.cpp
index 2c035ccab..8338791a1 100644
--- a/abstractmetabuilder.cpp
+++ b/abstractmetabuilder.cpp
@@ -473,6 +473,7 @@ bool AbstractMetaBuilder::build(QIODevice* input)
// setupEquals(cls);
// setupComparable(cls);
setupClonable(cls);
+ setupExternalConversion(cls);
// sort all inner classes topologically
if (!cls->typeEntry()->codeGeneration() || cls->innerClasses().size() < 2)
@@ -1173,9 +1174,6 @@ void AbstractMetaBuilder::fixReturnTypeOfConversionOperator(AbstractMetaFunction
AbstractMetaType* metaType = createMetaType();
metaType->setTypeEntry(retType);
metaFunction->setType(metaType);
-
- AbstractMetaClass* metaClass = m_metaClasses.findClass(castTo);
- metaClass->addExternalConversionOperator(metaFunction);
}
void AbstractMetaBuilder::traverseFunctions(ScopeModelItem scopeItem, AbstractMetaClass *metaClass)
@@ -2509,6 +2507,18 @@ void AbstractMetaBuilder::setupClonable(AbstractMetaClass *cls)
cls->setHasCloneOperator(result);
}
+void AbstractMetaBuilder::setupExternalConversion(AbstractMetaClass* cls) {
+ AbstractMetaFunctionList convOps = cls->operatorOverloads(AbstractMetaClass::ConversionOp);
+ foreach (AbstractMetaFunction* func, convOps) {
+ AbstractMetaClass* metaClass = m_metaClasses.findClass(func->type()->typeEntry());
+ if (!metaClass)
+ continue;
+ metaClass->addExternalConversionOperator(func);
+ }
+ foreach (AbstractMetaClass* innerClass, cls->innerClasses())
+ setupExternalConversion(innerClass);
+}
+
static void writeRejectLogFile(const QString &name,
const QMap<QString, AbstractMetaBuilder::RejectReason> &rejects)
{