Skip to content

Commit ffb6b23

Browse files
committed
fix: Prevent panic in Remove Unused Parameter assist
Instead of calling `builder.delete` for every text range we find with `process_usage`, we now ensure that the ranges do not overlap before removing them. If a range is fully contained by a prior one, it is dropped. fixes rust-lang#12784
1 parent dc05192 commit ffb6b23

File tree

1 file changed

+37
-4
lines changed

1 file changed

+37
-4
lines changed

crates/ide-assists/src/handlers/remove_unused_param.rs

Lines changed: 37 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -96,12 +96,20 @@ fn process_usages(
9696
) {
9797
let source_file = ctx.sema.parse(file_id);
9898
builder.edit_file(file_id);
99-
for usage in references {
100-
if let Some(text_range) = process_usage(&source_file, usage, arg_to_remove, is_self_present)
101-
{
102-
builder.delete(text_range);
99+
let possible_ranges = references
100+
.into_iter()
101+
.filter_map(|usage| process_usage(&source_file, usage, arg_to_remove, is_self_present));
102+
103+
let mut ranges_to_delete: Vec<TextRange> = vec![];
104+
for range in possible_ranges {
105+
if !ranges_to_delete.iter().any(|it| it.contains_range(range)) {
106+
ranges_to_delete.push(range)
103107
}
104108
}
109+
110+
for range in ranges_to_delete {
111+
builder.delete(range)
112+
}
105113
}
106114

107115
fn process_usage(
@@ -370,6 +378,31 @@ fn main() {
370378
S.f(92);
371379
S::f(&S);
372380
}
381+
"#,
382+
)
383+
}
384+
385+
#[test]
386+
fn nested_call() {
387+
check_assist(
388+
remove_unused_param,
389+
r#"
390+
fn foo(x: i32, $0y: i32) -> i32 {
391+
x
392+
}
393+
394+
fn bar() {
395+
foo(1, foo(2, 3));
396+
}
397+
"#,
398+
r#"
399+
fn foo(x: i32) -> i32 {
400+
x
401+
}
402+
403+
fn bar() {
404+
foo(1);
405+
}
373406
"#,
374407
)
375408
}

0 commit comments

Comments
 (0)