Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide-diagnostics/src/handlers/unused_variables.rs')
| -rw-r--r-- | crates/ide-diagnostics/src/handlers/unused_variables.rs | 53 |
1 files changed, 48 insertions, 5 deletions
diff --git a/crates/ide-diagnostics/src/handlers/unused_variables.rs b/crates/ide-diagnostics/src/handlers/unused_variables.rs index cd251faab9..fdd4e862ca 100644 --- a/crates/ide-diagnostics/src/handlers/unused_variables.rs +++ b/crates/ide-diagnostics/src/handlers/unused_variables.rs @@ -1,9 +1,12 @@ +use hir::Name; use ide_db::{ assists::{Assist, AssistId, AssistKind}, base_db::FileRange, label::Label, source_change::SourceChange, + RootDatabase, }; +use syntax::TextRange; use text_edit::TextEdit; use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext}; @@ -21,7 +24,17 @@ pub(crate) fn unused_variables( return None; } let diagnostic_range = ctx.sema.diagnostics_display_range(ast); - let var_name = d.local.primary_source(ctx.sema.db).syntax().to_string(); + // The range for the Actual Name. We don't want to replace the entire declarition. Using the diagnostic range causes issues within in Array Destructuring. + let name_range = d + .local + .primary_source(ctx.sema.db) + .name() + .map(|v| v.syntax().original_file_range_rooted(ctx.sema.db)) + .filter(|it| { + Some(it.file_id) == ast.file_id.file_id() + && diagnostic_range.range.contains_range(it.range) + }); + let var_name = d.local.name(ctx.sema.db); Some( Diagnostic::new_with_syntax_node_ptr( ctx, @@ -29,23 +42,36 @@ pub(crate) fn unused_variables( "unused variable", ast, ) - .with_fixes(fixes(&var_name, diagnostic_range, ast.file_id.is_macro())) + .with_fixes(name_range.and_then(|it| { + fixes(ctx.sema.db, var_name, it.range, diagnostic_range, ast.file_id.is_macro()) + })) .experimental(), ) } -fn fixes(var_name: &String, diagnostic_range: FileRange, is_in_marco: bool) -> Option<Vec<Assist>> { +fn fixes( + db: &RootDatabase, + var_name: Name, + name_range: TextRange, + diagnostic_range: FileRange, + is_in_marco: bool, +) -> Option<Vec<Assist>> { if is_in_marco { return None; } + Some(vec![Assist { id: AssistId("unscore_unused_variable_name", AssistKind::QuickFix), - label: Label::new(format!("Rename unused {} to _{}", var_name, var_name)), + label: Label::new(format!( + "Rename unused {} to _{}", + var_name.display(db), + var_name.display(db) + )), group: None, target: diagnostic_range.range, source_change: Some(SourceChange::from_text_edit( diagnostic_range.file_id, - TextEdit::replace(diagnostic_range.range, format!("_{}", var_name)), + TextEdit::replace(name_range, format!("_{}", var_name.display(db))), )), trigger_signature_help: false, }]) @@ -213,4 +239,21 @@ fn main() { "#, ); } + #[test] + fn unused_variable_in_array_destructure() { + check_fix( + r#" +fn main() { + let arr = [1, 2, 3, 4, 5]; + let [_x, y$0 @ ..] = arr; +} +"#, + r#" +fn main() { + let arr = [1, 2, 3, 4, 5]; + let [_x, _y @ ..] = arr; +} +"#, + ); + } } |