From d8b6919d4fcd1b69494278bb4472e095e2cd52f3 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Fri, 31 Jan 2014 21:32:39 +1100 Subject: [PATCH] std::fmt: prepare to convert the formatting traits to methods, and work around the lack of UFCS. The further work is pending a snapshot, to avoid putting #[cfg(stage0)] attributes on all the traits and duplicating them. --- src/libstd/fmt/mod.rs | 35 +++++++++++++++++++++++++++++++++++ src/libsyntax/ext/format.rs | 12 +++++------- 2 files changed, 40 insertions(+), 7 deletions(-) diff --git a/src/libstd/fmt/mod.rs b/src/libstd/fmt/mod.rs index 435e5568b8f3..14bf0206c287 100644 --- a/src/libstd/fmt/mod.rs +++ b/src/libstd/fmt/mod.rs @@ -606,6 +606,41 @@ pub trait LowerExp { fn fmt(&Self, &mut Formatter); } #[allow(missing_doc)] pub trait UpperExp { fn fmt(&Self, &mut Formatter); } +// FIXME #11938 - UFCS would make us able call the above methods +// directly Show::show(x, fmt). + +// FIXME(huonw's WIP): this is a intermediate state waiting for a +// snapshot (at the time of writing we're at 2014-01-20 b6400f9), to +// be able to make the `fmt` functions into normal methods and have +// `format!()` still work. +macro_rules! uniform_fn_call_workaround { + ($( $name: ident, $trait_: ident; )*) => { + $( + #[doc(hidden)] + pub fn $name(x: &T, fmt: &mut Formatter) { + $trait_::fmt(x, fmt) + } + )* + } +} +uniform_fn_call_workaround! { + secret_show, Show; + secret_bool, Bool; + secret_char, Char; + secret_signed, Signed; + secret_unsigned, Unsigned; + secret_octal, Octal; + secret_binary, Binary; + secret_lower_hex, LowerHex; + secret_upper_hex, UpperHex; + secret_string, String; + secret_poly, Poly; + secret_pointer, Pointer; + secret_float, Float; + secret_lower_exp, LowerExp; + secret_upper_exp, UpperExp; +} + /// The `write` function takes an output stream, a precompiled format string, /// and a list of arguments. The arguments will be formatted according to the /// specified format string into the output stream provided. diff --git a/src/libsyntax/ext/format.rs b/src/libsyntax/ext/format.rs index 535f5a5d0cd5..1893cc0c722a 100644 --- a/src/libsyntax/ext/format.rs +++ b/src/libsyntax/ext/format.rs @@ -702,7 +702,7 @@ impl<'a> Context<'a> { Named(ref s) => self.name_types.get(s) }; - let fmt_trait = match *ty { + let fmt_fn = match *ty { Known(ref tyname) => { match tyname.as_slice() { "" => "secret_show", @@ -721,10 +721,9 @@ impl<'a> Context<'a> { "x" => "secret_lower_hex", "X" => "secret_upper_hex", _ => { - self.ecx.span_err(sp, - format!("unknown format trait `{}`", - *tyname)); - "Dummy" + self.ecx.span_err(sp, format!("unknown format trait `{}`", + *tyname)); + "dummy" } } } @@ -747,8 +746,7 @@ impl<'a> Context<'a> { let format_fn = self.ecx.path_global(sp, ~[ self.ecx.ident_of("std"), self.ecx.ident_of("fmt"), - self.ecx.ident_of(fmt_trait), - self.ecx.ident_of("fmt"), + self.ecx.ident_of(fmt_fn), ]); self.ecx.expr_call_global(sp, ~[ self.ecx.ident_of("std"),