@@ -67,12 +67,16 @@ impl DebugInstrumenter {
6767 self . insert_state_set_oracle ( module, 8 ) ;
6868 }
6969
70- fn insert_var ( & mut self , var_name : & str ) -> SourceVarId {
70+ fn insert_var ( & mut self , var_name : & str ) -> Option < SourceVarId > {
71+ if var_name == "_" {
72+ return None ;
73+ }
74+
7175 let var_id = SourceVarId ( self . next_var_id ) ;
7276 self . next_var_id += 1 ;
7377 self . variables . insert ( var_id, var_name. to_string ( ) ) ;
7478 self . scope . last_mut ( ) . unwrap ( ) . insert ( var_name. to_string ( ) , var_id) ;
75- var_id
79+ Some ( var_id)
7680 }
7781
7882 fn lookup_var ( & self , var_name : & str ) -> Option < SourceVarId > {
@@ -107,9 +111,9 @@ impl DebugInstrumenter {
107111 . flat_map ( |param| {
108112 pattern_vars ( & param. pattern )
109113 . iter ( )
110- . map ( |( id, _is_mut) | {
111- let var_id = self . insert_var ( & id. 0 . contents ) ;
112- build_assign_var_stmt ( var_id, id_expr ( id) )
114+ . filter_map ( |( id, _is_mut) | {
115+ let var_id = self . insert_var ( & id. 0 . contents ) ? ;
116+ Some ( build_assign_var_stmt ( var_id, id_expr ( id) ) )
113117 } )
114118 . collect :: < Vec < _ > > ( )
115119 } )
@@ -225,13 +229,28 @@ impl DebugInstrumenter {
225229 }
226230 } )
227231 . collect ( ) ;
228- let vars_exprs: Vec < ast:: Expression > = vars. iter ( ) . map ( |( id, _) | id_expr ( id) ) . collect ( ) ;
232+ let vars_exprs: Vec < ast:: Expression > = vars
233+ . iter ( )
234+ . map ( |( id, _) | {
235+ // We don't want to generate an expression to read from "_".
236+ // And since this expression is going to be assigned to "_" so it doesn't matter
237+ // what it is, we can use `()` for it.
238+ if id. 0 . contents == "_" {
239+ ast:: Expression {
240+ kind : ast:: ExpressionKind :: Literal ( ast:: Literal :: Unit ) ,
241+ span : id. span ( ) ,
242+ }
243+ } else {
244+ id_expr ( id)
245+ }
246+ } )
247+ . collect ( ) ;
229248
230249 let mut block_stmts =
231250 vec ! [ ast:: Statement { kind: ast:: StatementKind :: Let ( let_stmt. clone( ) ) , span: * span } ] ;
232- block_stmts. extend ( vars. iter ( ) . map ( |( id, _) | {
233- let var_id = self . insert_var ( & id. 0 . contents ) ;
234- build_assign_var_stmt ( var_id, id_expr ( id) )
251+ block_stmts. extend ( vars. iter ( ) . filter_map ( |( id, _) | {
252+ let var_id = self . insert_var ( & id. 0 . contents ) ? ;
253+ Some ( build_assign_var_stmt ( var_id, id_expr ( id) ) )
235254 } ) ) ;
236255 block_stmts. push ( ast:: Statement {
237256 kind : ast:: StatementKind :: Expression ( ast:: Expression {
@@ -422,21 +441,31 @@ impl DebugInstrumenter {
422441 let var_name = & for_stmt. identifier . 0 . contents ;
423442 let var_id = self . insert_var ( var_name) ;
424443
425- let set_stmt = build_assign_var_stmt ( var_id, id_expr ( & for_stmt. identifier ) ) ;
426- let drop_stmt = build_drop_var_stmt ( var_id, Span :: empty ( for_stmt. span . end ( ) ) ) ;
444+ let set_and_drop_stmt = var_id. map ( |var_id| {
445+ (
446+ build_assign_var_stmt ( var_id, id_expr ( & for_stmt. identifier ) ) ,
447+ build_drop_var_stmt ( var_id, Span :: empty ( for_stmt. span . end ( ) ) ) ,
448+ )
449+ } ) ;
427450
428451 self . walk_expr ( & mut for_stmt. block ) ;
452+
453+ let mut statements = Vec :: new ( ) ;
454+ let block_statement = ast:: Statement {
455+ kind : ast:: StatementKind :: Semi ( for_stmt. block . clone ( ) ) ,
456+ span : for_stmt. block . span ,
457+ } ;
458+
459+ if let Some ( ( set_stmt, drop_stmt) ) = set_and_drop_stmt {
460+ statements. push ( set_stmt) ;
461+ statements. push ( block_statement) ;
462+ statements. push ( drop_stmt) ;
463+ } else {
464+ statements. push ( block_statement) ;
465+ }
466+
429467 for_stmt. block = ast:: Expression {
430- kind : ast:: ExpressionKind :: Block ( ast:: BlockExpression {
431- statements : vec ! [
432- set_stmt,
433- ast:: Statement {
434- kind: ast:: StatementKind :: Semi ( for_stmt. block. clone( ) ) ,
435- span: for_stmt. block. span,
436- } ,
437- drop_stmt,
438- ] ,
439- } ) ,
468+ kind : ast:: ExpressionKind :: Block ( ast:: BlockExpression { statements } ) ,
440469 span : for_stmt. span ,
441470 } ;
442471 }
0 commit comments