Skip to content

Commit 525fc4b

Browse files
committed
use ufcs in derive(RustEncodable)
1 parent e101042 commit 525fc4b

File tree

1 file changed

+40
-20
lines changed

1 file changed

+40
-20
lines changed

compiler/rustc_builtin_macros/src/deriving/encodable.rs

+40-20
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,8 @@ fn encodable_substructure(
179179

180180
match *substr.fields {
181181
Struct(_, ref fields) => {
182-
let emit_struct_field = Ident::new(sym::emit_struct_field, trait_span);
182+
let fn_emit_struct_field_path =
183+
cx.def_site_path(&[sym::rustc_serialize, sym::Encodable, sym::emit_struct_field]);
183184
let mut stmts = Vec::new();
184185
for (i, &FieldInfo { name, ref self_, span, .. }) in fields.iter().enumerate() {
185186
let name = match name {
@@ -189,11 +190,15 @@ fn encodable_substructure(
189190
let self_ref = cx.expr_addr_of(span, self_.clone());
190191
let enc = cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]);
191192
let lambda = cx.lambda1(span, enc, blkarg);
192-
let call = cx.expr_method_call(
193+
let call = cx.expr_call_global(
193194
span,
194-
blkencoder.clone(),
195-
emit_struct_field,
196-
vec![cx.expr_str(span, name), cx.expr_usize(span, i), lambda],
195+
fn_emit_struct_field_path.clone(),
196+
vec![
197+
blkencoder.clone(),
198+
cx.expr_str(span, name),
199+
cx.expr_usize(span, i),
200+
lambda,
201+
],
197202
);
198203

199204
// last call doesn't need a try!
@@ -216,11 +221,14 @@ fn encodable_substructure(
216221
cx.lambda_stmts_1(trait_span, stmts, blkarg)
217222
};
218223

219-
cx.expr_method_call(
224+
let fn_emit_struct_path =
225+
cx.def_site_path(&[sym::rustc_serialize, sym::Encodable, sym::emit_struct]);
226+
227+
cx.expr_call_global(
220228
trait_span,
221-
encoder,
222-
Ident::new(sym::emit_struct, trait_span),
229+
fn_emit_struct_path,
223230
vec![
231+
encoder,
224232
cx.expr_str(trait_span, substr.type_ident.name),
225233
cx.expr_usize(trait_span, fields.len()),
226234
blk,
@@ -235,7 +243,13 @@ fn encodable_substructure(
235243
// actually exist.
236244
let me = cx.stmt_let(trait_span, false, blkarg, encoder);
237245
let encoder = cx.expr_ident(trait_span, blkarg);
238-
let emit_variant_arg = Ident::new(sym::emit_enum_variant_arg, trait_span);
246+
247+
let fn_emit_enum_variant_arg_path: Vec<_> = cx.def_site_path(&[
248+
sym::rustc_serialize,
249+
sym::Encodable,
250+
sym::emit_enum_variant_arg,
251+
]);
252+
239253
let mut stmts = Vec::new();
240254
if !fields.is_empty() {
241255
let last = fields.len() - 1;
@@ -244,11 +258,11 @@ fn encodable_substructure(
244258
let enc =
245259
cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]);
246260
let lambda = cx.lambda1(span, enc, blkarg);
247-
let call = cx.expr_method_call(
261+
262+
let call = cx.expr_call_global(
248263
span,
249-
blkencoder.clone(),
250-
emit_variant_arg,
251-
vec![cx.expr_usize(span, i), lambda],
264+
fn_emit_enum_variant_arg_path.clone(),
265+
vec![blkencoder.clone(), cx.expr_usize(span, i), lambda],
252266
);
253267
let call = if i != last {
254268
cx.expr_try(span, call)
@@ -265,23 +279,29 @@ fn encodable_substructure(
265279

266280
let blk = cx.lambda_stmts_1(trait_span, stmts, blkarg);
267281
let name = cx.expr_str(trait_span, variant.ident.name);
268-
let call = cx.expr_method_call(
282+
283+
let fn_emit_enum_variant_path: Vec<_> =
284+
cx.def_site_path(&[sym::rustc_serialize, sym::Encodable, sym::emit_enum_variant]);
285+
286+
let call = cx.expr_call_global(
269287
trait_span,
270-
blkencoder,
271-
Ident::new(sym::emit_enum_variant, trait_span),
288+
fn_emit_enum_variant_path,
272289
vec![
290+
blkencoder,
273291
name,
274292
cx.expr_usize(trait_span, idx),
275293
cx.expr_usize(trait_span, fields.len()),
276294
blk,
277295
],
278296
);
297+
279298
let blk = cx.lambda1(trait_span, call, blkarg);
280-
let ret = cx.expr_method_call(
299+
let fn_emit_enum_path: Vec<_> =
300+
cx.def_site_path(&[sym::rustc_serialize, sym::Encodable, sym::emit_enum]);
301+
let ret = cx.expr_call_global(
281302
trait_span,
282-
encoder,
283-
Ident::new(sym::emit_enum, trait_span),
284-
vec![cx.expr_str(trait_span, substr.type_ident.name), blk],
303+
fn_emit_enum_path,
304+
vec![encoder, cx.expr_str(trait_span, substr.type_ident.name), blk],
285305
);
286306
cx.expr_block(cx.block(trait_span, vec![me, cx.stmt_expr(ret)]))
287307
}

0 commit comments

Comments
 (0)