diff options
| author | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-11 22:51:29 +0000 |
|---|---|---|
| committer | Zuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian> | 2026-01-11 22:51:29 +0000 |
| commit | 45feb20bf55c16ee415ef31a356ada67e1df18d6 (patch) | |
| tree | adfd5b4c5641dc5bdfac96f330553140ee90319b /src/codegen/codegen_utils.c | |
| parent | 36938b584ea2d096d97a124b70da51f685850ff7 (diff) | |
Some more, and some fixes
Diffstat (limited to 'src/codegen/codegen_utils.c')
| -rw-r--r-- | src/codegen/codegen_utils.c | 36 |
1 files changed, 24 insertions, 12 deletions
diff --git a/src/codegen/codegen_utils.c b/src/codegen/codegen_utils.c index 5dcbf19..8969276 100644 --- a/src/codegen/codegen_utils.c +++ b/src/codegen/codegen_utils.c @@ -194,26 +194,38 @@ char *infer_type(ParserContext *ctx, ASTNode *node) } } - // Check if it's a function pointer or built-in registered as a symbol. if (node->call.callee->type == NODE_EXPR_VAR) { Symbol *sym = find_symbol_entry(ctx, node->call.callee->var_ref.name); - if (sym && sym->type_info) + if (sym && sym->type_info && sym->type_info->kind == TYPE_FUNCTION && + sym->type_info->inner) { - // If it's a function pointer type, return return type. - if (sym->type_info->kind == TYPE_FUNCTION && sym->type_info->inner) - { - return type_to_string(sym->type_info->inner); - } - if (sym->type_info->kind == TYPE_POINTER && sym->type_info->inner && - sym->type_info->inner->kind == TYPE_FUNCTION && sym->type_info->inner->inner) + return type_to_string(sym->type_info->inner); + } + } + } + + if (node->type == NODE_TRY) + { + char *inner_type = infer_type(ctx, node->try_stmt.expr); + if (inner_type) + { + // Extract T from Result<T> or Option<T> + char *start = strchr(inner_type, '<'); + if (start) + { + start++; // Skip < + char *end = strrchr(inner_type, '>'); + if (end && end > start) { - return type_to_string(sym->type_info->inner->inner); + int len = end - start; + char *extracted = xmalloc(len + 1); + strncpy(extracted, start, len); + extracted[len] = 0; + return extracted; } } } - - return NULL; } if (node->type == NODE_EXPR_MEMBER) |
