From c449788b11d0184b356c6258fad33cc20813fd7d Mon Sep 17 00:00:00 2001 From: Vallahor Date: Fri, 27 May 2022 00:04:02 -0300 Subject: [PATCH] fix: typeOf_peer working in all cases --- lib/docs/main.js | 3 ++- src/Autodoc.zig | 51 ++++++++++++++++++++++++++++++------------------ 2 files changed, 34 insertions(+), 20 deletions(-) diff --git a/lib/docs/main.js b/lib/docs/main.js index 4a59d5d2bc..ccc74697b9 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -1087,7 +1087,8 @@ var zigAnalysis; 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}); + let elem = zigAnalysis.exprs[expr.typeOf_peer[i]]; + payloadHtml += exprName(elem, {wantHtml: true, wantLink:true}); if (i !== expr.typeOf_peer.length - 1) { payloadHtml += ", "; } diff --git a/src/Autodoc.zig b/src/Autodoc.zig index 655fb5339d..db553c584c 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -575,7 +575,7 @@ const DocData = struct { call: usize, // index in `calls` enumLiteral: []const u8, // direct value typeOf: usize, // index in `exprs` - typeOf_peer: []Expr, + typeOf_peer: []usize, as: As, sizeOf: usize, // index in `exprs` compileError: []const u8, @@ -642,14 +642,6 @@ 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| { @@ -658,6 +650,11 @@ const DocData = struct { try w.print("{s}", .{comma}); } }, + .typeOf_peer => |v| try std.json.stringify( + struct { typeOf_peer: []usize }{ .typeOf_peer = v }, + options, + w, + ), .array => |v| try std.json.stringify( struct { @"array": []usize }{ .@"array" = v }, options, @@ -1538,12 +1535,6 @@ fn walkInstruction( 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, @@ -1616,17 +1607,38 @@ fn walkInstruction( // 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; + const array_data = try self.arena.alloc(usize, args.len); + + var array_type: ?DocData.Expr = null; for (args) |arg, idx| { const wr = try self.walkRef(file, parent_scope, arg, idx == 0); + if (idx == 0) { + array_type = wr.typeRef; + } + const expr_index = self.exprs.items.len; try self.exprs.append(self.arena, wr.expr); + array_data[idx] = expr_index; } - return DocData.WalkResult{ - .typeRef = .{ .type = @enumToInt(Ref.void_type) }, - .expr = .{ .typeOf_peer = self.exprs.items[operand_index..] }, + const type_slot_index = self.types.items.len; + try self.types.append(self.arena, .{ + .Array = .{ + .len = .{ + .int = .{ + .value = args.len, + .negated = false, + }, + }, + .child = array_type.?, + }, + }); + const result = DocData.WalkResult{ + .typeRef = .{ .type = type_slot_index }, + .expr = .{ .typeOf_peer = array_data }, }; + + return result; }, .opaque_decl => return self.cteTodo("opaque {...}"), .variable => { @@ -2682,6 +2694,7 @@ fn analyzeFunction( const last_instr_index = fn_info.ret_ty_body[fn_info.ret_ty_body.len - 1]; const break_operand = data[last_instr_index].@"break".operand; const wr = try self.walkRef(file, scope, break_operand, false); + break :blk wr; };