diff --git a/crates/ide-assists/src/handlers/extract_function.rs b/crates/ide-assists/src/handlers/extract_function.rs index 36c1524f0e..9233c198df 100644 --- a/crates/ide-assists/src/handlers/extract_function.rs +++ b/crates/ide-assists/src/handlers/extract_function.rs @@ -699,6 +699,11 @@ impl FunctionBody { ast::Expr::PathExpr(path_expr) => { cb(path_expr.path().and_then(|it| it.as_single_name_ref())) } + ast::Expr::ClosureExpr(closure_expr) => { + if let Some(body) = closure_expr.body() { + body.syntax().descendants().map(ast::NameRef::cast).for_each(|it| cb(it)); + } + } ast::Expr::MacroExpr(expr) => { if let Some(tt) = expr.macro_call().and_then(|call| call.token_tree()) { tt.syntax() @@ -4842,6 +4847,31 @@ impl Struct { self.0 + 2 } } +"#, + ); + } + + #[test] + fn closure_arguments() { + check_assist( + extract_function, + r#" +fn parent(factor: i32) { + let v = &[1, 2, 3]; + + $0v.iter().map(|it| it * factor);$0 +} +"#, + r#" +fn parent(factor: i32) { + let v = &[1, 2, 3]; + + fun_name(v, factor); +} + +fn $0fun_name(v: &[i32; 3], factor: i32) { + v.iter().map(|it| it * factor); +} "#, ); }