From: Brendan Hansen Date: Wed, 22 Mar 2023 11:31:51 +0000 (-0500) Subject: added: polymorphic structures to doc info X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=dc1481a500f594309c3397d54df8b83d68f7c76c;p=onyx.git added: polymorphic structures to doc info --- diff --git a/compiler/src/doc.c b/compiler/src/doc.c index e577f362..c96ba761 100644 --- a/compiler/src/doc.c +++ b/compiler/src/doc.c @@ -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; } diff --git a/core/doc/doc.onyx b/core/doc/doc.onyx index c1304769..1a0112f4 100644 --- a/core/doc/doc.onyx +++ b/core/doc/doc.onyx @@ -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 {