Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/SynTree/DeclReplacer.cc

    r7862059 r0ce063b  
    3030                        bool debug;
    3131                public:
     32                        size_t replaced;
     33
     34                public:
    3235                        DeclReplacer( const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
    3336
     
    3841                        void previsit( TypeInstType * inst );
    3942                };
     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                };
    4058        }
    4159
    42         void replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
     60        size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug ) {
    4361                PassVisitor<DeclReplacer> replacer( declMap, typeMap, debug );
    4462                maybeAccept( node, replacer );
     63                return replacer.pass.replaced;
    4564        }
    4665
    47         void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
     66        size_t replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug ) {
    4867                TypeMap typeMap;
    49                 replace( node, declMap, typeMap, debug );
     68                return replace( node, declMap, typeMap, debug );
    5069        }
    5170
    52         void replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {
     71        size_t replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug ) {
    5372                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;
    5580        }
    5681
    5782        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 ) {}
    5984
    6085                // replace variable with new node from decl map
     
    6287                        // 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)
    6388                        if ( declMap.count( varExpr->var ) ) {
     89                                replaced++;
    6490                                auto replacement = declMap.at( varExpr->var );
    6591                                if ( debug ) {
     
    7298                void DeclReplacer::previsit( TypeInstType * inst ) {
    7399                        if ( typeMap.count( inst->baseType ) ) {
     100                                replaced++;
    74101                                auto replacement = typeMap.at( inst->baseType );
    75102                                if ( debug ) {
     
    79106                        }
    80107                }
     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                }
    81124        }
    82125} // namespace VarExprReplacer
Note: See TracChangeset for help on using the changeset viewer.