added: `parent` field to Doc_Package
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Mon, 20 Mar 2023 17:42:51 +0000 (12:42 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 24 Mar 2023 01:50:10 +0000 (20:50 -0500)
compiler/include/astnodes.h
compiler/src/doc.c
compiler/src/parser.c
compiler/src/polymorph.h
compiler/src/utils.c
core/doc/doc.onyx

index 6fcdab57c2079c393e08c3f41a6cc02136da28f1..4569d8566d90d9a706c7bb801979dd5996fca157 100644 (file)
@@ -289,6 +289,8 @@ typedef enum AstFlags {
     Ast_Flag_Extra_Field_Access    = BH_BIT(23),
 
     Ast_Flag_Symbol_Is_PolyVar     = BH_BIT(24),
+
+    Ast_Flag_Binding_Isnt_Captured = BH_BIT(25),
 } AstFlags;
 
 typedef enum UnaryOp {
@@ -1575,6 +1577,7 @@ struct Package {
 
     // NOTE: id's of the sub-packages
     bh_arr(u32) sub_packages;
+    i32 parent_id;
 
     // NOTE: This tracks all of the 'use package' statements of this package throughout
     // the code base. This is used when a static if clears and new symbols are introduced.
index 2bdff0e8cc9d3184e2b00e2398d1883c72db0cf5..5ec29f8321dfcdfb4ba43c5d708afed53bf6329d 100644 (file)
@@ -144,6 +144,7 @@ void onyx_docs_emit_symbol_info(const char *dest) {
 
 void onyx_docs_submit(OnyxDocInfo *docs, AstBinding *binding) {
     if (!binding->entity || !binding->entity->package) return;
+    if (!(binding->flags & Ast_Flag_Binding_Isnt_Captured)) return;
 
     AstNode *node = binding->node;
     if (node->kind == Ast_Kind_Function) {
@@ -209,6 +210,11 @@ static void write_type_node(bh_buffer *buffer, void *vnode) {
             }
             return;
 
+        case Ast_Kind_Address_Of:
+            bh_buffer_write_string(buffer, "&");
+            write_type_node(buffer, ((AstAddressOf *) node)->expr);
+            return;
+
         case Ast_Kind_Pointer_Type:
             bh_buffer_write_string(buffer, "&");
             write_type_node(buffer, ((AstPointerType *) node)->elem);
@@ -422,7 +428,11 @@ static b32 write_doc_polymorphic_proc(bh_buffer *buffer, AstBinding *binding, As
     bh_arr_each(AstParam, param, func->params) {
         bh_buffer_clear(&param_type_buf);
 
-        write_string(buffer, param->local->token->length, param->local->token->text);
+        if (param->is_baked)
+            write_cstring(buffer, bh_bprintf("$%b", param->local->token->text, param->local->token->length));
+        else 
+            write_string(buffer, param->local->token->length, param->local->token->text);
+
         write_type_node(&param_type_buf, param->local->type_node);
         write_string(buffer, param_type_buf.length, param_type_buf.data);
         write_cstring(buffer, "");
@@ -505,6 +515,8 @@ void onyx_docs_emit_odoc(const char *dest) {
         write_cstring(&doc_buffer, p->unqualified_name);
         write_cstring(&doc_buffer, package_qualified_name);
 
+        bh_buffer_write_u32(&doc_buffer, p->parent_id);
+
         bh_buffer_write_u32(&doc_buffer, bh_arr_length(p->sub_packages));
         fori (j, 0, bh_arr_length(p->sub_packages)) {
             bh_buffer_write_u32(&doc_buffer, (u32) p->sub_packages[j] - 1);
index 422927ab317ab1e1243896c8e3f3b4ae2daea807..c10afe1d1f45f78dbcd23e9c8ed2e34c67a38cdb 100644 (file)
@@ -2809,6 +2809,7 @@ static b32 parse_possible_quick_function_definition(OnyxParser* parser, AstTyped
         new_token->pos = param->token->pos;
 
         AstNode* type_node = make_symbol(parser->allocator, new_token);
+        type_node->flags |= Ast_Flag_Symbol_Is_PolyVar;
         bh_arr_push(poly_params, type_node);
     }
 
@@ -3589,6 +3590,8 @@ submit_binding_to_entities:
         if (binding->flags & Ast_Flag_Private_File)
             target_scope = parser->file_scope;
 
+        binding->flags |= Ast_Flag_Binding_Isnt_Captured;
+
         ENTITY_SUBMIT_IN_SCOPE(binding, target_scope);
     }
 }
@@ -3653,6 +3656,7 @@ static Package* parse_file_package(OnyxParser* parser) {
 
         strncat(aggregate_name, (*symbol)->text, 2047);
         Package* newpackage = package_lookup_or_create(aggregate_name, context.global_scope, parser->allocator, package_node->token->pos);
+        newpackage->parent_id = prevpackage ? prevpackage->id : 0xffffffff;
 
         AstPackage* pnode = make_node(AstPackage, Ast_Kind_Package);
         pnode->token = *symbol;
index 7abab457b14588f68d33a4bd639e5ffc43f402c8..a432752c8061e85407c02e3020513cbf26d60692 100644 (file)
@@ -1017,6 +1017,7 @@ b32 potentially_convert_function_to_polyproc(AstFunction *func) {
             name_token->pos  = pcall->token->pos;
 
             pp.poly_sym = make_symbol(context.ast_alloc, name_token);
+            pp.poly_sym->flags |= Ast_Flag_Symbol_Is_PolyVar;
             bh_arr_push(pcall->params, pp.poly_sym);
             bh_arr_push(func->poly_params, pp);
             param_idx ++;
index c91aec6c422863c0b20946c9edcdbe71e3c8f670..a9f4163502cbf936f9cace6b5d303b60ca22f82d 100644 (file)
@@ -45,6 +45,7 @@ Package* package_lookup_or_create(char* package_name, Scope* parent_scope, bh_al
         package->unqualified_name = pac_name + bh_str_last_index_of(pac_name, '.');
         package->use_package_entities = NULL;
         package->id = next_package_id++;
+        package->parent_id = -1;
         bh_arr_new(global_heap_allocator, package->sub_packages, 4);
 
         if (!strcmp(pac_name, "builtin")) {
index 0e74024247caf41b824ec3d1be943d46a7dd7b97..21ff0419878dc9242bf334f185d07990ae05afda 100644 (file)
@@ -43,6 +43,7 @@ Doc_Package :: struct {
     name: str;             // i.e. 'io'
     qualified_name: str;   // i.e. 'core.io'
 
+    parent: Id;
     subpackages: [] Id;
 }