about summary refs log tree commit diff
diff options
context:
space:
mode:
authorYoung-Flash <dongyang@apache.org>2024-03-11 19:34:16 +0800
committerYoung-Flash <dongyang@apache.org>2024-03-11 19:36:53 +0800
commit77136575da7fe3b59ed2c3d2f5100237e4111991 (patch)
tree67390bb2724bd49deab2de05d0f2d71b8449682c
parenta0dd822972de3f4ad7fbb2f3d31291a1714ad652 (diff)
downloadrust-77136575da7fe3b59ed2c3d2f5100237e4111991.tar.gz
rust-77136575da7fe3b59ed2c3d2f5100237e4111991.zip
feat: add fix for unused_variables
-rw-r--r--crates/ide-diagnostics/src/handlers/unused_variables.rs28
1 files changed, 28 insertions, 0 deletions
diff --git a/crates/ide-diagnostics/src/handlers/unused_variables.rs b/crates/ide-diagnostics/src/handlers/unused_variables.rs
index 28ccf474b40..412aed1e1ce 100644
--- a/crates/ide-diagnostics/src/handlers/unused_variables.rs
+++ b/crates/ide-diagnostics/src/handlers/unused_variables.rs
@@ -1,3 +1,11 @@
+use ide_db::{
+    assists::{Assist, AssistId, AssistKind},
+    base_db::FileRange,
+    label::Label,
+    source_change::SourceChange,
+};
+use text_edit::TextEdit;
+
 use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext};
 
 // Diagnostic: unused-variables
@@ -8,15 +16,35 @@ pub(crate) fn unused_variables(
     d: &hir::UnusedVariable,
 ) -> Diagnostic {
     let ast = d.local.primary_source(ctx.sema.db).syntax_ptr();
+    let diagnostic_range = ctx.sema.diagnostics_display_range(ast);
+    let var_name = d.local.primary_source(ctx.sema.db).syntax().to_string();
     Diagnostic::new_with_syntax_node_ptr(
         ctx,
         DiagnosticCode::RustcLint("unused_variables"),
         "unused variable",
         ast,
     )
+    .with_fixes(fixes(&var_name, diagnostic_range, ast.file_id.is_macro()))
     .experimental()
 }
 
+fn fixes(var_name: &String, 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)),
+        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)),
+        )),
+        trigger_signature_help: false,
+    }])
+}
+
 #[cfg(test)]
 mod tests {
     use crate::tests::check_diagnostics;