Skip to content

Commit 3a0409d

Browse files
committed
Auto merge of #29565 - sfackler:issue-29540, r=huonw
Closes #29540 r? @huonw
2 parents 74185af + d0bc6a1 commit 3a0409d

File tree

2 files changed

+536
-24
lines changed

2 files changed

+536
-24
lines changed

src/libsyntax/ext/deriving/debug.rs

+35-24
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)