fixed aliases resolving to self
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 11 Oct 2021 15:49:12 +0000 (10:49 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 11 Oct 2021 15:49:12 +0000 (10:49 -0500)
bin/onyx
core/container/map.onyx
core/container/set.onyx
include/astnodes.h
src/symres.c
src/utils.c

index 2570cf38dbeb573582a7234fa23989cf1de7dfc3..00f961ef230241c11fd10ec491ce05c6733918f4 100755 (executable)
Binary files a/bin/onyx and b/bin/onyx differ
index c97d44ad60e712f8b876b36bde0cb045e1c55d15..a1acf621acacb29b5d44efe62c16888df20747ee 100644 (file)
@@ -24,14 +24,14 @@ Map :: struct (K: type_expr, V: type_expr) {
         value : V;
     }
 
-    has     :: (package core.map).has
-    get     :: (package core.map).get
-    get_ptr :: (package core.map).get_ptr
-    put     :: (package core.map).put
-    delete  :: (package core.map).delete
-    update  :: (package core.map).update
-    clear   :: (package core.map).clear
-    empty   :: (package core.map).empty
+    has     :: has
+    get     :: get
+    get_ptr :: get_ptr
+    put     :: put
+    delete  :: delete
+    update  :: update
+    clear   :: clear
+    empty   :: empty
 }
 
 make :: ($Key: type_expr, $Value: type_expr, default := __zero_value(Value)) -> Map(Key, Value) {
index d4fb02bf79f9d1b2509af9719fde79f973713779..551e537c84db56ec2e33d44725637ef48925154d 100644 (file)
@@ -21,13 +21,13 @@ Set :: struct (T: type_expr) {
         value : T;
     }
 
-    has      :: (package core.set).has
-    get      :: (package core.set).get
-    insert   :: (package core.set).insert
-    remove   :: (package core.set).remove
-    clear    :: (package core.set).clear
-    empty    :: (package core.set).empty
-    iterator :: (package core.set).iterator
+    has      :: has
+    get      :: get
+    insert   :: insert
+    remove   :: remove
+    clear    :: clear
+    empty    :: empty
+    iterator :: iterator
 }
 
 make :: ($T: type_expr, default := __zero_value(T)) -> Set(T) {
index bea7e3d570aa2ad63ba7f027be63648330536057..c6da28568a26261bdac2e345e4d3cbfa79e925cf 100644 (file)
@@ -263,6 +263,8 @@ typedef enum AstFlags {
 
     // :TEMPORARY
     Ast_Flag_Params_Introduced     = BH_BIT(29),
+
+    Ast_Flag_Symbol_Invisible      = BH_BIT(30),
 } AstFlags;
 
 typedef enum UnaryOp {
index e1d1232de42ec4e7bd95e9043378e08f0b808858..40e0201ce1beeadb548ceec8f1f45e6fc9e6e242 100644 (file)
@@ -227,7 +227,9 @@ static SymresStatus symres_type(AstType** type) {
 
         case Ast_Kind_Alias: {
             AstAlias* alias = (AstAlias *) *type;
+            alias->flags |= Ast_Flag_Symbol_Invisible;
             SYMRES(type, (AstType **) &alias->alias);
+            alias->flags &= ~Ast_Flag_Symbol_Invisible;
             break;
         }
 
@@ -436,7 +438,12 @@ static SymresStatus symres_expression(AstTyped** expr) {
         case Ast_Kind_Method_Call:  SYMRES(method_call, (AstBinaryOp **) expr); break;
         case Ast_Kind_Size_Of:      SYMRES(size_of, (AstSizeOf *)*expr); break;
         case Ast_Kind_Align_Of:     SYMRES(align_of, (AstAlignOf *)*expr); break;
-        case Ast_Kind_Alias:        SYMRES(expression, &((AstAlias *) *expr)->alias); break;
+        case Ast_Kind_Alias: {
+            (*expr)->flags |= Ast_Flag_Symbol_Invisible;
+            SYMRES(expression, &((AstAlias *) *expr)->alias);
+            (*expr)->flags &= ~Ast_Flag_Symbol_Invisible;
+            break;
+        }
 
         case Ast_Kind_Range_Literal:
             SYMRES(expression, &((AstRangeLiteral *)(*expr))->low);
index eac3becaa5dc15bc7252cf10638631892a02b93c..52fbb2cff992898667a1fe5c5287ad81bc40d726 100644 (file)
@@ -132,18 +132,21 @@ void symbol_subpackage_introduce(Scope* scope, char* sym, AstPackage* package) {
 }
 
 AstNode* symbol_raw_resolve(Scope* start_scope, char* sym) {
-    AstNode* res = NULL;
     Scope* scope = start_scope;
 
-    while (res == NULL && scope != NULL) {
+    while (scope != NULL) {
         if (bh_table_has(AstNode *, scope->symbols, sym)) {
-            res = bh_table_get(AstNode *, scope->symbols, sym);
-        } else {
-            scope = scope->parent;
+            AstNode* res = bh_table_get(AstNode *, scope->symbols, sym);
+
+            if ((res->flags & Ast_Flag_Symbol_Invisible) == 0) {
+                return res;
+            }
         }
+
+        scope = scope->parent;
     }
 
-    return res;
+    return NULL;
 }
 
 AstNode* symbol_resolve(Scope* start_scope, OnyxToken* tkn) {