From 2b55484f3f6cf336f54efb9ded25663fe0e1374a Mon Sep 17 00:00:00 2001 From: Vexu <15308111+Vexu@users.noreply.github.com> Date: Thu, 10 Oct 2019 10:27:12 +0300 Subject: implement doc generation for union and enum --- src/dump_analysis.cpp | 157 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 157 insertions(+) (limited to 'src/dump_analysis.cpp') diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp index 35a249c92a..fc8afd8da4 100644 --- a/src/dump_analysis.cpp +++ b/src/dump_analysis.cpp @@ -216,6 +216,19 @@ static void jw_int(JsonWriter *jw, int64_t x) { jw_pop_state(jw); } +static void jw_bigint(JsonWriter *jw, const BigInt *x) { + assert(jw->state[jw->state_index] == JsonWriterStateValue); + Buf *str = buf_alloc(); + bigint_append_buf(str, x, 10); + + if (bigint_fits_in_bits(x, 52, true)) { + fprintf(jw->f, "%s", buf_ptr(str)); + } else { + fprintf(jw->f, "\"%s\"", buf_ptr(str)); + } + jw_pop_state(jw); +} + static void jw_string(JsonWriter *jw, const char *s) { assert(jw->state[jw->state_index] == JsonWriterStateValue); jw_write_escaped_string(jw, s); @@ -749,6 +762,40 @@ static void anal_dump_struct_field(AnalDumpCtx *ctx, const TypeStructField *stru jw_end_object(jw); } +static void anal_dump_union_field(AnalDumpCtx *ctx, const TypeUnionField *union_field) { + JsonWriter *jw = &ctx->jw; + + jw_begin_object(jw); + + jw_object_field(jw, "name"); + jw_string(jw, buf_ptr(union_field->name)); + + jw_object_field(jw, "type"); + anal_dump_type_ref(ctx, union_field->type_entry); + + jw_object_field(jw, "src"); + anal_dump_node_ref(ctx, union_field->decl_node); + + jw_end_object(jw); +} + +static void anal_dump_enum_field(AnalDumpCtx *ctx, const TypeEnumField *enum_field) { + JsonWriter *jw = &ctx->jw; + + jw_begin_object(jw); + + jw_object_field(jw, "name"); + jw_string(jw, buf_ptr(enum_field->name)); + + jw_object_field(jw, "value"); + jw_bigint(jw, &enum_field->value); + + jw_object_field(jw, "src"); + anal_dump_node_ref(ctx, enum_field->decl_node); + + jw_end_object(jw); +} + static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { JsonWriter *jw = &ctx->jw; jw_array_elem(jw); @@ -831,6 +878,116 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { } break; } + case ZigTypeIdUnion: { + jw_object_field(jw, "name"); + jw_string(jw, buf_ptr(&ty->name)); + { + jw_object_field(jw, "pubDecls"); + jw_begin_array(jw); + + ScopeDecls *decls_scope = ty->data.unionation.decls_scope; + auto it = decls_scope->decl_table.entry_iterator(); + for (;;) { + auto *entry = it.next(); + if (!entry) + break; + + Tld *tld = entry->value; + if (tld->visib_mod == VisibModPub) { + jw_array_elem(jw); + anal_dump_decl_ref(ctx, tld); + } + } + jw_end_array(jw); + } + + { + jw_object_field(jw, "privDecls"); + jw_begin_array(jw); + + ScopeDecls *decls_scope = ty->data.unionation.decls_scope; + auto it = decls_scope->decl_table.entry_iterator(); + for (;;) { + auto *entry = it.next(); + if (!entry) + break; + + Tld *tld = entry->value; + if (tld->visib_mod == VisibModPrivate) { + jw_array_elem(jw); + anal_dump_decl_ref(ctx, tld); + } + } + jw_end_array(jw); + } + + if (ty->data.unionation.src_field_count != 0) { + jw_object_field(jw, "fields"); + jw_begin_array(jw); + + for(size_t i = 0; i < ty->data.unionation.src_field_count; i += 1) { + jw_array_elem(jw); + anal_dump_union_field(ctx, &ty->data.unionation.fields[i]); + } + jw_end_array(jw); + } + break; + } + case ZigTypeIdEnum: { + jw_object_field(jw, "name"); + jw_string(jw, buf_ptr(&ty->name)); + { + jw_object_field(jw, "pubDecls"); + jw_begin_array(jw); + + ScopeDecls *decls_scope = ty->data.enumeration.decls_scope; + auto it = decls_scope->decl_table.entry_iterator(); + for (;;) { + auto *entry = it.next(); + if (!entry) + break; + + Tld *tld = entry->value; + if (tld->visib_mod == VisibModPub) { + jw_array_elem(jw); + anal_dump_decl_ref(ctx, tld); + } + } + jw_end_array(jw); + } + + { + jw_object_field(jw, "privDecls"); + jw_begin_array(jw); + + ScopeDecls *decls_scope = ty->data.enumeration.decls_scope; + auto it = decls_scope->decl_table.entry_iterator(); + for (;;) { + auto *entry = it.next(); + if (!entry) + break; + + Tld *tld = entry->value; + if (tld->visib_mod == VisibModPrivate) { + jw_array_elem(jw); + anal_dump_decl_ref(ctx, tld); + } + } + jw_end_array(jw); + } + + if (ty->data.enumeration.src_field_count != 0) { + jw_object_field(jw, "fields"); + jw_begin_array(jw); + + for(size_t i = 0; i < ty->data.enumeration.src_field_count; i += 1) { + jw_array_elem(jw); + anal_dump_enum_field(ctx, &ty->data.enumeration.fields[i]); + } + jw_end_array(jw); + } + break; + } case ZigTypeIdFloat: { jw_object_field(jw, "bits"); jw_int(jw, ty->data.floating.bit_count); -- cgit v1.2.3 From 4250d27fe500cf16701066277fd6643491e7ab09 Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Thu, 10 Oct 2019 14:21:35 +0200 Subject: Generated docs: store static container info in a containerDecl astNode And then get the struct field astNodes through the containerDecl astNode. The type of a struct field is still stored in the types array, but the static information is in the astNodes. --- lib/std/special/docs/main.js | 11 +++++---- src/dump_analysis.cpp | 56 +++++++++++++++++++++++++++++--------------- 2 files changed, 44 insertions(+), 23 deletions(-) (limited to 'src/dump_analysis.cpp') diff --git a/lib/std/special/docs/main.js b/lib/std/special/docs/main.js index 879b75872c..681d36319f 100644 --- a/lib/std/special/docs/main.js +++ b/lib/std/special/docs/main.js @@ -776,14 +776,17 @@ if (container.fields != null && container.fields.length !== 0) { resizeDomList(domListFields, container.fields.length, '
'); + + var containerNode = zigAnalysis.astNodes[container.src]; for (var i = 0; i < container.fields.length; i += 1) { - var field = container.fields[i]; + var fieldTypeIndex = container.fields[i]; + var fieldNode = zigAnalysis.astNodes[containerNode.fields[i]]; var divDom = domListFields.children[i]; - var html = '
' + escapeHtml(field.name) + ": " +
-                    typeIndexName(field.type, true, true) + ',
'; + var html = '
' + escapeHtml(fieldNode.name) + ": " +
+                    typeIndexName(fieldTypeIndex, true, true) + ',
'; - var docs = zigAnalysis.astNodes[field.src].docs; + var docs = fieldNode.docs; if (docs != null) { html += markdown(docs); } diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp index 35a249c92a..29a04b2d48 100644 --- a/src/dump_analysis.cpp +++ b/src/dump_analysis.cpp @@ -732,23 +732,6 @@ static void anal_dump_pointer_attrs(AnalDumpCtx *ctx, ZigType *ty) { anal_dump_type_ref(ctx, ty->data.pointer.child_type); } -static void anal_dump_struct_field(AnalDumpCtx *ctx, const TypeStructField *struct_field) { - JsonWriter *jw = &ctx->jw; - - jw_begin_object(jw); - - jw_object_field(jw, "name"); - jw_string(jw, buf_ptr(struct_field->name)); - - jw_object_field(jw, "type"); - anal_dump_type_ref(ctx, struct_field->type_entry); - - jw_object_field(jw, "src"); - anal_dump_node_ref(ctx, struct_field->decl_node); - - jw_end_object(jw); -} - static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { JsonWriter *jw = &ctx->jw; jw_array_elem(jw); @@ -811,13 +794,16 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { jw_end_array(jw); } + jw_object_field(jw, "src"); + anal_dump_node_ref(ctx, ty->data.structure.decl_node); + if (ty->data.structure.src_field_count != 0) { jw_object_field(jw, "fields"); jw_begin_array(jw); for(size_t i = 0; i < ty->data.structure.src_field_count; i += 1) { jw_array_elem(jw); - anal_dump_struct_field(ctx, &ty->data.structure.fields[i]); + anal_dump_type_ref(ctx, ty->data.structure.fields[i].type_entry); } jw_end_array(jw); } @@ -827,7 +813,6 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { jw_object_field(jw, "file"); anal_dump_file_ref(ctx, path_buf); - } break; } @@ -974,6 +959,39 @@ static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { jw_string(jw, buf_ptr(doc_comments_buf)); } + const Buf *name_buf; + switch (node->type) { + case NodeTypeStructField: + name_buf = node->data.struct_field.name; + break; + default: + name_buf = nullptr; + break; + } + if (name_buf != nullptr) { + jw_object_field(jw, "name"); + jw_string(jw, buf_ptr(name_buf)); + } + + const ZigList *fieldNodes; + switch (node->type) { + case NodeTypeContainerDecl: + fieldNodes = &node->data.container_decl.fields; + break; + default: + fieldNodes = nullptr; + break; + } + if (fieldNodes != nullptr) { + jw_object_field(jw, "fields"); + jw_begin_array(jw); + for (size_t i = 0; i < fieldNodes->length; i += 1) { + jw_array_elem(jw); + anal_dump_node_ref(ctx, fieldNodes->at(i)); + } + jw_end_array(jw); + } + jw_end_object(jw); } -- cgit v1.2.3 From e34e3344d4ac5c50a008905fe5cba25629cafa1c Mon Sep 17 00:00:00 2001 From: Timon Kruiper Date: Thu, 10 Oct 2019 15:23:24 +0200 Subject: Generated docs: Add function paramater names --- lib/std/special/docs/main.js | 10 ++++++++++ src/dump_analysis.cpp | 6 ++++++ 2 files changed, 16 insertions(+) (limited to 'src/dump_analysis.cpp') diff --git a/lib/std/special/docs/main.js b/lib/std/special/docs/main.js index 681d36319f..cc21767191 100644 --- a/lib/std/special/docs/main.js +++ b/lib/std/special/docs/main.js @@ -554,6 +554,16 @@ if (i != 0) { payloadHtml += ', '; } + + if (fnDecl != null && zigAnalysis.astNodes[fnDecl.src].fields != null) { + var paramDeclIndex = zigAnalysis.astNodes[fnDecl.src].fields[i]; + var paramName = zigAnalysis.astNodes[paramDeclIndex].name; + + if (paramName != null) { + payloadHtml += paramName + ': '; + } + } + var argTypeIndex = typeObj.args[i]; if (argTypeIndex != null) { payloadHtml += typeIndexName(argTypeIndex, wantHtml, wantSubLink); diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp index 29a04b2d48..ddf59097d7 100644 --- a/src/dump_analysis.cpp +++ b/src/dump_analysis.cpp @@ -964,6 +964,9 @@ static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { case NodeTypeStructField: name_buf = node->data.struct_field.name; break; + case NodeTypeParamDecl: + name_buf = node->data.param_decl.name; + break; default: name_buf = nullptr; break; @@ -978,6 +981,9 @@ static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { case NodeTypeContainerDecl: fieldNodes = &node->data.container_decl.fields; break; + case NodeTypeFnProto: + fieldNodes = &node->data.fn_proto.params; + break; default: fieldNodes = nullptr; break; -- cgit v1.2.3