From: Brendan Hansen Date: Tue, 18 Apr 2023 01:27:24 +0000 (-0500) Subject: added: explicit types to `do` blocks; fixed: `read_fill_buffer` X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=d29c6e89b3ea08d77c03d1b4e7d4765c75d179e8;p=onyx.git added: explicit types to `do` blocks; fixed: `read_fill_buffer` --- diff --git a/compiler/src/clone.c b/compiler/src/clone.c index f6f0be80..4070c0b6 100644 --- a/compiler/src/clone.c +++ b/compiler/src/clone.c @@ -583,7 +583,7 @@ AstNode* ast_clone(bh_allocator a, void* n) { case Ast_Kind_Do_Block: C(AstDoBlock, block); - ((AstDoBlock *) nn)->type_node = (AstType *) &basic_type_auto_return; + C(AstDoBlock, type_node); break; case Ast_Kind_File_Contents: diff --git a/compiler/src/parser.c b/compiler/src/parser.c index 3230c510..e456b8a7 100644 --- a/compiler/src/parser.c +++ b/compiler/src/parser.c @@ -363,6 +363,16 @@ static AstCall* parse_function_call(OnyxParser *parser, AstTyped *callee) { parse_arguments(parser, ')', &call_node->args); + while (consume_token_if_next(parser, '!')) { + AstCodeBlock* code_block = make_node(AstCodeBlock, Ast_Kind_Code_Block); + code_block->token = parser->curr; + code_block->type_node = builtin_code_type; + + code_block->code = (AstNode *) parse_block(parser, 1, NULL); + ((AstBlock *) code_block->code)->rules = Block_Rule_Code_Block; + bh_arr_push(call_node->args.values, (AstTyped *) code_block); + } + // Wrap expressions in AstArgument bh_arr_each(AstTyped *, arg, call_node->args.values) { if ((*arg) == NULL) continue; @@ -583,6 +593,10 @@ static AstTyped* parse_factor(OnyxParser* parser) { do_block->token = do_token; do_block->type_node = (AstType *) &basic_type_auto_return; + if (consume_token_if_next(parser, Token_Type_Right_Arrow)) { + do_block->type_node = parse_type(parser); + } + if (parser->curr->type != '{') { onyx_report_error(parser->curr->pos, Error_Critical, "Expected '{' after 'do', got '%s'.", token_name(parser->curr->type)); retval = NULL; diff --git a/compiler/src/symres.c b/compiler/src/symres.c index 492ff2d0..0920ec77 100644 --- a/compiler/src/symres.c +++ b/compiler/src/symres.c @@ -633,6 +633,7 @@ static SymresStatus symres_expression(AstTyped** expr) { case Ast_Kind_Do_Block: { Scope* old_current_scope = current_scope; + SYMRES(type, &(*expr)->type_node); SYMRES(block, ((AstDoBlock *) *expr)->block); current_scope = old_current_scope; break; diff --git a/core/io/reader.onyx b/core/io/reader.onyx index f1f0bf1b..ffec5669 100644 --- a/core/io/reader.onyx +++ b/core/io/reader.onyx @@ -212,7 +212,12 @@ read_fill_buffer :: (use reader: &Reader, bytes: [] u8) -> Error { } last_byte = cast(i32) bytes[write_index - 1]; - return (.None) if !reader_empty(reader) else .EOF; + + if reader_empty(reader) && n > 0 { + return .EOF; + } + + return .None; } read_i32 :: (use reader: &Reader) -> i32 {