| typesystem.h | | typesystem.h | |
| | | | |
| skipping to change at line 33 | | skipping to change at line 33 | |
| | | | |
| #ifndef TYPESYSTEM_H | | #ifndef TYPESYSTEM_H | |
| #define TYPESYSTEM_H | | #define TYPESYSTEM_H | |
| | | | |
| #include <QtCore/QHash> | | #include <QtCore/QHash> | |
| #include <QtCore/QString> | | #include <QtCore/QString> | |
| #include <QtCore/QStringList> | | #include <QtCore/QStringList> | |
| #include <QtCore/QMap> | | #include <QtCore/QMap> | |
| #include <QtCore/QDebug> | | #include <QtCore/QDebug> | |
| #include "apiextractormacros.h" | | #include "apiextractormacros.h" | |
|
| | | #include "include.h" | |
| | | | |
| class Indentor; | | class Indentor; | |
| | | | |
| class AbstractMetaType; | | class AbstractMetaType; | |
| class QTextStream; | | class QTextStream; | |
| | | | |
| class EnumTypeEntry; | | class EnumTypeEntry; | |
| class FlagsTypeEntry; | | 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; | | typedef QMap<int, QString> ArgumentMap; | |
| | | | |
| class TemplateInstance; | | class TemplateInstance; | |
| | | | |
| namespace TypeSystem | | namespace TypeSystem | |
| { | | { | |
| enum Language { | | enum Language { | |
| NoLanguage = 0x0000, | | NoLanguage = 0x0000, | |
| TargetLangCode = 0x0001, | | TargetLangCode = 0x0001, | |
| NativeCode = 0x0002, | | NativeCode = 0x0002, | |
| | | | |
| skipping to change at line 598 | | skipping to change at line 571 | |
| | | | |
| class APIEXTRACTOR_API TypeEntry | | class APIEXTRACTOR_API TypeEntry | |
| { | | { | |
| public: | | public: | |
| enum Type { | | enum Type { | |
| PrimitiveType, | | PrimitiveType, | |
| VoidType, | | VoidType, | |
| VarargsType, | | VarargsType, | |
| FlagsType, | | FlagsType, | |
| EnumType, | | EnumType, | |
|
| | | EnumValue, | |
| TemplateArgumentType, | | TemplateArgumentType, | |
| ThreadType, | | ThreadType, | |
| BasicValueType, | | BasicValueType, | |
| StringType, | | StringType, | |
| ContainerType, | | ContainerType, | |
| InterfaceType, | | InterfaceType, | |
| ObjectType, | | ObjectType, | |
| NamespaceType, | | NamespaceType, | |
| VariantType, | | VariantType, | |
| JObjectWrapperType, | | JObjectWrapperType, | |
| CharType, | | CharType, | |
| ArrayType, | | ArrayType, | |
| TypeSystemType, | | TypeSystemType, | |
| CustomType, | | CustomType, | |
|
| TargetLangType | | TargetLangType, | |
| | | FunctionType | |
| }; | | }; | |
| | | | |
| enum CodeGeneration { | | enum CodeGeneration { | |
| GenerateTargetLang = 0x0001, | | GenerateTargetLang = 0x0001, | |
| GenerateCpp = 0x0002, | | GenerateCpp = 0x0002, | |
| GenerateForSubclass = 0x0004, | | GenerateForSubclass = 0x0004, | |
| | | | |
| GenerateNothing = 0, | | GenerateNothing = 0, | |
| GenerateAll = 0xffff, | | GenerateAll = 0xffff, | |
| GenerateCode = GenerateTargetLang | GenerateCpp | | GenerateCode = GenerateTargetLang | GenerateCpp | |
| | | | |
| skipping to change at line 716 | | skipping to change at line 691 | |
| return m_type == CustomType; | | return m_type == CustomType; | |
| } | | } | |
| bool isBasicValue() const | | bool isBasicValue() const | |
| { | | { | |
| return m_type == BasicValueType; | | return m_type == BasicValueType; | |
| } | | } | |
| bool isTypeSystem() const | | bool isTypeSystem() const | |
| { | | { | |
| return m_type == TypeSystemType; | | return m_type == TypeSystemType; | |
| } | | } | |
|
| | | bool isFunction() const | |
| | | { | |
| | | return m_type == FunctionType; | |
| | | } | |
| | | bool isEnumValue() const | |
| | | { | |
| | | return m_type == EnumValue; | |
| | | } | |
| | | | |
| virtual bool preferredConversion() const | | virtual bool preferredConversion() const | |
| { | | { | |
| return m_preferredConversion; | | return m_preferredConversion; | |
| } | | } | |
| virtual void setPreferredConversion(bool b) | | virtual void setPreferredConversion(bool b) | |
| { | | { | |
| m_preferredConversion = b; | | m_preferredConversion = b; | |
| } | | } | |
| | | | |
| | | | |
| skipping to change at line 876 | | skipping to change at line 859 | |
| IncludeList extraIncludes() const | | IncludeList extraIncludes() const | |
| { | | { | |
| return m_extraIncludes; | | return m_extraIncludes; | |
| } | | } | |
| void setExtraIncludes(const IncludeList &includes) | | void setExtraIncludes(const IncludeList &includes) | |
| { | | { | |
| m_extraIncludes = includes; | | m_extraIncludes = includes; | |
| } | | } | |
| void addExtraInclude(const Include &include) | | void addExtraInclude(const Include &include) | |
| { | | { | |
|
| if (!m_includesUsed.value(include.name, false)) { | | if (!m_includesUsed.value(include.name(), false)) { | |
| m_extraIncludes << include; | | m_extraIncludes << include; | |
|
| m_includesUsed[include.name] = true; | | m_includesUsed[include.name()] = true; | |
| } | | } | |
| } | | } | |
| | | | |
| Include include() const | | Include include() const | |
| { | | { | |
| return m_include; | | return m_include; | |
| } | | } | |
| void setInclude(const Include &inc) | | void setInclude(const Include &inc) | |
| { | | { | |
| m_include = inc; | | m_include = inc; | |
| | | | |
| skipping to change at line 1237 | | skipping to change at line 1220 | |
| | | | |
| QStringList m_rejectedEnums; | | QStringList m_rejectedEnums; | |
| QList<EnumValueRedirection> m_enumRedirections; | | QList<EnumValueRedirection> m_enumRedirections; | |
| | | | |
| FlagsTypeEntry *m_flags; | | FlagsTypeEntry *m_flags; | |
| | | | |
| bool m_extensible; | | bool m_extensible; | |
| bool m_forceInteger; | | bool m_forceInteger; | |
| }; | | }; | |
| | | | |
|
| | | class APIEXTRACTOR_API EnumValueTypeEntry : public TypeEntry | |
| | | { | |
| | | public: | |
| | | EnumValueTypeEntry(const QString& name, const QString& value, const Enu | |
| | | mTypeEntry* enclosingEnum) | |
| | | : TypeEntry(name, TypeEntry::EnumValue), m_value(value), m_enclosin | |
| | | gEnum(enclosingEnum) | |
| | | { | |
| | | } | |
| | | | |
| | | QString value() const { return m_value; } | |
| | | const EnumTypeEntry* enclosingEnum() const { return m_enclosingEnum; } | |
| | | private: | |
| | | QString m_value; | |
| | | const EnumTypeEntry* m_enclosingEnum; | |
| | | }; | |
| | | | |
| class APIEXTRACTOR_API FlagsTypeEntry : public TypeEntry | | class APIEXTRACTOR_API FlagsTypeEntry : public TypeEntry | |
| { | | { | |
| public: | | public: | |
| FlagsTypeEntry(const QString &name) : TypeEntry(name, FlagsType), m_enu
m(0) | | FlagsTypeEntry(const QString &name) : TypeEntry(name, FlagsType), m_enu
m(0) | |
| { | | { | |
| } | | } | |
| | | | |
| QString qualifiedTargetLangName() const; | | QString qualifiedTargetLangName() const; | |
| QString targetLangName() const | | QString targetLangName() const | |
| { | | { | |
| | | | |
| skipping to change at line 1573 | | skipping to change at line 1571 | |
| ContainerTypeEntry(const QString &name, Type type) | | ContainerTypeEntry(const QString &name, Type type) | |
| : ComplexTypeEntry(name, ContainerType), m_type(type) | | : ComplexTypeEntry(name, ContainerType), m_type(type) | |
| { | | { | |
| setCodeGeneration(GenerateForSubclass); | | setCodeGeneration(GenerateForSubclass); | |
| } | | } | |
| | | | |
| Type type() const | | Type type() const | |
| { | | { | |
| return m_type; | | return m_type; | |
| } | | } | |
|
| | | | |
| | | QString typeName() const; | |
| QString targetLangName() const; | | QString targetLangName() const; | |
| QString targetLangPackage() const; | | QString targetLangPackage() const; | |
| QString qualifiedCppName() const; | | QString qualifiedCppName() const; | |
| | | | |
| static Type containerTypeFromString(QString typeName) | | static Type containerTypeFromString(QString typeName) | |
| { | | { | |
| static QHash<QString, Type> m_stringToContainerType; | | static QHash<QString, Type> m_stringToContainerType; | |
| if (m_stringToContainerType.isEmpty()) { | | if (m_stringToContainerType.isEmpty()) { | |
| m_stringToContainerType["list"] = ListContainer; | | m_stringToContainerType["list"] = ListContainer; | |
| m_stringToContainerType["string-list"] = StringListContainer; | | m_stringToContainerType["string-list"] = StringListContainer; | |
| | | | |
| skipping to change at line 1716 | | skipping to change at line 1716 | |
| } | | } | |
| virtual QString qualifiedCppName() const | | virtual QString qualifiedCppName() const | |
| { | | { | |
| return ComplexTypeEntry::qualifiedCppName().left(ComplexTypeEntry::
qualifiedCppName().length() - interfaceName("").length()); | | return ComplexTypeEntry::qualifiedCppName().left(ComplexTypeEntry::
qualifiedCppName().length() - interfaceName("").length()); | |
| } | | } | |
| | | | |
| private: | | private: | |
| ObjectTypeEntry *m_origin; | | ObjectTypeEntry *m_origin; | |
| }; | | }; | |
| | | | |
|
| | | 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 | | class APIEXTRACTOR_API ObjectTypeEntry : public ComplexTypeEntry | |
| { | | { | |
| public: | | public: | |
| ObjectTypeEntry(const QString &name) | | ObjectTypeEntry(const QString &name) | |
| : ComplexTypeEntry(name, ObjectType), m_interface(0) {} | | : ComplexTypeEntry(name, ObjectType), m_interface(0) {} | |
| | | | |
| InterfaceTypeEntry *designatedInterface() const | | InterfaceTypeEntry *designatedInterface() const | |
| { | | { | |
| return m_interface; | | return m_interface; | |
| } | | } | |
| | | | |
| skipping to change at line 1748 | | skipping to change at line 1774 | |
| }; | | }; | |
| | | | |
| struct TypeRejection | | struct TypeRejection | |
| { | | { | |
| QString class_name; | | QString class_name; | |
| QString function_name; | | QString function_name; | |
| QString field_name; | | QString field_name; | |
| QString enum_name; | | 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, b | | | |
| ecause 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 &targetLa | | | |
| ngName); | | | |
| | | | |
| 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_na | | | |
| me, | | | |
| const QString &field_name, const QString &enum_name); | | | |
| bool isClassRejected(const QString &class_name); | | | |
| bool isFunctionRejected(const QString &class_name, const QString &funct | | | |
| ion_name); | | | |
| bool isFieldRejected(const QString &class_name, const QString &field_na | | | |
| me); | | | |
| 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& func | | | |
| tionModification) | | | |
| { | | | |
| 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_holde | | | |
| r_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_holde | | | |
| r_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 &n | | | |
| ame) | | | |
| { | | | |
| 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 &n | | | |
| ame) | | | |
| { | | | |
| TypeEntry *entry = findType(name); | | | |
| if (entry && entry->isNamespace()) | | | |
| return static_cast<NamespaceTypeEntry *>(entry); | | | |
| else | | | |
| return 0; | | | |
| } | | | |
| | | | |
| QString fixCppTypeName(const QString &name); | | QString fixCppTypeName(const QString &name); | |
| | | | |
| #endif // TYPESYSTEM_H | | #endif // TYPESYSTEM_H | |
| | | | |
End of changes. 11 change blocks. |
| 312 lines changed or deleted | | 59 lines changed or added | |
|