Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/DeclReplacer.cc

    r0ce063b r7862059  
    3030                        bool debug;
    3131                public:
    32                         size_t replaced;
    33 
    34                 public:
    3532                        DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
    3633
     
    4138                        void previsit( TypeInstType * inst );
    4239                };
    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                 };
    5840        }
    5941
    60         size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
     42        void replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
    6143                PassVisitor<DeclReplacer> replacer( declMap, typeMap, debug );
    6244                maybeAccept( node, replacer );
    63                 return replacer.pass.replaced;
    6445        }
    6546
    66         size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
     47        void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
    6748                TypeMap typeMap;
    68                 return replace( node, declMap, typeMap, debug );
     49                replace( node, declMap, typeMap, debug );
    6950        }
    7051
    71         size_t replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {
     52        void replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {
    7253                DeclMap declMap;
    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;
     54                replace( node, declMap, typeMap, debug );
    8055        }
    8156
    8257        namespace {
    83                 DeclReplacer::DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug ) : declMap( declMap ), typeMap( typeMap ) , debug( debug ), replaced( 0 ) {}
     58                DeclReplacer::DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug ) : declMap( declMap ), typeMap( typeMap ) , debug( debug ) {}
    8459
    8560                // replace variable with new node from decl map
     
    8762                        // 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)
    8863                        if ( declMap.count( varExpr->var ) ) {
    89                                 replaced++;
    9064                                auto replacement = declMap.at( varExpr->var );
    9165                                if ( debug ) {
     
    9872                void DeclReplacer::previsit( TypeInstType * inst ) {
    9973                        if ( typeMap.count( inst->baseType ) ) {
    100                                 replaced++;
    10174                                auto replacement = typeMap.at( inst->baseType );
    10275                                if ( debug ) {
     
    10679                        }
    10780                }
    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                 }
    12481        }
    12582} // namespace VarExprReplacer
Note: See TracChangeset for help on using the changeset viewer.