struct AstCodeBlock {
AstTyped_base;
- AstBlock *code;
+ AstNode *code;
};
struct AstDirectiveInsert {
CheckStatus check_memres_type(AstMemRes* memres);
CheckStatus check_memres(AstMemRes* memres);
CheckStatus check_type(AstType* type);
+CheckStatus check_insert_directive(AstDirectiveInsert** pinsert);
// HACK HACK HACK
expr->type = ((AstAlias *) expr)->alias->type;
break;
+ case Ast_Kind_Directive_Insert:
+ retval = check_insert_directive((AstDirectiveInsert **) pexpr);
+ break;
+
case Ast_Kind_Code_Block:
expr->flags |= Ast_Flag_Comptime;
fill_in_type(expr);
return Check_Success;
}
-CheckStatus check_insert_directive(AstDirectiveInsert* insert) {
+CheckStatus check_insert_directive(AstDirectiveInsert** pinsert) {
+ AstDirectiveInsert* insert = *pinsert;
if (insert->flags & Ast_Flag_Has_Been_Checked) return Check_Success;
CHECK(expression, &insert->code_expr);
assert(code_block->kind == Ast_Kind_Code_Block);
- AstBlock* cloned_block = (AstBlock *) ast_clone(context.ast_alloc, code_block->code);
+ AstNode* cloned_block = ast_clone(context.ast_alloc, code_block->code);
+
+ if (cloned_block->kind == Ast_Kind_Block) {
+ AstNode* next = insert->next;
+ insert->next = (AstNode *) ((AstBlock *) cloned_block)->body;
- AstNode* next = insert->next;
- insert->next = (AstNode *) cloned_block->body;
+ AstNode* last_stmt = insert->next;
+ while (last_stmt->next != NULL) last_stmt = last_stmt->next;
+ last_stmt->next = next;
- AstNode* last_stmt = insert->next;
- while (last_stmt->next != NULL) last_stmt = last_stmt->next;
- last_stmt->next = next;
+ } else {
+ *(AstNode **) pinsert = cloned_block;
+ }
insert->flags |= Ast_Flag_Has_Been_Checked;
case Ast_Kind_Block: return check_block((AstBlock *) stmt);
case Ast_Kind_Defer: return check_statement(&((AstDefer *) stmt)->stmt);
- case Ast_Kind_Directive_Insert: return check_insert_directive((AstDirectiveInsert *) stmt);
-
case Ast_Kind_Binary_Op:
CHECK(binaryop, (AstBinaryOp **) pstmt, 1);
(*pstmt)->flags |= Ast_Flag_Expr_Ignored;
}
else if (parse_possible_directive(parser, "code")) {
OnyxToken* code_token = parser->curr - 1;
- // expect_token(parser, '{');
AstCodeBlock* code_block = make_node(AstCodeBlock, Ast_Kind_Code_Block);
code_block->token = code_token;
assert(builtin_code_type != NULL);
code_block->type_node = builtin_code_type;
- code_block->code = parse_block(parser, 1);
+ if (parser->curr->type == '{') {
+ code_block->code = (AstNode *) parse_block(parser, 1);
+
+ } else {
+ code_block->code = (AstNode *) parse_expression(parser, 0);
+ }
retval = (AstTyped *) code_block;
break;
}
+ else if (parse_possible_directive(parser, "insert")) {
+ AstDirectiveInsert* insert = make_node(AstDirectiveInsert, Ast_Kind_Directive_Insert);
+ insert->token = parser->curr - 1;
+ insert->code_expr = parse_expression(parser, 0);
+
+ retval = (AstTyped *) insert;
+ break;
+ }
onyx_report_error(parser->curr->pos, "Invalid directive in expression.");
return NULL;
break;
}
- if (parse_possible_directive(parser, "insert")) {
- AstDirectiveInsert* insert = make_node(AstDirectiveInsert, Ast_Kind_Directive_Insert);
- insert->token = parser->curr - 1;
- insert->code_expr = parse_expression(parser, 0);
-
- retval = (AstNode *) insert;
+ if (next_tokens_are(parser, 2, '#', Token_Type_Symbol)) {
+ retval = (AstNode *) parse_factor(parser);
break;
}
}
static SymresStatus symres_use(AstUse* use);
static SymresStatus symres_directive_solidify(AstDirectiveSolidify** psolid);
static SymresStatus symres_directive_defined(AstDirectiveDefined** pdefined);
+static SymresStatus symres_directive_insert(AstDirectiveInsert* insert);
static SymresStatus symres_statement_chain(AstNode** walker);
static SymresStatus symres_statement(AstNode** stmt, b32 *remove);
static SymresStatus symres_block(AstBlock* block);
SYMRES(if_expression, (AstIfExpression *) *expr);
break;
+ case Ast_Kind_Directive_Insert:
+ SYMRES(directive_insert, (AstDirectiveInsert *) *expr);
+ break;
+
+
default: break;
}
case Ast_Kind_Defer: SYMRES(statement, &((AstDefer *) *stmt)->stmt, NULL); break;
case Ast_Kind_Jump: break;
- case Ast_Kind_Directive_Insert: SYMRES(directive_insert, (AstDirectiveInsert *) *stmt); break;
-
case Ast_Kind_Local:
// if (remove) *remove = 1;
SYMRES(local, (AstLocal **) stmt);