diff options
| author | Wyatt Herkamp <wherkamp@gmail.com> | 2024-04-15 10:46:21 -0400 |
|---|---|---|
| committer | Wyatt Herkamp <wherkamp@gmail.com> | 2024-04-15 10:46:21 -0400 |
| commit | 0faa2940c7615fd845b6ad9dd44902c2104477e9 (patch) | |
| tree | 5ac80336bfedfafa42ff37d6f44ab21778f1ee6c | |
| parent | 2e7059ca5816158fdb13e63a88c3b4b26d001f0c (diff) | |
| download | rust-0faa2940c7615fd845b6ad9dd44902c2104477e9.tar.gz rust-0faa2940c7615fd845b6ad9dd44902c2104477e9.zip | |
Use the text range for the name. Not the entire syntax in Unused Variable Diagnostic.
| -rw-r--r-- | crates/ide-diagnostics/src/handlers/unused_variables.rs | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/crates/ide-diagnostics/src/handlers/unused_variables.rs b/crates/ide-diagnostics/src/handlers/unused_variables.rs index f69209a10a9..114783d323d 100644 --- a/crates/ide-diagnostics/src/handlers/unused_variables.rs +++ b/crates/ide-diagnostics/src/handlers/unused_variables.rs @@ -6,6 +6,7 @@ use ide_db::{ source_change::SourceChange, RootDatabase, }; +use syntax::TextRange; use text_edit::TextEdit; use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext}; @@ -23,6 +24,13 @@ pub(crate) fn unused_variables( return None; } let diagnostic_range = ctx.sema.diagnostics_display_range(ast); + // 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().value.text_range())?; + // Make sure we are within the diagnostic range for the variable + if !diagnostic_range.range.contains_range(name_range) { + return None; + } let var_name = d.local.name(ctx.sema.db); Some( Diagnostic::new_with_syntax_node_ptr( @@ -31,7 +39,13 @@ pub(crate) fn unused_variables( "unused variable", ast, ) - .with_fixes(fixes(ctx.sema.db, var_name, diagnostic_range, ast.file_id.is_macro())) + .with_fixes(fixes( + ctx.sema.db, + var_name, + name_range, + diagnostic_range, + ast.file_id.is_macro(), + )) .experimental(), ) } @@ -39,12 +53,14 @@ pub(crate) fn unused_variables( 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!( @@ -56,7 +72,7 @@ fn fixes( target: diagnostic_range.range, source_change: Some(SourceChange::from_text_edit( diagnostic_range.file_id, - TextEdit::replace(diagnostic_range.range, format!("_{}", var_name.display(db))), + TextEdit::replace(name_range, format!("_{}", var_name.display(db))), )), trigger_signature_help: false, }]) @@ -224,4 +240,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; +} +"#, + ); + } } |
