diff --git a/crates/ide-assists/src/handlers/add_explicit_type.rs b/crates/ide-assists/src/handlers/add_explicit_type.rs index 35a65cc30911..0dd01b67e8f4 100644 --- a/crates/ide-assists/src/handlers/add_explicit_type.rs +++ b/crates/ide-assists/src/handlers/add_explicit_type.rs @@ -1,3 +1,4 @@ +use either::Either; use hir::HirDisplay; use ide_db::syntax_helpers::node_ext::walk_ty; use syntax::ast::{self, AstNode, LetStmt, Param}; @@ -20,7 +21,8 @@ use crate::{AssistContext, AssistId, Assists}; // } // ``` pub(crate) fn add_explicit_type(acc: &mut Assists, ctx: &AssistContext<'_>) -> Option<()> { - let (ascribed_ty, expr, pat) = if let Some(let_stmt) = ctx.find_node_at_offset::() { + let syntax_node = ctx.find_node_at_offset::>()?; + let (ascribed_ty, expr, pat) = if let Either::Left(let_stmt) = syntax_node { let cursor_in_range = { let eq_range = let_stmt.eq_token()?.text_range(); ctx.offset() < eq_range.start() @@ -31,7 +33,7 @@ pub(crate) fn add_explicit_type(acc: &mut Assists, ctx: &AssistContext<'_>) -> O } (let_stmt.ty(), let_stmt.initializer(), let_stmt.pat()?) - } else if let Some(param) = ctx.find_node_at_offset::() { + } else if let Either::Right(param) = syntax_node { if param.syntax().ancestors().nth(2).and_then(ast::ClosureExpr::cast).is_none() { cov_mark::hit!(add_explicit_type_not_applicable_in_fn_param); return None; @@ -298,6 +300,20 @@ fn f() { let x: i32 = y; }; } +"#, + ); + + check_assist( + add_explicit_type, + r#" +fn f() { + let f: fn(i32) = |y$0| {}; +} +"#, + r#" +fn f() { + let f: fn(i32) = |y: i32| {}; +} "#, ); }