rust/src
Alex Crichton 6227357513 std: Stabilize the std::fmt module
This commit performs a final stabilization pass over the std::fmt module,
marking all necessary APIs as stable. One of the more interesting aspects of
this module is that it exposes a good deal of its runtime representation to the
outside world in order for `format_args!` to be able to construct the format
strings. Instead of hacking the compiler to assume that these items are stable,
this commit instead lays out a story for the stabilization and evolution of
these APIs.

There are three primary details used by the `format_args!` macro:

1. `Arguments` - an opaque package of a "compiled format string". This structure
   is passed around and the `write` function is the source of truth for
   transforming a compiled format string into a string at runtime. This must be
   able to be constructed in stable code.

2. `Argument` - an opaque structure representing an argument to a format string.
   This is *almost* a trait object as it's just a pointer/function pair, but due
   to the function originating from one of many traits, it's not actually a
   trait object. Like `Arguments`, this must be constructed from stable code.

3. `fmt::rt` - this module contains the runtime type definitions primarily for
   the `rt::Argument` structure. Whenever an argument is formatted with
   nonstandard flags, a corresponding `rt::Argument` is generated describing how
   the argument is being formatted. This can be used to construct an
   `Arguments`.

The primary interface to `std::fmt` is the `Arguments` structure, and as such
this type name is stabilize as-is today. It is expected for libraries to pass
around an `Arguments` structure to represent a pending formatted computation.

The remaining portions are largely "cruft" which would rather not be stabilized,
but due to the stability checks they must be. As a result, almost all pieces
have been renamed to represent that they are "version 1" of the formatting
representation. The theory is that at a later date if we change the
representation of these types we can add new definitions called "version 2" and
corresponding constructors for `Arguments`.

One of the other remaining large questions about the fmt module were how the
pending I/O reform would affect the signatures of methods in the module. Due to
[RFC 526][rfc], however, the writers of fmt are now incompatible with the
writers of io, so this question has largely been solved. As a result the
interfaces are largely stabilized as-is today.

[rfc]: https://github.com/rust-lang/rfcs/blob/master/text/0526-fmt-text-writer.md

Specifically, the following changes were made:

* The contents of `fmt::rt` were all moved under `fmt::rt::v1`
* `fmt::rt` is stable
* `fmt::rt::v1` is stable
* `Error` is stable
* `Writer` is stable
* `Writer::write_str` is stable
* `Writer::write_fmt` is stable
* `Formatter` is stable
* `Argument` has been renamed to `ArgumentV1` and is stable
* `ArgumentV1::new` is stable
* `ArgumentV1::from_uint` is stable
* `Arguments::new_v1` is stable (renamed from `new`)
* `Arguments::new_v1_formatted` is stable (renamed from `with_placeholders`)
* All formatting traits are now stable, as well as the `fmt` method.
* `fmt::write` is stable
* `fmt::format` is stable
* `Formatter::pad_integral` is stable
* `Formatter::pad` is stable
* `Formatter::write_str` is stable
* `Formatter::write_fmt` is stable
* Some assorted top level items which were only used by `format_args!` were
  removed in favor of static functions on `ArgumentV1` as well.
* The formatting-flag-accessing methods remain unstable

Within the contents of the `fmt::rt::v1` module, the following actions were
taken:

* Reexports of all enum variants were removed
* All prefixes on enum variants were removed
* A few miscellaneous enum variants were renamed
* Otherwise all structs, fields, and variants were marked stable.

In addition to these actions in the `std::fmt` module, many implementations of
`Show` and `String` were stabilized as well.

In some other modules:

* `ToString` is now stable
* `ToString::to_string` is now stable
* `Vec` no longer implements `fmt::Writer` (this has moved to `String`)

This is a breaking change due to all of the changes to the `fmt::rt` module, but
this likely will not have much impact on existing programs.

Closes #20661
[breaking-change]
2015-01-30 09:21:56 -08:00
..
compiler-rt@58ab642c30 Updated compiler-rt 2015-01-09 18:38:30 +02:00
compiletest s/Show/Debug/g 2015-01-29 07:49:02 -05:00
doc Auto merge of #21677 - japaric:no-range, r=alexcrichton 2015-01-29 16:28:52 +00:00
driver Set unstable feature names appropriately 2015-01-23 13:28:40 -08:00
etc Rollup merge of 21643 - semarie:break-local_stage0, r=brson 2015-01-29 03:17:16 +05:30
grammar cleanup: s/v.slice*()/&v[a..b]/g + remove redundant as_slice() calls 2015-01-27 09:03:06 -05:00
jemalloc@b001609960 update jemalloc 2014-10-05 22:17:25 -04:00
liballoc std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
libarena for x in range(a, b) -> for x in a..b 2015-01-29 07:47:37 -05:00
libbacktrace
libcollections std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
libcore std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
libcoretest s/Show/Debug/g 2015-01-29 07:49:02 -05:00
libflate for x in range(a, b) -> for x in a..b 2015-01-29 07:47:37 -05:00
libfmt_macros Rollup merge of 21681 - japaric:no-warn, r=alexcrichton 2015-01-29 03:14:35 +05:30
libgetopts s/Show/Debug/g 2015-01-29 07:49:02 -05:00
libgraphviz std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
liblibc Rollup merge of #21640 - retep998:rmdir, r=alexcrichton 2015-01-29 03:04:10 +05:30
liblog s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librand s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librbml s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librustc std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
librustc_back Auto merge of #21677 - japaric:no-range, r=alexcrichton 2015-01-29 16:28:52 +00:00
librustc_bitflags s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librustc_borrowck Auto merge of #21691 - edwardw:double-closure, r=nikomatsakis 2015-01-29 19:36:03 +00:00
librustc_driver s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librustc_llvm s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librustc_privacy Merge remote-tracking branch 'rust-lang/master' 2015-01-26 15:42:32 -08:00
librustc_resolve s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librustc_trans Auto merge of #21692 - pnkfelix:fsk-fix-coerce-match-20055, r=eddyb 2015-01-29 22:54:19 +00:00
librustc_typeck s/Show/Debug/g 2015-01-29 07:49:02 -05:00
librustdoc s/Show/Debug/g 2015-01-29 07:49:02 -05:00
libserialize std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
libstd std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
libsyntax std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
libterm s/Show/Debug/g 2015-01-29 07:49:02 -05:00
libtest Auto merge of #21677 - japaric:no-range, r=alexcrichton 2015-01-29 16:28:52 +00:00
libunicode s/Show/Debug/g 2015-01-29 07:49:02 -05:00
llvm@b820135911 Redo Segmented stack support for DragonFly 2015-01-18 08:25:52 +01:00
rt rt: Remove libtime wrappers 2015-01-19 23:05:10 +09:00
rust-installer@e577c97b49 Fix revert of rust-installer 2015-01-09 10:19:30 -08:00
rustbook Auto merge of #21677 - japaric:no-range, r=alexcrichton 2015-01-29 16:28:52 +00:00
rustllvm Better inline assembly errors 2015-01-22 19:43:39 +01:00
test std: Stabilize the std::fmt module 2015-01-30 09:21:56 -08:00
snapshots.txt register snaphots 2015-01-29 07:49:02 -05:00