diff options
| author | Daniel Gavin <danielgavin5@hotmail.com> | 2021-05-08 14:12:16 +0200 |
|---|---|---|
| committer | Daniel Gavin <danielgavin5@hotmail.com> | 2021-05-08 14:12:16 +0200 |
| commit | 6443fc0a31f2949993d7cd7806391fd5d7ee97c3 (patch) | |
| tree | ec2a925c097dbb70d867560c7f30845fabeb2290 /src | |
| parent | b3548adc1efcb143767e63d370efed1a60f724c5 (diff) | |
more work on generics and overloading
Diffstat (limited to 'src')
| -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, |