typedef AST_Node AST_Node_List; function B32 ast_is_named(AST_Node *n){ B32 result = n && n->name.s.str; return result; } function AST_Node * ast_node_new(Parser *p, AST_Kind kind, Token *token, Intern_String name){ AST_Node *node = arena_push_struct(&p->main_arena, AST_Node); node->pos = token; node->name = name; node->kind = kind; return node; } function AST_Node * ast_note(Parser *p, Token *token, Intern_String name, Expr *expr){ AST_Node *node = ast_node_new(p, AK_Note, token, name); node->expr = expr; return node; } function AST_Node * ast_enum(Parser *p, Token *token, Intern_String name){ AST_Node *node = ast_node_new(p, AK_Enum, token, name); return node; } function AST_Node * ast_struct(Parser *p, Token *token, Intern_String name, AST_Kind kind){ AST_Node *node = ast_node_new(p, kind, token, name); return node; } function AST_Node * ast_variable(Parser *p, Token *token, Intern_String name, AST_Node *type, Expr *expr){ AST_Node *node = ast_node_new(p, AK_Variable, token, name); node->variable_type = type; node->expr = expr; return node; } function AST_Node * ast_typedef(Parser *p, Token *token, Intern_String name, AST_Node *type){ AST_Node *node = ast_node_new(p, AK_Typedef, token, name); node->typedef_type = type; return node; } function AST_Node * ast_function(Parser *p, Token *token, Intern_String name, AST_Node *return_type){ AST_Node *node = ast_node_new(p, AK_Function, token, name); node->func_return_type = return_type; return node; } function AST_Node * ast_enum_child(Parser *p, Token *token, Intern_String name, Expr *expr){ AST_Node *node = ast_node_new(p, AK_EnumChild, token, name); node->expr = expr; return node; } function void ast_copy_symbol(AST_Node *dst, AST_Node *src){ AST_Node *scope_next = dst->next_scope; *dst = *src; dst->next_scope = scope_next; } function AST_Node * ast_type_pointer(Parser *p, Token *token, AST_Node *pointer_to){ AST_Node *node = ast_node_new(p, AK_Pointer, token, intern_empty); node->pointer = pointer_to; return node; } function AST_Node * ast_type_array(Parser *p, Token *token, AST_Node *pointer_to, Expr *expr){ AST_Node *node = ast_node_new(p, AK_Array, token, intern_empty); node->pointer = pointer_to; node->expr = expr; return node; } function void ast_node_pass_note_list(AST_Node *node, AST_Node *notes){ node->first_note = notes->first_note; node->last_note = notes->last_note; } function void ast_node_push_note(AST_Node *node, AST_Node *child){ SLLQueuePush(node->first_note, node->last_note, child); } function void ast_node_push_child(AST_Node *node, AST_Node *child){ SLLQueuePush(node->first_child, node->last_child, child); }