Commit 4bd359a849

Vallahor <vallahor91@gmail.com>
2022-05-27 03:18:55
add: handling typeof_peer
1 parent 1792842
Changed files (2)
lib
docs
src
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 += '<a href="">';
+                                      payloadHtml +=
+                                        '<span class="tok-kw" style="color:lightblue;">'
+                                        + exprName(value, opts) + '</span>';
+                                      payloadHtml += '</a>';
+                                    } else {
+                                      payloadHtml += exprName(value, opts);
+                                    }
+
+                                  } 
+                                  else if ("typeOf_peer" in value) {
+                                    if (opts.wantHtml) {
+                                      payloadHtml += '<a href="">';
+                                      payloadHtml +=
+                                        '<span class="tok-kw" style="color:lightblue;">'
+                                        + exprName(value, opts) + '</span>';
+                                      payloadHtml += '</a>';
+                                    } else {
+                                      payloadHtml += exprName(value, opts);
+                                    }
+
+                                  } 
                                   else if ("declRef" in value) {
                                     if (opts.wantHtml) {
                                       payloadHtml += '<a href="">';
@@ -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,
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);