Unnamed repository; edit this file 'description' to name the repository.
-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 f69209a10a..114783d323 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;
+}
+"#,
+ );
+ }
}