aboutsummaryrefslogtreecommitdiff
path: root/src/dump_analysis.cpp
diff options
context:
space:
mode:
authorAndrew Kelley <andrew@ziglang.org>2019-10-08 13:41:13 -0400
committerAndrew Kelley <andrew@ziglang.org>2019-10-08 13:41:13 -0400
commit784a493dc7114b6e6807c2a37d03dbadecee81e6 (patch)
treeb2a9709664aed3f9a2d53aa4c233a3887aa93984 /src/dump_analysis.cpp
parent03a6b33a73612500038635633d4c8326c2b5cf5f (diff)
downloadzig-784a493dc7114b6e6807c2a37d03dbadecee81e6.tar.gz
zig-784a493dc7114b6e6807c2a37d03dbadecee81e6.zip
generated docs: functions with inferred error sets display nicely
infrastructure in place for displaying error sets
Diffstat (limited to 'src/dump_analysis.cpp')
-rw-r--r--src/dump_analysis.cpp74
1 files changed, 72 insertions, 2 deletions
diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp
index 7caba132d0..a41edffa84 100644
--- a/src/dump_analysis.cpp
+++ b/src/dump_analysis.cpp
@@ -357,6 +357,9 @@ struct AnalDumpCtx {
ZigList<AstNode *> node_list;
HashMap<const AstNode *, uint32_t, node_ptr_hash, node_ptr_eql> node_map;
+
+ ZigList<ErrorTableEntry *> err_list;
+ HashMap<const ErrorTableEntry *, uint32_t, err_ptr_hash, err_ptr_eql> err_map;
};
static uint32_t anal_dump_get_type_id(AnalDumpCtx *ctx, ZigType *ty);
@@ -444,6 +447,17 @@ static uint32_t anal_dump_get_fn_id(AnalDumpCtx *ctx, ZigFn *fn) {
return fn_id;
}
+static uint32_t anal_dump_get_err_id(AnalDumpCtx *ctx, ErrorTableEntry *err) {
+ uint32_t err_id = ctx->err_list.length;
+ auto existing_entry = ctx->err_map.put_unique(err, err_id);
+ if (existing_entry == nullptr) {
+ ctx->err_list.append(err);
+ } else {
+ err_id = existing_entry->value;
+ }
+ return err_id;
+}
+
static uint32_t anal_dump_get_decl_id(AnalDumpCtx *ctx, Tld *tld) {
uint32_t decl_id = ctx->decl_list.length;
auto existing_entry = ctx->decl_map.put_unique(tld, decl_id);
@@ -513,6 +527,11 @@ static void anal_dump_fn_ref(AnalDumpCtx *ctx, ZigFn *fn) {
jw_int(&ctx->jw, fn_id);
}
+static void anal_dump_err_ref(AnalDumpCtx *ctx, ErrorTableEntry *err) {
+ uint32_t err_id = anal_dump_get_err_id(ctx, err);
+ jw_int(&ctx->jw, err_id);
+}
+
static void anal_dump_decl_ref(AnalDumpCtx *ctx, Tld *tld) {
uint32_t decl_id = anal_dump_get_decl_id(ctx, tld);
jw_int(&ctx->jw, decl_id);
@@ -841,6 +860,33 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
anal_dump_pointer_attrs(ctx, ty);
break;
}
+ case ZigTypeIdErrorSet: {
+ if (type_is_global_error_set(ty)) {
+ break;
+ }
+ if (ty->data.error_set.infer_fn != nullptr) {
+ jw_object_field(jw, "fn");
+ anal_dump_fn_ref(ctx, ty->data.error_set.infer_fn);
+ }
+ jw_object_field(jw, "errors");
+ jw_begin_array(jw);
+ for (uint32_t i = 0; i < ty->data.error_set.err_count; i += 1) {
+ jw_array_elem(jw);
+ ErrorTableEntry *err = ty->data.error_set.errors[i];
+ anal_dump_err_ref(ctx, err);
+ }
+ jw_end_array(jw);
+ break;
+ }
+ case ZigTypeIdErrorUnion: {
+ jw_object_field(jw, "err");
+ anal_dump_type_ref(ctx, ty->data.error_union.err_set_type);
+
+ jw_object_field(jw, "payload");
+ anal_dump_type_ref(ctx, ty->data.error_union.payload_type);
+
+ break;
+ }
default:
jw_object_field(jw, "name");
jw_string(jw, buf_ptr(&ty->name));
@@ -849,7 +895,7 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
jw_end_object(jw);
}
-void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) {
+static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) {
JsonWriter *jw = &ctx->jw;
jw_begin_object(jw);
@@ -892,7 +938,21 @@ void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) {
jw_end_object(jw);
}
-void anal_dump_fn(AnalDumpCtx *ctx, ZigFn *fn) {
+static void anal_dump_err(AnalDumpCtx *ctx, const ErrorTableEntry *err) {
+ JsonWriter *jw = &ctx->jw;
+
+ jw_begin_object(jw);
+
+ jw_object_field(jw, "src");
+ anal_dump_node_ref(ctx, err->decl_node);
+
+ jw_object_field(jw, "name");
+ jw_string(jw, buf_ptr(&err->name));
+
+ jw_end_object(jw);
+}
+
+static void anal_dump_fn(AnalDumpCtx *ctx, ZigFn *fn) {
JsonWriter *jw = &ctx->jw;
jw_begin_object(jw);
@@ -918,6 +978,7 @@ void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const
ctx.decl_map.init(16);
ctx.node_map.init(16);
ctx.fn_map.init(16);
+ ctx.err_map.init(16);
jw_begin_object(jw);
@@ -1055,6 +1116,15 @@ void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const
}
jw_end_array(jw);
+ jw_object_field(jw, "errors");
+ jw_begin_array(jw);
+ for (uint32_t i = 0; i < ctx.err_list.length; i += 1) {
+ const ErrorTableEntry *err = ctx.err_list.at(i);
+ jw_array_elem(jw);
+ anal_dump_err(&ctx, err);
+ }
+ jw_end_array(jw);
+
jw_object_field(jw, "astNodes");
jw_begin_array(jw);
for (uint32_t i = 0; i < ctx.node_list.length; i += 1) {