added: explicit types to `do` blocks; fixed: `read_fill_buffer`
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 18 Apr 2023 01:27:24 +0000 (20:27 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 18 Apr 2023 01:27:24 +0000 (20:27 -0500)
compiler/src/clone.c
compiler/src/parser.c
compiler/src/symres.c
core/io/reader.onyx

index f6f0be809692ab483bcfa1e2694d187f7fc58941..4070c0b66bdb33418592f81304adc3176383c1a7 100644 (file)
@@ -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:
index 3230c510cb053fe5fee2161a5c543372408c52dc..e456b8a7e96b4b0c41ec37ed64dc1c21ca964841 100644 (file)
@@ -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;
index 492ff2d01f75bbc8809512b38e91e6c6a262777e..0920ec77ffadc79c31bd3deeb484fa9cee60a256 100644 (file)
@@ -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;
index f1f0bf1bae870c501399c258a748f7b589b72821..ffec5669ac7112c64960fd3bd1ddbd52b1966795 100644 (file)
@@ -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 {