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.rs53
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;
+}
+"#,
+ );
+ }
}