From a0ec87be717094b080a98595cfd4ceb0aec38cdf Mon Sep 17 00:00:00 2001 From: Vallahor Date: Tue, 31 May 2022 19:48:00 -0300 Subject: [PATCH] add: merge_error_sets and @alignOf() need a checkin to confirm it's fully work --- lib/docs/main.js | 31 +++++++++- src/Autodoc.zig | 151 ++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 150 insertions(+), 32 deletions(-) diff --git a/lib/docs/main.js b/lib/docs/main.js index f9d5f0383b..3c84b56aea 100644 --- a/lib/docs/main.js +++ b/lib/docs/main.js @@ -1093,16 +1093,16 @@ var zigAnalysis; console.log(caseIndex); console.log(item); if (item['enumLiteral']) { - payloadHtml += " " + " ." + exprName(item, opts) + " = " + "
"; + payloadHtml += " " + " ." + exprName(item, opts) + " => {} " + "
"; continue; } - payloadHtml += " " + exprName(item, opts) + " = " + "
"; + payloadHtml += " " + exprName(item, opts) + " => {} " + "
"; } if (expr.switchOp.else_index !== 0) { const else_index = expr.switchOp.else_index; const item = zigAnalysis.exprs[else_index]; console.log(item); - payloadHtml += " " + "else" + " = " + "
"; + payloadHtml += " " + "else" + " => {} " + "
"; } payloadHtml += "}"; return payloadHtml; @@ -1239,6 +1239,13 @@ var zigAnalysis; } return print_lhs + " " + operator + " " + print_rhs; + } + case "errorSets": { + const errUnionObj = zigAnalysis.types[expr.errorSets]; + let lhs = exprName(errUnionObj.lhs, opts); + let rhs = exprName(errUnionObj.rhs, opts); + return lhs + " || " + rhs; + } case "errorUnion": { const errUnionObj = zigAnalysis.types[expr.errorUnion]; @@ -1281,6 +1288,11 @@ var zigAnalysis; return payloadHtml; } + case "alignOf": { + const alignRefArg = zigAnalysis.exprs[expr.alignOf]; + let payloadHtml = "@alignOf(" + exprName(alignRefArg, {wantHtml: true, wantLink:true}) + ")"; + return payloadHtml; + } case "typeOf": { const typeRefArg = zigAnalysis.exprs[expr.typeOf]; let payloadHtml = "@TypeOf(" + exprName(typeRefArg, {wantHtml: true, wantLink:true}) + ")"; @@ -1634,6 +1646,18 @@ var zigAnalysis; if (isVarArgs && i === fnObj.params.length - 1) { payloadHtml += '...'; } + else if ("alignOf" in value) { + if (opts.wantHtml) { + payloadHtml += ''; + payloadHtml += + '' + + exprName(value, opts) + ''; + payloadHtml += ''; + } else { + payloadHtml += exprName(value, opts); + } + + } else if ("typeOf" in value) { if (opts.wantHtml) { payloadHtml += ''; @@ -1728,6 +1752,7 @@ var zigAnalysis; } if (fnObj.is_inferred_error) { + console.log(fnObj) payloadHtml += "!"; } if (fnObj.ret != null) { diff --git a/src/Autodoc.zig b/src/Autodoc.zig index f9b15b0c2d..9f24497a48 100644 --- a/src/Autodoc.zig +++ b/src/Autodoc.zig @@ -657,6 +657,7 @@ const DocData = struct { array: []usize, // index in `exprs` call: usize, // index in `calls` enumLiteral: []const u8, // direct value + alignOf: usize, // index in `exprs` typeOf: usize, // index in `exprs` typeOf_peer: []usize, errorUnion: usize, // index in `exprs` @@ -665,6 +666,7 @@ const DocData = struct { bitSizeOf: usize, // index in `exprs` enumToInt: usize, // index in `exprs` compileError: []const u8, + errorSets: usize, string: []const u8, // direct value switchIndex: usize, // index in `exprs` switchOp: SwitchOp, @@ -693,9 +695,6 @@ const DocData = struct { const SwitchOp = struct { cases: []usize, else_index: ?usize, - // body_cases: ?[]usize, - - // const Case = struct { lhs: Expr, rhs: Expr }; }; const As = struct { typeRefArg: ?usize, // index in `exprs` @@ -722,7 +721,7 @@ const DocData = struct { \\{{ "{s}":{{}} }} , .{@tagName(self)}); }, - .type, .comptimeExpr, .call, .this, .declRef, .typeOf, .errorUnion => |v| { + .type, .comptimeExpr, .call, .this, .declRef, .typeOf, .errorUnion, .errorSets, .alignOf => |v| { try w.print( \\{{ "{s}":{} }} , .{ @tagName(self), v }); @@ -1792,6 +1791,33 @@ fn walkInstruction( .expr = .{ .errorUnion = type_slot_index }, }; }, + .merge_error_sets => { + const pl_node = data[inst_index].pl_node; + const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); + + var lhs: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.lhs, + false, + ); + var rhs: DocData.WalkResult = try self.walkRef( + file, + parent_scope, + extra.data.rhs, + false, + ); + const type_slot_index = self.types.items.len; + try self.types.append(self.arena, .{ .ErrorUnion = .{ + .lhs = lhs.expr, + .rhs = rhs.expr, + } }); + + return DocData.WalkResult{ + .typeRef = .{ .type = @enumToInt(Ref.type_type) }, + .expr = .{ .errorSets = type_slot_index }, + }; + }, .elem_type => { const un_node = data[inst_index].un_node; @@ -2228,15 +2254,17 @@ fn walkInstruction( }; }, .switch_block => { + // WIP const pl_node = data[inst_index].pl_node; const extra = file.zir.extraData(Zir.Inst.SwitchBlock, pl_node.payload_index); const array_data = try self.arena.alloc(usize, extra.data.bits.scalar_cases_len); var extra_index = extra.end; - const sep = "=" ** 200; - std.debug.print("{s}\n", .{sep}); - std.debug.print("pl_node = {any}\n", .{pl_node}); - std.debug.print("extra = {any}\n", .{extra}); + // const sep = "=" ** 200; + // std.debug.print("{s}\n", .{sep}); + // std.debug.print("pl_node = {any}\n", .{pl_node}); + // std.debug.print("extra = {any}\n", .{extra}); + // std.debug.print("{s}\n", .{sep}); const multi_cases_len = if (extra.data.bits.has_multi_cases) blk: { const multi_cases_len = file.zir.extra[extra_index]; @@ -2251,12 +2279,12 @@ fn walkInstruction( extra_index += 1; const body = file.zir.extra[extra_index..][0..body_len]; extra_index += body.len; - for (body) |body_member| { + for (body) |_| { const item_ref = @intToEnum(Ref, file.zir.extra[extra_index]); const item = try self.walkRef(file, parent_scope, item_ref, false); - std.debug.print("prong item_ref = {any}\n", .{item_ref}); - std.debug.print("prong item = {any}\n", .{item}); - std.debug.print("body member = {any}\n", .{body_member}); + // std.debug.print("prong item_ref = {any}\n", .{item_ref}); + // std.debug.print("prong item = {any}\n", .{item}); + // std.debug.print("body member = {any}\n", .{body_member}); const item_index = self.exprs.items.len; try self.exprs.append(self.arena, item.expr); else_index = item_index; @@ -2279,15 +2307,16 @@ fn walkInstruction( array_data[scalar_i] = item.expr.as.exprArg; const body_ref = @intToEnum(Ref, file.zir.extra[extra_index]); - const body_item = try self.walkRef(file, parent_scope, item_ref, false); + const body_item = try self.walkRef(file, parent_scope, body_ref, false); + _ = body_item; array_data[scalar_i] = item.expr.as.exprArg; - std.debug.print("{s}\n", .{sep}); - std.debug.print("body item_ref = {any}\n", .{item_ref}); - std.debug.print("body item = {any}\n", .{item}); - std.debug.print("body_len scalar cases = {any}\n", .{body_ref}); - std.debug.print("body scalar cases = {any}\n", .{body_item}); - std.debug.print("{s}\n", .{sep}); + // std.debug.print("{s}\n", .{sep}); + // std.debug.print("body item_ref = {any}\n", .{item_ref}); + // std.debug.print("body item = {any}\n", .{item}); + // std.debug.print("body_len scalar cases = {any}\n", .{body_ref}); + // std.debug.print("body scalar cases = {any}\n", .{body_item}); + // std.debug.print("{s}\n", .{sep}); } } { @@ -2311,14 +2340,15 @@ fn walkInstruction( const body = file.zir.extra[extra_index..][0..body_len]; extra_index += body_len; + _ = body; - std.debug.print("body multi_i = {any}\n", .{body}); - std.debug.print("items = {any}\n", .{items}); + // std.debug.print("body multi_i = {any}\n", .{body}); + // std.debug.print("items = {any}\n", .{items}); } } // std.debug.print("multi_cases_len = {}\n", .{multi_cases_len}); - std.debug.print("{s}\n", .{sep}); + // std.debug.print("{s}\n", .{sep}); const switch_index = self.exprs.items.len; try self.exprs.append(self.arena, .{ .switchOp = .{ .cases = array_data, .else_index = else_index } }); @@ -2368,6 +2398,26 @@ fn walkInstruction( .expr = .{ .typeOf = operand_index }, }; }, + .align_of => { + // WIP + // not fully working + // @alignOf() with some pointer type it's not even called in js + // @alignOf([*]u8) are being rendered as [*]u8 + const un_node = data[inst_index].un_node; + const operand = try self.walkRef( + file, + parent_scope, + un_node.operand, + need_type, + ); + const operand_index = self.exprs.items.len; + try self.exprs.append(self.arena, operand.expr); + + return DocData.WalkResult{ + .typeRef = operand.typeRef, + .expr = .{ .alignOf = operand_index }, + }; + }, .typeof_builtin => { const pl_node = data[inst_index].pl_node; const extra = file.zir.extraData(Zir.Inst.Block, pl_node.payload_index); @@ -2388,6 +2438,31 @@ fn walkInstruction( .expr = .{ .typeOf = operand_index }, }; }, + .typeof_log2_int_type => { + // @check + const un_node = data[inst_index].un_node; + const operand = try self.walkRef( + file, + parent_scope, + un_node.operand, + need_type, + ); + + // WIP + // const sep = "=" ** 200; + // std.debug.print("{s}\n", .{sep}); + // std.debug.print("un_node = {any}\n", .{un_node}); + // std.debug.print("operand = {any}\n", .{operand}); + // std.debug.print("{s}\n", .{sep}); + + const operand_index = self.exprs.items.len; + try self.exprs.append(self.arena, operand.expr); + + return DocData.WalkResult{ + .typeRef = operand.typeRef, + .expr = .{ .typeOf = operand_index }, + }; + }, .type_info => { // @check const un_node = data[inst_index].un_node; @@ -2536,6 +2611,23 @@ fn walkInstruction( .expr = .{ .type = self.types.items.len - 1 }, }; }, + .float128 => { + const pl_node = data[inst_index].pl_node; + const extra = file.zir.extraData(Zir.Inst.Float128, pl_node.payload_index); + _ = extra; + // const sep = "=" ** 200; + // std.debug.print("{s}\n", .{sep}); + // std.debug.print("pl_node = {any}\n", .{pl_node}); + // std.debug.print("extra = {any}\n", .{extra}); + // std.debug.print("{s}\n", .{sep}); + // printWithContext( + // file, + // inst_index, + // "TODO: implement `{s}` for walkInstruction\n\n", + // .{@tagName(tags[inst_index])}, + // ); + return self.cteTodo(@tagName(tags[inst_index])); + }, .block => { const res = DocData.WalkResult{ .expr = .{ .comptimeExpr = self.comptime_exprs.items.len, @@ -3746,14 +3838,15 @@ fn tryResolveRefPath( } // if we got here, our search failed - printWithContext( - file, - inst_index, - "failed to match `{s}` in struct", - .{child_string}, - ); + // printWithContext( + // file, + // inst_index, + // "failed to match `{s}` in struct", + // .{child_string}, + // ); // path[i + 1] = (try self.cteTodo("match failure")).expr; - // this are working, check c.zig + // + // that's working path[i + 1] = (try self.cteTodo(child_string)).expr; continue :outer; },