00001
00002
00003
00004
00005
00006
00007
00008
00009 #ifndef COMMA_AST_ATTRIBDECL_HDR_GUARD
00010 #define COMMA_AST_ATTRIBDECL_HDR_GUARD
00011
00012 #include "comma/ast/Decl.h"
00013
00014 namespace comma {
00015
00016
00017
00018
00021 class FunctionAttribDecl : public FunctionDecl {
00022
00023 public:
00025 attrib::AttributeID getAttributeID() const {
00026
00027 return static_cast<attrib::AttributeID>(bits);
00028 }
00029
00031
00032
00033
00034 const PrimaryType *getPrefix() const { return prefix; }
00035 PrimaryType *getPrefix() { return prefix; }
00037
00038
00039 static bool classof(const FunctionAttribDecl *node) { return true; }
00040 static bool classof(const Ast *node) {
00041 return denotesFunctionAttribDecl(node);
00042 }
00043
00044 protected:
00045 FunctionAttribDecl(AstKind kind, PrimaryType *prefix,
00046 IdentifierInfo *name, Location loc,
00047 IdentifierInfo **keywords, FunctionType *type,
00048 DeclRegion *parent)
00049 : FunctionDecl(kind, name, loc, keywords, type, parent),
00050 prefix(prefix) {
00051 bits = correspondingID(kind);
00052 }
00053
00054 private:
00055 static bool denotesFunctionAttribDecl(const Ast *node) {
00056 AstKind kind = node->getKind();
00057 return kind == AST_PosAD || kind == AST_ValAD;
00058 }
00059
00060 static attrib::AttributeID correspondingID(AstKind kind) {
00061 attrib::AttributeID ID;
00062 switch (kind) {
00063 default:
00064 assert(false && "Bad ast kind for this attribute!");
00065 ID = attrib::UNKNOWN_ATTRIBUTE;
00066 break;
00067 case AST_PosAD:
00068 ID = attrib::Pos;
00069 case AST_ValAD:
00070 ID = attrib::Val;
00071 }
00072 return ID;
00073 }
00074
00075 PrimaryType *prefix;
00076 };
00077
00078
00079
00080
00083 class PosAD : public FunctionAttribDecl {
00084
00085 public:
00087
00088 const DiscreteType *getPrefix() const {
00089 return llvm::cast<DiscreteType>(FunctionAttribDecl::getPrefix());
00090 }
00091 DiscreteType *getPrefix() {
00092 return llvm::cast<DiscreteType>(FunctionAttribDecl::getPrefix());
00093 }
00095
00096
00097 static bool classof(const PosAD *node) { return true; }
00098 static bool classof(const Ast *node) {
00099 return node->getKind() == AST_PosAD;
00100 }
00101
00102 private:
00105 static PosAD *create(AstResource &resource, IntegerDecl *prefixDecl);
00106 static PosAD *create(AstResource &resource, EnumerationDecl *prefixDecl);
00107
00108 friend class IntegerDecl;
00109 friend class EnumerationDecl;
00110
00112 PosAD(DiscreteType *prefix, IdentifierInfo *name, Location loc,
00113 IdentifierInfo **keywords, FunctionType *type,
00114 DeclRegion *parent)
00115 : FunctionAttribDecl(AST_PosAD, prefix, name, loc,
00116 keywords, type, parent) { }
00117 };
00118
00119
00120
00121
00124 class ValAD : public FunctionAttribDecl {
00125
00126 public:
00128
00129 const DiscreteType *getPrefix() const {
00130 return llvm::cast<DiscreteType>(FunctionAttribDecl::getPrefix());
00131 }
00132 DiscreteType *getPrefix() {
00133 return llvm::cast<DiscreteType>(FunctionAttribDecl::getPrefix());
00134 }
00136
00137
00138 static bool classof(const ValAD *node) { return true; }
00139 static bool classof(const Ast *node) {
00140 return node->getKind() == AST_ValAD;
00141 }
00142
00143 private:
00146 static ValAD *create(AstResource &resource, IntegerDecl *prefixDecl);
00147 static ValAD *create(AstResource &resource, EnumerationDecl *prefixDecl);
00148
00149 friend class IntegerDecl;
00150 friend class EnumerationDecl;
00151
00153 ValAD(DiscreteType *prefix, IdentifierInfo *name, Location loc,
00154 IdentifierInfo **keywords, FunctionType *type,
00155 DeclRegion *parent)
00156 : FunctionAttribDecl(AST_ValAD, prefix, name, loc,
00157 keywords, type, parent) { }
00158 };
00159
00160 }
00161
00162 #endif
00163