static AstFor* parse_for_stmt(OnyxParser* parser);
static AstSwitch* parse_switch_stmt(OnyxParser* parser);
static b32 parse_possible_symbol_declaration(OnyxParser* parser, AstNode** ret);
-static AstReturn* parse_return_statement(OnyxParser* parser);
+static AstReturn* parse_return_stmt(OnyxParser* parser);
+static AstNode* parse_use_stmt(OnyxParser* parser);
static AstBlock* parse_block(OnyxParser* parser);
static AstNode* parse_statement(OnyxParser* parser);
static AstType* parse_type(OnyxParser* parser);
}
// 'return' <expr>?
-static AstReturn* parse_return_statement(OnyxParser* parser) {
+static AstReturn* parse_return_stmt(OnyxParser* parser) {
AstReturn* return_node = make_node(AstReturn, Ast_Kind_Return);
return_node->token = expect_token(parser, Token_Type_Keyword_Return);
return return_node;
}
+static AstNode* parse_use_stmt(OnyxParser* parser) {
+ OnyxToken* use_token = expect_token(parser, Token_Type_Keyword_Use);
+
+ if (parser->curr->type == Token_Type_Keyword_Package) {
+ expect_token(parser, Token_Type_Keyword_Package);
+
+ AstUsePackage* upack = make_node(AstUsePackage, Ast_Kind_Use_Package);
+ upack->token = use_token;
+
+ AstNode* pack_symbol = make_node(AstNode, Ast_Kind_Symbol);
+ pack_symbol->token = expect_token(parser, Token_Type_Symbol);
+
+ // CLEANUP: This is just gross.
+ if (parser->curr->type == '.') {
+ consume_token(parser);
+ pack_symbol->token->length += 1;
+
+ while (1) {
+ if (parser->hit_unexpected_token) break;
+
+ OnyxToken* symbol = expect_token(parser, Token_Type_Symbol);
+ pack_symbol->token->length += symbol->length;
+
+ if (parser->curr->type == '.') {
+ pack_symbol->token->length += 1;
+ consume_token(parser);
+ } else {
+ break;
+ }
+ }
+ }
+
+ upack->package = (AstPackage *) pack_symbol;
+
+ if (parser->curr->type == Token_Type_Keyword_As) {
+ consume_token(parser);
+ upack->alias = expect_token(parser, Token_Type_Symbol);
+ }
+
+ if (parser->curr->type == '{') {
+ consume_token(parser);
+
+ bh_arr_new(global_heap_allocator, upack->only, 4);
+
+ while (parser->curr->type != '}') {
+ if (parser->hit_unexpected_token) return NULL;
+
+ AstAlias* alias = make_node(AstAlias, Ast_Kind_Alias);
+ alias->token = expect_token(parser, Token_Type_Symbol);
+
+ if (parser->curr->type == Token_Type_Keyword_As) {
+ consume_token(parser);
+ alias->alias = expect_token(parser, Token_Type_Symbol);
+ } else {
+ alias->alias = alias->token;
+ }
+
+ bh_arr_push(upack->only, alias);
+
+ if (parser->curr->type != '}')
+ expect_token(parser, ',');
+ }
+
+ consume_token(parser);
+ }
+
+ return (AstNode *) upack;
+
+ } else {
+ AstUse* use_node = make_node(AstUse, Ast_Kind_Use);
+ use_node->token = use_token;
+ use_node->expr = parse_expression(parser);
+ return (AstNode *) use_node;
+ }
+}
+
// <return> ;
// <block>
// <symbol_statement> ;
switch ((u16) parser->curr->type) {
case Token_Type_Keyword_Return:
- retval = (AstNode *) parse_return_statement(parser);
+ retval = (AstNode *) parse_return_stmt(parser);
break;
case '{':
}
case Token_Type_Keyword_Use: {
- AstUse* use_node = make_node(AstUse, Ast_Kind_Use);
- use_node->token = expect_token(parser, Token_Type_Keyword_Use);
- use_node->expr = parse_expression(parser);
+ // AstUse* use_node = make_node(AstUse, Ast_Kind_Use);
+ // use_node->token = expect_token(parser, Token_Type_Keyword_Use);
+ // use_node->expr = parse_expression(parser);
- retval = (AstNode *) use_node;
+ needs_semicolon = 0;
+ retval = (AstNode *) parse_use_stmt(parser);
break;
}
switch ((u16) parser->curr->type) {
case Token_Type_Keyword_Use: {
- OnyxToken* use_token = expect_token(parser, Token_Type_Keyword_Use);
-
- expect_token(parser, Token_Type_Keyword_Package);
-
- AstUsePackage* upack = make_node(AstUsePackage, Ast_Kind_Use_Package);
- upack->token = use_token;
-
- AstNode* pack_symbol = make_node(AstNode, Ast_Kind_Symbol);
- pack_symbol->token = expect_token(parser, Token_Type_Symbol);
-
- // CLEANUP: This is just gross.
- if (parser->curr->type == '.') {
- consume_token(parser);
- pack_symbol->token->length += 1;
-
- while (1) {
- if (parser->hit_unexpected_token) break;
-
- OnyxToken* symbol = expect_token(parser, Token_Type_Symbol);
- pack_symbol->token->length += symbol->length;
-
- if (parser->curr->type == '.') {
- pack_symbol->token->length += 1;
- consume_token(parser);
- } else {
- break;
- }
- }
- }
-
- upack->package = (AstPackage *) pack_symbol;
-
- if (parser->curr->type == Token_Type_Keyword_As) {
- consume_token(parser);
- upack->alias = expect_token(parser, Token_Type_Symbol);
- }
-
- if (parser->curr->type == '{') {
- consume_token(parser);
-
- bh_arr_new(global_heap_allocator, upack->only, 4);
-
- while (parser->curr->type != '}') {
- if (parser->hit_unexpected_token) return NULL;
-
- AstAlias* alias = make_node(AstAlias, Ast_Kind_Alias);
- alias->token = expect_token(parser, Token_Type_Symbol);
-
- if (parser->curr->type == Token_Type_Keyword_As) {
- consume_token(parser);
- alias->alias = expect_token(parser, Token_Type_Symbol);
- } else {
- alias->alias = alias->token;
- }
-
- bh_arr_push(upack->only, alias);
-
- if (parser->curr->type != '}')
- expect_token(parser, ',');
- }
-
- consume_token(parser);
- }
-
- add_node_to_process(parser, (AstNode *) upack);
+ AstNode* use_node = parse_use_stmt(parser);
+ add_node_to_process(parser, use_node);
return NULL;
}
// NOTE: Returns 1 if the statment should be removed
static b32 symres_statement(AstNode** stmt) {
switch ((*stmt)->kind) {
- case Ast_Kind_Local: symres_local((AstLocal **) stmt); return 1;
- case Ast_Kind_Return: symres_return((AstReturn *) *stmt); return 0;
- case Ast_Kind_If: symres_if((AstIfWhile *) *stmt); return 0;
- case Ast_Kind_While: symres_while((AstIfWhile *) *stmt); return 0;
- case Ast_Kind_For: symres_for((AstFor *) *stmt); return 0;
- case Ast_Kind_Switch: symres_switch((AstSwitch *) *stmt); return 0;
- case Ast_Kind_Call: symres_call((AstCall *) *stmt); return 0;
- case Ast_Kind_Argument: symres_expression((AstTyped **) &((AstArgument *) *stmt)->value); return 0;
- case Ast_Kind_Block: symres_block((AstBlock *) *stmt); return 0;
- case Ast_Kind_Defer: symres_statement(&((AstDefer *) *stmt)->stmt); return 0;
- case Ast_Kind_Use: symres_use((AstUse *) *stmt); return 1;
+ case Ast_Kind_Local: symres_local((AstLocal **) stmt); return 1;
+ case Ast_Kind_Return: symres_return((AstReturn *) *stmt); return 0;
+ case Ast_Kind_If: symres_if((AstIfWhile *) *stmt); return 0;
+ case Ast_Kind_While: symres_while((AstIfWhile *) *stmt); return 0;
+ case Ast_Kind_For: symres_for((AstFor *) *stmt); return 0;
+ case Ast_Kind_Switch: symres_switch((AstSwitch *) *stmt); return 0;
+ case Ast_Kind_Call: symres_call((AstCall *) *stmt); return 0;
+ case Ast_Kind_Argument: symres_expression((AstTyped **) &((AstArgument *) *stmt)->value); return 0;
+ case Ast_Kind_Block: symres_block((AstBlock *) *stmt); return 0;
+ case Ast_Kind_Defer: symres_statement(&((AstDefer *) *stmt)->stmt); return 0;
+ case Ast_Kind_Use: symres_use((AstUse *) *stmt); return 1;
+ case Ast_Kind_Use_Package: symres_use_package((AstUsePackage *) *stmt); return 1;
case Ast_Kind_Jump: return 0;
semstate.curr_package = ent->package;
}
+ EntityState next_state = Entity_State_Check_Types;
+
switch (ent->type) {
case Entity_Type_Foreign_Function_Header:
case Entity_Type_Function: symres_function(ent->function); break;
case Entity_Type_Global_Header: symres_global(ent->global); break;
case Entity_Type_Use_Package: symres_use_package(ent->use_package); break;
+ case Entity_Type_Use: symres_use(ent->use);
+ next_state = Entity_State_Finalized;
+ break;
+
case Entity_Type_Overloaded_Function: symres_overloaded_function(ent->overloaded_function); break;
case Entity_Type_Expression: symres_expression(&ent->expr); break;
case Entity_Type_Type_Alias: ent->type_alias = symres_type(ent->type_alias); break;
default: break;
}
- ent->state = Entity_State_Check_Types;
+ ent->state = next_state;
if (ent->package) scope_leave();
}