language/duchain
identifiedtype.h
00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef IDENTIFIEDTYPE_H
00023 #define IDENTIFIEDTYPE_H
00024
00025 #include "../identifier.h"
00026 #include "../declarationid.h"
00027
00028 namespace KDevelop
00029 {
00030 class DUContext;
00031 class Declaration;
00032 class DeclarationId;
00033 class TopDUContext;
00034 class AbstractType;
00035
00039 class IdentifiedTypeData
00040 {
00041 public:
00042 DeclarationId m_id;
00043 };
00044
00055 class KDEVPLATFORMLANGUAGE_EXPORT IdentifiedType
00056 {
00057 public:
00059 virtual ~IdentifiedType();
00060
00067 bool equals(const IdentifiedType* rhs) const;
00068
00070 void clear();
00071
00078 QualifiedIdentifier qualifiedIdentifier() const;
00079
00081 uint hash() const;
00082
00091 DeclarationId declarationId() const;
00092
00097 void setDeclarationId(const DeclarationId& id);
00098
00105 Declaration* declaration(const TopDUContext* top) const;
00106
00112 DUContext* internalContext(const TopDUContext* top) const;
00113
00125 void setDeclaration(Declaration* declaration);
00126
00128 virtual IdentifiedTypeData* idData() = 0;
00130 virtual const IdentifiedTypeData* idData() const = 0;
00131 };
00132
00135 template<class Parent>
00136 class KDEVPLATFORMLANGUAGE_EXPORT MergeIdentifiedType : public Parent, public IdentifiedType {
00137 public:
00138
00139 class Data : public Parent::Data, public IdentifiedTypeData {
00140 };
00141
00142 MergeIdentifiedType() {
00143 }
00144
00145
00146 MergeIdentifiedType(Data& data) : Parent(data) {
00147 }
00148
00149 virtual IdentifiedTypeData* idData() {
00150 return static_cast<Data*>(this->d_func_dynamic());
00151 }
00152
00153 virtual const IdentifiedTypeData* idData() const {
00154 return static_cast<const Data*>(this->d_func());
00155 }
00156
00157 virtual bool equals(const KDevelop::AbstractType* rhs) const
00158 {
00159 if (!Parent::equals(rhs))
00160 return false;
00161
00162 const IdentifiedType* rhsId = dynamic_cast<const IdentifiedType*>(rhs);
00163 Q_ASSERT(rhsId);
00164
00165 return IdentifiedType::equals(static_cast<const IdentifiedType*>(rhsId));
00166 }
00167
00168 private:
00169 MergeIdentifiedType(const MergeIdentifiedType& rhs);
00170 };
00171
00172 }
00173
00174 #endif
00175
00176