diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-08-23 22:28:34 -0300 |
---|---|---|
committer | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-09-12 15:52:48 -0300 |
commit | 53bd31b8564177a9f9871e715903c4cf43e079cf (patch) | |
tree | 62edaab0517f388d9ff0f6ae3c740ee9b66d5c99 | |
parent | a1e245f198d8b933572ca0791f02061667a42edf (diff) |
Collect the instantiated container types for the current module.
Reviewed by Hugo Parente <hugo.lima@openbossa.org>
Reviewed by Renato Araújo <renato.filho@openbossa.org>
-rw-r--r-- | generator.cpp | 59 | ||||
-rw-r--r-- | generator.h | 7 |
2 files changed, 65 insertions, 1 deletions
diff --git a/generator.cpp b/generator.cpp index ee15d2f..df8c721 100644 --- a/generator.cpp +++ b/generator.cpp @@ -40,12 +40,16 @@ struct Generator::GeneratorPrivate { QString packageName; int numGenerated; int numGeneratedWritten; + QStringList instantiatedContainersNames; + QList<const AbstractMetaType*> instantiatedContainers; }; Generator::Generator() : m_d(new GeneratorPrivate) { m_d->numGenerated = 0; m_d->numGeneratedWritten = 0; + m_d->instantiatedContainers = QList<const AbstractMetaType*>(); + m_d->instantiatedContainersNames = QStringList(); } Generator::~Generator() @@ -68,14 +72,67 @@ bool Generator::setup(const ApiExtractor& extractor, const QMap< QString, QStrin if (entryFound) break; } - if (entryFound) m_d->packageName = entryFound->name(); else ReportHandler::warning("Couldn't find the package name!!"); + + collectInstantiatedContainers(); + return doSetup(args); } +QString Generator::getSimplifiedContainerTypeName(const AbstractMetaType* type) +{ + if (!type->isContainer()) + return type->cppSignature(); + QString typeName = type->cppSignature(); + if (type->isConstant()) + typeName.remove(0, sizeof("const ") / sizeof(char) - 1); + if (type->isReference()) + typeName.chop(1); + while (typeName.endsWith('*') || typeName.endsWith(' ')) + typeName.chop(1); + return typeName; +} + +void Generator::addInstantiatedContainers(const AbstractMetaType* type) +{ + if (!type) + return; + foreach (const AbstractMetaType* t, type->instantiations()) + addInstantiatedContainers(t); + if (!type->typeEntry()->isContainer()) + return; + QString typeName = getSimplifiedContainerTypeName(type); + if (!m_d->instantiatedContainersNames.contains(typeName)) { + m_d->instantiatedContainersNames.append(typeName); + m_d->instantiatedContainers.append(type); + } +} + +void Generator::collectInstantiatedContainers(const AbstractMetaFunction* func) +{ + addInstantiatedContainers(func->type()); + foreach (const AbstractMetaArgument* arg, func->arguments()) + addInstantiatedContainers(arg->type()); +} + +void Generator::collectInstantiatedContainers() +{ + foreach (const AbstractMetaFunction* func, globalFunctions()) + collectInstantiatedContainers(func); + foreach (const AbstractMetaClass* metaClass, classes()) { + foreach (const AbstractMetaFunction* func, metaClass->functions()) + collectInstantiatedContainers(func); + } +} + +QList<const AbstractMetaType*> Generator::instantiatedContainers() const +{ + return m_d->instantiatedContainers; +} + QMap< QString, QString > Generator::options() const { return QMap<QString, QString>(); diff --git a/generator.h b/generator.h index 4c20268..59cef78 100644 --- a/generator.h +++ b/generator.h @@ -277,9 +277,16 @@ protected: */ virtual QString subDirectoryForPackage(QString packageName = QString()) const; + QList<const AbstractMetaType*> instantiatedContainers() const; + + static QString getSimplifiedContainerTypeName(const AbstractMetaType* type); + void addInstantiatedContainers(const AbstractMetaType* type); + private: struct GeneratorPrivate; GeneratorPrivate* m_d; + void collectInstantiatedContainers(const AbstractMetaFunction* func); + void collectInstantiatedContainers(); }; Q_DECLARE_OPERATORS_FOR_FLAGS(Generator::Options) |