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),
Scope *scope;
Scope *include_scope;
+ Scope *private_scope;
};
// NOTE: Simple data structure for storing what comes out of the 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);
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;
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);
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;
}
"not found in package");
return;
}
+
symbol_introduce(semstate.curr_package->scope, (*alias)->alias, thing);
}
}
}
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) {
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);