Skip to content

Commit a28e862

Browse files
committed
Address further review comments
* Use known names for iter/iter_mut method (simplifies checking if the method exists * Extract code to check assist with fixtures to function
1 parent 98a6264 commit a28e862

File tree

2 files changed

+36
-51
lines changed

2 files changed

+36
-51
lines changed

crates/hir_expand/src/name.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ pub mod known {
189189
// Components of known path (function name)
190190
filter_map,
191191
next,
192+
iter_mut,
192193
// Builtin macros
193194
file,
194195
column,

crates/ide_assists/src/handlers/convert_for_to_iter_for_each.rs

Lines changed: 35 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use ast::LoopBodyOwner;
2+
use hir::known;
23
use ide_db::helpers::FamousDefs;
34
use stdx::format_to;
45
use syntax::{ast, AstNode};
@@ -68,28 +69,30 @@ pub(crate) fn convert_for_to_iter_for_each(acc: &mut Assists, ctx: &AssistContex
6869
fn is_ref_and_impls_iter_method(
6970
sema: &hir::Semantics<ide_db::RootDatabase>,
7071
iterable: &ast::Expr,
71-
) -> Option<(ast::Expr, &'static str)> {
72+
) -> Option<(ast::Expr, hir::Name)> {
7273
let ref_expr = match iterable {
7374
ast::Expr::RefExpr(r) => r,
7475
_ => return None,
7576
};
76-
let wanted_method = if ref_expr.mut_token().is_some() { "iter_mut" } else { "iter" };
77+
let wanted_method = if ref_expr.mut_token().is_some() { known::iter_mut } else { known::iter };
7778
let expr_behind_ref = ref_expr.expr()?;
7879
let typ = sema.type_of_expr(&expr_behind_ref)?;
7980
let scope = sema.scope(iterable.syntax());
8081
let krate = scope.module()?.krate();
8182
let traits_in_scope = scope.traits_in_scope();
8283
let iter_trait = FamousDefs(sema, Some(krate)).core_iter_Iterator()?;
83-
let has_wanted_method =
84-
typ.iterate_method_candidates(sema.db, krate, &traits_in_scope, None, |_, func| {
85-
if func.name(sema.db).to_string() != wanted_method {
86-
return None;
87-
}
84+
let has_wanted_method = typ.iterate_method_candidates(
85+
sema.db,
86+
krate,
87+
&traits_in_scope,
88+
Some(&wanted_method),
89+
|_, func| {
8890
if func.ret_type(sema.db).impls_trait(sema.db, iter_trait, &[]) {
8991
return Some(());
9092
}
9193
None
92-
});
94+
},
95+
);
9396
has_wanted_method.and(Some((expr_behind_ref, wanted_method)))
9497
}
9598

@@ -135,6 +138,16 @@ impl Empty {
135138
pub struct NoIterMethod;
136139
";
137140

141+
fn check_assist_with_fixtures(before: &str, after: &str) {
142+
let before = &format!(
143+
"//- /main.rs crate:main deps:core,empty_iter{}{}{}",
144+
before,
145+
FamousDefs::FIXTURE,
146+
EMPTY_ITER_FIXTURE
147+
);
148+
check_assist(convert_for_to_iter_for_each, before, after);
149+
}
150+
138151
#[test]
139152
fn test_not_for() {
140153
check_assist_not_applicable(
@@ -169,24 +182,16 @@ fn main() {
169182

170183
#[test]
171184
fn test_for_borrowed() {
172-
let before = r"
185+
check_assist_with_fixtures(
186+
r"
173187
use empty_iter::*;
174188
fn main() {
175189
let x = Empty;
176190
for $0v in &x {
177191
let a = v * 2;
178192
}
179193
}
180-
";
181-
let before = &format!(
182-
"//- /main.rs crate:main deps:core,empty_iter{}{}{}",
183-
before,
184-
FamousDefs::FIXTURE,
185-
EMPTY_ITER_FIXTURE
186-
);
187-
check_assist(
188-
convert_for_to_iter_for_each,
189-
before,
194+
",
190195
r"
191196
use empty_iter::*;
192197
fn main() {
@@ -201,24 +206,16 @@ fn main() {
201206

202207
#[test]
203208
fn test_for_borrowed_no_iter_method() {
204-
let before = r"
209+
check_assist_with_fixtures(
210+
r"
205211
use empty_iter::*;
206212
fn main() {
207213
let x = NoIterMethod;
208214
for $0v in &x {
209215
let a = v * 2;
210216
}
211217
}
212-
";
213-
let before = &format!(
214-
"//- /main.rs crate:main deps:core,empty_iter{}{}{}",
215-
before,
216-
FamousDefs::FIXTURE,
217-
EMPTY_ITER_FIXTURE
218-
);
219-
check_assist(
220-
convert_for_to_iter_for_each,
221-
before,
218+
",
222219
r"
223220
use empty_iter::*;
224221
fn main() {
@@ -233,24 +230,16 @@ fn main() {
233230

234231
#[test]
235232
fn test_for_borrowed_mut() {
236-
let before = r"
233+
check_assist_with_fixtures(
234+
r"
237235
use empty_iter::*;
238236
fn main() {
239237
let x = Empty;
240238
for $0v in &mut x {
241239
let a = v * 2;
242240
}
243241
}
244-
";
245-
let before = &format!(
246-
"//- /main.rs crate:main deps:core,empty_iter{}{}{}",
247-
before,
248-
FamousDefs::FIXTURE,
249-
EMPTY_ITER_FIXTURE
250-
);
251-
check_assist(
252-
convert_for_to_iter_for_each,
253-
before,
242+
",
254243
r"
255244
use empty_iter::*;
256245
fn main() {
@@ -288,30 +277,25 @@ fn main() {
288277

289278
#[test]
290279
fn test_already_impls_iterator() {
291-
let before = r#"
280+
check_assist_with_fixtures(
281+
r#"
292282
use empty_iter::*;
293283
fn main() {
294284
let x = Empty;
295285
for$0 a in x.iter().take(1) {
296286
println!("{}", a);
297287
}
298288
}
299-
"#;
300-
let after = r#"
289+
"#,
290+
r#"
301291
use empty_iter::*;
302292
fn main() {
303293
let x = Empty;
304294
x.iter().take(1).for_each(|a| {
305295
println!("{}", a);
306296
});
307297
}
308-
"#;
309-
let before = &format!(
310-
"//- /main.rs crate:main deps:core,empty_iter{}{}{}",
311-
before,
312-
FamousDefs::FIXTURE,
313-
EMPTY_ITER_FIXTURE
298+
"#,
314299
);
315-
check_assist(convert_for_to_iter_for_each, before, after);
316300
}
317301
}

0 commit comments

Comments
 (0)