diff options
author | bors[bot] <26634292+bors[bot]@users.noreply.github.com> | 2021-04-13 12:39:03 +0100 |
---|---|---|
committer | GitHub <[email protected]> | 2021-04-13 12:39:03 +0100 |
commit | e6728a8cd39f9111dcdd654c7c65e99e5a2f1190 (patch) | |
tree | 2532d24e0c10c7e3284033df4256f7adf96d2e82 /docs/dev/architecture.md | |
parent | 0c02208fd8d9ff3ce8184e2eb5dba915d5b54656 (diff) | |
parent | 09a78caca403f1b4be8711d00519094896928e58 (diff) |
Merge #8415
8415: Fix faulty assertion when extracting function with macro call r=matklad a=brandondong
**Reproduction:**
```rust
fn main() {
let n = 1;
let k = n * n;
dbg!(n);
}
```
1. Select the second and third lines of the main function. Use the "Extract into function" code assist.
2. Panic occurs in debug, error is logged in release: "[ERROR ide_assists::handlers::extract_function] assertion failed: matches!(path, ast :: Expr :: PathExpr(_))".
3. Function generates successfully on release where the panic was bypassed.
```rust
fn fun_name(n: i32) {
let k = n * n;
dbg!(n);
}
```
**Cause:**
- The generated function will take `n` as a parameter. The extraction logic needs to search the usages of `n` to determine whether it is used mutably or not. The helper `path_element_of_reference` is called for each usage but the second usage is a macro call and fails the `Expr::PathExpr(_)` match assertion.
- The caller of `path_element_of_reference` does implicitly assume it to be a `Expr::PathExpr(_)` in how it looks at its parent node for determining whether it is used mutably. This logic will not work for macros.
- I'm not sure if there are any other cases besides macros where it could be something other than a `Expr::PathExpr(_)`. I tried various examples and could not find any.
**Fix:**
- Update assertion to include the macro case.
- Add a FIXME to properly handle checking if a macro usage requires mutable access. For now, return false instead of running the existing logic that is tailored for `Expr::PathExpr(_)`'s.
Co-authored-by: Brandon <[email protected]>
Diffstat (limited to 'docs/dev/architecture.md')
0 files changed, 0 insertions, 0 deletions