| use hir::HirDisplay; |
| |
| use crate::{Diagnostic, DiagnosticCode, DiagnosticsContext}; |
| |
| // Diagnostic: expected-function |
| // |
| // This diagnostic is triggered if a call is made on something that is not callable. |
| pub(crate) fn expected_function( |
| ctx: &DiagnosticsContext<'_>, |
| d: &hir::ExpectedFunction, |
| ) -> Diagnostic { |
| Diagnostic::new_with_syntax_node_ptr( |
| ctx, |
| DiagnosticCode::RustcHardError("E0618"), |
| format!("expected function, found {}", d.found.display(ctx.sema.db, ctx.display_target)), |
| d.call.map(|it| it.into()), |
| ) |
| } |
| |
| #[cfg(test)] |
| mod tests { |
| use crate::tests::check_diagnostics; |
| |
| #[test] |
| fn smoke_test() { |
| check_diagnostics( |
| r#" |
| fn foo() { |
| let x = 3; |
| x(); |
| // ^^^ error: expected function, found i32 |
| ""(); |
| // ^^^^ error: expected function, found &'static str |
| foo(); |
| } |
| "#, |
| ); |
| } |
| |
| #[test] |
| fn no_error_for_async_fn_traits() { |
| check_diagnostics( |
| r#" |
| //- minicore: async_fn |
| async fn f(it: impl AsyncFn(u32) -> i32) { |
| let fut = it(0); |
| let _: i32 = fut.await; |
| } |
| async fn g(mut it: impl AsyncFnMut(u32) -> i32) { |
| let fut = it(0); |
| let _: i32 = fut.await; |
| } |
| async fn h(it: impl AsyncFnOnce(u32) -> i32) { |
| let fut = it(0); |
| let _: i32 = fut.await; |
| } |
| "#, |
| ); |
| } |
| } |