From 6dbd55084104eea9a3e950456a4bf0d966ee9ac9 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Fri, 26 Feb 2010 21:26:13 -0300 Subject: 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. --- abstractmetabuilder.cpp | 16 +++++++++++++--- 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 &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, -- cgit v1.2.3