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

Improve print_tts #114571

Merged
merged 3 commits into from
Dec 11, 2023
Merged

Improve print_tts #114571

merged 3 commits into from
Dec 11, 2023

Commits on Dec 10, 2023

  1. Improve print_tts by changing tokenstream::Spacing.

    `tokenstream::Spacing` appears on all `TokenTree::Token` instances,
    both punct and non-punct. Its current usage:
    - `Joint` means "can join with the next token *and* that token is a
      punct".
    - `Alone` means "cannot join with the next token *or* can join with the
      next token but that token is not a punct".
    
    The fact that `Alone` is used for two different cases is awkward.
    This commit augments `tokenstream::Spacing` with a new variant
    `JointHidden`, resulting in:
    - `Joint` means "can join with the next token *and* that token is a
      punct".
    - `JointHidden` means "can join with the next token *and* that token is a
      not a punct".
    - `Alone` means "cannot join with the next token".
    
    This *drastically* improves the output of `print_tts`. For example,
    this:
    ```
    stringify!(let a: Vec<u32> = vec![];)
    ```
    currently produces this string:
    ```
    let a : Vec < u32 > = vec! [] ;
    ```
    With this PR, it now produces this string:
    ```
    let a: Vec<u32> = vec![] ;
    ```
    (The space after the `]` is because `TokenTree::Delimited` currently
    doesn't have spacing information. The subsequent commit fixes this.)
    
    The new `print_tts` doesn't replicate original code perfectly. E.g.
    multiple space characters will be condensed into a single space
    character. But it's much improved.
    
    `print_tts` still produces the old, uglier output for code produced by
    proc macros. Because we have to translate the generated code from
    `proc_macro::Spacing` to the more expressive `token::Spacing`, which
    results in too much `proc_macro::Along` usage and no
    `proc_macro::JointHidden` usage. So `space_between` still exists and
    is used by `print_tts` in conjunction with the `Spacing` field.
    
    This change will also help with the removal of `Token::Interpolated`.
    Currently interpolated tokens are pretty-printed nicely via AST pretty
    printing. `Token::Interpolated` removal will mean they get printed with
    `print_tts`. Without this change, that would result in much uglier
    output for code produced by decl macro expansions. With this change, AST
    pretty printing and `print_tts` produce similar results.
    
    The commit also tweaks the comments on `proc_macro::Spacing`. In
    particular, it refers to "compound tokens" rather than "multi-char
    operators" because lifetimes aren't operators.
    nnethercote committed Dec 10, 2023
    Configuration menu
    Copy the full SHA
    925f7fa View commit details
    Browse the repository at this point in the history
  2. Add spacing information to delimiters.

    This is an extension of the previous commit. It means the output of
    something like this:
    ```
    stringify!(let a: Vec<u32> = vec![];)
    ```
    goes from this:
    ```
    let a: Vec<u32> = vec![] ;
    ```
    With this PR, it now produces this string:
    ```
    let a: Vec<u32> = vec![];
    ```
    nnethercote committed Dec 10, 2023
    Configuration menu
    Copy the full SHA
    4cfdbd3 View commit details
    Browse the repository at this point in the history
  3. Add a few cases with wonky formatting to stringify.rs test.

    Because the spacing-based pretty-printing partially preserves that.
    nnethercote committed Dec 10, 2023
    Configuration menu
    Copy the full SHA
    940c885 View commit details
    Browse the repository at this point in the history