Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/Common/PassVisitor.h

    r6ca154b r4eb31f2b  
    1818// Templated visitor type
    1919// To use declare a PassVisitor< YOUR VISITOR TYPE >
    20 // The visitor type should specify the previsit/postvisit/premutate/postmutate for types that are desired.
    21 // Note: previsit/postvisit/premutate/postmutate must be **public** members
    22 //
    23 // Several additional features are available through inheritance
    24 // | WithTypeSubstitution - provides polymorphic TypeSubstitution * env for the current expression
    25 // | WithStmtsToAdd       - provides the ability to insert statements before or after the current statement by adding new statements into
    26 //                          stmtsToAddBefore or stmtsToAddAfter respectively.
    27 // | WithShortCircuiting  - provides the ability to skip visiting child nodes; set visit_children to false in pre{visit,mutate} to skip visiting children
    28 // | WithScopes           - provides the ability to save/restore data like a LIFO stack; to save, call GuardValue with the variable to save, the variable
    29 //                          will automatically be restored to its previous value after the corresponding postvisit/postmutate teminates.
     20// The visitor type should specify the previsit/postvisit for types that are desired.
    3021//-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    3122template< typename pass_type >
     
    3728        PassVisitor(Args &&... args)
    3829                : pass( std::forward<Args>( args )... )
    39         {
    40                 typedef PassVisitor<pass_type> this_t;
    41                 this_t * const * visitor = visitor_impl(pass, 0);
    42                 if(visitor) {
    43                         *const_cast<this_t **>( visitor ) = this;
    44                 }
    45         }
     30        {}
    4631
    4732        virtual ~PassVisitor() = default;
     
    10186        virtual void visit( ConstructorExpr * ctorExpr ) override final;
    10287        virtual void visit( CompoundLiteralExpr *compLitExpr ) override final;
     88        virtual void visit( UntypedValofExpr *valofExpr ) override final;
    10389        virtual void visit( RangeExpr *rangeExpr ) override final;
    10490        virtual void visit( UntypedTupleExpr *tupleExpr ) override final;
     
    186172        virtual Expression* mutate( ConstructorExpr *ctorExpr ) override final;
    187173        virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ) override final;
     174        virtual Expression* mutate( UntypedValofExpr *valofExpr ) override final;
    188175        virtual Expression* mutate( RangeExpr *rangeExpr ) override final;
    189176        virtual Expression* mutate( UntypedTupleExpr *tupleExpr ) override final;
     
    220207
    221208private:
    222         template<typename pass_t> friend void acceptAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor );
    223         template<typename pass_t> friend void mutateAll( std::list< Declaration* > &decls, PassVisitor< pass_t >& visitor );
    224 
    225209        template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); }
    226210        template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); }
     
    234218        void set_env( TypeSubstitution * env ) { set_env_impl( pass, env, 0); }
    235219
    236         template< typename func_t >
    237         void handleStatementList( std::list< Statement * > & statements, func_t func );
    238         void visitStatementList ( std::list< Statement* > &statements );
     220        void visitStatementList( std::list< Statement* > &statements );
    239221        void mutateStatementList( std::list< Statement* > &statements );
    240222
    241         template< typename func_t >
    242         Statement * handleStatement( Statement * stmt, func_t func );
    243         Statement * visitStatement ( Statement * stmt );
     223        Statement * visitStatement( Statement * stmt );
    244224        Statement * mutateStatement( Statement * stmt );
    245225
    246         template< typename func_t >
    247         Expression * handleExpression( Expression * expr, func_t func );
    248         Expression * visitExpression ( Expression * expr );
     226        void visitExpression( Expression * expr );
    249227        Expression * mutateExpression( Expression * expr );
    250228
     
    253231        std::list< Statement* > *       get_beforeStmts() { return stmtsToAddBefore_impl( pass, 0); }
    254232        std::list< Statement* > *       get_afterStmts () { return stmtsToAddAfter_impl ( pass, 0); }
    255         std::list< Declaration* > *     get_beforeDecls() { return declsToAddBefore_impl( pass, 0); }
    256         std::list< Declaration* > *     get_afterDecls () { return declsToAddAfter_impl ( pass, 0); }
    257 
    258         void set_visit_children( bool& ref ) { bool_ref * ptr = visit_children_impl(pass, 0); if(ptr) ptr->set( ref ); }
     233        bool visit_children() { bool* skip = skip_children_impl(pass, 0); return ! (skip && *skip); }
     234        void reset_visit() { bool* skip = skip_children_impl(pass, 0); if(skip) *skip = false; }
    259235
    260236        guard_value_impl init_guard() {
     
    295271        std::list< Statement* > stmtsToAddAfter;
    296272};
     273
    297274class WithShortCircuiting {
    298275protected:
     
    301278
    302279public:
    303         bool_ref visit_children;
     280        bool skip_children;
    304281};
    305282
     
    320297};
    321298
    322 template<typename pass_type>
    323 class WithVisitorRef {
    324 protected:
    325         WithVisitorRef() = default;
    326         ~WithVisitorRef() = default;
    327 
    328 public:
    329         PassVisitor<pass_type> * const visitor;
    330 };
    331299
    332300#include "PassVisitor.impl.h"
Note: See TracChangeset for help on using the changeset viewer.