/**************************************************************************** ** ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the Qt Script Generator project on Trolltech Labs. ** ** This file may be used under the terms of the GNU General Public ** License version 2.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.trolltech.com/products/qt/opensource.html ** ** If you are unsure which license is appropriate for your use, please ** review the following information: ** http://www.trolltech.com/products/qt/licensing.html or contact the ** sales department at sales@trolltech.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 #include #include class AbstractMeta; class AbstractMetaClass; class AbstractMetaField; class AbstractMetaFunction; class AbstractMetaType; class AbstractMetaVariable; class AbstractMetaArgument; class AbstractMetaEnumValue; class AbstractMetaEnum; class QPropertySpec; typedef QList AbstractMetaFieldList; typedef QList AbstractMetaArgumentList; typedef QList AbstractMetaFunctionList; class AbstractMetaClassList : public QList { 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 &insts) { m_instantiations = insts; } QList 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 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) { } ~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() 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 shouldIgnoreReturnValue() const { return QLatin1String("void") == 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 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; } 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; }; 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 { 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 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 templateArguments() const { return m_template_args; } void setTemplateArguments(const QList &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 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 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 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 m_template_args; ComplexTypeEntry *m_type_entry; FunctionModelItem m_qDebug_stream_function; }; 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; }; 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