Commit 300b617140

s-ol <s-ol@users.noreply.github.com>
2020-10-14 18:32:45
generated docs: add FnFrame type support
See #3404
1 parent bf982cd
Changed files (2)
lib
std
special
docs
src
lib/std/special/docs/main.js
@@ -726,6 +726,25 @@
                     payloadHtml += token('var', tokenKinds.Keyword, wantHtml);
                 }
                 return payloadHtml;
+            case typeKinds.Frame:
+                var name = '@Frame(';
+                var fnObj = zigAnalysis.fns[typeObj.fn];
+                var declPath = fnObj.decl && getCanonDeclPath(fnObj.decl);
+                var fnName = typeObj.fnName;
+                if (wantHtml) {
+                  name += '<span class="tok-fn">';
+                  if (declPath) {
+                    name += '<a href="' + navLink(declPath.pkgNames, declPath.declNames) + '">'
+                        + escapeHtml(fnName) + '</a>';
+                  } else {
+                    name += escapeHtml(fnName);
+                  }
+                  name += '</span>';
+                } else {
+                  name += fnName;
+                }
+                name += ')';
+                return name;
             case typeKinds.AnyFrame:
                 var name = token('anyframe', tokenKinds.Keyword, wantHtml);
                 if (typeObj.result) {
src/stage1/dump_analysis.cpp
@@ -352,6 +352,7 @@ struct AnalDumpCtx {
 
     ZigList<ZigFn *> fn_list;
     HashMap<const ZigFn *, uint32_t, fn_ptr_hash, fn_ptr_eql> fn_map;
+    HashMap<const ZigFn *, uint32_t, fn_ptr_hash, fn_ptr_eql> fn_decl_map;
 
     ZigList<AstNode *> node_list;
     HashMap<const AstNode *, uint32_t, node_ptr_hash, node_ptr_eql> node_map;
@@ -491,6 +492,7 @@ static uint32_t anal_dump_get_decl_id(AnalDumpCtx *ctx, Tld *tld) {
 
                 if (fn != nullptr) {
                     (void)anal_dump_get_type_id(ctx, fn->type_entry);
+                    ctx->fn_decl_map.put_unique(fn, decl_id);
                 }
                 break;
             }
@@ -1061,6 +1063,14 @@ static void anal_dump_type(AnalDumpCtx *ctx, ZigType *ty) {
             }
             break;
         }
+        case ZigTypeIdFnFrame: {
+            jw_object_field(jw, "fnName");
+            jw_string(jw, buf_ptr(&ty->data.frame.fn->symbol_name));
+
+            jw_object_field(jw, "fn");
+            anal_dump_fn_ref(ctx, ty->data.frame.fn);
+            break;
+        }
         case ZigTypeIdInvalid:
             zig_unreachable();
         default:
@@ -1186,6 +1196,12 @@ static void anal_dump_fn(AnalDumpCtx *ctx, ZigFn *fn) {
     jw_object_field(jw, "type");
     anal_dump_type_ref(ctx, fn->type_entry);
 
+    auto entry = ctx->fn_decl_map.maybe_get(fn);
+    if (entry != nullptr) {
+      jw_object_field(jw, "decl");
+      jw_int(jw, entry->value);
+    }
+
     jw_end_object(jw);
 }
 
@@ -1200,6 +1216,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.fn_decl_map.init(16);
     ctx.err_map.init(16);
 
     jw_begin_object(jw);