diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-02-26 21:26:13 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2010-02-26 21:26:13 -0300 |
commit | 6dbd55084104eea9a3e950456a4bf0d966ee9ac9 (patch) | |
tree | 0a0db526cdf66de75b8dd65d68d1e37beb92f1df | |
parent | 6f8cde0951da369d0b2960d8634ab9cf2a4b08d3 (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.
-rw-r--r-- | abstractmetabuilder.cpp | 16 | ||||
-rw-r--r-- | abstractmetabuilder.h | 1 |
2 files changed, 14 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) { diff --git a/abstractmetabuilder.h b/abstractmetabuilder.h index dc38d3b1a..163067beb 100644 --- a/abstractmetabuilder.h +++ b/abstractmetabuilder.h @@ -128,6 +128,7 @@ public: void setupEquals(AbstractMetaClass *metaClass); void setupComparable(AbstractMetaClass *metaClass); void setupClonable(AbstractMetaClass *cls); + void setupExternalConversion(AbstractMetaClass* cls); void setupFunctionDefaults(AbstractMetaFunction *metaFunction, AbstractMetaClass *metaClass); QString fixDefaultValue(ArgumentModelItem item, AbstractMetaType *type, |