/* * Copyright 2009, Ingo Weinhold, ingo_weinhold@gmx.de. * Distributed under the terms of the MIT License. */ #ifndef TYPE_H #define TYPE_H #include #include #include #include "Types.h" enum type_kind { TYPE_PRIMITIVE, TYPE_COMPOUND, TYPE_MODIFIED, TYPE_TYPEDEF, TYPE_ADDRESS, TYPE_ENUMERATION, TYPE_SUBRANGE, TYPE_ARRAY, TYPE_UNSPECIFIED, TYPE_FUNCTION, TYPE_POINTER_TO_MEMBER }; enum compound_type_kind { COMPOUND_TYPE_CLASS, COMPOUND_TYPE_STRUCT, COMPOUND_TYPE_UNION, COMPOUND_TYPE_INTERFACE }; enum address_type_kind { DERIVED_TYPE_POINTER, DERIVED_TYPE_REFERENCE }; enum template_type_kind { TEMPLATE_TYPE_TYPE, TEMPLATE_TYPE_VALUE }; enum { TYPE_MODIFIER_CONST = 0x01, TYPE_MODIFIER_VOLATILE = 0x02, TYPE_MODIFIER_RESTRICT = 0x04, TYPE_MODIFIER_PACKED = 0x08, TYPE_MODIFIER_SHARED = 0x10 }; class AddressType; class ArrayIndexPath; class ArrayType; class BString; class Type; class ValueLocation; class BaseType : public BReferenceable { public: virtual ~BaseType(); virtual Type* GetType() const = 0; }; class DataMember : public BReferenceable { public: virtual ~DataMember(); virtual const char* Name() const = 0; virtual Type* GetType() const = 0; }; class EnumeratorValue : public BReferenceable { public: virtual ~EnumeratorValue(); virtual const char* Name() const = 0; virtual BVariant Value() const = 0; }; class ArrayDimension : public BReferenceable { public: virtual ~ArrayDimension(); virtual Type* GetType() const = 0; // subrange or enumeration virtual uint64 CountElements() const; // returns 0, if unknown }; class FunctionParameter : public BReferenceable { public: virtual ~FunctionParameter(); virtual const char* Name() const = 0; virtual Type* GetType() const = 0; }; class TemplateParameter : public BReferenceable { public: virtual ~TemplateParameter(); virtual template_type_kind Kind() const = 0; virtual Type* GetType() const = 0; virtual BVariant Value() const = 0; }; class Type : public BReferenceable { public: virtual ~Type(); virtual image_id ImageID() const = 0; virtual const BString& ID() const = 0; virtual const BString& Name() const = 0; virtual type_kind Kind() const = 0; virtual target_size_t ByteSize() const = 0; virtual Type* ResolveRawType(bool nextOneOnly) const; // strips modifiers and typedefs (only one, // if requested) virtual status_t CreateDerivedAddressType( address_type_kind kind, AddressType*& _resultType); virtual status_t CreateDerivedArrayType( int64 lowerBound, int64 elementCount, bool extendExisting, // if the current object is already // an array type, attach an extra // dimension to it rather than // creating a new encapsulating // type object ArrayType*& _resultType); virtual status_t ResolveObjectDataLocation( const ValueLocation& objectLocation, ValueLocation*& _location) = 0; // returns a reference virtual status_t ResolveObjectDataLocation( target_addr_t objectAddress, ValueLocation*& _location) = 0; // returns a reference }; class PrimitiveType : public virtual Type { public: virtual ~PrimitiveType(); virtual type_kind Kind() const; virtual uint32 TypeConstant() const = 0; }; class CompoundType : public virtual Type { public: virtual ~CompoundType(); virtual type_kind Kind() const; virtual compound_type_kind CompoundKind() const = 0; virtual int32 CountBaseTypes() const = 0; virtual BaseType* BaseTypeAt(int32 index) const = 0; virtual int32 CountDataMembers() const = 0; virtual DataMember* DataMemberAt(int32 index) const = 0; virtual int32 CountTemplateParameters() const = 0; virtual TemplateParameter* TemplateParameterAt(int32 index) const = 0; virtual status_t ResolveBaseTypeLocation(BaseType* baseType, const ValueLocation& parentLocation, ValueLocation*& _location) = 0; // returns a reference virtual status_t ResolveDataMemberLocation(DataMember* member, const ValueLocation& parentLocation, ValueLocation*& _location) = 0; // returns a reference }; class ModifiedType : public virtual Type { public: virtual ~ModifiedType(); virtual type_kind Kind() const; virtual uint32 Modifiers() const = 0; virtual Type* BaseType() const = 0; virtual Type* ResolveRawType(bool nextOneOnly) const; }; class TypedefType : public virtual Type { public: virtual ~TypedefType(); virtual type_kind Kind() const; virtual Type* BaseType() const = 0; virtual Type* ResolveRawType(bool nextOneOnly) const; }; class AddressType : public virtual Type { public: virtual ~AddressType(); virtual type_kind Kind() const; virtual address_type_kind AddressKind() const = 0; virtual Type* BaseType() const = 0; }; class EnumerationType : public virtual Type { public: virtual ~EnumerationType(); virtual type_kind Kind() const; virtual Type* BaseType() const = 0; // may return NULL virtual int32 CountValues() const = 0; virtual EnumeratorValue* ValueAt(int32 index) const = 0; virtual EnumeratorValue* ValueFor(const BVariant& value) const; }; class SubrangeType : public virtual Type { public: virtual ~SubrangeType(); virtual type_kind Kind() const; virtual Type* BaseType() const = 0; virtual BVariant LowerBound() const = 0; virtual BVariant UpperBound() const = 0; }; class ArrayType : public virtual Type { public: virtual ~ArrayType(); virtual type_kind Kind() const; virtual Type* BaseType() const = 0; virtual int32 CountDimensions() const = 0; virtual ArrayDimension* DimensionAt(int32 index) const = 0; virtual status_t ResolveElementLocation( const ArrayIndexPath& indexPath, const ValueLocation& parentLocation, ValueLocation*& _location) = 0; // returns a reference }; class UnspecifiedType : public virtual Type { public: virtual ~UnspecifiedType(); virtual type_kind Kind() const; }; class FunctionType : public virtual Type { public: virtual ~FunctionType(); virtual type_kind Kind() const; virtual Type* ReturnType() const = 0; virtual int32 CountParameters() const = 0; virtual FunctionParameter* ParameterAt(int32 index) const = 0; virtual bool HasVariableArguments() const = 0; }; class PointerToMemberType : public virtual Type { public: virtual ~PointerToMemberType(); virtual type_kind Kind() const; virtual CompoundType* ContainingType() const = 0; virtual Type* BaseType() const = 0; }; #endif // TYPE_H