added: distinct type doc output
authorBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 8 Apr 2023 21:24:08 +0000 (16:24 -0500)
committerBrendan Hansen <brendan.f.hansen@gmail.com>
Sat, 8 Apr 2023 21:24:08 +0000 (16:24 -0500)
compiler/include/astnodes.h
compiler/src/doc.c
core/doc/doc.onyx

index db91ff4e3bc3004a4a0f0d73bc63c3b0d915f961..37a2ee3c567433cdbf8d526f4f562c4da6d7982e 100644 (file)
@@ -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;
index ec5066db254f622f824947803942c38ade1f82ed..23115947df3931f0c3234208455f62213d3442d2 100644 (file)
@@ -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)) {
index ea6e8aae95077b27542f303eb7c60daa72bc14fc..44ebe7a48120df2fd095c1d6bff56b48a300dc29 100644 (file)
@@ -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;
+}
+