Changes in src/Common/PassVisitor.h [6ca154b:4eb31f2b]
- File:
-
- 1 edited
-
src/Common/PassVisitor.h (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
src/Common/PassVisitor.h
r6ca154b r4eb31f2b 18 18 // Templated visitor type 19 19 // 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. 30 21 //------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 31 22 template< typename pass_type > … … 37 28 PassVisitor(Args &&... args) 38 29 : 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 {} 46 31 47 32 virtual ~PassVisitor() = default; … … 101 86 virtual void visit( ConstructorExpr * ctorExpr ) override final; 102 87 virtual void visit( CompoundLiteralExpr *compLitExpr ) override final; 88 virtual void visit( UntypedValofExpr *valofExpr ) override final; 103 89 virtual void visit( RangeExpr *rangeExpr ) override final; 104 90 virtual void visit( UntypedTupleExpr *tupleExpr ) override final; … … 186 172 virtual Expression* mutate( ConstructorExpr *ctorExpr ) override final; 187 173 virtual Expression* mutate( CompoundLiteralExpr *compLitExpr ) override final; 174 virtual Expression* mutate( UntypedValofExpr *valofExpr ) override final; 188 175 virtual Expression* mutate( RangeExpr *rangeExpr ) override final; 189 176 virtual Expression* mutate( UntypedTupleExpr *tupleExpr ) override final; … … 220 207 221 208 private: 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 225 209 template<typename node_type> void call_previsit ( node_type * node ) { previsit_impl ( pass, node, 0 ); } 226 210 template<typename node_type> void call_postvisit( node_type * node ) { postvisit_impl( pass, node, 0 ); } … … 234 218 void set_env( TypeSubstitution * env ) { set_env_impl( pass, env, 0); } 235 219 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 ); 239 221 void mutateStatementList( std::list< Statement* > &statements ); 240 222 241 template< typename func_t > 242 Statement * handleStatement( Statement * stmt, func_t func ); 243 Statement * visitStatement ( Statement * stmt ); 223 Statement * visitStatement( Statement * stmt ); 244 224 Statement * mutateStatement( Statement * stmt ); 245 225 246 template< typename func_t > 247 Expression * handleExpression( Expression * expr, func_t func ); 248 Expression * visitExpression ( Expression * expr ); 226 void visitExpression( Expression * expr ); 249 227 Expression * mutateExpression( Expression * expr ); 250 228 … … 253 231 std::list< Statement* > * get_beforeStmts() { return stmtsToAddBefore_impl( pass, 0); } 254 232 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; } 259 235 260 236 guard_value_impl init_guard() { … … 295 271 std::list< Statement* > stmtsToAddAfter; 296 272 }; 273 297 274 class WithShortCircuiting { 298 275 protected: … … 301 278 302 279 public: 303 bool _ref visit_children;280 bool skip_children; 304 281 }; 305 282 … … 320 297 }; 321 298 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 };331 299 332 300 #include "PassVisitor.impl.h"
Note:
See TracChangeset
for help on using the changeset viewer.