<feed xmlns='http://www.w3.org/2005/Atom'>
<title>rust/tests/ui/macros/stringify.rs, branch 1.78.0</title>
<subtitle>https://github.com/rust-lang/rust
</subtitle>
<id>http://git.dreamy.place/mirrors/rust/atom?h=1.78.0</id>
<link rel='self' href='http://git.dreamy.place/mirrors/rust/atom?h=1.78.0'/>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/'/>
<updated>2024-02-16T20:02:50+00:00</updated>
<entry>
<title>[AUTO-GENERATED] Migrate ui tests from `//` to `//@` directives</title>
<updated>2024-02-16T20:02:50+00:00</updated>
<author>
<name>许杰友 Jieyou Xu (Joe)</name>
<email>jieyouxu@outlook.com</email>
</author>
<published>2024-02-16T20:02:50+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=ec2cc761bc7067712ecc7734502f703fe3b024c8'/>
<id>urn:sha1:ec2cc761bc7067712ecc7734502f703fe3b024c8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Fix some cases in `space_between`.</title>
<updated>2024-01-22T09:19:17+00:00</updated>
<author>
<name>Nicholas Nethercote</name>
<email>n.nethercote@gmail.com</email>
</author>
<published>2024-01-22T04:58:36+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=1fbabeeb2e0e737301f6527ec3a22f1fa2f87676'/>
<id>urn:sha1:1fbabeeb2e0e737301f6527ec3a22f1fa2f87676</id>
<content type='text'>
There are a number of cases where we erroneously omit the space between
two tokens, all involving an exception to a more general case. The
affected tokens are `$`, `!`, `.`, `,`, and `let` followed by a
parenthesis.

This fixes a lot of FIXME comments.
</content>
</entry>
<entry>
<title>Fix parenthesization of subexprs containing statement boundary</title>
<updated>2023-12-19T06:40:48+00:00</updated>
<author>
<name>David Tolnay</name>
<email>dtolnay@gmail.com</email>
</author>
<published>2023-12-18T04:00:27+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=17239d9b641afa04d7ddc51e48a422ea1da1d2b8'/>
<id>urn:sha1:17239d9b641afa04d7ddc51e48a422ea1da1d2b8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Test parenthesization of leftmost subexprs containing stmt boundaries</title>
<updated>2023-12-19T06:40:23+00:00</updated>
<author>
<name>David Tolnay</name>
<email>dtolnay@gmail.com</email>
</author>
<published>2023-12-12T07:10:17+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=527e2eac17c5d3709e4e30e8b72ae33a6e8990b1'/>
<id>urn:sha1:527e2eac17c5d3709e4e30e8b72ae33a6e8990b1</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Rollup merge of #118726 - dtolnay:matchguardlet, r=compiler-errors</title>
<updated>2023-12-11T19:46:49+00:00</updated>
<author>
<name>Matthias Krüger</name>
<email>matthias.krueger@famsik.de</email>
</author>
<published>2023-12-11T19:46:49+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=3a0562b93c29b79aa1a9e775c2fdca068d23fd1e'/>
<id>urn:sha1:3a0562b93c29b79aa1a9e775c2fdca068d23fd1e</id>
<content type='text'>
Do not parenthesize exterior struct lit inside match guards

Before this PR, the AST pretty-printer injects parentheses around expressions any time parens _could_ be needed depending on what else is in the code that surrounds that expression. But the pretty-printer did not pass around enough context to understand whether parentheses really _are_ needed on any particular expression. As a consequence, there are false positives where unneeded parentheses are being inserted.

Example:

```rust
#![feature(if_let_guard)]

macro_rules! pp {
    ($e:expr) =&gt; {
        stringify!($e)
    };
}

fn main() {
    println!("{}", pp!(match () { () if let _ = Struct {} =&gt; {} }));
}
```

**Before:**

```console
match () { () if let _ = (Struct {}) =&gt; {} }
```

**After:**

```console
match () { () if let _ = Struct {} =&gt; {} }
```

This PR introduces a bit of state that is passed across various expression printing methods to help understand accurately whether particular situations require parentheses injected by the pretty printer, and it fixes one such false positive involving match guards as shown above.

There are other parenthesization false positive cases not fixed by this PR. I intend to address these in follow-up PRs. For example here is one: the expression `{ let _ = match x {} + 1; }` is pretty-printed as `{ let _ = (match x {}) + 1; }` despite there being no reason for parentheses to appear there.
</content>
</entry>
<entry>
<title>Add a few cases with wonky formatting to `stringify.rs` test.</title>
<updated>2023-12-10T22:36:42+00:00</updated>
<author>
<name>Nicholas Nethercote</name>
<email>n.nethercote@gmail.com</email>
</author>
<published>2023-11-29T01:02:40+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=940c885bc461afa2ec3eef901d6d685665686162'/>
<id>urn:sha1:940c885bc461afa2ec3eef901d6d685665686162</id>
<content type='text'>
Because the spacing-based pretty-printing partially preserves that.
</content>
</entry>
<entry>
<title>Add spacing information to delimiters.</title>
<updated>2023-12-10T22:36:40+00:00</updated>
<author>
<name>Nicholas Nethercote</name>
<email>n.nethercote@gmail.com</email>
</author>
<published>2023-10-12T04:36:14+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=4cfdbd328b7171b2328d11b950b1af0978d6b1ef'/>
<id>urn:sha1:4cfdbd328b7171b2328d11b950b1af0978d6b1ef</id>
<content type='text'>
This is an extension of the previous commit. It means the output of
something like this:
```
stringify!(let a: Vec&lt;u32&gt; = vec![];)
```
goes from this:
```
let a: Vec&lt;u32&gt; = vec![] ;
```
With this PR, it now produces this string:
```
let a: Vec&lt;u32&gt; = vec![];
```
</content>
</entry>
<entry>
<title>Improve `print_tts` by changing `tokenstream::Spacing`.</title>
<updated>2023-12-10T22:19:09+00:00</updated>
<author>
<name>Nicholas Nethercote</name>
<email>n.nethercote@gmail.com</email>
</author>
<published>2023-08-08T01:43:44+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=925f7fad576b6a8659d93846faf8d9610e59bab0'/>
<id>urn:sha1:925f7fad576b6a8659d93846faf8d9610e59bab0</id>
<content type='text'>
`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&lt;u32&gt; = vec![];)
```
currently produces this string:
```
let a : Vec &lt; u32 &gt; = vec! [] ;
```
With this PR, it now produces this string:
```
let a: Vec&lt;u32&gt; = 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.
</content>
</entry>
<entry>
<title>Do not parenthesize exterior struct lit inside match guards</title>
<updated>2023-12-08T23:15:42+00:00</updated>
<author>
<name>David Tolnay</name>
<email>dtolnay@gmail.com</email>
</author>
<published>2023-11-30T05:32:32+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=6f1d7631fb856cb8c94aaa3abb138fe54e8e75e8'/>
<id>urn:sha1:6f1d7631fb856cb8c94aaa3abb138fe54e8e75e8</id>
<content type='text'>
</content>
</entry>
<entry>
<title>Add if_let_guard and let_chains pretty printer tests</title>
<updated>2023-12-08T23:14:43+00:00</updated>
<author>
<name>David Tolnay</name>
<email>dtolnay@gmail.com</email>
</author>
<published>2023-11-30T07:02:05+00:00</published>
<link rel='alternate' type='text/html' href='http://git.dreamy.place/mirrors/rust/commit/?id=419b26931b73209bfafdb9938c09e12b9d650613'/>
<id>urn:sha1:419b26931b73209bfafdb9938c09e12b9d650613</id>
<content type='text'>
</content>
</entry>
</feed>
