From e9403853c0c37c26924f25e50234e34a9f46897b Mon Sep 17 00:00:00 2001 From: Andy Russell Date: Sat, 15 Mar 2025 10:33:31 -0400 Subject: [PATCH] display varargs in completion detail --- crates/hir/src/lib.rs | 4 ++ crates/ide-completion/src/render.rs | 47 ++++++++++++++++++++ crates/ide-completion/src/render/function.rs | 8 +++- 3 files changed, 58 insertions(+), 1 deletion(-) diff --git a/crates/hir/src/lib.rs b/crates/hir/src/lib.rs index 9f91f155ea..f4b5061861 100644 --- a/crates/hir/src/lib.rs +++ b/crates/hir/src/lib.rs @@ -2374,6 +2374,10 @@ impl Function { db.function_data(self.id).is_async() } + pub fn is_varargs(self, db: &dyn HirDatabase) -> bool { + db.function_data(self.id).is_varargs() + } + pub fn extern_block(self, db: &dyn HirDatabase) -> Option { match self.id.lookup(db.upcast()).container { ItemContainerId::ExternBlockId(id) => Some(ExternBlock { id }), diff --git a/crates/ide-completion/src/render.rs b/crates/ide-completion/src/render.rs index 0f0fa115af..05fd26c4e8 100644 --- a/crates/ide-completion/src/render.rs +++ b/crates/ide-completion/src/render.rs @@ -1276,6 +1276,53 @@ fn main() { fo$0 } ); } + #[test] + fn fn_detail_includes_variadics() { + check( + r#" +unsafe extern "C" fn foo(a: u32, b: u32, ...) {} + +fn main() { fo$0 } +"#, + SymbolKind::Function, + expect![[r#" + [ + CompletionItem { + label: "foo(…)", + detail_left: None, + detail_right: Some( + "unsafe fn(u32, u32, ...)", + ), + source_range: 62..64, + delete: 62..64, + insert: "foo(${1:a}, ${2:b});$0", + kind: SymbolKind( + Function, + ), + lookup: "foo", + detail: "unsafe fn(u32, u32, ...)", + trigger_call_info: true, + }, + CompletionItem { + label: "main()", + detail_left: None, + detail_right: Some( + "fn()", + ), + source_range: 62..64, + delete: 62..64, + insert: "main();$0", + kind: SymbolKind( + Function, + ), + lookup: "main", + detail: "fn()", + }, + ] + "#]], + ); + } + #[test] fn enum_detail_just_name_for_unit() { check( diff --git a/crates/ide-completion/src/render/function.rs b/crates/ide-completion/src/render/function.rs index 4693bdc047..85df817ddb 100644 --- a/crates/ide-completion/src/render/function.rs +++ b/crates/ide-completion/src/render/function.rs @@ -347,7 +347,7 @@ fn detail_full(ctx: &CompletionContext<'_>, func: hir::Function) -> String { } fn params_display(ctx: &CompletionContext<'_>, func: hir::Function) -> String { - if let Some(self_param) = func.self_param(ctx.db) { + let mut params = if let Some(self_param) = func.self_param(ctx.db) { let assoc_fn_params = func.assoc_fn_params(ctx.db); let params = assoc_fn_params .iter() @@ -364,7 +364,13 @@ fn params_display(ctx: &CompletionContext<'_>, func: hir::Function) -> String { } else { let assoc_fn_params = func.assoc_fn_params(ctx.db); assoc_fn_params.iter().map(|p| p.ty().display(ctx.db, ctx.display_target)).join(", ") + }; + + if func.is_varargs(ctx.db) { + params.push_str(", ..."); } + + params } fn params(