Added '#private' directive for package limited scope
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 3 Aug 2020 15:00:05 +0000 (10:00 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 3 Aug 2020 15:00:05 +0000 (10:00 -0500)
docs/plan
include/onyxastnodes.h
misc/onyx.sublime-syntax
onyx
progs/alloc_test.onyx
src/onyxparser.c
src/onyxsymres.c
src/onyxutils.c

index ebb99d2f67b052b5b9ce83ee4fc4c930dd701344..aadfdc3306c746216db9e4d36b0cb960c3cb7b29 100644 (file)
--- a/docs/plan
+++ b/docs/plan
@@ -134,7 +134,11 @@ HOW:
 
         [X] Deferred statements
 
-        [ ] Pointer math
+        [X] Pointer math
+            - Addition and subtraction
+
+        [X] #private
+            - symbol is scoped to package and not brought in from a 'use package' statement
 
         [ ] Better checking for casts
 
index ccfcb5924bf1f3414551314e4811fc0459509f8a..3ba79b67858d187af4d9bb443d4693e98d762e7b 100644 (file)
@@ -131,6 +131,7 @@ typedef enum AstFlags {
     Ast_Flag_Foreign          = BH_BIT(1),
     Ast_Flag_Const            = BH_BIT(2),
     Ast_Flag_Comptime         = BH_BIT(3),
+    Ast_Flag_Private_Package  = BH_BIT(4),
 
     // Function flags
     Ast_Flag_Inline           = BH_BIT(8),
@@ -437,6 +438,7 @@ struct Package {
 
     Scope *scope;
     Scope *include_scope;
+    Scope *private_scope;
 };
 
 // NOTE: Simple data structure for storing what comes out of the parser
index 5159d5800ce120631aa620bc2dee1172686624a1..67c95740a5031b7237b912f52995813669b22a43 100644 (file)
@@ -36,6 +36,9 @@ contexts:
     - match: '\b(-)?[0-9.]+\b'
       scope: constant.numeric.onyx
 
+    - match: '#[a-zA-Z]+'
+      scope: keyword.other.onyx
+
   double_quoted_string:
     - meta_scope: string.quoted.double.onyx
     - match: '\\.'
diff --git a/onyx b/onyx
index 913537647da248638c18e07a94171b53b945872a..6252d1f404eeeb277aef03aba8dc772605368250 100755 (executable)
Binary files a/onyx and b/onyx differ
index 9b2c7cd4a3ecfd0d25c34bc4803078375baea1de..ebb8b131f08db03058ddbdf7167e6b6dbf56196a 100644 (file)
@@ -13,7 +13,7 @@ deferred_example :: proc -> i32 {
 
     walker := cast(^i64) arr;
     for _: 0, 8 {
-        print(*(walker + 2));
+        print(*walker);
         walker += 1;
     }
 
@@ -21,7 +21,7 @@ deferred_example :: proc -> i32 {
 }
 
 proc #export "main" {
-    asdf :: "staring asdfkjasd asdflkjasdflkajsdflk";
+    asdf :: "staring asdfkjasd asdflkjasdflkajsdflya";
     heap_init();
 
     print(deferred_example());
index 7702fd91e5fdddb263f7f8dcb0c9af4b3e131dde..519f3aa6c706461898b98c6d295d1b914112248a 100644 (file)
@@ -1244,6 +1244,11 @@ static AstTyped* parse_top_level_expression(OnyxParser* parser) {
 // 'use' <string>
 // <symbol> :: <expr>
 static AstNode* parse_top_level_statement(OnyxParser* parser) {
+    b32 is_private = 0;
+    if (parse_possible_directive(parser, "private")) {
+        is_private = 1;
+    }
+
     switch (parser->curr->type) {
         case Token_Type_Keyword_Use: {
             OnyxToken* use_token = expect_token(parser, Token_Type_Keyword_Use);
@@ -1315,6 +1320,9 @@ static AstNode* parse_top_level_statement(OnyxParser* parser) {
 
                 AstTyped* node = parse_top_level_expression(parser);
 
+                if (is_private)
+                    node->flags |= Ast_Flag_Private_Package;
+
                 if (node->kind == Ast_Kind_Function) {
                     AstFunction* func = (AstFunction *) node;
 
@@ -1360,6 +1368,9 @@ static AstNode* parse_top_level_statement(OnyxParser* parser) {
                 memres->token = symbol;
                 memres->type_node = parse_type(parser);
 
+                if (is_private)
+                    memres->flags |= Ast_Flag_Private_Package;
+
                 add_node_to_process(parser, (AstNode *) memres);
 
                 AstBinding* binding = make_node(AstBinding, Ast_Kind_Binding);
@@ -1451,9 +1462,15 @@ ParseResults onyx_parse(OnyxParser *parser) {
                 switch (curr_stmt->kind) {
                     case Ast_Kind_Include_File: bh_arr_push(parser->results.files, (AstIncludeFile *) curr_stmt); break;
                     case Ast_Kind_Binding: {
-                        symbol_introduce(parser->package->scope,
-                            ((AstBinding *) curr_stmt)->token,
-                            ((AstBinding *) curr_stmt)->node);
+                        if (((AstBinding *) curr_stmt)->node->flags & Ast_Flag_Private_Package) {
+                            symbol_introduce(parser->package->private_scope,
+                                ((AstBinding *) curr_stmt)->token,
+                                ((AstBinding *) curr_stmt)->node);
+                        } else {
+                            symbol_introduce(parser->package->scope,
+                                ((AstBinding *) curr_stmt)->token,
+                                ((AstBinding *) curr_stmt)->node);
+                        }
                         break;
                     }
 
index 3015662bcde270c754a20a0912f7cfc8e03f1b78..275582a4cbbca3e70a5c5e8d43d2378c1f20537a 100644 (file)
@@ -436,6 +436,7 @@ static void symres_use_package(AstUsePackage* package) {
                     "not found in package");
                 return;
             }
+
             symbol_introduce(semstate.curr_package->scope, (*alias)->alias, thing);
         }
     }
@@ -521,7 +522,7 @@ void onyx_resolve_symbols() {
     }
 
     bh_arr_each(Entity, entity, semstate.program->entities) {
-        scope_enter(entity->package->scope);
+        scope_enter(entity->package->private_scope);
         semstate.curr_package = entity->package;
 
         switch (entity->type) {
index 4c434fde9737199fd65908391e92fc8824a56610..481e7eea6bdc416560b973a3bcce4530e89bcfd4 100644 (file)
@@ -99,6 +99,7 @@ Package* program_info_package_lookup_or_create(ProgramInfo* prog, char* package_
         package->name = pac_name;
         package->include_scope = scope_create(alloc, parent_scope);
         package->scope = scope_create(alloc, package->include_scope);
+        package->private_scope = scope_create(alloc, package->scope);
 
         bh_table_put(Package *, prog->packages, pac_name, package);