summaryrefslogtreecommitdiff
path: root/parser.c
diff options
context:
space:
mode:
authorCarson Fleming <cflems@cflems.net>2026-07-17 13:00:18 -0700
committerCarson Fleming <cflems@cflems.net>2026-07-17 13:00:18 -0700
commitcd1a01e2cf02ad556900219e561ebb64619fc6a5 (patch)
treed76cc861b2305a9bb84d7095cb96c490e92df315 /parser.c
parent424be65858999a894a18e1972fa9649fbc4c1df8 (diff)
downloadccc-cd1a01e2cf02ad556900219e561ebb64619fc6a5.tar.gz
working fib with stubbed typechecker
Diffstat (limited to 'parser.c')
-rw-r--r--parser.c21
1 files changed, 12 insertions, 9 deletions
diff --git a/parser.c b/parser.c
index 56fbadd..a213ee4 100644
--- a/parser.c
+++ b/parser.c
@@ -113,9 +113,12 @@ static void parse_literal(struct expr_node* p_node) {
static void parse_var_ref(struct var_ref_node* p_node) {
expect(TK_IDENT);
- p_node->ident = tok.data.ident;
- if (!scope_get_var(scope, NULL, p_node->ident))
- PARSER_PANIC("use of undeclared identifier: '%s'", p_node->ident);
+ struct var_def* var_def;
+ if (!scope_get_var(scope, &var_def, tok.data.ident))
+ PARSER_PANIC("use of undeclared identifier: '%s'", tok.data.ident);
+
+ free(tok.data.ident);
+ p_node->def_ref = var_def;
}
static void parse_expr_assign(struct expr_node* p_node) {
@@ -135,6 +138,7 @@ static void parse_expr_assign(struct expr_node* p_node) {
expect(TK_ASSIGN);
parse_expr(p_node->inner.assign.rval);
+ p_node->resolved_type = p_node->inner.assign.rval->resolved_type;
}
static void parse_args_eval(struct args_eval_node** pp_arg) {
@@ -153,16 +157,13 @@ static void parse_args_eval(struct args_eval_node** pp_arg) {
static void parse_expr_call(struct expr_node* p_node) {
switch (p_node->type) {
case EXPR_VAR_REF:
- struct var_def* var_def;
- if (!scope_get_var(scope, &var_def, p_node->inner.var_ref.ident))
- PARSER_PANIC(
- "%s is not a known function", p_node->inner.var_ref.ident);
-
- /* TODO: I would like to include functions in the resolve type rather than checking storage */
+ struct var_def* var_def = p_node->inner.var_ref.def_ref;
+ /* TODO: I would like to include functions in the resolved_type rather than checking storage */
if (var_def->loc.type != STO_FN)
PARSER_PANIC("called object is not a function");
p_node->inner.call.called_fn_ref = var_def->loc.decl;
+ p_node->resolved_type = var_def->loc.decl->return_type.def_ref;
break;
default:
PARSER_PANIC("expression is not callable");
@@ -251,6 +252,8 @@ static void parse_expr(struct expr_node* p_node) {
case TK_IDENT:
p_node->type = EXPR_VAR_REF;
parse_var_ref(&p_node->inner.var_ref);
+ p_node->resolved_type =
+ p_node->inner.var_ref.def_ref->resolved_type;
break;
default:
PARSER_PANIC("expected expression");