Changes in src/SynTree/DeclReplacer.cc [7862059:0ce063b]
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/SynTree/DeclReplacer.cc
r7862059 r0ce063b 30 30 bool debug; 31 31 public: 32 size_t replaced; 33 34 public: 32 35 DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug = false ); 33 36 … … 38 41 void previsit( TypeInstType * inst ); 39 42 }; 43 44 /// Mutator that replaces uses of declarations with arbitrary expressions, according to the supplied mapping 45 struct ExprDeclReplacer { 46 private: 47 const ExprMap & exprMap; 48 bool debug; 49 public: 50 size_t replaced; 51 52 public: 53 ExprDeclReplacer( const ExprMap & exprMap, bool debug = false ); 54 55 // replace variable with new node from expr map 56 Expression * postmutate( VariableExpr * varExpr ); 57 }; 40 58 } 41 59 42 voidreplace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {60 size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) { 43 61 PassVisitor<DeclReplacer> replacer( declMap, typeMap, debug ); 44 62 maybeAccept( node, replacer ); 63 return replacer.pass.replaced; 45 64 } 46 65 47 voidreplace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {66 size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) { 48 67 TypeMap typeMap; 49 re place( node, declMap, typeMap, debug );68 return replace( node, declMap, typeMap, debug ); 50 69 } 51 70 52 voidreplace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {71 size_t replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) { 53 72 DeclMap declMap; 54 replace( node, declMap, typeMap, debug ); 73 return replace( node, declMap, typeMap, debug ); 74 } 75 76 size_t replace( BaseSyntaxNode *& node, const ExprMap & exprMap, bool debug ) { 77 PassVisitor<ExprDeclReplacer> replacer( exprMap, debug ); 78 node = maybeMutate( node, replacer ); 79 return replacer.pass.replaced; 55 80 } 56 81 57 82 namespace { 58 DeclReplacer::DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug ) : declMap( declMap ), typeMap( typeMap ) , debug( debug ) {}83 DeclReplacer::DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug ) : declMap( declMap ), typeMap( typeMap ) , debug( debug ), replaced( 0 ) {} 59 84 60 85 // replace variable with new node from decl map … … 62 87 // 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) 63 88 if ( declMap.count( varExpr->var ) ) { 89 replaced++; 64 90 auto replacement = declMap.at( varExpr->var ); 65 91 if ( debug ) { … … 72 98 void DeclReplacer::previsit( TypeInstType * inst ) { 73 99 if ( typeMap.count( inst->baseType ) ) { 100 replaced++; 74 101 auto replacement = typeMap.at( inst->baseType ); 75 102 if ( debug ) { … … 79 106 } 80 107 } 108 109 ExprDeclReplacer::ExprDeclReplacer( const ExprMap & exprMap, bool debug ) : exprMap( exprMap ), debug( debug ), replaced( 0 ) {} 110 111 Expression * ExprDeclReplacer::postmutate( VariableExpr * varExpr ) { 112 if ( exprMap.count( varExpr->var ) ) { 113 replaced++; 114 Expression * replacement = exprMap.at( varExpr->var )->clone(); 115 if ( debug ) { 116 std::cerr << "replacing variable reference: " << (void*)varExpr->var << " " << varExpr->var << " with " << (void*)replacement << " " << replacement << std::endl; 117 } 118 std::swap( varExpr->env, replacement->env ); 119 delete varExpr; 120 return replacement; 121 } 122 return varExpr; 123 } 81 124 } 82 125 } // namespace VarExprReplacer
Note: See TracChangeset
for help on using the changeset viewer.