added: polymorphic structures to doc info
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Wed, 22 Mar 2023 11:31:51 +0000 (06:31 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Fri, 24 Mar 2023 01:51:04 +0000 (20:51 -0500)
compiler/src/doc.c
core/doc/doc.onyx

index e577f36287f6505b050c24fc4c0753f6048d8e90..c96ba761040742dc24fcf6832b7d1fffd6783571 100644 (file)
@@ -169,6 +169,10 @@ void onyx_docs_submit(OnyxDocInfo *docs, AstBinding *binding) {
     if (node->kind == Ast_Kind_Struct_Type) {
         bh_arr_push(docs->structures, binding);
     }
+
+    if (node->kind == Ast_Kind_Poly_Struct_Type) {
+        bh_arr_push(docs->structures, binding);
+    }
 }
 
 #define Doc_Magic_Bytes "ODOC"
@@ -488,23 +492,64 @@ static b32 write_doc_procedure(bh_buffer *buffer, AstBinding *binding, AstNode *
 }
 
 static b32 write_doc_structure(bh_buffer *buffer, AstBinding *binding, AstNode *node) {
-    AstStructType *struct_node = (void *) node;
+    if (node->kind == Ast_Kind_Struct_Type) {
+        AstStructType *struct_node = (void *) node;
 
-    write_entity_header(buffer, binding, node->token->pos);
+        write_entity_header(buffer, binding, node->token->pos);
 
-    Type *struct_type = struct_node->stcache;
-    assert(struct_type);
+        Type *struct_type = struct_node->stcache;
+        assert(struct_type);
 
-    bh_buffer_write_u32(buffer, bh_arr_length(struct_type->Struct.memarr));
-    bh_arr_each(StructMember*, pmem, struct_type->Struct.memarr) {
-        StructMember* mem = *pmem;
+        bh_buffer_write_u32(buffer, bh_arr_length(struct_type->Struct.memarr));
+        bh_arr_each(StructMember*, pmem, struct_type->Struct.memarr) {
+            StructMember* mem = *pmem;
 
-        write_cstring(buffer, mem->name);
-        write_cstring(buffer, type_get_name(mem->type));
-        write_cstring(buffer, "");
+            write_cstring(buffer, mem->name);
+            write_cstring(buffer, type_get_name(mem->type));
+            write_cstring(buffer, "");
 
+            bh_buffer_write_u32(buffer, 0);
+        }
+
+        // Polymorph parameters
         bh_buffer_write_u32(buffer, 0);
     }
+    else if (node->kind == Ast_Kind_Poly_Struct_Type) {
+        AstPolyStructType *poly_struct_node = (void *) node;
+        AstStructType *struct_node = poly_struct_node->base_struct;
+
+        write_entity_header(buffer, binding, node->token->pos);
+
+        bh_buffer type_buf;
+        bh_buffer_init(&type_buf, global_scratch_allocator, 256);
+
+        bh_buffer_write_u32(buffer, bh_arr_length(struct_node->members));
+        bh_arr_each(AstStructMember *, psmem, struct_node->members) {
+            AstStructMember *smem = *psmem;
+
+            bh_buffer_clear(&type_buf);
+            write_type_node(&type_buf, smem->type_node);
+
+            write_string(buffer, smem->token->length, smem->token->text);
+            write_string(buffer, type_buf.length, type_buf.data);
+            write_cstring(buffer, "");
+
+            bh_buffer_write_u32(buffer, smem->is_used ? 1 : 0);
+        }
+
+        // Polymorph parameters
+        bh_buffer_write_u32(buffer, bh_arr_length(poly_struct_node->poly_params));
+        bh_arr_each(AstPolyStructParam, param, poly_struct_node->poly_params) {
+            bh_buffer_clear(&type_buf);
+            write_type_node(&type_buf, param->type_node);
+
+            write_string(buffer, param->token->length, param->token->text);
+            write_string(buffer, type_buf.length, type_buf.data);
+            write_cstring(buffer, "");
+        }
+
+        bh_buffer_free(&type_buf);
+    }
 
     return 1;
 }
index c130476964c2f83a9932cd2c53074942193115ea..1a0112f4839c64c536aa1b5d1c9fca3bdfa0e0e8 100644 (file)
@@ -75,14 +75,14 @@ Doc_Procedure :: struct {
     }
     flags: Flags;
 
-    params: [] Doc_Procedure_Param;
+    params: [] Doc_Param;
     return_type: str;   // TODO: Make this not a string
 
     // Only used if this is an overloaded procedure
     overloads: [] Doc_Procedure;
 }
 
-Doc_Procedure_Param :: struct {
+Doc_Param :: struct {
     name: str;
     type: str;          // TODO: Make this not a string
     default_value: str;
@@ -92,6 +92,7 @@ Doc_Structure :: struct {
     use base: Doc_Entity;
 
     members: [] Doc_Structure_Member;
+    polymorph_arguments: [] Doc_Param;
 }
 
 Doc_Structure_Member :: struct {