00001
00002
00003
00004
00005
00006
00007
00008
00009
00014
00015
00016 #ifndef COMMA_AST_DECLREWRITER_HDR_GUARD
00017 #define COMMA_AST_DECLREWRITER_HDR_GUARD
00018
00019 #include "comma/ast/AstRewriter.h"
00020
00021 #include "llvm/ADT/DenseMap.h"
00022
00023 namespace comma {
00024
00025 class DeclRewriter : public AstRewriter {
00026
00027 public:
00028
00034 DeclRewriter(AstResource &resource,
00035 DeclRegion *context, DeclRegion *origin)
00036 : AstRewriter(resource), context(context), origin(origin) { }
00037
00039 DeclRewriter(const AstRewriter &rewrites,
00040 DeclRegion *context, DeclRegion *origin)
00041 : AstRewriter(rewrites), context(context), origin(origin) { }
00042
00047 void setContext(DeclRegion *context) {
00048 assert(context->getParent() == this->context);
00049 this->context = context;
00050 }
00051
00056 void setOrigin(DeclRegion *origin) {
00057 assert(origin->getParent() == this->origin);
00058 this->origin = origin;
00059 }
00060
00062
00063 const DeclRegion *getContext() const { return context; }
00064 DeclRegion *getContext() { return context; }
00066
00068
00069 const DeclRegion *getOrigin() const { return origin; }
00070 DeclRegion *getOrigin() { return origin; }
00072
00079
00080 TypeDecl *rewriteTypeDecl(TypeDecl *tdecl);
00081
00082 FunctionDecl *rewriteFunctionDecl(FunctionDecl *fdecl);
00083
00084 ProcedureDecl *rewriteProcedureDecl(ProcedureDecl *pdecl);
00085
00086 EnumerationDecl *rewriteEnumerationDecl(EnumerationDecl *edecl);
00087
00088 ArrayDecl *rewriteArrayDecl(ArrayDecl *adecl);
00089
00090 IntegerDecl *rewriteIntegerDecl(IntegerDecl *idecl);
00091
00092 RecordDecl *rewriteRecordDecl(RecordDecl *rdecl);
00093
00094 IncompleteTypeDecl *rewriteIncompleteTypeDecl(IncompleteTypeDecl *ITD);
00095
00096 AccessDecl *rewriteAccessDecl(AccessDecl *access);
00097
00098 CarrierDecl *rewriteCarrierDecl(CarrierDecl *carrier);
00100
00102 Decl *rewriteDecl(Decl *decl);
00103
00104 private:
00105 DeclRegion *context;
00106 DeclRegion *origin;
00107
00110 typedef llvm::DenseMap<Decl*, Decl*> DeclMap;
00111 DeclMap declRewrites;
00112
00115 Decl *findRewrite(Decl *source) const { return declRewrites.lookup(source); }
00116
00118 bool hasRewrite(Decl *source) const { return findRewrite(source) != 0; }
00119
00122 void addDeclRewrite(Decl *source, Decl *target) {
00123 assert(!hasRewrite(source) && "Cannot override decl rewrite rules!");
00124 declRewrites[source] = target;
00125 }
00126
00129 void mirrorRegion(DeclRegion *source, DeclRegion *target);
00130
00131 Type *rewriteType(Type *type);
00132 AccessType *rewriteAccessType(AccessType *type);
00133 RecordType *rewriteRecordType(RecordType *type);
00134 ArrayType *rewriteArrayType(ArrayType *type);
00135 IncompleteType *rewriteIncompleteType(IncompleteType *type);
00136
00137 Expr *rewriteExpr(Expr *expr);
00138
00139 IntegerLiteral *rewriteIntegerLiteral(IntegerLiteral *lit);
00140 FunctionCallExpr *rewriteFunctionCall(FunctionCallExpr *call);
00141 AttribExpr *rewriteAttrib(AttribExpr *attrib);
00142 ConversionExpr *rewriteConversion(ConversionExpr *conv);
00143 };
00144
00145 }
00146
00147 #endif