@@ -72,34 +72,40 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span,
72
72
let span = Span { expn_id : cx. backtrace ( ) , .. span } ;
73
73
let name = cx. expr_lit ( span, ast:: Lit_ :: LitStr ( ident. name . as_str ( ) ,
74
74
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 ( ) ) ;
76
77
77
- match * substr. fields {
78
- Struct ( ref fields) | EnumMatching ( _, _, ref fields) => {
78
+ let fmt = substr. nonself_args [ 0 ] . clone ( ) ;
79
79
80
+ let stmts = match * substr. fields {
81
+ Struct ( ref fields) | EnumMatching ( _, _, ref fields) => {
82
+ let mut stmts = vec ! [ ] ;
80
83
if fields. is_empty ( ) || fields[ 0 ] . name . is_none ( ) {
81
84
// 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) ) ;
86
90
87
91
for field in fields {
88
92
// Use double indirection to make sure this works for unsized types
89
93
let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
90
94
let field = cx. expr_addr_of ( field. span , field) ;
91
95
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) ) ;
96
101
}
97
102
} else {
98
103
// 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) ) ;
103
109
104
110
for field in fields {
105
111
let name = cx. expr_lit ( field. span , ast:: Lit_ :: LitStr (
@@ -109,18 +115,23 @@ fn show_substructure(cx: &mut ExtCtxt, span: Span,
109
115
// Use double indirection to make sure this works for unsized types
110
116
let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
111
117
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) ) ;
116
123
}
117
124
}
125
+ stmts
118
126
}
119
127
_ => unreachable ! ( )
120
- }
128
+ } ;
129
+
130
+ let expr = cx. expr_method_call ( span,
131
+ builder_expr,
132
+ token:: str_to_ident ( "finish" ) ,
133
+ vec ! [ ] ) ;
121
134
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)
126
137
}
0 commit comments