summaryrefslogtreecommitdiff
path: root/src/parser/parser_utils.c
diff options
context:
space:
mode:
authorZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-14 14:25:11 +0000
committerZuhaitz Méndez Fernández de Aránguiz <zuhaitz@debian>2026-01-14 14:25:11 +0000
commita918df69269a39ef7350a645b5db025d66ecb18a (patch)
tree4ecb93f26e7e3ee2e256dd215c214b966df2d905 /src/parser/parser_utils.c
parentdf70f5bea676eb27e0ada10116d62f8c242c03a1 (diff)
Moving from to for improved error handling.
Diffstat (limited to 'src/parser/parser_utils.c')
-rw-r--r--src/parser/parser_utils.c23
1 files changed, 12 insertions, 11 deletions
diff --git a/src/parser/parser_utils.c b/src/parser/parser_utils.c
index ba506a0..7af8d62 100644
--- a/src/parser/parser_utils.c
+++ b/src/parser/parser_utils.c
@@ -1761,7 +1761,7 @@ ASTNode *copy_fields_replacing(ParserContext *ctx, ASTNode *fields, const char *
if (found)
{
- instantiate_generic(ctx, template_name, concrete_arg);
+ instantiate_generic(ctx, template_name, concrete_arg, fields->token);
}
}
free(type_copy);
@@ -1819,7 +1819,7 @@ void instantiate_methods(ParserContext *ctx, GenericImplTemplate *it,
if (strcmp(gt->name, template_name) == 0)
{
// Found matching template, instantiate it
- instantiate_generic(ctx, template_name, arg);
+ instantiate_generic(ctx, template_name, arg, meth->token);
break;
}
gt = gt->next;
@@ -1833,7 +1833,7 @@ void instantiate_methods(ParserContext *ctx, GenericImplTemplate *it,
add_instantiated_func(ctx, new_impl);
}
-void instantiate_generic(ParserContext *ctx, const char *tpl, const char *arg)
+void instantiate_generic(ParserContext *ctx, const char *tpl, const char *arg, Token token)
{
// Ignore generic placeholders
if (strlen(arg) == 1 && isupper(arg[0]))
@@ -1871,7 +1871,7 @@ void instantiate_generic(ParserContext *ctx, const char *tpl, const char *arg)
}
if (!t)
{
- zpanic("Unknown generic: %s", tpl);
+ zpanic_at(token, "Unknown generic: %s", tpl);
}
Instantiation *ni = xmalloc(sizeof(Instantiation));
@@ -1981,7 +1981,7 @@ char *parse_condition_raw(ParserContext *ctx, Lexer *l)
t = lexer_next(l);
if (t.type == TOK_EOF)
{
- zpanic("Unterminated condition");
+ zpanic_at(t, "Unterminated condition");
}
if (t.type == TOK_LPAREN)
{
@@ -2014,7 +2014,7 @@ char *parse_condition_raw(ParserContext *ctx, Lexer *l)
int len = (l->src + l->pos) - start;
if (len == 0)
{
- zpanic("Empty condition or missing body");
+ zpanic_at(lexer_peek(l), "Empty condition or missing body");
}
char *c = xmalloc(len + 1);
strncpy(c, start, len);
@@ -2340,9 +2340,10 @@ char *consume_and_rewrite(ParserContext *ctx, Lexer *l)
char *parse_and_convert_args(ParserContext *ctx, Lexer *l, char ***defaults_out, int *count_out,
Type ***types_out, char ***names_out, int *is_varargs_out)
{
- if (lexer_next(l).type != TOK_LPAREN)
+ Token t = lexer_next(l);
+ if (t.type != TOK_LPAREN)
{
- zpanic("Expected '(' in function args");
+ zpanic_at(t, "Expected '(' in function args");
}
char *buf = xmalloc(1024);
@@ -2421,13 +2422,13 @@ char *parse_and_convert_args(ParserContext *ctx, Lexer *l, char ***defaults_out,
{
if (t.type != TOK_IDENT)
{
- zpanic("Expected arg name");
+ zpanic_at(lexer_peek(l), "Expected arg name");
}
char *name = token_strdup(t);
names[count] = name; // Store name
if (lexer_next(l).type != TOK_COLON)
{
- zpanic("Expected ':'");
+ zpanic_at(lexer_peek(l), "Expected ':'");
}
Type *arg_type = parse_type_formal(ctx, l);
@@ -2500,7 +2501,7 @@ char *parse_and_convert_args(ParserContext *ctx, Lexer *l, char ***defaults_out,
}
if (lexer_next(l).type != TOK_RPAREN)
{
- zpanic("Expected ')' after args");
+ zpanic_at(lexer_peek(l), "Expected ')' after args");
}
*defaults_out = defaults;