00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00013 
00014 
00015 #ifndef COMMA_AST_PRAGMA_HDR_GUARD
00016 #define COMMA_AST_PRAGMA_HDR_GUARD
00017 
00018 #include "comma/ast/AstBase.h"
00019 #include "comma/basic/Pragmas.h"
00020 
00021 #include "llvm/ADT/ilist.h"
00022 #include "llvm/ADT/StringRef.h"
00023 
00024 namespace comma {
00025 
00026 
00027 
00028 class Pragma {
00029 
00030 public:
00031     virtual ~Pragma() { }
00032 
00033     pragma::PragmaID getKind() const { return ID; }
00034 
00035     Location getLocation() const { return loc; }
00036 
00038 
00039 
00040     Pragma *getNext() { return nextLink; }
00041     Pragma *getPrev() { return prevLink; }
00042 
00043     const Pragma *getNext() const { return nextLink; }
00044     const Pragma *getPrev() const { return prevLink; }
00045 
00046     void setNext(Pragma *P) { nextLink = P; }
00047     void setPrev(Pragma *P) { prevLink = P; }
00049 
00050     
00051     static bool classof(const Pragma *pragma) { return true; }
00052 
00053 protected:
00054     Pragma(pragma::PragmaID ID, Location loc)
00055         : ID(ID), loc(loc), nextLink(0), prevLink(0) { }
00056 
00060     Pragma() : ID(pragma::UNKNOWN_PRAGMA), loc(0), nextLink(0), prevLink(0) { }
00061     friend class llvm::ilist_sentinel_traits<Pragma>;
00062 
00063     pragma::PragmaID ID;
00064     Location loc;
00065     Pragma *nextLink;
00066     Pragma *prevLink;
00067 };
00068 
00069 
00070 
00071 class PragmaAssert : public Pragma {
00072 
00073 public:
00074     PragmaAssert(Location loc, Expr *condition, Expr *message = 0)
00075         : Pragma(pragma::Assert, loc),
00076           condition(condition),
00077           message(message) { }
00078 
00080 
00081     const Expr *getCondition() const { return condition; }
00082     Expr *getCondition() { return condition; }
00084 
00086 
00087 
00088     const Expr *getMessage() const { return message; }
00089     Expr *getMessage() { return message; }
00091 
00093     bool hasMessage() const { return message != 0; }
00094 
00096     void setCondition(Expr *condition) { this->condition = condition; }
00097 
00099     void setMessage(Expr *message) { this->message = message; }
00100 
00101     
00102     static bool classof(const PragmaAssert *pragma) { return true; }
00103     static bool classof(const Pragma *pragma) {
00104         return pragma->getKind() == pragma::Assert;
00105     }
00106 
00107 private:
00108     Expr *condition;
00109     Expr *message;
00110 };
00111 
00112 
00113 
00114 class PragmaImport : public Pragma {
00115 
00116 public:
00120     enum Convention {
00121         UNKNOWN_CONVENTION,
00122         C
00123     };
00124 
00125     PragmaImport(Location loc, Convention convention,
00126                  IdentifierInfo *entity, Expr *externalName);
00127 
00130     static Convention getConventionID(llvm::StringRef &ref);
00131 
00133     Convention getConvention() const { return convention; }
00134 
00136     IdentifierInfo *getEntityIdInfo() const { return entity; }
00137 
00139 
00140 
00141     Expr *getExternalNameExpr() { return externalNameExpr; }
00142     const Expr *getExternalNameExpr() const { return externalNameExpr; }
00144 
00146     const std::string &getExternalName() const { return externalName; }
00147 
00148 private:
00149     Convention convention;
00150     IdentifierInfo *entity;
00151     Expr *externalNameExpr;
00152     std::string externalName;
00153 };
00154 
00155 } 
00156 
00157 #endif