Mercurial > projects > qtd
diff generator/abstractmetalang.h @ 1:e78566595089
initial import
author | mandel |
---|---|
date | Mon, 11 May 2009 16:01:50 +0000 |
parents | |
children | eb3b5bbffc8f |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/generator/abstractmetalang.h Mon May 11 16:01:50 2009 +0000 @@ -0,0 +1,968 @@ +/**************************************************************************** +** +** Copyright (C) 1992-2008 Nokia. All rights reserved. +** +** This file is part of Qt Jambi. +** +** * Commercial Usage +* Licensees holding valid Qt Commercial licenses may use this file in +* accordance with the Qt Commercial License Agreement provided with the +* Software or, alternatively, in accordance with the terms contained in +* a written agreement between you and Nokia. +* +* +* GNU General Public License Usage +* Alternatively, this file may be used under the terms of the GNU +* General Public License versions 2.0 or 3.0 as published by the Free +* Software Foundation and appearing in the file LICENSE.GPL included in +* the packaging of this file. Please review the following information +* to ensure GNU General Public Licensing requirements will be met: +* http://www.fsf.org/licensing/licenses/info/GPLv2.html and +* http://www.gnu.org/copyleft/gpl.html. In addition, as a special +* exception, Nokia gives you certain additional rights. These rights +* are described in the Nokia Qt GPL Exception version 1.2, included in +* the file GPL_EXCEPTION.txt in this package. +* +* Qt for Windows(R) Licensees +* As a special exception, Nokia, as the sole copyright holder for Qt +* Designer, grants users of the Qt/Eclipse Integration plug-in the +* right for the Qt/Eclipse Integration to link to functionality +* provided by Qt Designer and its related libraries. +* +* +* If you are unsure which license is appropriate for your use, please +* contact the sales department at qt-sales@nokia.com. + +** +** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +** +****************************************************************************/ + +#ifndef ABSTRACTMETALANG_H +#define ABSTRACTMETALANG_H + +#include "codemodel.h" + +#include "typesystem.h" + +#include <QHash> +#include <QSet> +#include <QStringList> +#include <QTextStream> + + +class AbstractMeta; +class AbstractMetaClass; +class AbstractMetaField; +class AbstractMetaFunction; +class AbstractMetaType; +class AbstractMetaVariable; +class AbstractMetaArgument; +class AbstractMetaEnumValue; +class AbstractMetaEnum; +class QPropertySpec; + +typedef QList<AbstractMetaField *> AbstractMetaFieldList; +typedef QList<AbstractMetaArgument *> AbstractMetaArgumentList; +typedef QList<AbstractMetaFunction *> AbstractMetaFunctionList; +class AbstractMetaClassList : public QList<AbstractMetaClass *> +{ +public: + AbstractMetaClass *findClass(const QString &name) const; + AbstractMetaEnumValue *findEnumValue(const QString &string) const; + AbstractMetaEnum *findEnum(const EnumTypeEntry *entry) const; + +}; + + + +class AbstractMetaAttributes +{ +public: + AbstractMetaAttributes() : m_attributes(0) { }; + + enum Attribute { + None = 0x00000000, + + Private = 0x00000001, + Protected = 0x00000002, + Public = 0x00000004, + Friendly = 0x00000008, + Visibility = 0x0000000f, + + Native = 0x00000010, + Abstract = 0x00000020, + Static = 0x00000040, + + FinalInTargetLang = 0x00000080, + FinalInCpp = 0x00000100, + ForceShellImplementation = 0x00000200, + + GetterFunction = 0x00000400, + SetterFunction = 0x00000800, + + FinalOverload = 0x00001000, + InterfaceFunction = 0x00002000, + + PropertyReader = 0x00004000, + PropertyWriter = 0x00008000, + PropertyResetter = 0x00010000, + + Fake = 0x00020000, + + Invokable = 0x00040000, + + Final = FinalInTargetLang | FinalInCpp + }; + + uint attributes() const { return m_attributes; } + void setAttributes(uint attributes) { m_attributes = attributes; } + + uint originalAttributes() const { return m_originalAttributes; } + void setOriginalAttributes(uint attributes) { m_originalAttributes = attributes; } + + uint visibility() const { return m_attributes & Visibility; } + void setVisibility(uint visi) { m_attributes = (m_attributes & ~Visibility) | visi; } + + void operator+=(Attribute attribute) { m_attributes |= attribute; } + void operator-=(Attribute attribute) { m_attributes &= ~attribute; } + + bool isNative() const { return m_attributes & Native; } + bool isFinal() const { return (m_attributes & Final) == Final; } + bool isFinalInTargetLang() const { return m_attributes & FinalInTargetLang; } + bool isFinalInCpp() const { return m_attributes & FinalInCpp; } + bool isAbstract() const { return m_attributes & Abstract; } + bool isStatic() const { return m_attributes & Static; } + bool isForcedShellImplementation() const { return m_attributes & ForceShellImplementation; } + bool isInterfaceFunction() const { return m_attributes & InterfaceFunction; } + bool isFinalOverload() const { return m_attributes & FinalOverload; } + bool isInvokable() const { return m_attributes & Invokable; } + + bool isPropertyReader() const { return m_attributes & PropertyReader; } + bool isPropertyWriter() const { return m_attributes & PropertyWriter; } + bool isPropertyResetter() const { return m_attributes & PropertyResetter; } + + bool isPrivate() const { return m_attributes & Private; } + bool isProtected() const { return m_attributes & Protected; } + bool isPublic() const { return m_attributes & Public; } + bool isFriendly() const { return m_attributes & Friendly; } + + bool wasPrivate() const { return m_originalAttributes & Private; } + bool wasProtected() const { return m_originalAttributes & Protected; } + bool wasPublic() const { return m_originalAttributes & Public; } + bool wasFriendly() const { return m_originalAttributes & Friendly; } + +private: + uint m_attributes; + uint m_originalAttributes; +}; + + +class AbstractMetaType +{ +public: + enum TypeUsagePattern { + InvalidPattern, + PrimitivePattern, + FlagsPattern, + EnumPattern, + ValuePattern, + StringPattern, + CharPattern, + ObjectPattern, + QObjectPattern, + NativePointerPattern, + ContainerPattern, + VariantPattern, + JObjectWrapperPattern, + ArrayPattern, + ThreadPattern + }; + + AbstractMetaType() : + m_type_entry(0), + m_array_element_count(0), + m_array_element_type(0), + m_original_template_type(0), + m_pattern(InvalidPattern), + m_constant(false), + m_reference(false), + m_cpp_instantiation(true), + m_indirections(0), + m_reserved(0) + { + } + + QString package() const { return m_type_entry->javaPackage(); } + QString name() const { return m_type_entry->targetLangName(); } + QString fullName() const { return m_type_entry->qualifiedTargetLangName(); } + + void setTypeUsagePattern(TypeUsagePattern pattern) { m_pattern = pattern; } + TypeUsagePattern typeUsagePattern() const { return m_pattern; } + + // true when use pattern is container + bool hasInstantiations() const { return !m_instantiations.isEmpty(); } + void addInstantiation(AbstractMetaType *inst) { m_instantiations << inst; } + void setInstantiations(const QList<AbstractMetaType *> &insts) { m_instantiations = insts; } + QList<AbstractMetaType *> instantiations() const { return m_instantiations; } + void setInstantiationInCpp(bool incpp) { m_cpp_instantiation = incpp; } + bool hasInstantiationInCpp() const { return hasInstantiations() && m_cpp_instantiation; } + + QString minimalSignature() const; + + // true when the type is a QtJambiObject subclass + bool hasNativeId() const; + + // returns true if the typs is used as a non complex primitive, no & or *'s + bool isPrimitive() const { return m_pattern == PrimitivePattern; } + + // returns true if the type is used as an enum + bool isEnum() const { return m_pattern == EnumPattern; } + + // returns true if the type is used as a QObject * + bool isQObject() const { return m_pattern == QObjectPattern; } + + // returns true if the type is used as an object, e.g. Xxx * + bool isObject() const { return m_pattern == ObjectPattern; } + + // returns true if the type is used as an array, e.g. Xxx[42] + bool isArray() const { return m_pattern == ArrayPattern; } + + // returns true if the type is used as a value type (X or const X &) + bool isValue() const { return m_pattern == ValuePattern; } + + // returns true for more complex types... + bool isNativePointer() const { return m_pattern == NativePointerPattern; } + + // returns true if the type was originally a QString or const QString & or equivalent for QLatin1String + bool isTargetLangString() const { return m_pattern == StringPattern; } + + // returns true if the type was originally a QChar or const QChar & + bool isTargetLangChar() const { return m_pattern == CharPattern; } + + // return true if the type was originally a QVariant or const QVariant & + bool isVariant() const { return m_pattern == VariantPattern; } + + // return true if the type was originally a JObjectWrapper or const JObjectWrapper & + bool isJObjectWrapper() const { return m_pattern == JObjectWrapperPattern; } + + // returns true if the type was used as a container + bool isContainer() const { return m_pattern == ContainerPattern; } + + // returns true if the type was used as a flag + bool isFlags() const { return m_pattern == FlagsPattern; } + + // returns true if the type was used as a thread + bool isThread() const { return m_pattern == ThreadPattern; } + + bool isConstant() const { return m_constant; } + void setConstant(bool constant) { m_constant = constant; } + + bool isReference() const { return m_reference; } + void setReference(bool ref) { m_reference = ref; } + + // Returns true if the type is to be implemented using Java enums, e.g. not plain ints. + bool isTargetLangEnum() const { return isEnum() && !((EnumTypeEntry *) typeEntry())->forceInteger(); } + bool isIntegerEnum() const { return isEnum() && !isTargetLangEnum(); } + + // Returns true if the type is to be implemented using Java QFlags, e.g. not plain ints. + bool isTargetLangFlags() const { + return isFlags() && !((FlagsTypeEntry *) typeEntry())->forceInteger(); } + bool isIntegerFlags() const { return isFlags() && !isTargetLangFlags(); } + + int actualIndirections() const { return m_indirections + (isReference() ? 1 : 0); } + int indirections() const { return m_indirections; } + void setIndirections(int indirections) { m_indirections = indirections; } + + void setArrayElementCount(int n) { m_array_element_count = n; } + int arrayElementCount() const { return m_array_element_count; } + + AbstractMetaType *arrayElementType() const { return m_array_element_type; } + void setArrayElementType(AbstractMetaType *t) { m_array_element_type = t; } + + QString cppSignature() const; + + AbstractMetaType *copy() const; + + const TypeEntry *typeEntry() const { return m_type_entry; } + void setTypeEntry(const TypeEntry *type) { m_type_entry = type; } + + void setOriginalTypeDescription(const QString &otd) { m_original_type_description = otd; } + QString originalTypeDescription() const { return m_original_type_description; } + + void setOriginalTemplateType(const AbstractMetaType *type) { m_original_template_type = type; } + const AbstractMetaType *originalTemplateType() const { return m_original_template_type; } + +private: + const TypeEntry *m_type_entry; + QList <AbstractMetaType *> m_instantiations; + QString m_package; + QString m_original_type_description; + + int m_array_element_count; + AbstractMetaType *m_array_element_type; + const AbstractMetaType *m_original_template_type; + + TypeUsagePattern m_pattern; + uint m_constant : 1; + uint m_reference : 1; + uint m_cpp_instantiation : 1; + int m_indirections : 4; + uint m_reserved : 25; // unused +}; + +class AbstractMetaVariable +{ +public: + AbstractMetaVariable() : m_type(0) { } + + AbstractMetaType *type() const { return m_type; } + void setType(AbstractMetaType *type) { m_type = type; } + + QString name() const { return m_name; } + void setName(const QString &name) { m_name = name; } + +private: + QString m_name; + AbstractMetaType *m_type; +}; + + + +class AbstractMetaArgument : public AbstractMetaVariable +{ +public: + AbstractMetaArgument() : m_argument_index(0) { }; + + QString defaultValueExpression() const { return m_expression; } + void setDefaultValueExpression(const QString &expr) { m_expression = expr; } + + QString originalDefaultValueExpression() const { return m_original_expression; } + void setOriginalDefaultValueExpression(const QString &expr) { m_original_expression = expr; } + + QString toString() const { return type()->name() + " " + AbstractMetaVariable::name() + + (m_expression.isEmpty() ? "" : " = " + m_expression); } + + int argumentIndex() const { return m_argument_index; } + void setArgumentIndex(int argIndex) { m_argument_index = argIndex; } + + QString argumentName() const; + QString indexedName() const; + + AbstractMetaArgument *copy() const; + +private: + // Just to force people to call argumentName() And indexedName(); + QString name() const; + + QString m_expression; + QString m_original_expression; + int m_argument_index; +}; + + +class AbstractMetaField : public AbstractMetaVariable, public AbstractMetaAttributes +{ +public: + AbstractMetaField(); + ~AbstractMetaField(); + + const AbstractMetaClass *enclosingClass() const { return m_class; } + void setEnclosingClass(const AbstractMetaClass *cls) { m_class = cls; } + + const AbstractMetaFunction *getter() const; + const AbstractMetaFunction *setter() const; + + FieldModificationList modifications() const; + + AbstractMetaField *copy() const; + +private: + mutable AbstractMetaFunction *m_getter; + mutable AbstractMetaFunction *m_setter; + const AbstractMetaClass *m_class; +}; + + +class AbstractMetaFunction : public AbstractMetaAttributes +{ +public: + enum FunctionType { + ConstructorFunction, + DestructorFunction, + NormalFunction, + SignalFunction, + EmptyFunction, + SlotFunction, + GlobalScopeFunction + }; + + enum CompareResult { + EqualName = 0x00000001, + EqualArguments = 0x00000002, + EqualAttributes = 0x00000004, + EqualImplementor = 0x00000008, + EqualReturnType = 0x00000010, + EqualDefaultValueOverload = 0x00000020, + EqualModifiedName = 0x00000040, + + NameLessThan = 0x00001000, + + PrettySimilar = EqualName | EqualArguments, + Equal = 0x0000001f, + NotEqual = 0x00001000 + }; + + AbstractMetaFunction() + : m_function_type(NormalFunction), + m_type(0), + m_class(0), + m_implementing_class(0), + m_declaring_class(0), + m_interface_class(0), + m_property_spec(0), + m_constant(false), + m_invalid(false), + m_jumptable_id(-1), + // qtd + m_store_result(0) + { + } + + ~AbstractMetaFunction(); + + QString name() const { return m_name; } + void setName(const QString &name) { m_name = name; } + + QString originalName() const { return m_original_name.isEmpty() ? name() : m_original_name; } + void setOriginalName(const QString &name) { m_original_name = name; } + + QString modifiedName() const; + + QString minimalSignature() const; + QStringList possibleIntrospectionCompatibleSignatures() const; + + QString marshalledName(bool classIsOwner = true) const; + + // true if one or more of the arguments are of QtJambiObject subclasses + bool argumentsHaveNativeId() const + { + foreach (const AbstractMetaArgument *arg, m_arguments) { + if (arg->type()->hasNativeId()) + return true; + } + + return false; + } + + bool isModifiedRemoved(int types = TypeSystem::All) const; + + AbstractMetaType *type() const { return m_type; } + void setType(AbstractMetaType *type) { m_type = type; } + + // The class that has this function as a member. + const AbstractMetaClass *ownerClass() const { return m_class; } + void setOwnerClass(const AbstractMetaClass *cls) { m_class = cls; } + + // The first class in a hierarchy that declares the function + const AbstractMetaClass *declaringClass() const { return m_declaring_class; } + void setDeclaringClass(const AbstractMetaClass *cls) { m_declaring_class = cls; } + + // The class that actually implements this function + const AbstractMetaClass *implementingClass() const { return m_implementing_class; } + void setImplementingClass(const AbstractMetaClass *cls) { m_implementing_class = cls; } + + bool needsCallThrough() const; + + AbstractMetaArgumentList arguments() const { return m_arguments; } + void setArguments(const AbstractMetaArgumentList &arguments) { m_arguments = arguments; } + void addArgument(AbstractMetaArgument *argument) { m_arguments << argument; } + int actualMinimumArgumentCount() const; + + void setInvalid(bool on) { m_invalid = on; } + bool isInvalid() const { return m_invalid; } + bool isDeprecated() const; + bool isDestructor() const { return functionType() == DestructorFunction; } + bool isConstructor() const { return functionType() == ConstructorFunction; } + bool isNormal() const { return functionType() == NormalFunction || isSlot() || isInGlobalScope(); } + bool isInGlobalScope() const { return functionType() == GlobalScopeFunction; } + bool isSignal() const { return functionType() == SignalFunction; } + bool isSlot() const { return functionType() == SlotFunction; } + bool isEmptyFunction() const { return functionType() == EmptyFunction; } + FunctionType functionType() const { return m_function_type; } + void setFunctionType(FunctionType type) { m_function_type = type; } + + QStringList introspectionCompatibleSignatures(const QStringList &resolvedArguments = QStringList()) const; + QString signature() const; + QString targetLangSignature(bool minimal = false) const; + bool shouldReturnThisObject() const { return QLatin1String("this") == argumentReplaced(0); } + + bool isConstant() const { return m_constant; } + void setConstant(bool constant) { m_constant = constant; } + + QString toString() const { return m_name; } + + uint compareTo(const AbstractMetaFunction *other) const; + + bool operator <(const AbstractMetaFunction &a) const; + + AbstractMetaFunction *copy() const; + + QString replacedDefaultExpression(const AbstractMetaClass *cls, int idx) const; + bool removedDefaultExpression(const AbstractMetaClass *cls, int idx) const; + QString conversionRule(TypeSystem::Language language, int idx) const; + QList<ReferenceCount> referenceCounts(const AbstractMetaClass *cls, int idx = -2) const; + + bool nullPointersDisabled(const AbstractMetaClass *cls = 0, int argument_idx = 0) const; + QString nullPointerDefaultValue(const AbstractMetaClass *cls = 0, int argument_idx = 0) const; + + bool resetObjectAfterUse(int argument_idx) const; + + // Returns whether garbage collection is disabled for the argument in any context + bool disabledGarbageCollection(const AbstractMetaClass *cls, int key) const; + + // Returns the ownership rules for the given argument in the given context + TypeSystem::Ownership ownership(const AbstractMetaClass *cls, TypeSystem::Language language, int idx) const; + + bool isVirtualSlot() const; + + QString typeReplaced(int argument_index) const; + bool isRemovedFromAllLanguages(const AbstractMetaClass *) const; + bool isRemovedFrom(const AbstractMetaClass *, TypeSystem::Language language) const; + bool argumentRemoved(int) const; + + QString argumentReplaced(int key) const; + bool needsSuppressUncheckedWarning() const; + + bool hasModifications(const AbstractMetaClass *implementor) const; + FunctionModificationList modifications(const AbstractMetaClass *implementor) const; + + // If this function stems from an interface, this returns the + // interface that declares it. + const AbstractMetaClass *interfaceClass() const { return m_interface_class; } + void setInterfaceClass(const AbstractMetaClass *cl) { m_interface_class = cl; } + + void setPropertySpec(QPropertySpec *spec) { m_property_spec = spec; } + QPropertySpec *propertySpec() const { return m_property_spec; } + + int jumpTableId() const { return m_jumptable_id; } + void setJumpTableId(int id) { m_jumptable_id = id; } + + // qtd + bool storeResult() const; + void checkStoreResult(); + +private: + int m_store_result; + +private: + QString m_name; + QString m_original_name; + mutable QString m_cached_minimal_signature; + mutable QString m_cached_modified_name; + + FunctionType m_function_type; + AbstractMetaType *m_type; + const AbstractMetaClass *m_class; + const AbstractMetaClass *m_implementing_class; + const AbstractMetaClass *m_declaring_class; + const AbstractMetaClass *m_interface_class; + QPropertySpec *m_property_spec; + AbstractMetaArgumentList m_arguments; + uint m_constant : 1; + uint m_invalid : 1; + int m_jumptable_id; +}; + + +class AbstractMetaEnumValue +{ +public: + AbstractMetaEnumValue() + : m_value_set(false), m_value(0) + { + } + + int value() const { return m_value; } + void setValue(int value) { m_value_set = true; m_value = value; } + + QString stringValue() const { return m_string_value; } + void setStringValue(const QString &v) { m_string_value = v; } + + QString name() const { return m_name; } + void setName(const QString &name) { m_name = name; } + + bool isValueSet() const { return m_value_set; } + +private: + QString m_name; + QString m_string_value; + + bool m_value_set; + int m_value; +}; + + +class AbstractMetaEnumValueList : public QList<AbstractMetaEnumValue *> +{ +public: + AbstractMetaEnumValue *find(const QString &name) const; +}; + +class AbstractMetaEnum : public AbstractMetaAttributes +{ +public: + AbstractMetaEnum() : m_type_entry(0), m_class(0), m_has_qenums_declaration(false) {} + + AbstractMetaEnumValueList values() const { return m_enum_values; } + void addEnumValue(AbstractMetaEnumValue *enumValue) { m_enum_values << enumValue; } + + QString name() const { return m_type_entry->targetLangName(); } + QString qualifier() const { return m_type_entry->javaQualifier(); } + QString package() const { return m_type_entry->javaPackage(); } + QString fullName() const { return package() + "." + qualifier() + "." + name(); } + + // Has the enum been declared inside a Q_ENUMS() macro in its enclosing class? + void setHasQEnumsDeclaration(bool on) { m_has_qenums_declaration = on; } + bool hasQEnumsDeclaration() const { return m_has_qenums_declaration; } + + EnumTypeEntry *typeEntry() const { return m_type_entry; } + void setTypeEntry(EnumTypeEntry *entry) { m_type_entry = entry; } + + AbstractMetaClass *enclosingClass() const { return m_class; } + void setEnclosingClass(AbstractMetaClass *c) { m_class = c; } + +private: + AbstractMetaEnumValueList m_enum_values; + EnumTypeEntry *m_type_entry; + AbstractMetaClass *m_class; + + uint m_has_qenums_declaration : 1; + uint m_reserved : 31; +}; + +typedef QList<AbstractMetaEnum *> AbstractMetaEnumList; + +class AbstractMetaClass : public AbstractMetaAttributes +{ +public: + enum FunctionQueryOption { + Constructors = 0x000001, // Only constructors + //Destructors = 0x000002, // Only destructors. Not included in class. + VirtualFunctions = 0x000004, // Only virtual functions (virtual in both TargetLang and C++) + FinalInTargetLangFunctions = 0x000008, // Only functions that are non-virtual in TargetLang + FinalInCppFunctions = 0x000010, // Only functions that are non-virtual in C++ + ClassImplements = 0x000020, // Only functions implemented by the current class + Inconsistent = 0x000040, // Only inconsistent functions (inconsistent virtualness in TargetLang/C++) + StaticFunctions = 0x000080, // Only static functions + Signals = 0x000100, // Only signals + NormalFunctions = 0x000200, // Only functions that aren't signals + Visible = 0x000400, // Only public and protected functions + ForcedShellFunctions = 0x000800, // Only functions that are overridden to be implemented in the shell class + WasPublic = 0x001000, // Only functions that were originally public + WasProtected = 0x002000, // Only functions that were originally protected + NonStaticFunctions = 0x004000, // No static functions + Empty = 0x008000, // Empty overrides of abstract functions + Invisible = 0x010000, // Only private functions + VirtualInCppFunctions = 0x020000, // Only functions that are virtual in C++ + NonEmptyFunctions = 0x040000, // Only functions with JNI implementations + VirtualInTargetLangFunctions = 0x080000, // Only functions which are virtual in TargetLang + AbstractFunctions = 0x100000, // Only abstract functions + WasVisible = 0x200000, // Only functions that were public or protected in the original code + NotRemovedFromTargetLang = 0x400000, // Only functions that have not been removed from TargetLang + NotRemovedFromShell = 0x800000, // Only functions that have not been removed from the shell class + VirtualSlots = 0x1000000 // Only functions that are set as virtual slots in the type system + }; + + AbstractMetaClass() + : m_namespace(false), + m_qobject(false), + m_has_virtuals(false), + m_has_nonpublic(false), + m_has_virtual_slots(false), + m_has_nonprivateconstructor(false), + m_functions_fixed(false), + m_has_public_destructor(true), + m_force_shell_class(false), + m_has_hash_function(false), + m_has_equals_operator(false), + m_has_clone_operator(false), + m_is_type_alias(false), + m_enclosing_class(0), + m_base_class(0), + m_template_base_class(0), + m_extracted_interface(0), + m_primary_interface_implementor(0), + m_type_entry(0), + m_qDebug_stream_function(0) + { + } + + virtual ~AbstractMetaClass(); + + AbstractMetaClass *extractInterface(); + void fixFunctions(); + + AbstractMetaFunctionList functions() const { return m_functions; } + void setFunctions(const AbstractMetaFunctionList &functions); + void addFunction(AbstractMetaFunction *function); + bool hasFunction(const AbstractMetaFunction *f) const; + bool hasFunction(const QString &str) const; + bool hasSignal(const AbstractMetaFunction *f) const; + + bool hasConstructors() const; + + void addDefaultConstructor(); + + bool hasNonPrivateConstructor() const { return m_has_nonprivateconstructor; } + void setHasNonPrivateConstructor(bool on) { m_has_nonprivateconstructor = on; } + bool hasPublicDestructor() const { return m_has_public_destructor; } + void setHasPublicDestructor(bool on) { m_has_public_destructor = on; } + + AbstractMetaFunctionList queryFunctionsByName(const QString &name) const; + AbstractMetaFunctionList queryFunctions(uint query) const; + inline AbstractMetaFunctionList allVirtualFunctions() const; + inline AbstractMetaFunctionList allFinalFunctions() const; + AbstractMetaFunctionList functionsInTargetLang() const; + AbstractMetaFunctionList functionsInShellClass() const; + inline AbstractMetaFunctionList cppInconsistentFunctions() const; + inline AbstractMetaFunctionList cppSignalFunctions() const; + AbstractMetaFunctionList publicOverrideFunctions() const; + AbstractMetaFunctionList virtualOverrideFunctions() const; + AbstractMetaFunctionList virtualFunctions() const; + AbstractMetaFunctionList nonVirtualShellFunctions() const; + + AbstractMetaFieldList fields() const { return m_fields; } + void setFields(const AbstractMetaFieldList &fields) { m_fields = fields; } + void addField(AbstractMetaField *field) { m_fields << field; } + + AbstractMetaEnumList enums() const { return m_enums; } + void setEnums(const AbstractMetaEnumList &enums) { m_enums = enums; } + void addEnum(AbstractMetaEnum *e) { m_enums << e; } + + AbstractMetaEnum *findEnum(const QString &enumName); + AbstractMetaEnum *findEnumForValue(const QString &enumName); + AbstractMetaEnumValue *findEnumValue(const QString &enumName, AbstractMetaEnum *meta_enum); + + AbstractMetaClassList interfaces() const { return m_interfaces; } + void addInterface(AbstractMetaClass *interface); + void setInterfaces(const AbstractMetaClassList &interface); + + QString fullName() const { return package() + "." + name(); } + QString name() const; + + QString baseClassName() const { return m_base_class ? m_base_class->name() : QString(); } + + AbstractMetaClass *baseClass() const { return m_base_class; } + void setBaseClass(AbstractMetaClass *base_class) { m_base_class = base_class; } + + const AbstractMetaClass *enclosingClass() const { return m_enclosing_class; } + void setEnclosingClass(AbstractMetaClass *cl) { m_enclosing_class = cl; } + + QString package() const { return m_type_entry->javaPackage(); } + bool isInterface() const { return m_type_entry->isInterface(); } + bool isNamespace() const { return m_type_entry->isNamespace(); } + bool isQObject() const { return m_type_entry->isQObject(); } + bool isQtNamespace() const { return isNamespace() && name() == "Qt"; } + QString qualifiedCppName() const { return m_type_entry->qualifiedCppName(); } + + bool hasInconsistentFunctions() const; + bool hasSignals() const; + bool inheritsFrom(const AbstractMetaClass *other) const; + + void setForceShellClass(bool on) { m_force_shell_class = on; } + bool generateShellClass() const; + + bool hasVirtualSlots() const { return m_has_virtual_slots; } + bool hasVirtualFunctions() const { return !isFinal() && m_has_virtuals; } + bool hasProtectedFunctions() const; + + QList<TypeEntry *> templateArguments() const { return m_template_args; } + void setTemplateArguments(const QList<TypeEntry *> &args) { m_template_args = args; } + + bool hasFieldAccessors() const; + + // only valid during metajavabuilder's run + QStringList baseClassNames() const { return m_base_class_names; } + void setBaseClassNames(const QStringList &names) { m_base_class_names = names; } + + AbstractMetaClass *primaryInterfaceImplementor() const { return m_primary_interface_implementor; } + void setPrimaryInterfaceImplementor(AbstractMetaClass *cl) { m_primary_interface_implementor = cl; } + + const ComplexTypeEntry *typeEntry() const { return m_type_entry; } + ComplexTypeEntry *typeEntry() { return m_type_entry; } + void setTypeEntry(ComplexTypeEntry *type) { m_type_entry = type; } + + void setHasHashFunction(bool on) { m_has_hash_function = on; } + bool hasHashFunction() const { return m_has_hash_function; } + + void setToStringCapability(FunctionModelItem fun) { m_qDebug_stream_function= fun; } + FunctionModelItem hasToStringCapability() const { return m_qDebug_stream_function; } + + virtual bool hasDefaultToStringFunction() const; + + void setHasEqualsOperator(bool on) { m_has_equals_operator = on; } + bool hasEqualsOperator() const { return m_has_equals_operator; } + + void setHasCloneOperator(bool on) { m_has_clone_operator = on; } + bool hasCloneOperator() const { return m_has_clone_operator; } + + void addPropertySpec(QPropertySpec *spec) { m_property_specs << spec; } + QList<QPropertySpec *> propertySpecs() const { return m_property_specs; } + + QPropertySpec *propertySpecForRead(const QString &name) const; + QPropertySpec *propertySpecForWrite(const QString &name) const; + QPropertySpec *propertySpecForReset(const QString &name) const; + + QList<ReferenceCount> referenceCounts() const; + + void setEqualsFunctions(const AbstractMetaFunctionList &lst) { m_equals_functions = lst; } + AbstractMetaFunctionList equalsFunctions() const { return m_equals_functions; } + + void setNotEqualsFunctions(const AbstractMetaFunctionList &lst) { m_nequals_functions = lst; } + AbstractMetaFunctionList notEqualsFunctions() const { return m_nequals_functions; } + + void setLessThanFunctions(const AbstractMetaFunctionList &lst) { m_less_than_functions = lst; } + AbstractMetaFunctionList lessThanFunctions() const { return m_less_than_functions; } + + void setGreaterThanFunctions(const AbstractMetaFunctionList &lst) { m_greater_than_functions = lst; } + AbstractMetaFunctionList greaterThanFunctions() const { return m_greater_than_functions; } + + void setLessThanEqFunctions(const AbstractMetaFunctionList &lst) { m_less_than_eq_functions = lst; } + AbstractMetaFunctionList lessThanEqFunctions() const { return m_less_than_eq_functions; } + + void setGreaterThanEqFunctions(const AbstractMetaFunctionList &lst) { m_greater_than_eq_functions = lst; } + AbstractMetaFunctionList greaterThanEqFunctions() const { return m_greater_than_eq_functions; } + + void sortFunctions(); + + const AbstractMetaClass *templateBaseClass() const { return m_template_base_class; } + void setTemplateBaseClass(const AbstractMetaClass *cls) { m_template_base_class = cls; } + + void setTypeAlias(bool typeAlias) { m_is_type_alias = typeAlias; } + bool isTypeAlias() const { return m_is_type_alias; } + +private: + uint m_namespace : 1; + uint m_qobject : 1; + uint m_has_virtuals : 1; + uint m_has_nonpublic : 1; + uint m_has_virtual_slots : 1; + uint m_has_nonprivateconstructor : 1; + uint m_functions_fixed : 1; + uint m_has_public_destructor : 1; + uint m_force_shell_class : 1; + uint m_has_hash_function : 1; + uint m_has_equals_operator : 1; + uint m_has_clone_operator :1; + uint m_is_type_alias : 1; + uint m_reserved : 19; + + const AbstractMetaClass *m_enclosing_class; + AbstractMetaClass *m_base_class; + const AbstractMetaClass *m_template_base_class; + AbstractMetaFunctionList m_functions; + AbstractMetaFieldList m_fields; + AbstractMetaEnumList m_enums; + AbstractMetaClassList m_interfaces; + AbstractMetaClass *m_extracted_interface; + AbstractMetaClass *m_primary_interface_implementor; + QList<QPropertySpec *> m_property_specs; + AbstractMetaFunctionList m_equals_functions; + AbstractMetaFunctionList m_nequals_functions; + + AbstractMetaFunctionList m_less_than_functions; + AbstractMetaFunctionList m_greater_than_functions; + AbstractMetaFunctionList m_less_than_eq_functions; + AbstractMetaFunctionList m_greater_than_eq_functions; + + QStringList m_base_class_names; + QList<TypeEntry *> m_template_args; + ComplexTypeEntry *m_type_entry; + FunctionModelItem m_qDebug_stream_function; + + // qtd2 hack + friend class DGenerator; +}; + +class QPropertySpec { +public: + QPropertySpec(const TypeEntry *type) + : m_type(type), + m_index(-1) + { + } + + const TypeEntry *type() const { return m_type; } + + QString name() const { return m_name; } + void setName(const QString &name) { m_name = name; } + + QString read() const { return m_read; } + void setRead(const QString &read) { m_read = read; } + + QString write() const { return m_write; } + void setWrite(const QString &write) { m_write = write; } + + QString designable() const { return m_designable; } + void setDesignable(const QString &designable) { m_designable = designable; } + + QString reset() const { return m_reset; } + void setReset(const QString &reset) { m_reset = reset; } + + int index() const { return m_index; } + void setIndex(int index) { m_index = index; } + +private: + QString m_name; + QString m_read; + QString m_write; + QString m_designable; + QString m_reset; + const TypeEntry *m_type; + int m_index; +}; + +// qtd +class ArgumentReplace +{ +private: + QHash<QString, QString> data; + static ArgumentReplace *m_instance; + ArgumentReplace(); + +public: + static void init(); + static QString translate(QString arg); +}; + +inline AbstractMetaFunctionList AbstractMetaClass::allVirtualFunctions() const +{ + return queryFunctions(VirtualFunctions + | NotRemovedFromTargetLang); +} + +inline AbstractMetaFunctionList AbstractMetaClass::allFinalFunctions() const +{ + return queryFunctions(FinalInTargetLangFunctions + | FinalInCppFunctions + | NotRemovedFromTargetLang); +} + +inline AbstractMetaFunctionList AbstractMetaClass::cppInconsistentFunctions() const +{ + return queryFunctions(Inconsistent + | NormalFunctions + | Visible + | NotRemovedFromTargetLang); +} + +inline AbstractMetaFunctionList AbstractMetaClass::cppSignalFunctions() const +{ + return queryFunctions(Signals + | Visible + | NotRemovedFromTargetLang); +} + +#endif // ABSTRACTMETALANG_H