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 /abstractmetabuilder.cpp | |
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.
Diffstat (limited to 'abstractmetabuilder.cpp')
-rw-r--r-- | abstractmetabuilder.cpp | 16 |
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) { |