From: Brendan Hansen Date: Mon, 20 Mar 2023 17:42:51 +0000 (-0500) Subject: added: `parent` field to Doc_Package X-Git-Url: https://git.brendanfh.com/?a=commitdiff_plain;h=cb067aaeaa57726a4dc02d453182bb139c1e702e;p=onyx.git added: `parent` field to Doc_Package --- diff --git a/compiler/include/astnodes.h b/compiler/include/astnodes.h index 6fcdab57..4569d856 100644 --- a/compiler/include/astnodes.h +++ b/compiler/include/astnodes.h @@ -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. diff --git a/compiler/src/doc.c b/compiler/src/doc.c index 2bdff0e8..5ec29f83 100644 --- a/compiler/src/doc.c +++ b/compiler/src/doc.c @@ -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(¶m_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(¶m_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); diff --git a/compiler/src/parser.c b/compiler/src/parser.c index 422927ab..c10afe1d 100644 --- a/compiler/src/parser.c +++ b/compiler/src/parser.c @@ -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; diff --git a/compiler/src/polymorph.h b/compiler/src/polymorph.h index 7abab457..a432752c 100644 --- a/compiler/src/polymorph.h +++ b/compiler/src/polymorph.h @@ -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 ++; diff --git a/compiler/src/utils.c b/compiler/src/utils.c index c91aec6c..a9f41635 100644 --- a/compiler/src/utils.c +++ b/compiler/src/utils.c @@ -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")) { diff --git a/core/doc/doc.onyx b/core/doc/doc.onyx index 0e740242..21ff0419 100644 --- a/core/doc/doc.onyx +++ b/core/doc/doc.onyx @@ -43,6 +43,7 @@ Doc_Package :: struct { name: str; // i.e. 'io' qualified_name: str; // i.e. 'core.io' + parent: Id; subpackages: [] Id; }