Changeset 2908f08 for src/ResolvExpr/FindOpenVars.cc
- Timestamp:
- Nov 17, 2023, 3:03:51 PM (10 months ago)
- Branches:
- master
- Children:
- f7f997a
- Parents:
- 41606df1
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/ResolvExpr/FindOpenVars.cc
r41606df1 r2908f08 24 24 namespace ResolvExpr { 25 25 26 namespace { 27 struct FindOpenVars final : public ast::WithGuards { 28 ast::OpenVarSet & open; 29 ast::OpenVarSet & closed; 30 ast::AssertionSet & need; 31 ast::AssertionSet & have; 32 ast::TypeEnvironment & env; 33 bool nextIsOpen; 26 namespace { 34 27 35 FindOpenVars( 36 ast::OpenVarSet & o, ast::OpenVarSet & c, ast::AssertionSet & n, 37 ast::AssertionSet & h, ast::TypeEnvironment & env, FirstMode firstIsOpen ) 38 : open( o ), closed( c ), need( n ), have( h ), env (env), nextIsOpen( firstIsOpen ) {} 28 struct FindOpenVars final : public ast::WithGuards { 29 ast::OpenVarSet & open; 30 ast::OpenVarSet & closed; 31 ast::AssertionSet & need; 32 ast::AssertionSet & have; 33 ast::TypeEnvironment & env; 34 bool nextIsOpen; 39 35 40 void previsit( const ast::FunctionType * type ) { 41 // mark open/closed variables 42 if ( nextIsOpen ) { 43 // trying to remove this from resolver. 44 // occasionally used in other parts so not deleting right now. 36 FindOpenVars( 37 ast::OpenVarSet & o, ast::OpenVarSet & c, ast::AssertionSet & n, 38 ast::AssertionSet & h, ast::TypeEnvironment & env, FirstMode firstIsOpen ) 39 : open( o ), closed( c ), need( n ), have( h ), env (env), nextIsOpen( firstIsOpen ) {} 45 40 46 // insert open variables unbound to environment. 47 env.add(type->forall); 41 void previsit( const ast::FunctionType * type ) { 42 // mark open/closed variables 43 if ( nextIsOpen ) { 44 // trying to remove this from resolver. 45 // occasionally used in other parts so not deleting right now. 48 46 49 for ( auto & decl : type->forall ) { 50 open[ *decl ] = ast::TypeData{ decl->base }; 51 } 52 for ( auto & assert : type->assertions ) { 53 need[ assert ].isUsed = false; 54 } 55 } else { 56 for ( auto & decl : type->forall ) { 57 closed[ *decl ] = ast::TypeData{ decl->base }; 58 } 59 for ( auto & assert : type->assertions ) { 60 have[ assert ].isUsed = false; 61 } 62 } 47 // insert open variables unbound to environment. 48 env.add(type->forall); 63 49 64 // flip open variables for contained function types 65 nextIsOpen = ! nextIsOpen; 66 GuardAction( [this](){ nextIsOpen = ! nextIsOpen; } ); 50 for ( auto & decl : type->forall ) { 51 open[ *decl ] = ast::TypeData{ decl->base }; 67 52 } 53 for ( auto & assert : type->assertions ) { 54 need[ assert ].isUsed = false; 55 } 56 } else { 57 for ( auto & decl : type->forall ) { 58 closed[ *decl ] = ast::TypeData{ decl->base }; 59 } 60 for ( auto & assert : type->assertions ) { 61 have[ assert ].isUsed = false; 62 } 63 } 68 64 69 }; 65 // flip open variables for contained function types 66 // nextIsOpen = ! nextIsOpen; 67 // GuardAction( [this](){ nextIsOpen = ! nextIsOpen; } ); 68 GuardValue( nextIsOpen ) = !nextIsOpen; 70 69 } 70 }; 71 71 72 void findOpenVars( 73 const ast::Type * type, ast::OpenVarSet & open, ast::OpenVarSet & closed, 74 ast::AssertionSet & need, ast::AssertionSet & have, ast::TypeEnvironment & env, FirstMode firstIsOpen ) { 75 ast::Pass< FindOpenVars > finder{ open, closed, need, have, env, firstIsOpen }; 76 type->accept( finder ); 72 } // namespace 77 73 78 if (!closed.empty()) { 79 std::cerr << "closed: "; 80 for (auto& i : closed) { 81 std::cerr << i.first.base->location << ":" << i.first.base->name << ' '; 82 } 83 std::cerr << std::endl; 74 void findOpenVars( 75 const ast::Type * type, ast::OpenVarSet & open, ast::OpenVarSet & closed, 76 ast::AssertionSet & need, ast::AssertionSet & have, ast::TypeEnvironment & env, FirstMode firstIsOpen ) { 77 ast::Pass< FindOpenVars > finder{ open, closed, need, have, env, firstIsOpen }; 78 type->accept( finder ); 79 80 if (!closed.empty()) { 81 std::cerr << "closed: "; 82 for (auto& i : closed) { 83 std::cerr << i.first.base->location << ":" << i.first.base->name << ' '; 84 84 } 85 std::cerr << std::endl; 85 86 } 87 } 88 86 89 } // namespace ResolvExpr 87 90
Note: See TracChangeset
for help on using the changeset viewer.