diff --git a/lib/docs/main.js b/lib/docs/main.js index 4f4d68f7b0..4a59d5d2bc 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -1083,9 +1083,23 @@ var zigAnalysis; struct_body += "}"; return struct_body; } + case "typeOf_peer": { + console.log(expr) + let payloadHtml = "@TypeOf(" + for (let i = 0; i < expr.typeOf_peer.length; i++) { + payloadHtml += exprName(expr.typeOf_peer[i], {wantHtml: true, wantLink:true}); + if (i !== expr.typeOf_peer.length - 1) { + payloadHtml += ", "; + } + } + payloadHtml += ")"; + console.log(payloadHtml) + return payloadHtml; + + } case "typeOf": { const typeRefArg = zigAnalysis.exprs[expr.typeOf]; - let payloadHtml = "@TypeOf(" + exprName(typeRefArg) + ")"; + let payloadHtml = "@TypeOf(" + exprName(typeRefArg, {wantHtml: true, wantLink:true}) + ")"; return payloadHtml; } case "null": { @@ -1432,6 +1446,30 @@ var zigAnalysis; if (isVarArgs && i === fnObj.params.length - 1) { payloadHtml += '...'; } + else if ("typeOf" in value) { + if (opts.wantHtml) { + payloadHtml += ''; + payloadHtml += + '' + + exprName(value, opts) + ''; + payloadHtml += ''; + } else { + payloadHtml += exprName(value, opts); + } + + } + else if ("typeOf_peer" in value) { + if (opts.wantHtml) { + payloadHtml += ''; + payloadHtml += + '' + + exprName(value, opts) + ''; + payloadHtml += ''; + } else { + payloadHtml += exprName(value, opts); + } + + } else if ("declRef" in value) { if (opts.wantHtml) { payloadHtml += ''; @@ -1454,7 +1492,6 @@ var zigAnalysis; } else { payloadHtml += exprName(value, opts); } - } else if ("refPath" in value) { if (opts.wantHtml) { @@ -1466,7 +1503,6 @@ var zigAnalysis; } else { payloadHtml += exprName(value, opts); } - } else if ("type" in value) { let name = exprName(value, { wantHtml: false, diff --git a/src/Autodoc.zig b/src/Autodoc.zig index b98adba2db..655fb5339d 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -575,6 +575,7 @@ const DocData = struct { call: usize, // index in `calls` enumLiteral: []const u8, // direct value typeOf: usize, // index in `exprs` + typeOf_peer: []Expr, as: As, sizeOf: usize, // index in `exprs` compileError: []const u8, @@ -641,6 +642,14 @@ const DocData = struct { options, w, ), + .typeOf_peer => |v| { + try w.print("{{ \"typeOf_peer\": [", .{}); + for (v) |c, i| { + const comma = if (i == v.len - 1) "]}" else ",\n"; + try c.jsonStringify(options, w); + try w.print("{s}", .{comma}); + } + }, .refPath => |v| { try w.print("{{ \"refPath\": [", .{}); for (v) |c, i| { @@ -1509,7 +1518,8 @@ fn walkInstruction( .expr = .{ .type = type_slot_index }, }; }, - .param_anytype => { + .param_anytype, .param_anytype_comptime => { + // @check if .param_anytype_comptime can be here // Analysis of anytype function params happens in `.func`. // This switch case handles the case where an expression depends // on an anytype field. E.g.: `fn foo(bar: anytype) @TypeOf(bar)`. @@ -1527,6 +1537,13 @@ fn walkInstruction( const pl_tok = data[inst_index].pl_tok; const extra = file.zir.extraData(Zir.Inst.Param, pl_tok.payload_index); const name = file.zir.nullTerminatedString(extra.data.name); + + std.debug.print("param\n", .{}); + std.debug.print("pl_tok = {any}\n", .{pl_tok}); + std.debug.print("extra = {any}\n", .{extra}); + std.debug.print("name = {any}\n", .{name}); + std.debug.print("param\n", .{}); + const cte_slot_index = self.comptime_exprs.items.len; try self.comptime_exprs.append(self.arena, .{ .code = name, @@ -1595,7 +1612,22 @@ fn walkInstruction( ); return self.cteTodo(@tagName(extended.opcode)); }, + .typeof_peer => { + // Zir says it's a NodeMultiOp but in this case it's TypeOfPeer + const extra = file.zir.extraData(Zir.Inst.TypeOfPeer, extended.operand); + const args = file.zir.refSlice(extra.end, extended.small); + const operand_index = self.exprs.items.len; + for (args) |arg, idx| { + const wr = try self.walkRef(file, parent_scope, arg, idx == 0); + try self.exprs.append(self.arena, wr.expr); + } + + return DocData.WalkResult{ + .typeRef = .{ .type = @enumToInt(Ref.void_type) }, + .expr = .{ .typeOf_peer = self.exprs.items[operand_index..] }, + }; + }, .opaque_decl => return self.cteTodo("opaque {...}"), .variable => { const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small);