rust-lang / rust-lang/rust-analyzer
`convert_named_struct_to_tuple_struct` produces intersecting edits when a macro expands a field access twice
@Albab-Hasan is already working on this.
Since Jun 10, 2026.
- Dominant language
- Rust
- Stars
- 16.9k
- Forks
- 2.2k
- Avg merge
- 1d 12h
- Merged PRs (30d)
- 72
Description
rust-analyzer version: 0.3.2929-standalone (panic message below is from a source build of master with force-always-assert; on the release build the assist silently does nothing and only logs the error)
rustc version: rustc 1.97.0-nightly (ca9a134e0 2026-04-26)
editor or extension: VSCode, rust-analyzer extension 0.3.2929
relevant settings: none
repository link (if public, optional): n/a
code snippet to reproduce:
macro_rules! m { ($e:expr) => { ($e, $e) }; }
struct S { a: i32 }
fn main() {
let s2 = S { a: 1 };
m!(s2.a);
}
reproduce:
cursor on S in struct S { a: i32 }
Convert to tuple struct
expected:
struct S(i32); with the usage rewritten to m!(s2.0);, or the field reference inside the macro left alone. either way no crash.
actual:
on the release build the assist is offered, applies nothing, and logs the error. on a build with debug assertions the request handler panics:
request handler panicked: some replace change ranges intersect!
left change: ReplaceWithMany(Token(IDENT@299..300 "a"), [Node(NAME_REF@0..1)]) a0
equals
right change: ReplaceWithMany(Token(IDENT@299..300 "a"), [Node(NAME_REF@0..1)]) a0
panicked at crates/syntax/src/syntax_editor/edit_algo.rs:478:5:
some replace change ranges intersect!
cause:
the macro expands $e twice, so the field-reference search returns two FileReferences for the single a token in the source. edit_field_references maps both back to the same source token and registers two identical ReplaceWithMany changes, tripping stdx::always!(false, "some replace change ranges intersect!") in edit_algo.rs . the whole edit is discarded.
note:
same root cause as the destructure_tuple_binding / destructure_struct_binding issues, also affects convert_tuple_struct_to_named_struct.
env:
- rustc: 1.97.0-nightly
- rust-analyzer: 0.3.2929
- OS: Ubuntu
- Editor: VS Code
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Assessment
This issue has not been assessed yet.