From: Brendan Hansen Date: Thu, 16 Mar 2023 20:46:26 +0000 (-0500) Subject: added: simple procedure documenting X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=df088a5d5d0716b246f024935a8d1d881a9e17f6;p=onyx.git added: simple procedure documenting --- diff --git a/compiler/include/astnodes.h b/compiler/include/astnodes.h index 1ec48dd3..0e104b89 100644 --- a/compiler/include/astnodes.h +++ b/compiler/include/astnodes.h @@ -1603,7 +1603,7 @@ enum Runtime { typedef struct OnyxDocInfo { - bh_arr(AstFunction *) procedures; + bh_arr(AstBinding *) procedures; } OnyxDocInfo; diff --git a/compiler/include/doc.h b/compiler/include/doc.h index 93a8348d..45214503 100644 --- a/compiler/include/doc.h +++ b/compiler/include/doc.h @@ -6,6 +6,7 @@ // Onyx Documentation generation +void onyx_docs_submit(OnyxDocInfo *docs, AstBinding *binding); void onyx_docs_emit_odoc(const char *dest); diff --git a/compiler/src/checker.c b/compiler/src/checker.c index 19b19409..01b56267 100644 --- a/compiler/src/checker.c +++ b/compiler/src/checker.c @@ -2924,11 +2924,6 @@ CheckStatus check_function_header(AstFunction* func) { func->type = type_build_function_type(context.ast_alloc, func); if (func->type == NULL) YIELD(func->token->pos, "Waiting for function type to be constructed"); - // TODO nocheckin move this. - if (context.doc_info && func->entity_header && !func->generated_from) { - bh_arr_push(context.doc_info->procedures, func); - } - return Check_Success; } diff --git a/compiler/src/doc.c b/compiler/src/doc.c index 60867c3e..0ddf09c1 100644 --- a/compiler/src/doc.c +++ b/compiler/src/doc.c @@ -142,6 +142,18 @@ void onyx_docs_emit_symbol_info(const char *dest) { // Onyx Documentation Format // +void onyx_docs_submit(OnyxDocInfo *docs, AstBinding *binding) { + AstNode *node = binding->node; + if (node->kind == Ast_Kind_Function) { + AstFunction *func = (void *) node; + if (!func->generated_from && func->intrinsic_name + && binding->entity && binding->entity->package) { + + bh_arr_push(docs->procedures, binding); + } + } +} + #define Doc_Magic_Bytes "ODOC" static void write_cstring(bh_buffer *buffer, const char *data) { @@ -179,6 +191,9 @@ void onyx_docs_emit_odoc(const char *dest) { bh_buffer_write_u32(&doc_buffer, 0); bh_buffer_write_u32(&doc_buffer, 0); + Table(u32) file_ids = NULL; + u32 next_file_id = 0; + // // Package Info // @@ -212,27 +227,48 @@ void onyx_docs_emit_odoc(const char *dest) { bh_buffer_write_u32(&doc_buffer, 0); u32 proc_count = 0; - bh_arr(AstFunction *) procs = context.doc_info->procedures; - bh_arr_each(AstFunction *, pfunc, procs) { - AstFunction *func = *pfunc; - + bh_arr(AstBinding *) procs = context.doc_info->procedures; + bh_arr_each(AstBinding *, pbind, procs) { + AstFunction *func = (void *) (*pbind)->node; if (!func->intrinsic_name) continue; - write_string(&doc_buffer, func->intrinsic_name->length, func->intrinsic_name->text); - assert(func->entity_header && func->entity_header->package); + // TODO: Add polymorphic procedure support + if (func->kind != Ast_Kind_Function) continue; - bh_buffer_write_u32(&doc_buffer, func->entity_header->package->id - 1); + write_string(&doc_buffer, (*pbind)->token->length, (*pbind)->token->text); + // assert(func->entity_header && func->entity_header->package); + + u32 visibility = 1; + if ((*pbind)->flags & Ast_Flag_Private_Package) visibility = 2; + if ((*pbind)->flags & Ast_Flag_Private_File) visibility = 3; + bh_buffer_write_u32(&doc_buffer, visibility); - // TODO: Location - 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, (*pbind)->entity->package->id - 1); + + OnyxFilePos pos = (*pbind)->token->pos; + if (shgeti(file_ids, pos.filename) == -1) { + shput(file_ids, pos.filename, next_file_id); + next_file_id++; + } + + bh_buffer_write_u32(&doc_buffer, file_ids[shgeti(file_ids, pos.filename)].value); + bh_buffer_write_u32(&doc_buffer, pos.line); + bh_buffer_write_u32(&doc_buffer, pos.column); write_cstring(&doc_buffer, ""); // TODO: Flags bh_buffer_write_u32(&doc_buffer, 0); + bh_buffer_write_u32(&doc_buffer, bh_arr_length(func->params)); + bh_arr_each(AstParam, param, func->params) { + write_string(&doc_buffer, param->local->token->length, param->local->token->text); + write_cstring(&doc_buffer, type_get_name(param->local->type)); + write_cstring(&doc_buffer, ""); + } + + write_cstring(&doc_buffer, type_get_name(type_build_from_ast(context.ast_alloc, func->return_type))); + proc_count++; } @@ -244,7 +280,13 @@ void onyx_docs_emit_odoc(const char *dest) { // *((u32 *) bh_pointer_add(doc_buffer.data, offset_table_index + 8)) = doc_buffer.length; - bh_buffer_write_u32(&doc_buffer, 0); + bh_buffer_write_u32(&doc_buffer, shlenu(file_ids)); + fori (i, 0, shlen(file_ids)) { + const char *key = file_ids[i].key; + + bh_buffer_write_u32(&doc_buffer, 0); + write_cstring(&doc_buffer, key); + } bh_file_write(&doc_file, doc_buffer.data, doc_buffer.length); diff --git a/compiler/src/symres.c b/compiler/src/symres.c index fb889375..a5972dd9 100644 --- a/compiler/src/symres.c +++ b/compiler/src/symres.c @@ -3,6 +3,7 @@ #include "utils.h" #include "astnodes.h" #include "errors.h" +#include "doc.h" // :EliminatingSymres - notes the places where too much work is being done in symbol resolution @@ -1782,6 +1783,10 @@ void symres_entity(Entity* ent) { symbol_introduce(current_scope, ent->binding->token, ent->binding->node); track_declaration_for_tags((AstNode *) ent->binding); + if (context.doc_info) { + onyx_docs_submit(context.doc_info, ent->binding); + } + package_reinsert_use_packages(ent->package); next_state = Entity_State_Finalized; break; diff --git a/core/doc/doc.onyx b/core/doc/doc.onyx index be9a9f54..d21a5057 100644 --- a/core/doc/doc.onyx +++ b/core/doc/doc.onyx @@ -46,9 +46,16 @@ Doc_Package :: struct { subpackages: [] Id; } +Doc_Visibility :: enum { + Public :: 1; + Package :: 2; + Local :: 3; +} + Doc_Procedure :: struct { name: str; + visibility: Doc_Visibility; package_id: Doc_Package.Id; location: Doc_Location; @@ -59,5 +66,14 @@ Doc_Procedure :: struct { Is_Foreign :: 2; } flags: Flags; + + params: [] Doc_Procedure_Param; + return_type: str; // TODO: Make this not a string +} + +Doc_Procedure_Param :: struct { + name: str; + type: str; // TODO: Make this not a string + default_value: str; }