From 94244a7a1179ec827546c2af6676f6b7bcda563c Mon Sep 17 00:00:00 2001 From: Yunfei Date: Mon, 29 Jul 2024 15:55:21 +0800 Subject: [PATCH 1/5] feat(ide-completion): explictly show `async` keyword on `impl trait` --- .../ide-completion/src/completions/item_list/trait_impl.rs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/crates/ide-completion/src/completions/item_list/trait_impl.rs b/crates/ide-completion/src/completions/item_list/trait_impl.rs index f9dc62562f..4a1f985b30 100644 --- a/crates/ide-completion/src/completions/item_list/trait_impl.rs +++ b/crates/ide-completion/src/completions/item_list/trait_impl.rs @@ -180,8 +180,10 @@ fn add_function_impl( ) { let fn_name = func.name(ctx.db); + let is_async = func.is_async(ctx.db); let label = format_smolstr!( - "fn {}({})", + "{}fn {}({})", + if is_async { "async " } else { "" }, fn_name.display(ctx.db), if func.assoc_fn_params(ctx.db).is_empty() { "" } else { ".." } ); @@ -193,7 +195,7 @@ fn add_function_impl( }); let mut item = CompletionItem::new(completion_kind, replacement_range, label); - item.lookup_by(format!("fn {}", fn_name.display(ctx.db))) + item.lookup_by(format!("{}fn {}", if is_async { "async "} else { "" },fn_name.display(ctx.db))) .set_documentation(func.docs(ctx.db)) .set_relevance(CompletionRelevance { is_item_from_trait: true, ..Default::default() }); From 752c49b679afcec7edf5d26d52bf3d164ee7349f Mon Sep 17 00:00:00 2001 From: Yunfei Date: Mon, 29 Jul 2024 16:35:19 +0800 Subject: [PATCH 2/5] Fix error message --- .../src/handlers/trait_impl_missing_assoc_item.rs | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs index 58d1b7f31d..836059cb9b 100644 --- a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs +++ b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs @@ -13,6 +13,7 @@ pub(crate) fn trait_impl_missing_assoc_item( ) -> Diagnostic { let missing = d.missing.iter().format_with(", ", |(name, item), f| { f(&match *item { + hir::AssocItem::Function(func) if func.is_async(ctx.sema.db) => "`async fn ", hir::AssocItem::Function(_) => "`fn ", hir::AssocItem::Const(_) => "`const ", hir::AssocItem::TypeAlias(_) => "`type ", @@ -56,22 +57,25 @@ trait Trait { const C: (); type T; fn f(); + async fn async_f(); } impl Trait for () { const C: () = (); type T = (); fn f() {} + async fn async_f() {} } impl Trait for () { //^^^^^ error: not all trait items implemented, missing: `const C` type T = (); fn f() {} + async fn async_f() {} } impl Trait for () { - //^^^^^ error: not all trait items implemented, missing: `const C`, `type T`, `fn f` + //^^^^^ error: not all trait items implemented, missing: `const C`, `type T`, `fn f`, `async fn async_f` } "#, From f3a1b902fd71d8bd4c384d9752ffb73e13d760f2 Mon Sep 17 00:00:00 2001 From: Yunfei Date: Mon, 29 Jul 2024 16:51:49 +0800 Subject: [PATCH 3/5] Cargo fmt --- .../src/completions/item_list/trait_impl.rs | 10 +++++++--- .../src/handlers/trait_impl_missing_assoc_item.rs | 2 +- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/crates/ide-completion/src/completions/item_list/trait_impl.rs b/crates/ide-completion/src/completions/item_list/trait_impl.rs index 4a1f985b30..2fd7805e60 100644 --- a/crates/ide-completion/src/completions/item_list/trait_impl.rs +++ b/crates/ide-completion/src/completions/item_list/trait_impl.rs @@ -195,9 +195,13 @@ fn add_function_impl( }); let mut item = CompletionItem::new(completion_kind, replacement_range, label); - item.lookup_by(format!("{}fn {}", if is_async { "async "} else { "" },fn_name.display(ctx.db))) - .set_documentation(func.docs(ctx.db)) - .set_relevance(CompletionRelevance { is_item_from_trait: true, ..Default::default() }); + item.lookup_by(format!( + "{}fn {}", + if is_async { "async " } else { "" }, + fn_name.display(ctx.db) + )) + .set_documentation(func.docs(ctx.db)) + .set_relevance(CompletionRelevance { is_item_from_trait: true, ..Default::default() }); if let Some(source) = ctx.sema.source(func) { let assoc_item = ast::AssocItem::Fn(source.value); diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs index 836059cb9b..60d1452d86 100644 --- a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs +++ b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs @@ -13,7 +13,7 @@ pub(crate) fn trait_impl_missing_assoc_item( ) -> Diagnostic { let missing = d.missing.iter().format_with(", ", |(name, item), f| { f(&match *item { - hir::AssocItem::Function(func) if func.is_async(ctx.sema.db) => "`async fn ", + hir::AssocItem::Function(func) if func.is_async(ctx.sema.db) => "`async fn ", hir::AssocItem::Function(_) => "`fn ", hir::AssocItem::Const(_) => "`const ", hir::AssocItem::TypeAlias(_) => "`type ", From 59dc1c9b2cce9830308c06c1a618a99ddf781afa Mon Sep 17 00:00:00 2001 From: Yunfei Date: Mon, 29 Jul 2024 20:36:03 +0800 Subject: [PATCH 4/5] Revert "Fix error message" This reverts commit 752c49b679afcec7edf5d26d52bf3d164ee7349f. --- .../src/handlers/trait_impl_missing_assoc_item.rs | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs index 60d1452d86..58d1b7f31d 100644 --- a/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs +++ b/crates/ide-diagnostics/src/handlers/trait_impl_missing_assoc_item.rs @@ -13,7 +13,6 @@ pub(crate) fn trait_impl_missing_assoc_item( ) -> Diagnostic { let missing = d.missing.iter().format_with(", ", |(name, item), f| { f(&match *item { - hir::AssocItem::Function(func) if func.is_async(ctx.sema.db) => "`async fn ", hir::AssocItem::Function(_) => "`fn ", hir::AssocItem::Const(_) => "`const ", hir::AssocItem::TypeAlias(_) => "`type ", @@ -57,25 +56,22 @@ trait Trait { const C: (); type T; fn f(); - async fn async_f(); } impl Trait for () { const C: () = (); type T = (); fn f() {} - async fn async_f() {} } impl Trait for () { //^^^^^ error: not all trait items implemented, missing: `const C` type T = (); fn f() {} - async fn async_f() {} } impl Trait for () { - //^^^^^ error: not all trait items implemented, missing: `const C`, `type T`, `fn f`, `async fn async_f` + //^^^^^ error: not all trait items implemented, missing: `const C`, `type T`, `fn f` } "#, From 8a1b9cab6741b767f170601a9fa1dce7fe983804 Mon Sep 17 00:00:00 2001 From: Yunfei Date: Mon, 29 Jul 2024 20:40:51 +0800 Subject: [PATCH 5/5] Add test in `ide-completion/src/tests/item_list.rs` --- crates/ide-completion/src/tests/item_list.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/ide-completion/src/tests/item_list.rs b/crates/ide-completion/src/tests/item_list.rs index f138938b02..8aad7bfc3a 100644 --- a/crates/ide-completion/src/tests/item_list.rs +++ b/crates/ide-completion/src/tests/item_list.rs @@ -299,6 +299,7 @@ trait Test { const CONST1: (); fn function0(); fn function1(); + async fn function2(); } impl Test for () { @@ -310,8 +311,9 @@ impl Test for () { "#, expect![[r#" ct const CONST1: () = + fn async fn function2() fn fn function1() - ma makro!(…) macro_rules! makro + ma makro!(…) macro_rules! makro md module ta type Type1 = kw crate::