Commit 2b55484f3f

Vexu <15308111+Vexu@users.noreply.github.com>
2019-10-10 09:27:12
implement doc generation for union and enum
1 parent 12ed85d
Changed files (2)
lib
std
special
docs
src
lib/std/special/docs/main.js
@@ -780,8 +780,13 @@
                 var field = container.fields[i];
                 var divDom = domListFields.children[i];
 
-                var html = '<pre>' + escapeHtml(field.name) + ": " +
+                var html = '<pre>' + escapeHtml(field.name);
+                if (field.type) {
+                    html += ": " +
                     typeIndexName(field.type, true, true) + ',</pre>';
+                } else {
+                    html += " = " + field.value + ",</pre>";
+                }
 
                 var docs = zigAnalysis.astNodes[field.src].docs;
                 if (docs != null) {
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);