implement doc generation for union and enum

This commit is contained in:
Vexu 2019-10-10 10:27:12 +03:00
parent 12ed85d0d1
commit 2b55484f3f
No known key found for this signature in database
GPG Key ID: 5AEABFCAFF5CD8D6
2 changed files with 163 additions and 1 deletions

View File

@ -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) {

View File

@ -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);