aboutsummaryrefslogtreecommitdiff
path: root/src/server/generics.odin
diff options
context:
space:
mode:
authorDanielGavin <danielgavin5@hotmail.com>2024-01-09 00:15:10 +0100
committerDanielGavin <danielgavin5@hotmail.com>2024-01-09 00:15:10 +0100
commitb2705f673df1c82dbbc4d97aa6aa3053222ca5c3 (patch)
treec8ccc4e4ebed7b63017376f4c187e601f050f65c /src/server/generics.odin
parent976ae722600931b47b16fd7e1d906f7aa71f5d3f (diff)
Add matrix_type to clone node
Diffstat (limited to 'src/server/generics.odin')
-rw-r--r--src/server/generics.odin28
1 files changed, 26 insertions, 2 deletions
diff --git a/src/server/generics.odin b/src/server/generics.odin
index b4393bb..5921de2 100644
--- a/src/server/generics.odin
+++ b/src/server/generics.odin
@@ -54,6 +54,10 @@ resolve_poly :: proc(
}
}
return true
+ } else if type != nil {
+ if ident, ok := unwrap_ident(type); ok {
+ poly_map[ident.name] = specialization
+ }
}
#partial switch p in specialization.derived {
@@ -281,6 +285,11 @@ find_and_replace_poly_type :: proc(
return v, ok
}
}
+ if poly, ok := node.derived.(^ast.Poly_Type); ok && poly.type != nil {
+ if v, ok := poly_map[poly.type.name]; ok {
+ return v, ok
+ }
+ }
return nil, false
}
@@ -296,6 +305,16 @@ find_and_replace_poly_type :: proc(
poly_map := cast(^map[string]^ast.Expr)visitor.data
#partial switch v in node.derived {
+ case ^ast.Matrix_Type:
+ if expr, ok := is_in_poly_map(v.elem, poly_map); ok {
+ v.elem = expr
+ }
+ if expr, ok := is_in_poly_map(v.column_count, poly_map); ok {
+ v.column_count = expr
+ }
+ if expr, ok := is_in_poly_map(v.row_count, poly_map); ok {
+ v.row_count = expr
+ }
case ^ast.Dynamic_Array_Type:
if expr, ok := is_in_poly_map(v.elem, poly_map); ok {
v.elem = expr
@@ -417,7 +436,7 @@ resolve_generic_function_symbol :: proc(
)
if symbol_expr == nil {
- continue
+ return {}, false
}
if resolve_poly(
@@ -428,7 +447,11 @@ resolve_generic_function_symbol :: proc(
&poly_map,
) {
if poly, ok := name.derived.(^ast.Poly_Type); ok {
- poly_map[poly.type.name] = call_expr.args[i]
+ poly_map[poly.type.name] = clone_expr(
+ call_expr.args[i],
+ ast_context.allocator,
+ nil,
+ )
}
}
}
@@ -438,6 +461,7 @@ resolve_generic_function_symbol :: proc(
}
for k, v in poly_map {
+ find_and_replace_poly_type(v, &poly_map)
//fmt.println(k, v.derived, "\n")
}