aboutsummaryrefslogtreecommitdiff
path: root/crates/assists/src/handlers/remove_unused_param.rs
diff options
context:
space:
mode:
authorLukas Wirth <[email protected]>2021-01-11 23:05:07 +0000
committerLukas Wirth <[email protected]>2021-01-12 00:03:04 +0000
commitfbdb32adfc49e0d69b7fd8e44135bea59382d2cb (patch)
tree5cffb6d3f0a0a168bfa48d7adcd6fa233e30b3db /crates/assists/src/handlers/remove_unused_param.rs
parent52fa926f005890f07dffc789c84c2be57a6bdccc (diff)
Group references by FileId
Diffstat (limited to 'crates/assists/src/handlers/remove_unused_param.rs')
-rw-r--r--crates/assists/src/handlers/remove_unused_param.rs43
1 files changed, 27 insertions, 16 deletions
diff --git a/crates/assists/src/handlers/remove_unused_param.rs b/crates/assists/src/handlers/remove_unused_param.rs
index 56e8b5229..4f3b8ac46 100644
--- a/crates/assists/src/handlers/remove_unused_param.rs
+++ b/crates/assists/src/handlers/remove_unused_param.rs
@@ -1,8 +1,11 @@
1use ide_db::{defs::Definition, search::Reference}; 1use ide_db::{
2 defs::Definition,
3 search::{FileReference, FileReferences},
4};
2use syntax::{ 5use syntax::{
3 algo::find_node_at_range, 6 algo::find_node_at_range,
4 ast::{self, ArgListOwner}, 7 ast::{self, ArgListOwner},
5 AstNode, SyntaxKind, SyntaxNode, TextRange, T, 8 AstNode, SourceFile, SyntaxKind, SyntaxNode, TextRange, T,
6}; 9};
7use test_utils::mark; 10use test_utils::mark;
8use SyntaxKind::WHITESPACE; 11use SyntaxKind::WHITESPACE;
@@ -58,32 +61,40 @@ pub(crate) fn remove_unused_param(acc: &mut Assists, ctx: &AssistContext) -> Opt
58 param.syntax().text_range(), 61 param.syntax().text_range(),
59 |builder| { 62 |builder| {
60 builder.delete(range_to_remove(param.syntax())); 63 builder.delete(range_to_remove(param.syntax()));
61 for usage in fn_def.usages(&ctx.sema).all() { 64 for usages in fn_def.usages(&ctx.sema).all() {
62 process_usage(ctx, builder, usage, param_position); 65 process_usages(ctx, builder, usages, param_position);
63 } 66 }
64 }, 67 },
65 ) 68 )
66} 69}
67 70
68fn process_usage( 71fn process_usages(
69 ctx: &AssistContext, 72 ctx: &AssistContext,
70 builder: &mut AssistBuilder, 73 builder: &mut AssistBuilder,
71 usage: Reference, 74 usages: FileReferences,
75 arg_to_remove: usize,
76) {
77 let source_file = ctx.sema.parse(usages.file_id);
78 builder.edit_file(usages.file_id);
79 for usage in usages.references {
80 if let Some(text_range) = process_usage(&source_file, usage, arg_to_remove) {
81 builder.delete(text_range);
82 }
83 }
84}
85
86fn process_usage(
87 source_file: &SourceFile,
88 FileReference { range, .. }: FileReference,
72 arg_to_remove: usize, 89 arg_to_remove: usize,
73) -> Option<()> { 90) -> Option<TextRange> {
74 let source_file = ctx.sema.parse(usage.file_range.file_id); 91 let call_expr: ast::CallExpr = find_node_at_range(source_file.syntax(), range)?;
75 let call_expr: ast::CallExpr =
76 find_node_at_range(source_file.syntax(), usage.file_range.range)?;
77 let call_expr_range = call_expr.expr()?.syntax().text_range(); 92 let call_expr_range = call_expr.expr()?.syntax().text_range();
78 if !call_expr_range.contains_range(usage.file_range.range) { 93 if !call_expr_range.contains_range(range) {
79 return None; 94 return None;
80 } 95 }
81 let arg = call_expr.arg_list()?.args().nth(arg_to_remove)?; 96 let arg = call_expr.arg_list()?.args().nth(arg_to_remove)?;
82 97 Some(range_to_remove(arg.syntax()))
83 builder.edit_file(usage.file_range.file_id);
84 builder.delete(range_to_remove(arg.syntax()));
85
86 Some(())
87} 98}
88 99
89fn range_to_remove(node: &SyntaxNode) -> TextRange { 100fn range_to_remove(node: &SyntaxNode) -> TextRange {