about summary refs log tree commit diff
diff options
context:
space:
mode:
authorLukas Wirth <lukastw97@gmail.com>2025-03-16 13:43:11 +0000
committerGitHub <noreply@github.com>2025-03-16 13:43:11 +0000
commit98f346f46a5405cdd96e7fb497c8623588a69401 (patch)
tree69b040ffe655da41851895983db6c55ac65c2788
parent7b33761eeabe48483dc93372fad0dc75ca815623 (diff)
parentf98dec54d2e69575793e34e0e7b4519b53578dc1 (diff)
downloadrust-98f346f46a5405cdd96e7fb497c8623588a69401.tar.gz
rust-98f346f46a5405cdd96e7fb497c8623588a69401.zip
Merge pull request #19363 from euclio/varargs-detail
display varargs in completion detail
-rw-r--r--src/tools/rust-analyzer/crates/hir/src/lib.rs4
-rw-r--r--src/tools/rust-analyzer/crates/ide-completion/src/render.rs47
-rw-r--r--src/tools/rust-analyzer/crates/ide-completion/src/render/function.rs8
3 files changed, 58 insertions, 1 deletions
diff --git a/src/tools/rust-analyzer/crates/hir/src/lib.rs b/src/tools/rust-analyzer/crates/hir/src/lib.rs
index c3834b3c4d0..ed0743def6b 100644
--- a/src/tools/rust-analyzer/crates/hir/src/lib.rs
+++ b/src/tools/rust-analyzer/crates/hir/src/lib.rs
@@ -2363,6 +2363,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<ExternBlock> {
         match self.id.lookup(db.upcast()).container {
             ItemContainerId::ExternBlockId(id) => Some(ExternBlock { id }),
diff --git a/src/tools/rust-analyzer/crates/ide-completion/src/render.rs b/src/tools/rust-analyzer/crates/ide-completion/src/render.rs
index 54094a8f8e3..793a2fc027a 100644
--- a/src/tools/rust-analyzer/crates/ide-completion/src/render.rs
+++ b/src/tools/rust-analyzer/crates/ide-completion/src/render.rs
@@ -1277,6 +1277,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(
             r#"
diff --git a/src/tools/rust-analyzer/crates/ide-completion/src/render/function.rs b/src/tools/rust-analyzer/crates/ide-completion/src/render/function.rs
index dd0f24522fc..e013fe4cb7f 100644
--- a/src/tools/rust-analyzer/crates/ide-completion/src/render/function.rs
+++ b/src/tools/rust-analyzer/crates/ide-completion/src/render/function.rs
@@ -343,7 +343,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()
@@ -360,7 +360,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(