source: src/AST/DeclReplacer.cpp @ 60f4919

Last change on this file since 60f4919 was 747d0fa, checked in by Andrew Beach <ajbeach@…>, 2 years ago

White-space clean-up in DeclReplacer?.

  • 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 : Andrew Beach
12// Last Modified On : Thr Sep 15 11:55:00 2022
13// Update Count     : 2
14//
15
16#include "DeclReplacer.hpp"
17
18#include "Expr.hpp"
19#include "Pass.hpp"
20#include "Type.hpp"
21
22namespace ast {
23
24namespace DeclReplacer {
25
26namespace {
27        struct DeclReplacer {
28        private:
29                const DeclMap & declMap;
30                const TypeMap & typeMap;
31                bool debug;
32
33        public:
34                DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug )
35                        : declMap( declMap ), typeMap( typeMap ), debug( debug )
36                {}
37
38                const ast::VariableExpr * previsit( const ast::VariableExpr * );
39                const ast::TypeInstType * previsit( const ast::TypeInstType * );
40        };
41
42        struct VarExprReplacer {
43        private:
44                const ExprMap & exprMap;
45
46        public:
47                VarExprReplacer( const ExprMap & exprMap ) : exprMap( exprMap ) {}
48
49                const Expr * postvisit( const VariableExpr * );
50        };
51} // namespace
52
53const ast::Node * replace( const ast::Node * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
54        if(!node) return nullptr;
55        Pass<DeclReplacer> replacer = { declMap, typeMap, debug };
56        return node->accept( replacer );
57}
58
59const ast::Node * replace( const ast::Node * node, const DeclMap & declMap, bool debug ) {
60        TypeMap typeMap;
61        return replace( node, declMap, typeMap, debug );
62}
63
64const ast::Node * replace( const ast::Node * node, const TypeMap & typeMap, bool debug ) {
65        DeclMap declMap;
66        return replace( node, declMap, typeMap, debug );
67}
68
69const ast::Node * replace( const ast::Node * node, const ExprMap & exprMap ) {
70        Pass<VarExprReplacer> replacer = {exprMap};
71        return node->accept( replacer );
72}
73
74namespace {
75        // replace variable with new node from decl map
76        const ast::VariableExpr * DeclReplacer::previsit( const VariableExpr * varExpr ) {
77                // 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)
78                if ( !declMap.count( varExpr->var ) ) return varExpr;
79
80                auto replacement = declMap.at( varExpr->var );
81                if ( debug ) {
82                        std::cerr << "replacing variable reference: "
83                                << (void*)varExpr->var.get() << " " << varExpr->var
84                                << " with " << (void*)replacement << " " << replacement
85                                << std::endl;
86                }
87                auto nexpr = mutate(varExpr);
88                nexpr->var = replacement;
89                return nexpr;
90        }
91
92        const TypeInstType * DeclReplacer::previsit( const TypeInstType * inst ) {
93                if ( !typeMap.count( inst->base ) ) return inst;
94
95                auto replacement = typeMap.at( inst->base );
96                if ( debug ) {
97                        std::cerr << "replacing type reference: "
98                                << (void*)inst->base.get() << " " << inst->base
99                                << " with " << (void*)replacement << " " << replacement
100                                << std::endl;
101                }
102                auto ninst = mutate(inst);
103                ninst->base = replacement;
104                return ninst;
105        }
106
107        const Expr * VarExprReplacer::postvisit( const VariableExpr * expr ) {
108                if ( !exprMap.count( expr->var ) ) return expr;
109                return exprMap.at( expr->var );
110        }
111} // namespace
112
113} // namespace DeclReplacer
114
115} // namespace ast
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.