diff options
| author | Vexu <15308111+Vexu@users.noreply.github.com> | 2019-10-10 10:27:12 +0300 |
|---|---|---|
| committer | Vexu <15308111+Vexu@users.noreply.github.com> | 2019-10-10 10:27:12 +0300 |
| commit | 2b55484f3f6cf336f54efb9ded25663fe0e1374a (patch) | |
| tree | ed469d4234c331461c17fc36cb49824b796de858 /src/dump_analysis.cpp | |
| parent | 12ed85d0d13136a5e8c1a54da5c3d2174cebee37 (diff) | |
| download | zig-2b55484f3f6cf336f54efb9ded25663fe0e1374a.tar.gz zig-2b55484f3f6cf336f54efb9ded25663fe0e1374a.zip | |
implement doc generation for union and enum
Diffstat (limited to 'src/dump_analysis.cpp')
| -rw-r--r-- | src/dump_analysis.cpp | 157 |
1 files changed, 157 insertions, 0 deletions
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); |
