Unnamed repository; edit this file 'description' to name the repository.
Diffstat (limited to 'crates/ide/src/signature_help.rs')
-rw-r--r--crates/ide/src/signature_help.rs41
1 files changed, 36 insertions, 5 deletions
diff --git a/crates/ide/src/signature_help.rs b/crates/ide/src/signature_help.rs
index 05e605f6e4..96301ea0ce 100644
--- a/crates/ide/src/signature_help.rs
+++ b/crates/ide/src/signature_help.rs
@@ -201,7 +201,10 @@ fn signature_help_for_call(
variant.name(db).display(db)
);
}
- hir::CallableKind::Closure | hir::CallableKind::FnPtr | hir::CallableKind::Other => (),
+ hir::CallableKind::Closure(closure) => {
+ format_to!(res.signature, "impl {}", closure.fn_trait(db));
+ }
+ hir::CallableKind::FnPtr | hir::CallableKind::Other => (),
}
res.signature.push('(');
@@ -245,7 +248,7 @@ fn signature_help_for_call(
render(func.ret_type(db))
}
hir::CallableKind::Function(_)
- | hir::CallableKind::Closure
+ | hir::CallableKind::Closure(_)
| hir::CallableKind::FnPtr
| hir::CallableKind::Other => render(callable.return_type()),
hir::CallableKind::TupleStruct(_) | hir::CallableKind::TupleEnumVariant(_) => {}
@@ -1349,14 +1352,42 @@ fn test() { S.foo($0); }
struct S;
fn foo(s: S) -> i32 { 92 }
fn main() {
+ let _move = S;
+ (|s| {{_move}; foo(s)})($0)
+}
+ "#,
+ expect![[r#"
+ impl FnOnce(s: S) -> i32
+ ^^^^
+ "#]],
+ );
+ check(
+ r#"
+struct S;
+fn foo(s: S) -> i32 { 92 }
+fn main() {
(|s| foo(s))($0)
}
"#,
expect![[r#"
- (s: S) -> i32
- ^^^^
+ impl Fn(s: S) -> i32
+ ^^^^
"#]],
- )
+ );
+ check(
+ r#"
+struct S;
+fn foo(s: S) -> i32 { 92 }
+fn main() {
+ let mut mutate = 0;
+ (|s| { mutate = 1; foo(s) })($0)
+}
+ "#,
+ expect![[r#"
+ impl FnMut(s: S) -> i32
+ ^^^^
+ "#]],
+ );
}
#[test]