diff options
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/analysis.odin | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/server/analysis.odin b/src/server/analysis.odin index 999c7c1..d928f7c 100644 --- a/src/server/analysis.odin +++ b/src/server/analysis.odin @@ -336,23 +336,28 @@ resolve_generic_function_symbol :: proc(ast_context: ^AstContext, params: []^ast using ast; if params == nil { - return index.Symbol {}, false; + return {}, false; } if results == nil { - return index.Symbol {}, false; + return {}, false; } if ast_context.call == nil { - return index.Symbol {}, false; + return {}, false; } call_expr := ast_context.call; - poly_map := make(map[string]^Expr, 0, context.temp_allocator); - i := 0; + poly_map := make(map[string]^Expr, 0, context.temp_allocator); + i := 0; + count_required_params := 0; for param in params { + if param.default_value != nil { + count_required_params += 1; + } + for name in param.names { if len(call_expr.args) <= i { @@ -373,6 +378,10 @@ resolve_generic_function_symbol :: proc(ast_context: ^AstContext, params: []^ast } } + if count_required_params > len(call_expr.args) || count_required_params == 0 || len(call_expr.args) == 0 { + return {}, false; + } + function_name := ""; function_range: common.Range; @@ -402,16 +411,17 @@ resolve_generic_function_symbol :: proc(ast_context: ^AstContext, params: []^ast if ident, ok := result.type.derived.(Ident); ok { field := cast(^Field)index.clone_node(result, context.temp_allocator, nil); - - if m := &poly_map[ident.name]; m != nil { + if m, ok := poly_map[ident.name]; ok { field.type = poly_map[ident.name]; append(&return_types, field); - } else { - return index.Symbol {}, false; - } + } } } + if len(poly_map) != len(return_types) { + return {}, false; + } + symbol.value = index.SymbolProcedureValue { return_types = return_types[:], arg_types = params, |