#include "gravity_visitor.h"
#define VISIT(type) if (!self->visit_##type) return; \
self->visit_##type(self, (gnode_##type##_t *) node); \
break;
static void default_action (gnode_t *node) {
printf("Visitor unhandled case: %d\n", node->tag);
assert(0);
}
void gvisit(gvisitor_t *self, gnode_t *node) {
if (!node) return;
switch (node->tag) {
case NODE_LIST_STAT: VISIT(list_stmt);
case NODE_COMPOUND_STAT: VISIT(compound_stmt);
case NODE_LABEL_STAT: VISIT(label_stmt);
case NODE_FLOW_STAT: VISIT(flow_stmt);
case NODE_JUMP_STAT: VISIT(jump_stmt);
case NODE_LOOP_STAT: VISIT(loop_stmt);
case NODE_EMPTY_STAT: VISIT(empty_stmt);
case NODE_ENUM_DECL: VISIT(enum_decl);
case NODE_FUNCTION_DECL: VISIT(function_decl);
case NODE_VARIABLE_DECL: VISIT(variable_decl);
case NODE_CLASS_DECL: VISIT(class_decl);
case NODE_MODULE_DECL: VISIT(module_decl);
case NODE_BINARY_EXPR: VISIT(binary_expr);
case NODE_UNARY_EXPR: VISIT(unary_expr);
case NODE_FILE_EXPR: VISIT(file_expr);
case NODE_LIST_EXPR: VISIT(list_expr);
case NODE_LITERAL_EXPR: VISIT(literal_expr);
case NODE_IDENTIFIER_EXPR: VISIT(identifier_expr);
case NODE_KEYWORD_EXPR: VISIT(keyword_expr);
case NODE_POSTFIX_EXPR: VISIT(postfix_expr);
default: default_action(node);
}
}