Ignore:
Timestamp:
May 22, 2019, 3:40:36 PM (5 years ago)
Author:
Aaron Moss <a3moss@…>
Branches:
ADT, arm-eh, ast-experimental, cleanup-dtors, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
76ed81f
Parents:
d8938622 (diff), f4c2f1a (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of plg.uwaterloo.ca:software/cfa/cfa-cc

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/AST/DeclReplacer.cpp

    rd8938622 r6380f78  
    1414//
    1515
    16 #warning unimplemented
     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
     42        const ast::Node * replace( const ast::Node * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
     43                if(!node) return nullptr;
     44                Pass<DeclReplacer> replacer = { declMap, typeMap, debug };
     45                return node->accept( replacer );
     46        }
     47
     48        const ast::Node * replace( const ast::Node * node, const DeclMap & declMap, bool debug ) {
     49                TypeMap typeMap;
     50                return replace( node, declMap, typeMap, debug );
     51        }
     52
     53        const ast::Node * replace( const ast::Node * node, const TypeMap & typeMap, bool debug ) {
     54                DeclMap declMap;
     55                return replace( node, declMap, typeMap, debug );
     56        }
     57
     58        namespace {
     59                // replace variable with new node from decl map
     60                const ast::VariableExpr * DeclReplacer::previsit( const VariableExpr * varExpr ) {
     61                        // 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)
     62                        if ( !declMap.count( varExpr->var ) ) return varExpr;
     63
     64                        auto replacement = declMap.at( varExpr->var );
     65                        if ( debug ) {
     66                                std::cerr << "replacing variable reference: "
     67                                        << (void*)varExpr->var.get() << " " << varExpr->var
     68                                        << " with " << (void*)replacement << " " << replacement
     69                                        << std::endl;
     70                        }
     71                        auto nexpr = mutate(varExpr);
     72                        nexpr->var = replacement;
     73                        return nexpr;
     74                }
     75
     76                const TypeInstType * DeclReplacer::previsit( const TypeInstType * inst ) {
     77                        if ( !typeMap.count( inst->base ) ) return inst;
     78
     79                        auto replacement = typeMap.at( inst->base );
     80                        if ( debug ) {
     81                                std::cerr << "replacing type reference: "
     82                                        << (void*)inst->base.get() << " " << inst->base
     83                                        << " with " << (void*)replacement << " " << replacement
     84                                        << std::endl;
     85                        }
     86                        auto ninst = mutate(inst);
     87                        ninst->base = replacement;
     88                        return ninst;
     89                }
     90        }
     91}
     92
     93}
    1794
    1895// Local Variables: //
Note: See TracChangeset for help on using the changeset viewer.