Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 30 additions & 3 deletions crates/ide-assists/src/handlers/bind_unused_param.rs
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ use crate::assist_context::{AssistContext, Assists};
use ide_db::{LineIndexDatabase, assists::AssistId, defs::Definition};
use syntax::{
AstNode,
ast::{self, edit_in_place::Indent},
ast::{self, HasName, edit_in_place::Indent},
};

// Assist: bind_unused_param
Expand All @@ -22,6 +22,7 @@ pub(crate) fn bind_unused_param(acc: &mut Assists, ctx: &AssistContext<'_>) -> O
let param: ast::Param = ctx.find_node_at_offset()?;

let Some(ast::Pat::IdentPat(ident_pat)) = param.pat() else { return None };
let name = ident_pat.name().filter(|n| !n.text().starts_with('_'))?;

let param_def = {
let local = ctx.sema.to_def(&ident_pat)?;
Expand All @@ -39,14 +40,14 @@ pub(crate) fn bind_unused_param(acc: &mut Assists, ctx: &AssistContext<'_>) -> O

acc.add(
AssistId::quick_fix("bind_unused_param"),
format!("Bind as `let _ = {ident_pat};`"),
format!("Bind as `let _ = {name};`"),
param.syntax().text_range(),
|builder| {
let line_index = ctx.db().line_index(ctx.vfs_file_id());

let indent = func.indent_level();
let text_indent = indent + 1;
let mut text = format!("\n{text_indent}let _ = {ident_pat};");
let mut text = format!("\n{text_indent}let _ = {name};");

let left_line = line_index.line_col(l_curly_range.end()).line;
let right_line = line_index.line_col(r_curly_range.start()).line;
Expand Down Expand Up @@ -83,6 +84,22 @@ fn foo(y: i32) {
);
}

#[test]
fn bind_unused_ref_ident_pat() {
cov_mark::check!(single_line);
check_assist(
bind_unused_param,
r#"
fn foo(ref $0y: i32) {}
"#,
r#"
fn foo(ref y: i32) {
let _ = y;
}
"#,
);
}

#[test]
fn bind_unused_empty_block_with_newline() {
check_assist(
Expand Down Expand Up @@ -149,6 +166,16 @@ impl Trait for () {
bind_unused_param,
r#"
fn foo(x: i32, $0y: i32) { y; }
"#,
);
}

#[test]
fn keep_underscore_used() {
check_assist_not_applicable(
bind_unused_param,
r#"
fn foo($0_x: i32, y: i32) {}
"#,
);
}
Expand Down
Loading