diff options
| author | DanielGavin <danielgavin5@hotmail.com> | 2024-10-03 21:30:40 +0200 |
|---|---|---|
| committer | DanielGavin <danielgavin5@hotmail.com> | 2024-10-03 21:30:40 +0200 |
| commit | afe0c725e0bd3a0b79adddf3c997391a5088ab35 (patch) | |
| tree | 98e6573746639cbe4edbad3364bb58931457e0e0 /src/server | |
| parent | 4b8678b8f6b54e3c8dbbbd943228e6b9c919f330 (diff) | |
Fix issues with call expression inside another generic call expression.
Diffstat (limited to 'src/server')
| -rw-r--r-- | src/server/generics.odin | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/src/server/generics.odin b/src/server/generics.odin index 8c8a5a2..ffb3cb6 100644 --- a/src/server/generics.odin +++ b/src/server/generics.odin @@ -495,6 +495,25 @@ resolve_generic_function_symbol :: proc( return {}, false } + //If we have a function call, we should instead look at the return value: bar(foo(123)) + if symbol_value, ok := symbol.value.(SymbolProcedureValue); ok && len(symbol_value.return_types) > 0 { + if _, ok := call_expr.args[i].derived.(^ast.Call_Expr); ok { + if symbol_value.return_types[0].type != nil { + if symbol, ok = resolve_type_expression(ast_context, symbol_value.return_types[0].type); + ok { + symbol_expr = symbol_to_expr( + symbol, + call_expr.args[i].pos.file, + context.temp_allocator, + ) + if symbol_expr == nil { + return {}, false + } + } + } + } + } + symbol_expr = clone_expr(symbol_expr, ast_context.allocator, nil) param_type := clone_expr(param.type, ast_context.allocator, nil) |