aboutsummaryrefslogtreecommitdiff
path: root/src/ast.c
diff options
context:
space:
mode:
authorBruce Hill <bruce@bruce-hill.com>2025-12-08 02:08:47 -0500
committerBruce Hill <bruce@bruce-hill.com>2025-12-08 02:09:52 -0500
commit5a194a3e0dc01d7ba0d9ad81030284ebda13cbd6 (patch)
tree61c7419612cafe56f25f37b1718c57f716980048 /src/ast.c
parent86228917b98a3ef4019e9e18fcafacc948ffcfd1 (diff)
Add checks for unused variables
Diffstat (limited to 'src/ast.c')
-rw-r--r--src/ast.c25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/ast.c b/src/ast.c
index b2730d21..e87ca005 100644
--- a/src/ast.c
+++ b/src/ast.c
@@ -443,19 +443,19 @@ CONSTFUNC ast_e binop_tag(ast_e tag) {
}
}
-static void ast_visit_list(ast_list_t *ast_list, void (*visitor)(ast_t *, void *), void *userdata) {
+static void ast_visit_list(ast_list_t *ast_list, visit_behavior_t (*visitor)(ast_t *, void *), void *userdata) {
for (ast_list_t *ast = ast_list; ast; ast = ast->next)
ast_visit(ast->ast, visitor, userdata);
}
-static void ast_visit_args(arg_ast_t *args, void (*visitor)(ast_t *, void *), void *userdata) {
+static void ast_visit_args(arg_ast_t *args, visit_behavior_t (*visitor)(ast_t *, void *), void *userdata) {
for (arg_ast_t *arg = args; arg; arg = arg->next)
ast_visit(arg->value, visitor, userdata);
}
-void ast_visit(ast_t *ast, void (*visitor)(ast_t *, void *), void *userdata) {
+void ast_visit(ast_t *ast, visit_behavior_t (*visitor)(ast_t *, void *), void *userdata) {
if (!ast) return;
- visitor(ast, userdata);
+ if (visitor(ast, userdata) == VISIT_STOP) return;
switch (ast->tag) {
case Unknown:
@@ -686,26 +686,25 @@ void ast_visit(ast_t *ast, void (*visitor)(ast_t *, void *), void *userdata) {
static void _recursive_type_ast_visit(type_ast_t *ast, void *userdata) {
if (ast == NULL) return;
- void (*visit)(type_ast_t *, void *) = ((Closure_t *)userdata)->fn;
+ visit_behavior_t (*visit)(type_ast_t *, void *) = ((Closure_t *)userdata)->fn;
void *visitor_userdata = ((Closure_t *)userdata)->userdata;
+ if (visit(ast, visitor_userdata) == VISIT_STOP) return;
+
switch (ast->tag) {
case UnknownTypeAST:
- case VarTypeAST: visit(ast, visitor_userdata); break;
+ case VarTypeAST: break;
case PointerTypeAST: {
_recursive_type_ast_visit(Match(ast, PointerTypeAST)->pointed, userdata);
- visit(ast, visitor_userdata);
break;
}
case ListTypeAST: {
_recursive_type_ast_visit(Match(ast, ListTypeAST)->item, userdata);
- visit(ast, visitor_userdata);
break;
}
case TableTypeAST: {
DeclareMatch(table, ast, TableTypeAST);
_recursive_type_ast_visit(table->key, userdata);
_recursive_type_ast_visit(table->value, userdata);
- visit(ast, visitor_userdata);
break;
}
case FunctionTypeAST: {
@@ -713,12 +712,10 @@ static void _recursive_type_ast_visit(type_ast_t *ast, void *userdata) {
for (arg_ast_t *arg = fn->args; arg; arg = arg->next)
_recursive_type_ast_visit(arg->type, userdata);
_recursive_type_ast_visit(fn->ret, userdata);
- visit(ast, visitor_userdata);
break;
}
case OptionalTypeAST: {
_recursive_type_ast_visit(Match(ast, OptionalTypeAST)->type, userdata);
- visit(ast, visitor_userdata);
break;
}
case EnumTypeAST: {
@@ -727,14 +724,13 @@ static void _recursive_type_ast_visit(type_ast_t *ast, void *userdata) {
_recursive_type_ast_visit(field->type, userdata);
}
}
- visit(ast, visitor_userdata);
break;
}
default: errx(1, "Invalid type AST");
}
}
-static void _type_ast_visit(ast_t *ast, void *userdata) {
+static visit_behavior_t _type_ast_visit(ast_t *ast, void *userdata) {
switch (ast->tag) {
case Declare: {
_recursive_type_ast_visit(Match(ast, Declare)->type, userdata);
@@ -777,9 +773,10 @@ static void _type_ast_visit(ast_t *ast, void *userdata) {
}
default: break;
}
+ return VISIT_PROCEED;
}
-void type_ast_visit(ast_t *ast, void (*visitor)(type_ast_t *, void *), void *userdata) {
+void type_ast_visit(ast_t *ast, visit_behavior_t (*visitor)(type_ast_t *, void *), void *userdata) {
Closure_t fn = {.fn = visitor, .userdata = userdata};
ast_visit(ast, _type_ast_visit, &fn);
}