Update doc format to allow for aliases

This commit is contained in:
gingerBill
2022-01-26 23:31:47 +00:00
parent 070b450768
commit 7e11f3cc4b
2 changed files with 25 additions and 21 deletions
+11 -2
View File
@@ -154,6 +154,7 @@ enum OdinDocEntityKind : u32 {
OdinDocEntity_ProcGroup = 5, OdinDocEntity_ProcGroup = 5,
OdinDocEntity_ImportName = 6, OdinDocEntity_ImportName = 6,
OdinDocEntity_LibraryName = 7, OdinDocEntity_LibraryName = 7,
OdinDocEntity_Builtin = 8,
}; };
enum OdinDocEntityFlag : u64 { enum OdinDocEntityFlag : u64 {
@@ -170,6 +171,8 @@ enum OdinDocEntityFlag : u64 {
OdinDocEntityFlag_Type_Alias = 1ull<<20, OdinDocEntityFlag_Type_Alias = 1ull<<20,
OdinDocEntityFlag_Builtin_Procedure = 1ull<<30,
OdinDocEntityFlag_Var_Thread_Local = 1ull<<40, OdinDocEntityFlag_Var_Thread_Local = 1ull<<40,
OdinDocEntityFlag_Var_Static = 1ull<<41, OdinDocEntityFlag_Var_Static = 1ull<<41,
@@ -201,15 +204,21 @@ enum OdinDocPkgFlags : u32 {
OdinDocPkgFlag_Init = 1<<2, OdinDocPkgFlag_Init = 1<<2,
}; };
struct OdinDocScopeEntry {
OdinDocString name;
OdinDocEntityIndex entity;
};
struct OdinDocPkg { struct OdinDocPkg {
OdinDocString fullpath; OdinDocString fullpath;
OdinDocString name; OdinDocString name;
u32 flags; u32 flags;
OdinDocString docs; OdinDocString docs;
OdinDocArray<OdinDocFileIndex> files; OdinDocArray<OdinDocFileIndex> files;
OdinDocArray<OdinDocEntityIndex> entities; OdinDocArray<OdinDocScopeEntry> entries;
}; };
struct OdinDocHeader { struct OdinDocHeader {
OdinDocHeaderBase base; OdinDocHeaderBase base;
+14 -19
View File
@@ -819,6 +819,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) {
if (!docs) { docs = e->Constant.docs; } if (!docs) { docs = e->Constant.docs; }
} }
String name = e->token.string;
String link_name = {}; String link_name = {};
OdinDocEntityKind kind = OdinDocEntity_Invalid; OdinDocEntityKind kind = OdinDocEntity_Invalid;
@@ -834,6 +835,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) {
case Entity_ProcGroup: kind = OdinDocEntity_ProcGroup; break; case Entity_ProcGroup: kind = OdinDocEntity_ProcGroup; break;
case Entity_ImportName: kind = OdinDocEntity_ImportName; break; case Entity_ImportName: kind = OdinDocEntity_ImportName; break;
case Entity_LibraryName: kind = OdinDocEntity_LibraryName; break; case Entity_LibraryName: kind = OdinDocEntity_LibraryName; break;
case Entity_Builtin: kind = OdinDocEntity_Builtin; break;
} }
switch (e->kind) { switch (e->kind) {
@@ -899,7 +901,7 @@ OdinDocEntityIndex odin_doc_add_entity(OdinDocWriter *w, Entity *e) {
doc_entity.kind = kind; doc_entity.kind = kind;
doc_entity.flags = flags; doc_entity.flags = flags;
doc_entity.pos = odin_doc_token_pos_cast(w, e->token.pos); doc_entity.pos = odin_doc_token_pos_cast(w, e->token.pos);
doc_entity.name = odin_doc_write_string(w, e->token.string); doc_entity.name = odin_doc_write_string(w, name);
doc_entity.type = 0; // Set later doc_entity.type = 0; // Set later
doc_entity.init_string = init_string; doc_entity.init_string = init_string;
doc_entity.comment = odin_doc_comment_group_string(w, comment); doc_entity.comment = odin_doc_comment_group_string(w, comment);
@@ -976,7 +978,7 @@ void odin_doc_update_entities(OdinDocWriter *w) {
OdinDocArray<OdinDocEntityIndex> odin_doc_add_pkg_entities(OdinDocWriter *w, AstPackage *pkg) { OdinDocArray<OdinDocScopeEntry> odin_doc_add_pkg_entries(OdinDocWriter *w, AstPackage *pkg) {
if (pkg->scope == nullptr) { if (pkg->scope == nullptr) {
return {}; return {};
} }
@@ -984,14 +986,14 @@ OdinDocArray<OdinDocEntityIndex> odin_doc_add_pkg_entities(OdinDocWriter *w, Ast
return {}; return {};
} }
auto entities = array_make<Entity *>(heap_allocator(), 0, pkg->scope->elements.entries.count); auto entries = array_make<OdinDocScopeEntry>(heap_allocator(), 0, w->entity_cache.entries.count);
defer (array_free(&entities)); defer (array_free(&entries));
for_array(i, pkg->scope->elements.entries) { for_array(i, pkg->scope->elements.entries) {
String name = pkg->scope->elements.entries[i].key.string;
Entity *e = pkg->scope->elements.entries[i].value; Entity *e = pkg->scope->elements.entries[i].value;
switch (e->kind) { switch (e->kind) {
case Entity_Invalid: case Entity_Invalid:
case Entity_Builtin:
case Entity_Nil: case Entity_Nil:
case Entity_Label: case Entity_Label:
continue; continue;
@@ -1002,18 +1004,10 @@ OdinDocArray<OdinDocEntityIndex> odin_doc_add_pkg_entities(OdinDocWriter *w, Ast
case Entity_ProcGroup: case Entity_ProcGroup:
case Entity_ImportName: case Entity_ImportName:
case Entity_LibraryName: case Entity_LibraryName:
case Entity_Builtin:
// Fine // Fine
break; break;
} }
array_add(&entities, e);
}
gb_sort_array(entities.data, entities.count, cmp_entities_for_printing);
auto entity_indices = array_make<OdinDocEntityIndex>(heap_allocator(), 0, w->entity_cache.entries.count);
defer (array_free(&entity_indices));
for_array(i, entities) {
Entity *e = entities[i];
if (e->pkg != pkg) { if (e->pkg != pkg) {
continue; continue;
} }
@@ -1024,12 +1018,13 @@ OdinDocArray<OdinDocEntityIndex> odin_doc_add_pkg_entities(OdinDocWriter *w, Ast
continue; continue;
} }
OdinDocEntityIndex doc_entity_index = 0; OdinDocScopeEntry entry = {};
doc_entity_index = odin_doc_add_entity(w, e); entry.name = odin_doc_write_string(w, name);
array_add(&entity_indices, doc_entity_index); entry.entity = odin_doc_add_entity(w, e);
array_add(&entries, entry);
} }
return odin_write_slice(w, entity_indices.data, entity_indices.count); return odin_write_slice(w, entries.data, entries.count);
} }
@@ -1097,7 +1092,7 @@ void odin_doc_write_docs(OdinDocWriter *w) {
} }
doc_pkg.files = odin_write_slice(w, file_indices.data, file_indices.count); doc_pkg.files = odin_write_slice(w, file_indices.data, file_indices.count);
doc_pkg.entities = odin_doc_add_pkg_entities(w, pkg); doc_pkg.entries = odin_doc_add_pkg_entries(w, pkg);
if (dst) { if (dst) {
*dst = doc_pkg; *dst = doc_pkg;