diff options
Diffstat (limited to 'typesystem.h')
-rw-r--r-- | typesystem.h | 327 |
1 files changed, 31 insertions, 296 deletions
diff --git a/typesystem.h b/typesystem.h index be2852bd9..dc7ebc0a7 100644 --- a/typesystem.h +++ b/typesystem.h @@ -30,6 +30,7 @@ #include <QtCore/QMap> #include <QtCore/QDebug> #include "apiextractormacros.h" +#include "include.h" class Indentor; @@ -39,34 +40,6 @@ class QTextStream; class EnumTypeEntry; class FlagsTypeEntry; -struct APIEXTRACTOR_API Include -{ - enum IncludeType { - IncludePath, - LocalPath, - TargetLangImport - }; - - Include() : type(IncludePath) {} - Include(IncludeType t, const QString &nam) : type(t), name(nam) {}; - - bool isValid() - { - return !name.isEmpty(); - } - - IncludeType type; - QString name; - - QString toString() const; - - bool operator<(const Include &other) const - { - return name < other.name; - } -}; -typedef QList<Include> IncludeList; - typedef QMap<int, QString> ArgumentMap; class TemplateInstance; @@ -610,7 +583,8 @@ public: ArrayType, TypeSystemType, CustomType, - TargetLangType + TargetLangType, + FunctionType }; enum CodeGeneration { @@ -874,9 +848,9 @@ public: } void addExtraInclude(const Include &include) { - if (!m_includesUsed.value(include.name, false)) { + if (!m_includesUsed.value(include.name(), false)) { m_extraIncludes << include; - m_includesUsed[include.name] = true; + m_includesUsed[include.name()] = true; } } @@ -1726,6 +1700,32 @@ private: }; +class APIEXTRACTOR_API FunctionTypeEntry : public TypeEntry +{ +public: + FunctionTypeEntry(const QString& name, const QString& signature) + : TypeEntry(name, FunctionType) + { + addSignature(signature); + } + void addSignature(const QString& signature) + { + m_signatures << signature; + } + + QStringList signatures() const + { + return m_signatures; + } + + bool hasSignature(const QString& signature) const + { + return m_signatures.contains(signature); + } +private: + QStringList m_signatures; +}; + class APIEXTRACTOR_API ObjectTypeEntry : public ComplexTypeEntry { public: @@ -1758,271 +1758,6 @@ struct TypeRejection QString enum_name; }; -class APIEXTRACTOR_API TypeDatabase -{ - TypeDatabase(); - TypeDatabase(const TypeDatabase&); - TypeDatabase& operator=(const TypeDatabase&); -public: - - /** - * Return the type system instance. - * \param newInstance This parameter is usefull just for unit testing, because singletons causes - * too many side effects on unit testing. - */ - static TypeDatabase *instance(bool newInstance = false); - - static QString normalizedSignature(const char* signature); - - QStringList requiredTargetImports() - { - return m_requiredTargetImports; - } - - void addRequiredTargetImport(const QString &moduleName) - { - if (!m_requiredTargetImports.contains(moduleName)) - m_requiredTargetImports << moduleName; - } - - QStringList typesystemPaths() - { - return m_typesystemPaths; - } - void addTypesystemPath(const QString &typesystem_paths) - { -#if defined(Q_OS_WIN32) - char *path_splitter = const_cast<char *>(";"); -#else - char *path_splitter = const_cast<char *>(":"); -#endif - m_typesystemPaths += typesystem_paths.split(path_splitter); - } - - IncludeList extraIncludes(const QString &className); - - inline PrimitiveTypeEntry *findPrimitiveType(const QString &name); - inline ComplexTypeEntry *findComplexType(const QString &name); - inline ObjectTypeEntry *findObjectType(const QString &name); - inline NamespaceTypeEntry *findNamespaceType(const QString &name); - ContainerTypeEntry *findContainerType(const QString &name); - - TypeEntry *findType(const QString &name) const - { - QList<TypeEntry *> entries = findTypes(name); - foreach (TypeEntry *entry, entries) { - if (entry && - (!entry->isPrimitive() || static_cast<PrimitiveTypeEntry *>(entry)->preferredTargetLangType())) { - return entry; - } - } - return 0; - } - QList<TypeEntry *> findTypes(const QString &name) const - { - return m_entries.value(name); - } - TypeEntryHash allEntries() - { - return m_entries; - } - - SingleTypeEntryHash entries() - { - TypeEntryHash entries = allEntries(); - - SingleTypeEntryHash returned; - QList<QString> keys = entries.keys(); - - foreach (QString key, keys) - returned[key] = findType(key); - - return returned; - } - - PrimitiveTypeEntry *findTargetLangPrimitiveType(const QString &targetLangName); - - QList<const PrimitiveTypeEntry*> primitiveTypes() { - TypeEntryHash entries = allEntries(); - QList<const PrimitiveTypeEntry*> returned; - foreach(QString key, entries.keys()) { - foreach(const TypeEntry* typeEntry, entries[key]) { - if (typeEntry->isPrimitive()) - returned.append((PrimitiveTypeEntry*) typeEntry); - } - } - return returned; - } - QList<const ContainerTypeEntry*> containerTypes() { - TypeEntryHash entries = allEntries(); - QList<const ContainerTypeEntry*> returned; - foreach(QString key, entries.keys()) { - foreach(const TypeEntry* typeEntry, entries[key]) { - if (typeEntry->isContainer()) - returned.append((ContainerTypeEntry*) typeEntry); - } - } - return returned; - } - - void addRejection(const QString &class_name, const QString &function_name, - const QString &field_name, const QString &enum_name); - bool isClassRejected(const QString &class_name); - bool isFunctionRejected(const QString &class_name, const QString &function_name); - bool isFieldRejected(const QString &class_name, const QString &field_name); - bool isEnumRejected(const QString &class_name, const QString &enum_name); - - void addType(TypeEntry *e) - { - m_entries[e->qualifiedCppName()].append(e); - } - - SingleTypeEntryHash flagsEntries() const - { - return m_flagsEntries; - } - FlagsTypeEntry *findFlagsType(const QString &name) const; - void addFlagsType(FlagsTypeEntry *fte) - { - m_flagsEntries[fte->originalName()] = fte; - } - - TemplateEntry *findTemplate(const QString &name) - { - return m_templates[name]; - } - void addTemplate(TemplateEntry *t) - { - m_templates[t->name()] = t; - } - - AddedFunctionList globalUserFunctions() const - { - return m_globalUserFunctions; - } - void addGlobalUserFunctions(const AddedFunctionList& functions) - { - m_globalUserFunctions << functions; - } - AddedFunctionList findGlobalUserFunctions(const QString& name) const; - - void addGlobalUserFunctionModifications(const FunctionModificationList& functionModifications) - { - m_functionMods << functionModifications; - } - void addGlobalUserFunctionModification(const FunctionModification& functionModification) - { - m_functionMods << functionModification; - } - FunctionModificationList functionModifications(const QString& signature) const; - - void setSuppressWarnings(bool on) - { - m_suppressWarnings = on; - } - void addSuppressedWarning(const QString &s) - { - m_suppressedWarnings.append(s); - } - - bool isSuppressedWarning(const QString &s) - { - if (!m_suppressWarnings) - return false; - - foreach (const QString &_warning, m_suppressedWarnings) { - QString warning(QString(_warning).replace("\\*", "&place_holder_for_asterisk;")); - - QStringList segs = warning.split("*", QString::SkipEmptyParts); - if (!segs.size()) - continue; - - int i = 0; - int pos = s.indexOf(QString(segs.at(i++)).replace("&place_holder_for_asterisk;", "*")); - //qDebug() << "s == " << s << ", warning == " << segs; - while (pos != -1) { - if (i == segs.size()) - return true; - pos = s.indexOf(QString(segs.at(i++)).replace("&place_holder_for_asterisk;", "*"), pos); - } - } - - return false; - } - - void setRebuildClasses(const QStringList &cls) - { - m_rebuildClasses = cls; - } - - static QString globalNamespaceClassName(const TypeEntry *te); - QString filename() const - { - return "typesystem.txt"; - } - - QString modifiedTypesystemFilepath(const QString &ts_file); - bool parseFile(const QString &filename, bool generate = true); - bool parseFile(QIODevice* device, bool generate = true); - -private: - bool m_suppressWarnings; - TypeEntryHash m_entries; - SingleTypeEntryHash m_flagsEntries; - TemplateEntryHash m_templates; - QStringList m_suppressedWarnings; - - AddedFunctionList m_globalUserFunctions; - FunctionModificationList m_functionMods; - - QStringList m_requiredTargetImports; - - QStringList m_typesystemPaths; - QHash<QString, bool> m_parsedTypesystemFiles; - - QList<TypeRejection> m_rejections; - QStringList m_rebuildClasses; -}; - -inline PrimitiveTypeEntry *TypeDatabase::findPrimitiveType(const QString &name) -{ - QList<TypeEntry *> entries = findTypes(name); - - foreach (TypeEntry *entry, entries) { - if (entry && entry->isPrimitive() && static_cast<PrimitiveTypeEntry *>(entry)->preferredTargetLangType()) - return static_cast<PrimitiveTypeEntry *>(entry); - } - - return 0; -} - -inline ComplexTypeEntry *TypeDatabase::findComplexType(const QString &name) -{ - TypeEntry *entry = findType(name); - if (entry && entry->isComplex()) - return static_cast<ComplexTypeEntry *>(entry); - else - return 0; -} - -inline ObjectTypeEntry *TypeDatabase::findObjectType(const QString &name) -{ - TypeEntry *entry = findType(name); - if (entry && entry->isObject()) - return static_cast<ObjectTypeEntry *>(entry); - else - return 0; -} - -inline NamespaceTypeEntry *TypeDatabase::findNamespaceType(const QString &name) -{ - TypeEntry *entry = findType(name); - if (entry && entry->isNamespace()) - return static_cast<NamespaceTypeEntry *>(entry); - else - return 0; -} - QString fixCppTypeName(const QString &name); #endif // TYPESYSTEM_H |