From: Brendan Hansen Date: Sat, 8 Apr 2023 21:24:08 +0000 (-0500) Subject: added: distinct type doc output X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=0b97df6deb85e06e5267b23b9e5fa48d6be0e6a6;p=onyx.git added: distinct type doc output --- diff --git a/compiler/include/astnodes.h b/compiler/include/astnodes.h index db91ff4e..37a2ee3c 100644 --- a/compiler/include/astnodes.h +++ b/compiler/include/astnodes.h @@ -1658,6 +1658,7 @@ typedef struct OnyxDocInfo { bh_arr(AstBinding *) procedures; bh_arr(AstBinding *) structures; bh_arr(AstBinding *) enumerations; + bh_arr(AstBinding *) distinct_types; Table(u32) file_ids; u32 next_file_id; diff --git a/compiler/src/doc.c b/compiler/src/doc.c index ec5066db..23115947 100644 --- a/compiler/src/doc.c +++ b/compiler/src/doc.c @@ -200,6 +200,10 @@ void onyx_docs_submit(OnyxDocInfo *docs, AstBinding *binding) { if (node->kind == Ast_Kind_Enum_Type) { bh_arr_push(docs->enumerations, binding); } + + if (node->kind == Ast_Kind_Distinct_Type) { + bh_arr_push(docs->distinct_types, binding); + } } #define Doc_Magic_Bytes "ODOC" @@ -397,6 +401,8 @@ static void write_entity_header(bh_buffer *buffer, AstBinding *binding, OnyxFile write_doc_notes(buffer, binding); } +static b32 write_doc_procedure(bh_buffer *buffer, AstBinding *binding, AstNode *proc); + static void write_doc_constraints(bh_buffer *buffer, ConstraintContext *constraints, bh_arr(AstPolyParam) poly_params) { bh_buffer tmp_buffer; bh_buffer_init(&tmp_buffer, global_scratch_allocator, 256); @@ -451,7 +457,40 @@ static void write_doc_constraints(bh_buffer *buffer, ConstraintContext *constrai bh_buffer_free(&tmp_buffer); } -static b32 write_doc_procedure(bh_buffer *buffer, AstBinding *binding, AstNode *proc); +static void write_doc_methods(bh_buffer *buffer, Scope *method_scope) { + u32 count_patch = buffer->length; + bh_buffer_write_u32(buffer, 0); + + if (method_scope == NULL) { + return; + } + + u32 method_count = 0; + fori (i, 0, shlen(method_scope->symbols)) { + AstFunction* node = (AstFunction *) strip_aliases(method_scope->symbols[i].value); + if (node->kind != Ast_Kind_Function + && node->kind != Ast_Kind_Polymorphic_Proc + && node->kind != Ast_Kind_Overloaded_Function + && node->kind != Ast_Kind_Macro) + continue; + + assert(node->entity); + assert(node->entity->function == node); + + AstBinding *binding = NULL; + switch (node->kind) { + case Ast_Kind_Polymorphic_Proc: + case Ast_Kind_Function: binding = node->original_binding_to_node; break; + case Ast_Kind_Macro: binding = ((AstMacro *) node)->original_binding_to_node; break; + case Ast_Kind_Overloaded_Function: binding = ((AstOverloadedFunction *) node)->original_binding_to_node; break; + } + + method_count++; + write_doc_procedure(buffer, binding, (AstNode *) node); + } + + *((u32 *) bh_pointer_add(buffer->data, count_patch)) = method_count; +} static b32 write_doc_function(bh_buffer *buffer, AstBinding *binding, AstNode *proc) { AstFunction *func = (void *) proc; @@ -659,34 +698,7 @@ static b32 write_doc_structure(bh_buffer *buffer, AstBinding *binding, AstNode * bh_buffer_free(&type_buf); } - u32 count_patch = buffer->length; - bh_buffer_write_u32(buffer, 0); - - u32 method_count = 0; - fori (i, 0, shlen(method_scope->symbols)) { - AstFunction* node = (AstFunction *) strip_aliases(method_scope->symbols[i].value); - if (node->kind != Ast_Kind_Function - && node->kind != Ast_Kind_Polymorphic_Proc - && node->kind != Ast_Kind_Overloaded_Function - && node->kind != Ast_Kind_Macro) - continue; - - assert(node->entity); - assert(node->entity->function == node); - - AstBinding *binding = NULL; - switch (node->kind) { - case Ast_Kind_Polymorphic_Proc: - case Ast_Kind_Function: binding = node->original_binding_to_node; break; - case Ast_Kind_Macro: binding = ((AstMacro *) node)->original_binding_to_node; break; - case Ast_Kind_Overloaded_Function: binding = ((AstOverloadedFunction *) node)->original_binding_to_node; break; - } - - method_count++; - write_doc_procedure(buffer, binding, (AstNode *) node); - } - - *((u32 *) bh_pointer_add(buffer->data, count_patch)) = method_count; + write_doc_methods(buffer, method_scope); return 1; } @@ -712,6 +724,22 @@ static b32 write_doc_enum(bh_buffer *buffer, AstBinding *binding, AstNode *node) return 1; } +static b32 write_doc_distinct_type(bh_buffer *buffer, AstBinding *binding, AstNode *node) { + AstDistinctType *distinct_node = (void *) node; + + write_entity_header(buffer, binding, node->token->pos); + + bh_buffer type_buf; + bh_buffer_init(&type_buf, global_scratch_allocator, 256); + write_type_node(&type_buf, distinct_node->base_type); + write_string(buffer, type_buf.length, type_buf.data); + bh_buffer_free(&type_buf); + + write_doc_methods(buffer, distinct_node->scope); + + return 1; +} + static void write_doc_entity_array(bh_buffer *buffer, bh_arr(AstBinding *) arr, b32 (*write_doc)(bh_buffer *buffer, AstBinding *, AstNode*), u32 offset_write_location) { @@ -755,6 +783,7 @@ void onyx_docs_emit_odoc(const char *dest) { bh_buffer_write_u32(&doc_buffer, 0); bh_buffer_write_u32(&doc_buffer, 0); bh_buffer_write_u32(&doc_buffer, 0); + bh_buffer_write_u32(&doc_buffer, 0); // // Package Info @@ -800,10 +829,16 @@ void onyx_docs_emit_odoc(const char *dest) { write_doc_entity_array(&doc_buffer, context.doc_info->enumerations, write_doc_enum, offset_table_index + 12); + // + // Distinct Types Info + // + write_doc_entity_array(&doc_buffer, context.doc_info->distinct_types, write_doc_distinct_type, offset_table_index + 16); + + // // File Info // - *((u32 *) bh_pointer_add(doc_buffer.data, offset_table_index + 16)) = doc_buffer.length; + *((u32 *) bh_pointer_add(doc_buffer.data, offset_table_index + 20)) = doc_buffer.length; bh_buffer_write_u32(&doc_buffer, shlenu(context.doc_info->file_ids)); fori (i, 0, shlen(context.doc_info->file_ids)) { diff --git a/core/doc/doc.onyx b/core/doc/doc.onyx index ea6e8aae..44ebe7a4 100644 --- a/core/doc/doc.onyx +++ b/core/doc/doc.onyx @@ -4,11 +4,12 @@ package core.doc Doc :: struct { header: Doc_Header; - packages: [] Doc_Package; - procedures: [] Doc_Procedure; - structures: [] Doc_Structure; - enumerations: [] Doc_Enum; - files: [] Doc_File; + packages: [] Doc_Package; + procedures: [] Doc_Procedure; + structures: [] Doc_Structure; + enumerations: [] Doc_Enum; + distinct_types: [] Doc_Distinct_Type; + files: [] Doc_File; } @@ -25,6 +26,7 @@ Doc_Header :: struct { procedures_info_start: u32; structures_info_start: u32; enumerations_info_start: u32; + distinct_types_info_start: u32; files_info_start: u32; } @@ -130,3 +132,12 @@ Doc_Enum_Value :: struct { name: str; value: u64; } + +Doc_Distinct_Type :: struct { + use base: Doc_Entity; + + wrapped_type: str; // TODO: Make this not a string + + methods: [] Doc_Procedure; +} +