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;...@@ -1083,9 +1083,23 @@ var zigAnalysis;
1083 struct_body += "}";1083 struct_body += "}";
1084 return struct_body;1084 return struct_body;
1085 }1085 }
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 }
1086 case "typeOf": {1100 case "typeOf": {
1087 const typeRefArg = zigAnalysis.exprs[expr.typeOf];1101 const typeRefArg = zigAnalysis.exprs[expr.typeOf];
1088 let payloadHtml = "@TypeOf(" + exprName(typeRefArg) + ")";1102 let payloadHtml = "@TypeOf(" + exprName(typeRefArg, {wantHtml: true, wantLink:true}) + ")";
1089 return payloadHtml;1103 return payloadHtml;
1090 }1104 }
1091 case "null": {1105 case "null": {
...@@ -1432,6 +1446,30 @@ var zigAnalysis;...@@ -1432,6 +1446,30 @@ var zigAnalysis;
1432 if (isVarArgs && i === fnObj.params.length - 1) {1446 if (isVarArgs && i === fnObj.params.length - 1) {
1433 payloadHtml += '...';1447 payloadHtml += '...';
1434 } 1448 }
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 }
1435 else if ("declRef" in value) {1473 else if ("declRef" in value) {
1436 if (opts.wantHtml) {1474 if (opts.wantHtml) {
1437 payloadHtml += '<a href="">';1475 payloadHtml += '<a href="">';
...@@ -1454,7 +1492,6 @@ var zigAnalysis;...@@ -1454,7 +1492,6 @@ var zigAnalysis;
1454 } else {1492 } else {
1455 payloadHtml += exprName(value, opts);1493 payloadHtml += exprName(value, opts);
1456 }1494 }
1457
1458 } 1495 }
1459 else if ("refPath" in value) {1496 else if ("refPath" in value) {
1460 if (opts.wantHtml) {1497 if (opts.wantHtml) {
...@@ -1466,7 +1503,6 @@ var zigAnalysis;...@@ -1466,7 +1503,6 @@ var zigAnalysis;
1466 } else {1503 } else {
1467 payloadHtml += exprName(value, opts);1504 payloadHtml += exprName(value, opts);
1468 }1505 }
1469
1470 } else if ("type" in value) {1506 } else if ("type" in value) {
1471 let name = exprName(value, {1507 let name = exprName(value, {
1472 wantHtml: false,1508 wantHtml: false,
src/Autodoc.zig+33-1
...@@ -575,6 +575,7 @@ const DocData = struct {...@@ -575,6 +575,7 @@ const DocData = struct {
575 call: usize, // index in `calls`575 call: usize, // index in `calls`
576 enumLiteral: []const u8, // direct value576 enumLiteral: []const u8, // direct value
577 typeOf: usize, // index in `exprs`577 typeOf: usize, // index in `exprs`
578 typeOf_peer: []Expr,
578 as: As,579 as: As,
579 sizeOf: usize, // index in `exprs`580 sizeOf: usize, // index in `exprs`
580 compileError: []const u8,581 compileError: []const u8,
...@@ -641,6 +642,14 @@ const DocData = struct {...@@ -641,6 +642,14 @@ const DocData = struct {
641 options,642 options,
642 w,643 w,
643 ),644 ),
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 },
644 .refPath => |v| {653 .refPath => |v| {
645 try w.print("{{ \"refPath\": [", .{});654 try w.print("{{ \"refPath\": [", .{});
646 for (v) |c, i| {655 for (v) |c, i| {
...@@ -1509,7 +1518,8 @@ fn walkInstruction(...@@ -1509,7 +1518,8 @@ fn walkInstruction(
1509 .expr = .{ .type = type_slot_index },1518 .expr = .{ .type = type_slot_index },
1510 };1519 };
1511 },1520 },
1512 .param_anytype => {1521 .param_anytype, .param_anytype_comptime => {
1522 // @check if .param_anytype_comptime can be here
1513 // Analysis of anytype function params happens in `.func`.1523 // Analysis of anytype function params happens in `.func`.
1514 // This switch case handles the case where an expression depends1524 // This switch case handles the case where an expression depends
1515 // on an anytype field. E.g.: `fn foo(bar: anytype) @TypeOf(bar)`.1525 // on an anytype field. E.g.: `fn foo(bar: anytype) @TypeOf(bar)`.
...@@ -1527,6 +1537,13 @@ fn walkInstruction(...@@ -1527,6 +1537,13 @@ fn walkInstruction(
1527 const pl_tok = data[inst_index].pl_tok;1537 const pl_tok = data[inst_index].pl_tok;
1528 const extra = file.zir.extraData(Zir.Inst.Param, pl_tok.payload_index);1538 const extra = file.zir.extraData(Zir.Inst.Param, pl_tok.payload_index);
1529 const name = file.zir.nullTerminatedString(extra.data.name);1539 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
1530 const cte_slot_index = self.comptime_exprs.items.len;1547 const cte_slot_index = self.comptime_exprs.items.len;
1531 try self.comptime_exprs.append(self.arena, .{1548 try self.comptime_exprs.append(self.arena, .{
1532 .code = name,1549 .code = name,
...@@ -1595,7 +1612,22 @@ fn walkInstruction(...@@ -1595,7 +1612,22 @@ fn walkInstruction(
1595 );1612 );
1596 return self.cteTodo(@tagName(extended.opcode));1613 return self.cteTodo(@tagName(extended.opcode));
1597 },1614 },
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 },
1599 .opaque_decl => return self.cteTodo("opaque {...}"),1631 .opaque_decl => return self.cteTodo("opaque {...}"),
1600 .variable => {1632 .variable => {
1601 const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small);1633 const small = @bitCast(Zir.Inst.ExtendedVar.Small, extended.small);