rust/crates
bors ec968198b9 Auto merge of #13816 - WaffleLapkin:postfix_adjustment_hints, r=Veykril
Postfix adjustment hints

# Basic Description

This PR implements "postfix" adjustment hints:
![2022-12-21_19-27](https://user-images.githubusercontent.com/38225716/208941721-d48d316f-a918-408a-9757-8d4e2b402a66.png)

They are identical to normal adjustment hints, but are rendered _after_ the expression. E.g. `expr.*` instead of `*expr`. ~~This mirrors "postfix deref" feature that I'm planning to eventually propose to the compiler.~~

# Motivation

The advantage of being postfix is that you need to add parentheses less often:

![2022-12-21_19-38](https://user-images.githubusercontent.com/38225716/208944302-16718112-14a4-4438-8aed-797766391c63.png)
![2022-12-21_19-37](https://user-images.githubusercontent.com/38225716/208944281-d9614888-6597-41ee-bf5d-a081d8048f94.png)

This is because a lot of "reborrow" hints are caused by field access or method calls, both of which are postfix and have higher "precedence" than prefix `&` and `*`.

Also IMHO it just looks nicer and it's more clear what is happening (order of operations).

# Modes

However, there are some cases where postfix hints need parentheses but prefix don't (for example `&x` being turned into `(&x).*.*.&` or `&**&x`).

This PR allows users to choose which look they like more. There are 4 options (`rust-analyzer.inlayHints.expressionAdjustmentHints.mode` setting):
- `prefix` — always use prefix hints (default, what was used before that PR)
- `postfix` — always use postfix hints
- `prefer_prefix` — try to minimize number of parentheses, breaking ties in favor of prefix
- `prefer_postfix` — try to minimize number of parentheses, breaking ties in favor of postfix

Comparison of all modes:

![2022-12-21_19-53](https://user-images.githubusercontent.com/38225716/208947482-26357c82-2b42-47d9-acec-835f5f03f6b4.png)
![2022-12-21_19-49](https://user-images.githubusercontent.com/38225716/208946731-fe566d3b-52b2-4846-994d-c2cecc769e0f.png)
![2022-12-21_19-48](https://user-images.githubusercontent.com/38225716/208946742-6e237f44-805e-469a-a3db-03d8f76e1317.png)
![2022-12-21_19-47](https://user-images.githubusercontent.com/38225716/208946747-79f25fae-e3ea-47d2-8d27-cb4eeac034fe.png)

# Edge cases

Where are some rare cases where chain hints weirdly interact with adjustment hints, for example (note `SourceAnalyzer.&`):

![image](https://user-images.githubusercontent.com/38225716/208947958-41c12971-f1f0-4a41-a930-47939cce9f58.png)

This is pre-existing, you can get the same effect with prefix hints (`SourceAnalyzer)`).

----

Another weird thing is this:

![2022-12-21_20-00](https://user-images.githubusercontent.com/38225716/208948590-ea26d325-2108-4b35-abaa-716a65a1ae99.png)

Here `.&` is a hint and `?` is written in the source code. It looks like `?` is part of the hint because `?.` is ligature in my font. IMO this is a bug in vscode, but still worth mentioning (I'm also too lazy to report it there...).

# Fixed bugs

I've used the "needs parens" API and this accidentally fixed a bug with parens around `as`, see the test diff:
```diff,rust
     let _: *const u32  = &mut 0u32 as *mut u32;
                        //^^^^^^^^^^^^^^^^^^^^^<mut-ptr-to-const-ptr>
+                       //^^^^^^^^^^^^^^^^^^^^^(
+                       //^^^^^^^^^^^^^^^^^^^^^)
...
     let _: *const u32  = &mut 0u32 as *mut u32;
                        //^^^^^^^^^^^^^^^^^^^^^<mut-ptr-to-const-ptr>
+                       //^^^^^^^^^^^^^^^^^^^^^(
+                       //^^^^^^^^^^^^^^^^^^^^^)
```

# Changelog

changelog feature Add an option to make adjustment hints (aka reborrow hints) postfix
changelog fix Fix placement of parentheses around `as` casts for adjustment hints
2023-01-09 13:47:46 +00:00
..
base-db Inline all format arguments where possible 2022-12-24 14:36:10 -05:00
cfg Inline all format arguments where possible 2022-12-24 14:36:10 -05:00
flycheck use inline format args 2023-01-02 14:52:32 +00:00
hir Auto merge of #13458 - cameron1024:suggest-checked-wrapping-saturating, r=Veykril 2023-01-09 11:24:44 +00:00
hir-def remove unnecessary lifetimes that can be elided 2023-01-02 15:02:54 +00:00
hir-expand Auto merge of #13860 - danieleades:clippy, r=lnicola 2023-01-08 17:29:57 +00:00
hir-ty Auto merge of #13860 - danieleades:clippy, r=lnicola 2023-01-08 17:29:57 +00:00
ide Add a fixme to remove hacks 2023-01-09 13:37:37 +00:00
ide-assists Auto merge of #13843 - Overpeek:master, r=Veykril 2023-01-09 13:34:51 +00:00
ide-completion fix: add_format_like_completions to handle no exprs 2023-01-09 12:23:59 +01:00
ide-db test: fix arg_type test 2023-01-09 12:22:29 +01:00
ide-diagnostics remove needless borrows 2023-01-02 14:52:32 +00:00
ide-ssr Inline all format arguments where possible 2022-12-24 14:36:10 -05:00
limit Inline all format arguments where possible 2022-12-24 14:36:10 -05:00
mbe remove unnecessary lifetimes that can be elided 2023-01-02 15:02:54 +00:00
parser remove useless operations 2023-01-02 15:02:54 +00:00
paths
proc-macro-api remove useless operations 2023-01-02 15:02:54 +00:00
proc-macro-srv remove needless borrows 2023-01-02 14:52:32 +00:00
proc-macro-srv-cli
proc-macro-test Moar linting: needless_borrow, let_unit_value, ... 2022-12-25 05:07:47 -05:00
profile remove needless borrows 2023-01-02 14:52:32 +00:00
project-model remove unnecessary lifetimes that can be elided 2023-01-02 15:02:54 +00:00
rust-analyzer Add an option to minimize parentheses for adjustment hints 2023-01-09 13:35:17 +00:00
sourcegen remove needless borrows 2023-01-02 14:52:32 +00:00
stdx remove useless casts 2023-01-02 15:02:54 +00:00
syntax Auto merge of #13763 - rami3l:fix/gen-partial-eq-generic, r=Veykril 2023-01-09 13:02:09 +00:00
test-utils Auto merge of #13860 - danieleades:clippy, r=lnicola 2023-01-08 17:29:57 +00:00
text-edit
toolchain Moar linting: needless_borrow, let_unit_value, ... 2022-12-25 05:07:47 -05:00
tt Inline all format arguments where possible 2022-12-24 14:36:10 -05:00
vfs derive 'Hash' 2022-12-30 11:14:15 +00:00
vfs-notify