aboutsummaryrefslogtreecommitdiffstats
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
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.
-rw-r--r--abstractmetabuilder.cpp16
-rw-r--r--abstractmetabuilder.h1
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,