source: src/AST/DeclReplacer.cpp @ 12c1eef

ADTast-experimentalenumpthread-emulationqualifiedEnum
Last change on this file since 12c1eef was 490fb92e, checked in by Fangren Yu <f37yu@…>, 4 years ago

move FixInit? to new ast

  • Property mode set to 100644
File size: 3.3 KB
Line 
1//
2// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
3//
4// The contents of this file are covered under the licence agreement in the
5// file "LICENCE" distributed with Cforall.
6//
7// DeclReplacer.cpp --
8//
9// Author           : Aaron B. Moss
10// Created On       : Wed May 8 13:00:00 2019
11// Last Modified By : Aaron B. Moss
12// Last Modified On : Wed May 8 13:00:00 2019
13// Update Count     : 1
14//
15
16#include "DeclReplacer.hpp"
17#include "Expr.hpp"
18#include "Type.hpp"
19
20#include "Pass.hpp"
21
22namespace ast {
23
24namespace DeclReplacer {
25        namespace {
26                struct DeclReplacer {
27                private:
28                        const DeclMap & declMap;
29                        const TypeMap & typeMap;
30                        bool debug;
31
32                public:
33                        DeclReplacer(const DeclMap & declMap, const TypeMap & typeMap, bool debug)
34                                : declMap( declMap ), typeMap( typeMap ), debug( debug )
35                        {}
36
37                        const ast::VariableExpr * previsit( const ast::VariableExpr * );
38                        const ast::TypeInstType * previsit( const ast::TypeInstType * );
39                };
40
41                struct VarExprReplacer {
42                private:
43                        const ExprMap & exprMap;
44                       
45                public:
46                        VarExprReplacer(const ExprMap & exprMap): exprMap (exprMap) {}
47
48                        const Expr * postvisit (const VariableExpr *);
49                };
50        }
51
52        const ast::Node * replace( const ast::Node * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
53                if(!node) return nullptr;
54                Pass<DeclReplacer> replacer = { declMap, typeMap, debug };
55                return node->accept( replacer );
56        }
57
58        const ast::Node * replace( const ast::Node * node, const DeclMap & declMap, bool debug ) {
59                TypeMap typeMap;
60                return replace( node, declMap, typeMap, debug );
61        }
62
63        const ast::Node * replace( const ast::Node * node, const TypeMap & typeMap, bool debug ) {
64                DeclMap declMap;
65                return replace( node, declMap, typeMap, debug );
66        }
67
68        const ast::Node * replace( const ast::Node * node, const ExprMap & exprMap) {
69                Pass<VarExprReplacer> replacer = {exprMap};
70                return node->accept( replacer );
71        }
72
73        namespace {
74                // replace variable with new node from decl map
75                const ast::VariableExpr * DeclReplacer::previsit( const VariableExpr * varExpr ) {
76                        // xxx - assertions and parameters aren't accounted for in this... (i.e. they aren't inserted into the map when it's made, only DeclStmts are)
77                        if ( !declMap.count( varExpr->var ) ) return varExpr;
78
79                        auto replacement = declMap.at( varExpr->var );
80                        if ( debug ) {
81                                std::cerr << "replacing variable reference: "
82                                        << (void*)varExpr->var.get() << " " << varExpr->var
83                                        << " with " << (void*)replacement << " " << replacement
84                                        << std::endl;
85                        }
86                        auto nexpr = mutate(varExpr);
87                        nexpr->var = replacement;
88                        return nexpr;
89                }
90
91                const TypeInstType * DeclReplacer::previsit( const TypeInstType * inst ) {
92                        if ( !typeMap.count( inst->base ) ) return inst;
93
94                        auto replacement = typeMap.at( inst->base );
95                        if ( debug ) {
96                                std::cerr << "replacing type reference: "
97                                        << (void*)inst->base.get() << " " << inst->base
98                                        << " with " << (void*)replacement << " " << replacement
99                                        << std::endl;
100                        }
101                        auto ninst = mutate(inst);
102                        ninst->base = replacement;
103                        return ninst;
104                }
105
106                const Expr * VarExprReplacer::postvisit( const VariableExpr * expr ) {
107                        if (!exprMap.count(expr->var)) return expr;
108
109                        return exprMap.at(expr->var);
110                }
111
112        }
113}
114
115}
116
117// Local Variables: //
118// tab-width: 4 //
119// mode: c++ //
120// compile-command: "make install" //
121// End: //
Note: See TracBrowser for help on using the repository browser.