aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/generics.odin26
-rw-r--r--tests/hover_test.odin22
2 files changed, 48 insertions, 0 deletions
diff --git a/src/server/generics.odin b/src/server/generics.odin
index cec9926..984cb8e 100644
--- a/src/server/generics.odin
+++ b/src/server/generics.odin
@@ -207,6 +207,26 @@ resolve_poly :: proc(
return found
}
+ case ^ast.Ellipsis:
+ if call_array, ok := call_node.derived.(^ast.Array_Type); ok {
+ found := false
+
+ if array_is_soa(call_array^) {
+ return false
+ }
+
+ if poly_type, ok := p.expr.derived.(^ast.Poly_Type); ok {
+ if ident, ok := unwrap_ident(poly_type.type); ok {
+ save_poly_map(ident, call_array.elem, poly_map)
+ }
+
+ if poly_type.specialization != nil {
+ return resolve_poly(ast_context, call_array.elem, call_symbol, p.expr, poly_map)
+ }
+ found |= true
+ }
+ return found
+ }
case ^ast.Map_Type:
if call_map, ok := call_node.derived.(^ast.Map_Type); ok {
found := false
@@ -425,6 +445,12 @@ find_and_replace_poly_type :: proc(expr: ^ast.Expr, poly_map: ^map[string]^ast.E
}
}
}
+ case ^ast.Ellipsis:
+ if expr, ok := get_poly_map(v.expr, poly_map); ok {
+ v.expr = expr
+ v.pos.file = expr.pos.file
+ v.end.file = expr.end.file
+ }
}
return visitor
diff --git a/tests/hover_test.odin b/tests/hover_test.odin
index f1577c8..2d50c51 100644
--- a/tests/hover_test.odin
+++ b/tests/hover_test.odin
@@ -4760,6 +4760,28 @@ ast_hover_proc_group_variadic_args :: proc(t: ^testing.T) {
}
test.expect_hover(t, &source, "test.append: proc(array: ^$T/[dynamic]string, args: ..string)")
}
+
+@(test)
+ast_hover_proc_group_variadic_args_with_generic_type :: proc(t: ^testing.T) {
+ source := test.Source {
+ main = `package test
+ append_elems :: proc(array: ^$T/[dynamic]$E, args: ..E) {}
+ append_elem :: proc(array: ^$T/[dynamic]$E, arg: E) {}
+
+ append :: proc {
+ append_elem,
+ append_elems,
+ }
+
+ main :: proc() {
+ foos: [dynamic]string
+ bars: [dynamic]string
+ app{*}end(&bars, ..foos[:])
+ }
+ `,
+ }
+ test.expect_hover(t, &source, "test.append: proc(array: ^$T/[dynamic]$E, args: ..E)")
+}
/*
Waiting for odin fix