authorgravatar for vallahor91@gmail.comVallahor <vallahor91@gmail.com> 2022-05-26 22:18:55-03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-19 19:10:11-07:00
log4bd359a8498e3c239a03abc4f84bb18c0e5617ae
tree06537100913682486f2ec77ebb5a2706adbfb98a
parent17928428082768497d909b3fd55615be21a7660c

add: handling typeof_peer


2 files changed, 72 insertions(+), 4 deletions(-)

lib/docs/main.js+39-3
......@@ -1083,9 +1083,23 @@ var zigAnalysis;
10831083 struct_body += "}";
10841084 return struct_body;
10851085 }
1086 case "typeOf_peer": {
1087 console.log(expr)
1088 let payloadHtml = "@TypeOf("
1089 for (let i = 0; i < expr.typeOf_peer.length; i++) {
1090 payloadHtml += exprName(expr.typeOf_peer[i], {wantHtml: true, wantLink:true});
1091 if (i !== expr.typeOf_peer.length - 1) {
1092 payloadHtml += ", ";
1093 }
1094 }
1095 payloadHtml += ")";
1096 console.log(payloadHtml)
1097 return payloadHtml;
1098
1099 }
10861100 case "typeOf": {
10871101 const typeRefArg = zigAnalysis.exprs[expr.typeOf];
1088 let payloadHtml = "@TypeOf(" + exprName(typeRefArg) + ")";
1102 let payloadHtml = "@TypeOf(" + exprName(typeRefArg, {wantHtml: true, wantLink:true}) + ")";
10891103 return payloadHtml;
10901104 }
10911105 case "null": {
......@@ -1432,6 +1446,30 @@ var zigAnalysis;
14321446 if (isVarArgs && i === fnObj.params.length - 1) {
14331447 payloadHtml += '...';
14341448 }
1449 else if ("typeOf" in value) {
1450 if (opts.wantHtml) {
1451 payloadHtml += '<a href="">';
1452 payloadHtml +=
1453 '<span class="tok-kw" style="color:lightblue;">'
1454 + exprName(value, opts) + '</span>';
1455 payloadHtml += '</a>';
1456 } else {
1457 payloadHtml += exprName(value, opts);
1458 }
1459
1460 }
1461 else if ("typeOf_peer" in value) {
1462 if (opts.wantHtml) {
1463 payloadHtml += '<a href="">';
1464 payloadHtml +=
1465 '<span class="tok-kw" style="color:lightblue;">'
1466 + exprName(value, opts) + '</span>';
1467 payloadHtml += '</a>';
1468 } else {
1469 payloadHtml += exprName(value, opts);
1470 }
1471
1472 }
14351473 else if ("declRef" in value) {
14361474 if (opts.wantHtml) {
14371475 payloadHtml += '<a href="">';
......@@ -1454,7 +1492,6 @@ var zigAnalysis;
14541492 } else {
14551493 payloadHtml += exprName(value, opts);
14561494 }
1457
14581495 }
14591496 else if ("refPath" in value) {
14601497 if (opts.wantHtml) {
......@@ -1466,7 +1503,6 @@ var zigAnalysis;
14661503 } else {
14671504 payloadHtml += exprName(value, opts);
14681505 }
1469
14701506 } else if ("type" in value) {
14711507 let name = exprName(value, {
14721508 wantHtml: false,
src/Autodoc.zig+33-1
......@@ -575,6 +575,7 @@ const DocData = struct {
575575 call: usize, // index in `calls`
576576 enumLiteral: []const u8, // direct value
577577 typeOf: usize, // index in `exprs`
578 typeOf_peer: []Expr,
578579 as: As,
579580 sizeOf: usize, // index in `exprs`
580581 compileError: []const u8,
......@@ -641,6 +642,14 @@ const DocData = struct {
641642 options,
642643 w,
643644 ),
645 .typeOf_peer => |v| {
646 try w.print("{{ \"typeOf_peer\": [", .{});
647 for (v) |c, i| {
648 const comma = if (i == v.len - 1) "]}" else ",\n";
649 try c.jsonStringify(options, w);
650 try w.print("{s}", .{comma});
651 }
652 },
644653 .refPath => |v| {
645654 try w.print("{{ \"refPath\": [", .{});
646655 for (v) |c, i| {
......@@ -1509,7 +1518,8 @@ fn walkInstruction(
15091518 .expr = .{ .type = type_slot_index },
15101519 };
15111520 },
1512 .param_anytype => {
1521 .param_anytype, .param_anytype_comptime => {
1522 // @check if .param_anytype_comptime can be here
15131523 // Analysis of anytype function params happens in `.func`.
15141524 // This switch case handles the case where an expression depends
15151525 // on an anytype field. E.g.: `fn foo(bar: anytype) @TypeOf(bar)`.
......@@ -1527,6 +1537,13 @@ fn walkInstruction(
15271537 const pl_tok = data[inst_index].pl_tok;
15281538 const extra = file.zir.extraData(Zir.Inst.Param, pl_tok.payload_index);
15291539 const name = file.zir.nullTerminatedString(extra.data.name);
1540
1541 std.debug.print("param\n", .{});
1542 std.debug.print("pl_tok = {any}\n", .{pl_tok});
1543 std.debug.print("extra = {any}\n", .{extra});
1544 std.debug.print("name = {any}\n", .{name});
1545 std.debug.print("param\n", .{});
1546
15301547 const cte_slot_index = self.comptime_exprs.items.len;
15311548 try self.comptime_exprs.append(self.arena, .{
15321549 .code = name,
......@@ -1595,7 +1612,22 @@ fn walkInstruction(
15951612 );
15961613 return self.cteTodo(@tagName(extended.opcode));
15971614 },
1615 .typeof_peer => {
1616 // Zir says it's a NodeMultiOp but in this case it's TypeOfPeer
1617 const extra = file.zir.extraData(Zir.Inst.TypeOfPeer, extended.operand);
1618 const args = file.zir.refSlice(extra.end, extended.small);
1619 const operand_index = self.exprs.items.len;
1620 for (args) |arg, idx| {
1621 const wr = try self.walkRef(file, parent_scope, arg, idx == 0);
1622
1623 try self.exprs.append(self.arena, wr.expr);
1624 }
15981625
1626 return DocData.WalkResult{
1627 .typeRef = .{ .type = @enumToInt(Ref.void_type) },
1628 .expr = .{ .typeOf_peer = self.exprs.items[operand_index..] },
1629 };
1630 },
15991631 .opaque_decl => return self.cteTodo("opaque {...}"),
16001632 .variable => {
16011633 const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small);