Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

proc_macro: Reorganize public API #49597

Merged
merged 2 commits into from
Apr 5, 2018

Commits on Apr 2, 2018

  1. proc_macro: Reorganize public API

    This commit is a reorganization of the `proc_macro` crate's public user-facing
    API. This is the result of a number of discussions at the recent Rust All-Hands
    where we're hoping to get the `proc_macro` crate into ship shape for
    stabilization of a subset of its functionality in the Rust 2018 release.
    
    The reorganization here is motivated by experiences from the `proc-macro2`,
    `quote`, and `syn` crates on crates.io (and other crates which depend on them).
    The main focus is future flexibility along with making a few more operations
    consistent and/or fixing bugs. A summary of the changes made from today's
    `proc_macro` API is:
    
    * The `TokenNode` enum has been removed and the public fields of `TokenTree`
      have also been removed. Instead the `TokenTree` type is now a public enum
      (what `TokenNode` was) and each variant is an opaque struct which internally
      contains `Span` information. This makes the various tokens a bit more
      consistent, require fewer wrappers, and otherwise provides good
      future-compatibility as opaque structs are easy to modify later on.
    
    * `Literal` integer constructors have been expanded to be unambiguous as to what
      they're doing and also allow for more future flexibility. Previously
      constructors like `Literal::float` and `Literal::integer` were used to create
      unsuffixed literals and the concrete methods like `Literal::i32` would create
      a suffixed token. This wasn't immediately clear to all users (the
      suffixed/unsuffixed aspect) and having *one* constructor for unsuffixed
      literals required us to pick a largest type which may not always be true. To
      fix these issues all constructors are now of the form
      `Literal::i32_unsuffixed` or `Literal::i32_suffixed` (for all integral types).
      This should allow future compatibility as well as being immediately clear
      what's suffixed and what isn't.
    
    * Each variant of `TokenTree` internally contains a `Span` which can also be
      configured via `set_span`. For example `Literal` and `Term` now both
      internally contain a `Span` rather than having it stored in an auxiliary
      location.
    
    * Constructors of all tokens are called `new` now (aka `Term::intern` is gone)
      and most do not take spans. Manufactured tokens typically don't have a fresh
      span to go with them and the span is purely used for error-reporting
      **except** the span for `Term`, which currently affects hygiene. The default
      spans for all these constructed tokens is `Span::call_site()` for now.
    
      The `Term` type's constructor explicitly requires passing in a `Span` to
      provide future-proofing against possible hygiene changes. It's intended that a
      first pass of stabilization will likely only stabilize `Span::call_site()`
      which is an explicit opt-in for "I would like no hygiene here please". The
      intention here is to make this explicit in procedural macros to be
      forwards-compatible with a hygiene-specifying solution.
    
    * Some of the conversions for `TokenStream` have been simplified a little.
    
    * The `TokenTreeIter` iterator was renamed to `token_stream::IntoIter`.
    
    Overall the hope is that this is the "final pass" at the API of `TokenStream`
    and most of `TokenTree` before stabilization. Explicitly left out here is any
    changes to `Span`'s API which will likely need to be re-evaluated before
    stabilization.
    
    All changes in this PR have already been reflected to the [`proc-macro2`],
    `quote`, and `syn` crates. New versions of all these crates have also been
    published to crates.io.
    
    Once this lands in nightly I plan on making an internals post again summarizing
    the changes made here and also calling on all macro authors to give the APIs a
    spin and see how they work. Hopefully pending no major issues we can then have
    an FCP to stabilize later this cycle!
    
    [`proc-macro2`]: https://docs.rs/proc-macro2/0.3.1/proc_macro2/
    alexcrichton committed Apr 2, 2018
    Configuration menu
    Copy the full SHA
    553c04d View commit details
    Browse the repository at this point in the history

Commits on Apr 4, 2018

  1. Tweak doc comment expansion

    * Expand `!` tokens for inner doc comments
    * Trim leading doc comment decoration in the string literal
    
    Both of these should help bring the expansion inline with what `macro_rules!`
    already does.
    
    Closes rust-lang#49655
    Closes rust-lang#49656
    alexcrichton committed Apr 4, 2018
    Configuration menu
    Copy the full SHA
    a57b1fb View commit details
    Browse the repository at this point in the history