@@ -197,6 +197,8 @@ fn visit_stmts(stmts: &mut Vec<Stmt>, s: S, d: D, top_level: bool) {
197197 let mut i = 0 ;
198198 while i < stmts. len ( ) {
199199 let replace = match & stmts[ i] {
200+ Stmt :: Show ( name) => visit_show_or_hide_monitor ( name, s, d, true ) ,
201+ Stmt :: Hide ( name) => visit_show_or_hide_monitor ( name, s, d, false ) ,
200202 Stmt :: SetVar {
201203 name,
202204 value,
@@ -729,3 +731,41 @@ fn const_struct_literal(
729731 }
730732 }
731733}
734+
735+ fn visit_show_or_hide_monitor ( name : & Name , s : S , _d : D , is_show : bool ) -> Option < Vec < Stmt > > {
736+ if name. fieldname ( ) . is_some ( ) {
737+ return None ;
738+ }
739+ let basename = name. basename ( ) ;
740+ let type_ = s
741+ . get_list ( basename)
742+ . map ( |list| & list. type_ )
743+ . or_else ( || s. get_var ( basename) . map ( |var| & var. type_ ) ) ?;
744+ let ( type_name, _) = type_. struct_ ( ) ?;
745+ let struct_ = s. get_struct ( type_name) ?;
746+ Some (
747+ struct_
748+ . fields
749+ . iter ( )
750+ . map ( |field| {
751+ if is_show {
752+ Stmt :: Show ( Name :: DotName {
753+ lhs : name. basename ( ) . clone ( ) ,
754+ lhs_span : name. basespan ( ) . clone ( ) ,
755+ rhs : field. name . clone ( ) ,
756+ rhs_span : field. span . clone ( ) ,
757+ is_generated : true ,
758+ } )
759+ } else {
760+ Stmt :: Hide ( Name :: DotName {
761+ lhs : name. basename ( ) . clone ( ) ,
762+ lhs_span : name. basespan ( ) . clone ( ) ,
763+ rhs : field. name . clone ( ) ,
764+ rhs_span : field. span . clone ( ) ,
765+ is_generated : true ,
766+ } )
767+ }
768+ } )
769+ . collect ( ) ,
770+ )
771+ }
0 commit comments