diff options
| author | Andrew Kelley <andrew@ziglang.org> | 2019-10-16 01:29:16 -0400 |
|---|---|---|
| committer | Andrew Kelley <andrew@ziglang.org> | 2019-10-16 01:49:02 -0400 |
| commit | 1014cfdf3b60faf9af5b062d198f4f44976cb1bc (patch) | |
| tree | cfa5bff2c520b70c510e3a6ca44b35588417be38 /src/dump_analysis.cpp | |
| parent | 47dfaf3d175ebea63b169a373b4dec4af6af7001 (diff) | |
| download | zig-1014cfdf3b60faf9af5b062d198f4f44976cb1bc.tar.gz zig-1014cfdf3b60faf9af5b062d198f4f44976cb1bc.zip | |
generated docs: progress towards generic types being useful
See #3406
Diffstat (limited to 'src/dump_analysis.cpp')
| -rw-r--r-- | src/dump_analysis.cpp | 162 |
1 files changed, 98 insertions, 64 deletions
diff --git a/src/dump_analysis.cpp b/src/dump_analysis.cpp index 61a40ebfcc..d5b109fbcb 100644 --- a/src/dump_analysis.cpp +++ b/src/dump_analysis.cpp @@ -456,6 +456,10 @@ static uint32_t anal_dump_get_fn_id(AnalDumpCtx *ctx, ZigFn *fn) { auto existing_entry = ctx->fn_map.put_unique(fn, fn_id); if (existing_entry == nullptr) { ctx->fn_list.append(fn); + + // poke the fn + (void)anal_dump_get_type_id(ctx, fn->type_entry); + (void)anal_dump_get_node_id(ctx, fn->proto_node); } else { fn_id = existing_entry->value; } @@ -700,11 +704,7 @@ static void anal_dump_value(AnalDumpCtx *ctx, AstNode *source_node, ZigType *ty, case ZigTypeIdFn: { if (value->data.x_ptr.special == ConstPtrSpecialFunction) { ZigFn *val_fn = value->data.x_ptr.data.fn.fn_entry; - if (val_fn->type_entry->data.fn.is_generic) { - anal_dump_node_ref(ctx, val_fn->proto_node); - } else { - anal_dump_fn_ref(ctx, val_fn); - } + anal_dump_fn_ref(ctx, val_fn); } else { jw_null(&ctx->jw); } @@ -758,6 +758,7 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) { switch (ty->id) { case ZigTypeIdMetaType: case ZigTypeIdBool: + case ZigTypeIdEnumLiteral: break; case ZigTypeIdStruct: { if (ty->data.structure.is_slice) { @@ -1072,13 +1073,25 @@ static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { jw_object_field(jw, "col"); jw_int(jw, node->column); - const Buf *doc_comments_buf; + const Buf *doc_comments_buf = nullptr; + const Buf *name_buf = nullptr; + const ZigList<AstNode *> *field_nodes = nullptr; + bool is_var_args = false; + bool is_noalias = false; + bool is_comptime = false; + switch (node->type) { case NodeTypeParamDecl: doc_comments_buf = &node->data.param_decl.doc_comments; + name_buf = node->data.param_decl.name; + is_var_args = node->data.param_decl.is_var_args; + is_noalias = node->data.param_decl.is_noalias; + is_comptime = node->data.param_decl.is_comptime; break; case NodeTypeFnProto: doc_comments_buf = &node->data.fn_proto.doc_comments; + field_nodes = &node->data.fn_proto.params; + is_var_args = node->data.fn_proto.is_var_args; break; case NodeTypeVariableDeclaration: doc_comments_buf = &node->data.variable_declaration.doc_comments; @@ -1088,55 +1101,50 @@ static void anal_dump_node(AnalDumpCtx *ctx, const AstNode *node) { break; case NodeTypeStructField: doc_comments_buf = &node->data.struct_field.doc_comments; + name_buf = node->data.struct_field.name; + break; + case NodeTypeContainerDecl: + field_nodes = &node->data.container_decl.fields; break; default: - doc_comments_buf = nullptr; break; } + if (doc_comments_buf != nullptr && doc_comments_buf->list.length != 0) { jw_object_field(jw, "docs"); 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; - case NodeTypeParamDecl: - name_buf = node->data.param_decl.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<AstNode *> *fieldNodes; - switch (node->type) { - case NodeTypeContainerDecl: - fieldNodes = &node->data.container_decl.fields; - break; - case NodeTypeFnProto: - fieldNodes = &node->data.fn_proto.params; - break; - default: - fieldNodes = nullptr; - break; - } - if (fieldNodes != nullptr) { + if (field_nodes != nullptr) { jw_object_field(jw, "fields"); jw_begin_array(jw); - for (size_t i = 0; i < fieldNodes->length; i += 1) { + for (size_t i = 0; i < field_nodes->length; i += 1) { jw_array_elem(jw); - anal_dump_node_ref(ctx, fieldNodes->at(i)); + anal_dump_node_ref(ctx, field_nodes->at(i)); } jw_end_array(jw); } + if (is_var_args) { + jw_object_field(jw, "varArgs"); + jw_bool(jw, true); + } + + if (is_comptime) { + jw_object_field(jw, "comptime"); + jw_bool(jw, true); + } + + if (is_noalias) { + jw_object_field(jw, "noalias"); + jw_bool(jw, true); + } + jw_end_object(jw); } @@ -1235,59 +1243,76 @@ void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const jw_object_field(jw, "calls"); jw_begin_array(jw); { + ZigList<ZigVar *> var_stack = {}; + auto it = g->memoized_fn_eval_table.entry_iterator(); for (;;) { auto *entry = it.next(); if (!entry) break; - jw_array_elem(jw); - jw_begin_object(jw); - - jw_object_field(jw, "args"); - jw_begin_object(jw); + var_stack.resize(0); + ZigFn *fn = nullptr; Scope *scope = entry->key; while (scope != nullptr) { if (scope->id == ScopeIdVarDecl) { ZigVar *var = reinterpret_cast<ScopeVarDecl *>(scope)->var; - jw_object_field(jw, var->name); - jw_begin_object(jw); - jw_object_field(jw, "type"); - anal_dump_type_ref(&ctx, var->var_type); - jw_object_field(jw, "value"); - anal_dump_value(&ctx, scope->source_node, var->var_type, var->const_value); - jw_end_object(jw); + var_stack.append(var); } else if (scope->id == ScopeIdFnDef) { - jw_end_object(jw); + fn = reinterpret_cast<ScopeFnDef *>(scope)->fn_entry; + break; + } + scope = scope->parent; + } + ConstExprValue *result = entry->value; + + assert(fn != nullptr); + + jw_array_elem(jw); + jw_begin_object(jw); + + jw_object_field(jw, "fn"); + anal_dump_fn_ref(&ctx, fn); + + jw_object_field(jw, "result"); + { + jw_begin_object(jw); + + jw_object_field(jw, "type"); + anal_dump_type_ref(&ctx, result->type); + + jw_object_field(jw, "value"); + anal_dump_value(&ctx, scope->source_node, result->type, result); + + jw_end_object(jw); + } + + if (var_stack.length != 0) { + jw_object_field(jw, "args"); + jw_begin_array(jw); - jw_object_field(jw, "fn"); - ZigFn *fn = reinterpret_cast<ScopeFnDef *>(scope)->fn_entry; - anal_dump_fn_ref(&ctx, fn); + while (var_stack.length != 0) { + ZigVar *var = var_stack.pop(); - ConstExprValue *result = entry->value; - jw_object_field(jw, "result"); + jw_array_elem(jw); jw_begin_object(jw); + jw_object_field(jw, "type"); - anal_dump_type_ref(&ctx, result->type); + anal_dump_type_ref(&ctx, var->var_type); + jw_object_field(jw, "value"); - anal_dump_value(&ctx, scope->source_node, result->type, result); + anal_dump_value(&ctx, scope->source_node, var->var_type, var->const_value); + jw_end_object(jw); - break; } - scope = scope->parent; + jw_end_array(jw); } + jw_end_object(jw); } - } - jw_end_array(jw); - jw_object_field(jw, "fns"); - jw_begin_array(jw); - for (uint32_t i = 0; i < ctx.fn_list.length; i += 1) { - ZigFn *fn = ctx.fn_list.at(i); - jw_array_elem(jw); - anal_dump_fn(&ctx, fn); + var_stack.deinit(); } jw_end_array(jw); @@ -1315,6 +1340,15 @@ void zig_print_analysis_dump(CodeGen *g, FILE *f, const char *one_indent, const } jw_end_array(jw); + jw_object_field(jw, "fns"); + jw_begin_array(jw); + for (uint32_t i = 0; i < ctx.fn_list.length; i += 1) { + ZigFn *fn = ctx.fn_list.at(i); + jw_array_elem(jw); + anal_dump_fn(&ctx, fn); + } + 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) { |
