diff options
| author | Carson Fleming <cflems@cflems.net> | 2026-07-17 13:00:18 -0700 |
|---|---|---|
| committer | Carson Fleming <cflems@cflems.net> | 2026-07-17 13:00:18 -0700 |
| commit | cd1a01e2cf02ad556900219e561ebb64619fc6a5 (patch) | |
| tree | d76cc861b2305a9bb84d7095cb96c490e92df315 /parser.c | |
| parent | 424be65858999a894a18e1972fa9649fbc4c1df8 (diff) | |
| download | ccc-cd1a01e2cf02ad556900219e561ebb64619fc6a5.tar.gz | |
working fib with stubbed typechecker
Diffstat (limited to 'parser.c')
| -rw-r--r-- | parser.c | 21 |
1 files changed, 12 insertions, 9 deletions
@@ -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"); |
