Unnamed repository; edit this file 'description' to name the repository.
Auto merge of #12789 - DorianListens:dscheidt/unused-param-overlapping, r=DorianListens
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 #12784
bors 2022-07-20
parent 7d20ff3 · parent ffb6b23 · commit 30c4db1
-rw-r--r--crates/ide-assists/src/handlers/remove_unused_param.rs41
1 files changed, 37 insertions, 4 deletions
diff --git a/crates/ide-assists/src/handlers/remove_unused_param.rs b/crates/ide-assists/src/handlers/remove_unused_param.rs
index 80e2ca918b..928a5a386e 100644
--- a/crates/ide-assists/src/handlers/remove_unused_param.rs
+++ b/crates/ide-assists/src/handlers/remove_unused_param.rs
@@ -96,12 +96,20 @@ fn process_usages(
) {
let source_file = ctx.sema.parse(file_id);
builder.edit_file(file_id);
- for usage in references {
- if let Some(text_range) = process_usage(&source_file, usage, arg_to_remove, is_self_present)
- {
- builder.delete(text_range);
+ let possible_ranges = references
+ .into_iter()
+ .filter_map(|usage| process_usage(&source_file, usage, arg_to_remove, is_self_present));
+
+ let mut ranges_to_delete: Vec<TextRange> = vec![];
+ for range in possible_ranges {
+ if !ranges_to_delete.iter().any(|it| it.contains_range(range)) {
+ ranges_to_delete.push(range)
}
}
+
+ for range in ranges_to_delete {
+ builder.delete(range)
+ }
}
fn process_usage(
@@ -373,4 +381,29 @@ fn main() {
"#,
)
}
+
+ #[test]
+ fn nested_call() {
+ check_assist(
+ remove_unused_param,
+ r#"
+fn foo(x: i32, $0y: i32) -> i32 {
+ x
+}
+
+fn bar() {
+ foo(1, foo(2, 3));
+}
+"#,
+ r#"
+fn foo(x: i32) -> i32 {
+ x
+}
+
+fn bar() {
+ foo(1);
+}
+"#,
+ )
+ }
}