@@ -51,9 +51,9 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
51
51
// build fmt.debug_struct(<name>).field(<fieldname>, &<fieldval>)....build()
52
52
// or fmt.debug_tuple(<name>).field(&<fieldval>)....build()
53
53
// 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 ) ,
57
57
EnumNonMatchingCollapsed ( ..) |
58
58
StaticStruct ( ..) |
59
59
StaticEnum ( ..) => cx. span_bug ( span, "nonsensical .fields in `#[derive(Debug)]`" ) ,
@@ -67,55 +67,51 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>
67
67
68
68
let fmt = substr. nonself_args [ 0 ] . clone ( ) ;
69
69
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) ) ;
114
91
}
115
- stmts
116
92
}
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
+ }
119
115
120
116
let expr = cx. expr_method_call ( span, builder_expr, Ident :: from_str ( "finish" ) , vec ! [ ] ) ;
121
117
0 commit comments