changed: optional semicolons are behind a feature flag
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 6 Feb 2024 03:10:41 +0000 (21:10 -0600)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Tue, 6 Feb 2024 03:10:41 +0000 (21:10 -0600)
compiler/include/astnodes.h
compiler/src/lex.c
compiler/src/onyx.c
compiler/src/parser.c

index 1968cd2bca43b5e887a2f1d288c18e53a68d9dcb..f72f20d7d30041aaae44c2c334fd0f44cedd1c6e 100644 (file)
@@ -1843,6 +1843,8 @@ struct CompileOptions {
     b32 no_stale_code         : 1;
     b32 show_all_errors       : 1;
 
+    b32 enable_optional_semicolons : 1;
+
     b32 generate_tag_file         : 1;
     b32 generate_symbol_info_file : 1;
     b32 generate_lsp_info_file    : 1;
index e4c236636efb3e5d0a14903daebbaf9385181d03..0efad284352c17cdf7801a4c007726ac8a38e2da 100644 (file)
@@ -158,7 +158,7 @@ OnyxToken* onyx_get_token(OnyxTokenizer* tokenizer) {
 
         switch (*tokenizer->curr) {
             case '\n':
-                if (tokenizer->insert_semicolon) {
+                if (tokenizer->insert_semicolon && context.options->enable_optional_semicolons) {
                     OnyxToken semicolon_token;
                     semicolon_token.type = Token_Type_Inserted_Semicolon;
                     semicolon_token.text = "; ";
index 1808f859a1be749791b9656462de3308cb88cd93..f22ead8048d8ac28e9385637f646972a6a1bd998 100644 (file)
@@ -94,6 +94,7 @@ static const char *build_docstring = DOCSTRING_HEADER
     "\t                        Can drastically increase binary size.\n"
     "\t--generate-foreign-info Generate information for foreign blocks. Rarely needed, so disabled by default.\n"
     "\t--wasm-mvp              Use only WebAssembly MVP features.\n"
+    "\t--feature <feature>     Enable an experimental language feature.\n"
     "\n"
     "Developer options:\n"
     "\t--no-colors               Disables colors in the error message.\n"
@@ -123,6 +124,8 @@ static CompileOptions compile_opts_parse(bh_allocator alloc, int argc, char *arg
         .no_stale_code           = 0,
         .show_all_errors         = 0,
 
+        .enable_optional_semicolons = 0,
+
         .runtime = Runtime_Onyx,
 
         .files = NULL,
@@ -280,6 +283,12 @@ static CompileOptions compile_opts_parse(bh_allocator alloc, int argc, char *arg
             else if (!strcmp(argv[i], "--show-all-errors")) {
                 options.show_all_errors = 1;
             }
+            else if (!strcmp(argv[i], "--feature")) {
+                char *next_arg = argv[++i];
+                if (!strcmp(next_arg, "optional-semicolons")) {
+                    options.enable_optional_semicolons = 1;
+                }
+            }
             else if (!strcmp(argv[i], "-I")) {
                 bh_arr_push(options.included_folders, argv[++i]);
             }
index a60f522a65dee2573789a457a1700811cfb81907..bec7ef9e415082569616c2099fc99c79e5bc8219 100644 (file)
@@ -3068,6 +3068,16 @@ static b32 parse_possible_function_definition_no_consume(OnyxParser* parser) {
 
         // :LinearTokenDependent
         OnyxToken* token_after_paren = matching_paren + 1;
+
+        // Allow for:
+        //     foo :: ()
+        //         -> i32 {}
+        //
+        //     bar :: ()
+        //     { }
+        if (token_after_paren->type == Token_Type_Inserted_Semicolon)
+            token_after_paren += 1;
+
         if (token_after_paren->type != Token_Type_Right_Arrow
             && token_after_paren->type != '{'
             && token_after_paren->type != Token_Type_Keyword_Do