@@ -51,7 +51,7 @@ pub fn expand_deriving_decodable(cx: &ExtCtxt,
51
51
trait_def. expand ( mitem, in_items)
52
52
}
53
53
54
- fn decodable_substructure ( cx : & ExtCtxt , span : Span ,
54
+ fn decodable_substructure ( cx : & ExtCtxt , trait_span : Span ,
55
55
substr : & Substructure ) -> @Expr {
56
56
let decoder = substr. nonself_args [ 0 ] ;
57
57
let recurse = ~[ cx. ident_of ( "extra" ) ,
@@ -60,9 +60,9 @@ fn decodable_substructure(cx: &ExtCtxt, span: Span,
60
60
cx. ident_of ( "decode" ) ] ;
61
61
// throw an underscore in front to suppress unused variable warnings
62
62
let blkarg = cx. ident_of ( "_d" ) ;
63
- let blkdecoder = cx. expr_ident ( span , blkarg) ;
64
- let calldecode = cx. expr_call_global ( span , recurse, ~[ blkdecoder] ) ;
65
- let lambdadecode = cx. lambda_expr_1 ( span , calldecode, blkarg) ;
63
+ let blkdecoder = cx. expr_ident ( trait_span , blkarg) ;
64
+ let calldecode = cx. expr_call_global ( trait_span , recurse, ~[ blkdecoder] ) ;
65
+ let lambdadecode = cx. lambda_expr_1 ( trait_span , calldecode, blkarg) ;
66
66
67
67
return match * substr. fields {
68
68
StaticStruct ( _, ref summary) => {
@@ -73,7 +73,7 @@ fn decodable_substructure(cx: &ExtCtxt, span: Span,
73
73
let read_struct_field = cx. ident_of ( "read_struct_field" ) ;
74
74
75
75
let result = decode_static_fields ( cx,
76
- span ,
76
+ trait_span ,
77
77
substr. type_ident ,
78
78
summary,
79
79
|span, name, field| {
@@ -82,10 +82,10 @@ fn decodable_substructure(cx: &ExtCtxt, span: Span,
82
82
cx. expr_uint ( span, field) ,
83
83
lambdadecode] )
84
84
} ) ;
85
- cx. expr_method_call ( span , decoder, cx. ident_of ( "read_struct" ) ,
86
- ~[ cx. expr_str ( span , cx. str_of ( substr. type_ident ) ) ,
87
- cx. expr_uint ( span , nfields) ,
88
- cx. lambda_expr_1 ( span , result, blkarg) ] )
85
+ cx. expr_method_call ( trait_span , decoder, cx. ident_of ( "read_struct" ) ,
86
+ ~[ cx. expr_str ( trait_span , cx. str_of ( substr. type_ident ) ) ,
87
+ cx. expr_uint ( trait_span , nfields) ,
88
+ cx. lambda_expr_1 ( trait_span , result, blkarg) ] )
89
89
}
90
90
StaticEnum ( _, ref fields) => {
91
91
let variant = cx. ident_of ( "i" ) ;
@@ -94,12 +94,11 @@ fn decodable_substructure(cx: &ExtCtxt, span: Span,
94
94
let mut variants = ~[ ] ;
95
95
let rvariant_arg = cx. ident_of ( "read_enum_variant_arg" ) ;
96
96
97
- for ( i, f) in fields. iter ( ) . enumerate ( ) {
98
- let ( name, parts) = match * f { ( i, ref p) => ( i, p) } ;
99
- variants. push ( cx. expr_str ( span, cx. str_of ( name) ) ) ;
97
+ for ( i, & ( name, v_span, ref parts) ) in fields. iter ( ) . enumerate ( ) {
98
+ variants. push ( cx. expr_str ( v_span, cx. str_of ( name) ) ) ;
100
99
101
100
let decoded = decode_static_fields ( cx,
102
- span ,
101
+ v_span ,
103
102
name,
104
103
parts,
105
104
|span, _, field| {
@@ -108,22 +107,22 @@ fn decodable_substructure(cx: &ExtCtxt, span: Span,
108
107
lambdadecode] )
109
108
} ) ;
110
109
111
- arms. push ( cx. arm ( span ,
112
- ~[ cx. pat_lit ( span , cx. expr_uint ( span , i) ) ] ,
110
+ arms. push ( cx. arm ( v_span ,
111
+ ~[ cx. pat_lit ( v_span , cx. expr_uint ( v_span , i) ) ] ,
113
112
decoded) ) ;
114
113
}
115
114
116
- arms. push ( cx. arm_unreachable ( span ) ) ;
115
+ arms. push ( cx. arm_unreachable ( trait_span ) ) ;
117
116
118
- let result = cx. expr_match ( span , cx. expr_ident ( span , variant) , arms) ;
119
- let lambda = cx. lambda_expr ( span , ~[ blkarg, variant] , result) ;
120
- let variant_vec = cx. expr_vec ( span , variants) ;
121
- let result = cx. expr_method_call ( span , blkdecoder,
117
+ let result = cx. expr_match ( trait_span , cx. expr_ident ( trait_span , variant) , arms) ;
118
+ let lambda = cx. lambda_expr ( trait_span , ~[ blkarg, variant] , result) ;
119
+ let variant_vec = cx. expr_vec ( trait_span , variants) ;
120
+ let result = cx. expr_method_call ( trait_span , blkdecoder,
122
121
cx. ident_of ( "read_enum_variant" ) ,
123
122
~[ variant_vec, lambda] ) ;
124
- cx. expr_method_call ( span , decoder, cx. ident_of ( "read_enum" ) ,
125
- ~[ cx. expr_str ( span , cx. str_of ( substr. type_ident ) ) ,
126
- cx. lambda_expr_1 ( span , result, blkarg) ] )
123
+ cx. expr_method_call ( trait_span , decoder, cx. ident_of ( "read_enum" ) ,
124
+ ~[ cx. expr_str ( trait_span , cx. str_of ( substr. type_ident ) ) ,
125
+ cx. lambda_expr_1 ( trait_span , result, blkarg) ] )
127
126
}
128
127
_ => cx. bug ( "expected StaticEnum or StaticStruct in deriving(Decodable)" )
129
128
} ;
@@ -133,29 +132,29 @@ fn decodable_substructure(cx: &ExtCtxt, span: Span,
133
132
/// - `outer_pat_ident` is the name of this enum variant/struct
134
133
/// - `getarg` should retrieve the `uint`-th field with name `@str`.
135
134
fn decode_static_fields ( cx : & ExtCtxt ,
136
- outer_span : Span ,
135
+ trait_span : Span ,
137
136
outer_pat_ident : Ident ,
138
137
fields : & StaticFields ,
139
138
getarg : |Span , @str , uint| -> @Expr )
140
139
-> @Expr {
141
140
match * fields {
142
141
Unnamed ( ref fields) => {
143
142
if fields. is_empty ( ) {
144
- cx. expr_ident ( outer_span , outer_pat_ident)
143
+ cx. expr_ident ( trait_span , outer_pat_ident)
145
144
} else {
146
145
let fields = fields. iter ( ) . enumerate ( ) . map ( |( i, & span) | {
147
146
getarg ( span, format ! ( "_field{}" , i) . to_managed ( ) , i)
148
147
} ) . collect ( ) ;
149
148
150
- cx. expr_call_ident ( outer_span , outer_pat_ident, fields)
149
+ cx. expr_call_ident ( trait_span , outer_pat_ident, fields)
151
150
}
152
151
}
153
152
Named ( ref fields) => {
154
153
// use the field's span to get nicer error messages.
155
154
let fields = fields. iter ( ) . enumerate ( ) . map ( |( i, & ( name, span) ) | {
156
155
cx. field_imm ( span, name, getarg ( span, cx. str_of ( name) , i) )
157
156
} ) . collect ( ) ;
158
- cx. expr_struct_ident ( outer_span , outer_pat_ident, fields)
157
+ cx. expr_struct_ident ( trait_span , outer_pat_ident, fields)
159
158
}
160
159
}
161
160
}
0 commit comments