rust/crates
bors 818c30c311 Auto merge of #16092 - kilpkonn:term_search_1, r=Veykril
feat: Introduce term search to rust-analyzer

# Introduce term search to `rust-analyzer`
_I've marked this as draft as there might be some shortcomings, please point them out so I can fix them. Otherwise I think it is kind of ready as I think I'll rather introduce extra functionality in follow up PRs._

Term search (or I guess expression search for rust) is a technique to generate code by basically making the types match.
Consider the following program
```rust
fn wrap(arg: i32) -> Option<i32> {
    todo!();
}
```
From the types of values in scope and constructors of `Option`, we can produce the expected result of wrapping the argument in `Option`

Dependently typed languages such as `Idris2` and `Agda` have similar tools to help with proofs, but this can be also used in everyday development as a "auto-complete".

# Demo videos

https://github.com/rust-lang/rust-analyzer/assets/19900308/7b68a1b7-7dba-4e31-9221-6c7485e77d88

https://github.com/rust-lang/rust-analyzer/assets/19900308/0fae530a-aabb-4b28-af71-e19f8d3d64b2

# What does it currently do
- It works well with locals, free functions, type constructors and non-static impl methods that take items by value.
- Works with functions/methods that take shared references, but not with unique references (very conservative).
- Can handle projections to struct fields (eg. `foo.bar.baz`) but this might me more conservative than it has to be to avoid conflicting with borrow checker
- Should create only valid programs (no type / borrow checking errors). Tested with `rust-analyzer analysis-stats /path/to/ripgrep/Cargo.toml --run-term-search --validate-term-search` (basically running `cargo check` on all of the generated programs and only error seems to be due to type inference which is more of issue of testing method.

# Performace / fitness
```txt
ripgrep (latest)
Tail Expr syntactic hits: 130/1692 (7%)
Tail Exprs found: 523/1692 (30%)
Term search avg time: 9ms
Term search:         15.64s, 97ginstr, 8mb

rust-analyzer (on this branch)
Tail Expr syntactic hits: 804/13860 (5%)
Tail Exprs found: 6757/13860 (48%)
Term search avg time: 78ms
Term search:         1088.23s, 6765ginstr, 98mb
```
Highly generic code seems to blow up the search space so currently the amount of generics allowed is functions/methods is limited down to 0 (1 didn't give much improvement and 2 is already like 0.5+s search time)

# Plans for the future (not in this PR)
- ``~~Add impl methods that do not take `self` type (should be quite straight forward)~~ Done
- Be smarter (aka less restrictive) about borrow checking - this seems quite hard but since the current approach is rather naive I think some easy improvement is available.
- ``~~See if it works as a autocomplete while typing~~ Done

_Feel free to ask questions / point of shortcoming either here or on Zulip, I'll be happy to address them. I'm doing this as part of my MSc thesis so I'll be working on it till summer anyway 😄_
2024-02-12 14:47:12 +00:00
..
base-db feat: ignored and disabled macro expansion 2024-02-12 12:50:40 +01:00
cfg
flycheck internal: tool discovery prefers sysroot tools 2024-02-12 12:08:18 +01:00
hir Cleanup term search related changes 2024-02-11 14:35:54 +02:00
hir-def Auto merge of #16092 - kilpkonn:term_search_1, r=Veykril 2024-02-12 14:47:12 +00:00
hir-expand Encode disabled proc-macros via boolean flag, not special Expander 2024-02-12 13:39:38 +01:00
hir-ty Auto merge of #16092 - kilpkonn:term_search_1, r=Veykril 2024-02-12 14:47:12 +00:00
ide Cleanup term search related changes 2024-02-11 14:35:54 +02:00
ide-assists Cleanup term search related changes 2024-02-11 14:35:54 +02:00
ide-completion Cleanup term search related changes 2024-02-11 14:35:54 +02:00
ide-db Cleanup term search related changes 2024-02-11 14:35:54 +02:00
ide-diagnostics Auto merge of #16092 - kilpkonn:term_search_1, r=Veykril 2024-02-12 14:47:12 +00:00
ide-ssr ide-ssr: Fix warnings about clippy str_to_string rule 2024-02-10 01:00:40 +09:00
intern
limit Lint debug prints and disallowed types with clippy 2024-02-01 17:57:27 +01:00
load-cargo Encode disabled proc-macros via boolean flag, not special Expander 2024-02-12 13:39:38 +01:00
mbe fix: Fix macro transcriber emitting incorrect lifetime tokens 2024-02-11 12:10:38 +01:00
parser parser: Fix warnings about clippy str_to_string rule 2024-02-10 01:00:40 +09:00
paths
proc-macro-api proc-macro-api: Fix warnings about clippy str_to_string rule 2024-02-10 01:00:40 +09:00
proc-macro-srv Auto merge of #16470 - Veykril:clippy-disallow, r=lnicola 2024-02-05 17:20:43 +00:00
proc-macro-srv-cli Merge commit '0113bc9388b480fa42c632f57f4f0f7af5813ec1' into sync-from-ra 2024-02-04 10:37:58 +02:00
profile Merge commit '0113bc9388b480fa42c632f57f4f0f7af5813ec1' into sync-from-ra 2024-02-04 10:37:58 +02:00
project-model internal: tool discovery prefers sysroot tools 2024-02-12 12:08:18 +01:00
rust-analyzer Auto merge of #16092 - kilpkonn:term_search_1, r=Veykril 2024-02-12 14:47:12 +00:00
salsa internal: Remove SELF_REF hack for self referential SyntaxContexts 2024-02-10 16:20:02 +01:00
sourcegen sourcegen: Fix warnings about clippy str_to_string rule 2024-02-10 01:00:40 +09:00
span internal: Remove SELF_REF hack for self referential SyntaxContexts 2024-02-10 16:20:02 +01:00
stdx Merge commit '0113bc9388b480fa42c632f57f4f0f7af5813ec1' into sync-from-ra 2024-02-04 10:37:58 +02:00
syntax Add quantified trees to reduce autocomplete options 2024-02-11 13:33:29 +02:00
test-fixture Encode disabled proc-macros via boolean flag, not special Expander 2024-02-12 13:39:38 +01:00
test-utils Cleanup term search related changes 2024-02-11 14:35:54 +02:00
text-edit text-edit: Fix warnings about clippy str_to_string rule 2024-02-10 01:00:41 +09:00
toolchain internal: tool discovery prefers sysroot tools 2024-02-12 12:08:18 +01:00
tt fix: Fix macro transcriber emitting incorrect lifetime tokens 2024-02-11 12:10:38 +01:00
vfs vfs: Fix warnings about clippy str_to_string rule 2024-02-10 01:00:40 +09:00
vfs-notify