summaryrefslogtreecommitdiff
path: root/src/codegen/codegen_utils.c
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-11 22:51:29 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-11 22:51:29 +0000
commit45feb20bf55c16ee415ef31a356ada67e1df18d6 (patch)
treeadfd5b4c5641dc5bdfac96f330553140ee90319b /src/codegen/codegen_utils.c
parent36938b584ea2d096d97a124b70da51f685850ff7 (diff)
Some more, and some fixes
Diffstat (limited to 'src/codegen/codegen_utils.c')
-rw-r--r--src/codegen/codegen_utils.c36
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)