aboutsummaryrefslogtreecommitdiff
path: root/crates/ide/src/diagnostics
diff options
context:
space:
mode:
authorPhil Ellison <[email protected]>2020-12-28 13:41:15 +0000
committerPhil Ellison <[email protected]>2021-01-23 07:40:24 +0000
commit1316422a7c2ef26e9da78fa23f170407b1cb39bb (patch)
tree1eea156207bcc920f0573ef51d7f6ad4fe03299d /crates/ide/src/diagnostics
parenteab5db20edd9604ba5d489fa8c6430eb7bac6610 (diff)
Add diagnostic for filter_map followed by next
Diffstat (limited to 'crates/ide/src/diagnostics')
-rw-r--r--crates/ide/src/diagnostics/fixes.rs33
1 files changed, 32 insertions, 1 deletions
diff --git a/crates/ide/src/diagnostics/fixes.rs b/crates/ide/src/diagnostics/fixes.rs
index 579d5a308..eafbac43a 100644
--- a/crates/ide/src/diagnostics/fixes.rs
+++ b/crates/ide/src/diagnostics/fixes.rs
@@ -4,7 +4,7 @@ use hir::{
4 db::AstDatabase, 4 db::AstDatabase,
5 diagnostics::{ 5 diagnostics::{
6 Diagnostic, IncorrectCase, MissingFields, MissingOkOrSomeInTailExpr, NoSuchField, 6 Diagnostic, IncorrectCase, MissingFields, MissingOkOrSomeInTailExpr, NoSuchField,
7 RemoveThisSemicolon, UnresolvedModule, 7 RemoveThisSemicolon, ReplaceFilterMapNextWithFindMap, UnresolvedModule,
8 }, 8 },
9 HasSource, HirDisplay, InFile, Semantics, VariantDef, 9 HasSource, HirDisplay, InFile, Semantics, VariantDef,
10}; 10};
@@ -144,6 +144,37 @@ impl DiagnosticWithFix for IncorrectCase {
144 } 144 }
145} 145}
146 146
147// Bugs:
148// * Action is applicable for both iter() and filter_map() rows
149// * Action deletes the entire method chain
150impl DiagnosticWithFix for ReplaceFilterMapNextWithFindMap {
151 fn fix(&self, sema: &Semantics<RootDatabase>) -> Option<Fix> {
152 let root = sema.db.parse_or_expand(self.file)?;
153
154 let next_expr = self.next_expr.to_node(&root);
155 let next_expr_range = next_expr.syntax().text_range();
156
157 let filter_map_expr = self.filter_map_expr.to_node(&root);
158 let filter_map_expr_range = filter_map_expr.syntax().text_range();
159
160 let edit = TextEdit::delete(next_expr_range);
161
162 // This is the entire method chain, including the array literal
163 eprintln!("NEXT EXPR: {:#?}", next_expr);
164 // This is the entire method chain except for the final next()
165 eprintln!("FILTER MAP EXPR: {:#?}", filter_map_expr);
166
167 let source_change =
168 SourceFileEdit { file_id: self.file.original_file(sema.db), edit }.into();
169
170 Some(Fix::new(
171 "Replace filter_map(..).next() with find_map()",
172 source_change,
173 filter_map_expr_range,
174 ))
175 }
176}
177
147fn missing_record_expr_field_fix( 178fn missing_record_expr_field_fix(
148 sema: &Semantics<RootDatabase>, 179 sema: &Semantics<RootDatabase>,
149 usage_file_id: FileId, 180 usage_file_id: FileId,