about summary refs log tree commit diff
diff options
context:
space:
mode:
authorWyatt Herkamp <wherkamp@gmail.com>2024-04-15 10:46:21 -0400
committerWyatt Herkamp <wherkamp@gmail.com>2024-04-15 10:46:21 -0400
commit0faa2940c7615fd845b6ad9dd44902c2104477e9 (patch)
tree5ac80336bfedfafa42ff37d6f44ab21778f1ee6c
parent2e7059ca5816158fdb13e63a88c3b4b26d001f0c (diff)
downloadrust-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.rs37
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;
+}
+"#,
+        );
+    }
 }