@@ -51,9 +51,9 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
5151 // build fmt.debug_struct(<name>).field(<fieldname>, &<fieldval>)....build()
5252 // or fmt.debug_tuple(<name>).field(&<fieldval>)....build()
5353 // based on the "shape".
54- let ( ident, is_struct ) = match * substr. fields {
55- Struct ( vdata, _ ) => ( substr. type_ident , vdata. is_struct ( ) ) ,
56- EnumMatching ( _, _, v, _ ) => ( v. node . ident , v. node . data . is_struct ( ) ) ,
54+ let ( ident, vdata , fields ) = match substr. fields {
55+ Struct ( vdata, fields ) => ( substr. type_ident , * vdata, fields ) ,
56+ EnumMatching ( _, _, v, fields ) => ( v. node . ident , & v. node . data , fields ) ,
5757 EnumNonMatchingCollapsed ( ..) |
5858 StaticStruct ( ..) |
5959 StaticEnum ( ..) => cx. span_bug ( span, "nonsensical .fields in `#[derive(Debug)]`" ) ,
@@ -67,55 +67,51 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
6767
6868 let fmt = substr. nonself_args [ 0 ] . clone ( ) ;
6969
70- let mut stmts = match * substr. fields {
71- Struct ( _, ref fields) |
72- EnumMatching ( .., ref fields) => {
73- let mut stmts = vec ! [ ] ;
74- if !is_struct {
75- // tuple struct/"normal" variant
76- let expr =
77- cx. expr_method_call ( span, fmt, Ident :: from_str ( "debug_tuple" ) , vec ! [ name] ) ;
78- stmts. push ( cx. stmt_let ( DUMMY_SP , true , builder, expr) ) ;
79-
80- for field in fields {
81- // Use double indirection to make sure this works for unsized types
82- let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
83- let field = cx. expr_addr_of ( field. span , field) ;
84-
85- let expr = cx. expr_method_call ( span,
86- builder_expr. clone ( ) ,
87- Ident :: from_str ( "field" ) ,
88- vec ! [ field] ) ;
89-
90- // Use `let _ = expr;` to avoid triggering the
91- // unused_results lint.
92- stmts. push ( stmt_let_undescore ( cx, span, expr) ) ;
93- }
94- } else {
95- // normal struct/struct variant
96- let expr =
97- cx. expr_method_call ( span, fmt, Ident :: from_str ( "debug_struct" ) , vec ! [ name] ) ;
98- stmts. push ( cx. stmt_let ( DUMMY_SP , true , builder, expr) ) ;
99-
100- for field in fields {
101- let name = cx. expr_lit ( field. span ,
102- ast:: LitKind :: Str ( field. name . unwrap ( ) . name ,
103- ast:: StrStyle :: Cooked ) ) ;
104-
105- // Use double indirection to make sure this works for unsized types
106- let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
107- let field = cx. expr_addr_of ( field. span , field) ;
108- let expr = cx. expr_method_call ( span,
109- builder_expr. clone ( ) ,
110- Ident :: from_str ( "field" ) ,
111- vec ! [ name, field] ) ;
112- stmts. push ( stmt_let_undescore ( cx, span, expr) ) ;
113- }
70+ let mut stmts = vec ! [ ] ;
71+ match vdata {
72+ ast:: VariantData :: Tuple ( ..) | ast:: VariantData :: Unit ( ..) => {
73+ // tuple struct/"normal" variant
74+ let expr =
75+ cx. expr_method_call ( span, fmt, Ident :: from_str ( "debug_tuple" ) , vec ! [ name] ) ;
76+ stmts. push ( cx. stmt_let ( DUMMY_SP , true , builder, expr) ) ;
77+
78+ for field in fields {
79+ // Use double indirection to make sure this works for unsized types
80+ let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
81+ let field = cx. expr_addr_of ( field. span , field) ;
82+
83+ let expr = cx. expr_method_call ( span,
84+ builder_expr. clone ( ) ,
85+ Ident :: from_str ( "field" ) ,
86+ vec ! [ field] ) ;
87+
88+ // Use `let _ = expr;` to avoid triggering the
89+ // unused_results lint.
90+ stmts. push ( stmt_let_undescore ( cx, span, expr) ) ;
11491 }
115- stmts
11692 }
117- _ => unreachable ! ( ) ,
118- } ;
93+ ast:: VariantData :: Struct ( ..) => {
94+ // normal struct/struct variant
95+ let expr =
96+ cx. expr_method_call ( span, fmt, Ident :: from_str ( "debug_struct" ) , vec ! [ name] ) ;
97+ stmts. push ( cx. stmt_let ( DUMMY_SP , true , builder, expr) ) ;
98+
99+ for field in fields {
100+ let name = cx. expr_lit ( field. span ,
101+ ast:: LitKind :: Str ( field. name . unwrap ( ) . name ,
102+ ast:: StrStyle :: Cooked ) ) ;
103+
104+ // Use double indirection to make sure this works for unsized types
105+ let field = cx. expr_addr_of ( field. span , field. self_ . clone ( ) ) ;
106+ let field = cx. expr_addr_of ( field. span , field) ;
107+ let expr = cx. expr_method_call ( span,
108+ builder_expr. clone ( ) ,
109+ Ident :: from_str ( "field" ) ,
110+ vec ! [ name, field] ) ;
111+ stmts. push ( stmt_let_undescore ( cx, span, expr) ) ;
112+ }
113+ }
114+ }
119115
120116 let expr = cx. expr_method_call ( span, builder_expr, Ident :: from_str ( "finish" ) , vec ! [ ] ) ;
121117
0 commit comments