b32 symbol_raw_introduce(Scope* scope, char* tkn, OnyxFilePos pos, AstNode* symbol);
void symbol_builtin_introduce(Scope* scope, char* sym, AstNode *node);
void symbol_subpackage_introduce(Package *parent, char* sym, AstPackage *node);
+AstNode* symbol_raw_resolve_no_ascend(Scope* scope, char* sym);
AstNode* symbol_raw_resolve(Scope* start_scope, char* sym);
AstNode* symbol_resolve(Scope* start_scope, OnyxToken* tkn);
AstNode* try_symbol_raw_resolve_from_node(AstNode* node, char* symbol);
}
}
+AstNode* symbol_raw_resolve_no_ascend(Scope* scope, char* sym) {
+ if (!scope || !scope->symbols) return NULL;
+
+ i32 index = shgeti(scope->symbols, sym);
+ if (index != -1) {
+ AstNode* res = scope->symbols[index].value;
+
+ if ((res->flags & Ast_Flag_Symbol_Invisible) == 0) {
+ return res;
+ }
+ }
+
+ return NULL;
+}
+
AstNode* symbol_raw_resolve(Scope* start_scope, char* sym) {
Scope* scope = start_scope;
+ AstNode *res = NULL;
while (scope != NULL) {
- i32 index = shgeti(scope->symbols, sym);
- if (index != -1) {
- AstNode* res = scope->symbols[index].value;
-
- if ((res->flags & Ast_Flag_Symbol_Invisible) == 0) {
- return res;
- }
+ res = symbol_raw_resolve_no_ascend(scope, sym);
+ if (res) {
+ return res;
}
scope = scope->parent;
return NULL;
}
- return symbol_raw_resolve(package->package->scope, symbol);
+ return symbol_raw_resolve_no_ascend(package->package->scope, symbol);
}
case Ast_Kind_Foreign_Block: {
if (bt->scope == NULL)
return NULL;
- return symbol_raw_resolve(bt->scope, symbol);
+ return symbol_raw_resolve_no_ascend(bt->scope, symbol);
}
case Ast_Kind_Enum_Type: {
AstEnumType* etype = (AstEnumType *) node;
- return symbol_raw_resolve(etype->scope, symbol);
+ return symbol_raw_resolve_no_ascend(etype->scope, symbol);
}
case Ast_Kind_Struct_Type: {
case Ast_Kind_Poly_Struct_Type: {
AstPolyStructType* stype = ((AstPolyStructType *) node);
- return symbol_raw_resolve(stype->scope, symbol);
+ return symbol_raw_resolve_no_ascend(stype->scope, symbol);
}
case Ast_Kind_Poly_Union_Type: {
AstPolyUnionType* utype = ((AstPolyUnionType *) node);
- return symbol_raw_resolve(utype->scope, symbol);
+ return symbol_raw_resolve_no_ascend(utype->scope, symbol);
}
case Ast_Kind_Poly_Call_Type: {
case Ast_Kind_Distinct_Type: {
AstDistinctType* dtype = (AstDistinctType *) node;
- return symbol_raw_resolve(dtype->scope, symbol);
+ return symbol_raw_resolve_no_ascend(dtype->scope, symbol);
}
case Ast_Kind_Interface: {
AstInterface* inter = (AstInterface *) node;
- return symbol_raw_resolve(inter->scope, symbol);
+ return symbol_raw_resolve_no_ascend(inter->scope, symbol);
}
default: break;