@@ -72,34 +72,40 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span,
7272 let span = Span { expn_id : cx. backtrace ( ) , .. span } ;
7373 let name = cx. expr_lit ( span, ast:: Lit_ :: LitStr ( ident. name . as_str ( ) ,
7474 ast:: StrStyle :: CookedStr ) ) ;
75- let mut expr = substr. nonself_args [ 0 ] . clone ( ) ;
75+ let builder = token:: str_to_ident ( "builder" ) ;
76+ let builder_expr = cx. expr_ident ( span, builder. clone ( ) ) ;
7677
77- match * substr. fields {
78- Struct ( ref fields) | EnumMatching ( _, _, ref fields) => {
78+ let fmt = substr. nonself_args [ 0 ] . clone ( ) ;
7979
80+ let stmts = match * substr. fields {
81+ Struct ( ref fields) | EnumMatching ( _, _, ref fields) => {
82+ let mut stmts = vec ! [ ] ;
8083 if fields. is_empty ( ) || fields[ 0 ] . name . is_none ( ) {
8184 // tuple struct/"normal" variant
82- expr = cx. expr_method_call ( span,
83- expr,
84- token:: str_to_ident ( "debug_tuple" ) ,
85- vec ! [ name] ) ;
85+ let expr = cx. expr_method_call ( span,
86+ fmt,
87+ token:: str_to_ident ( "debug_tuple" ) ,
88+ vec ! [ name] ) ;
89+ stmts. push ( cx. stmt_let ( span, true , builder, expr) ) ;
8690
8791 for field in fields {
8892 // Use double indirection to make sure this works for unsized types
8993 let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
9094 let field = cx. expr_addr_of ( field. span , field) ;
9195
92- expr = cx. expr_method_call ( span,
93- expr,
94- token:: str_to_ident ( "field" ) ,
95- vec ! [ field] ) ;
96+ let expr = cx. expr_method_call ( span,
97+ builder_expr. clone ( ) ,
98+ token:: str_to_ident ( "field" ) ,
99+ vec ! [ field] ) ;
100+ stmts. push ( cx. stmt_expr ( expr) ) ;
96101 }
97102 } else {
98103 // normal struct/struct variant
99- expr = cx. expr_method_call ( span,
100- expr,
101- token:: str_to_ident ( "debug_struct" ) ,
102- vec ! [ name] ) ;
104+ let expr = cx. expr_method_call ( span,
105+ fmt,
106+ token:: str_to_ident ( "debug_struct" ) ,
107+ vec ! [ name] ) ;
108+ stmts. push ( cx. stmt_let ( span, true , builder, expr) ) ;
103109
104110 for field in fields {
105111 let name = cx. expr_lit ( field. span , ast:: Lit_ :: LitStr (
@@ -109,18 +115,23 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span,
109115 // Use double indirection to make sure this works for unsized types
110116 let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
111117 let field = cx. expr_addr_of ( field. span , field) ;
112- expr = cx. expr_method_call ( span,
113- expr,
114- token:: str_to_ident ( "field" ) ,
115- vec ! [ name, field] ) ;
118+ let expr = cx. expr_method_call ( span,
119+ builder_expr. clone ( ) ,
120+ token:: str_to_ident ( "field" ) ,
121+ vec ! [ name, field] ) ;
122+ stmts. push ( cx. stmt_expr ( expr) ) ;
116123 }
117124 }
125+ stmts
118126 }
119127 _ => unreachable ! ( )
120- }
128+ } ;
129+
130+ let expr = cx. expr_method_call ( span,
131+ builder_expr,
132+ token:: str_to_ident ( "finish" ) ,
133+ vec ! [ ] ) ;
121134
122- cx. expr_method_call ( span,
123- expr,
124- token:: str_to_ident ( "finish" ) ,
125- vec ! [ ] )
135+ let block = cx. block ( span, stmts, Some ( expr) ) ;
136+ cx. expr_block ( block)
126137}
0 commit comments