Commit 1f5df0e034

Vallahor <vallahor91@gmail.com>
2022-06-01 21:06:49
add: slice_start, slice_end and slice_sentinel
1 parent b9fa910
Changed files (2)
lib
docs
src
lib/docs/main.js
@@ -1086,7 +1086,33 @@ var zigAnalysis;
             return literal;
           }
           case "void": {
-            return "VOID WIP";
+            return "void";
+          }
+          case "slice":{
+            let payloadHtml = "";
+            const lhsExpr = zigAnalysis.exprs[expr.slice.lhs];
+            const startExpr = zigAnalysis.exprs[expr.slice.start];
+            console.log(expr)
+            let decl = exprName(lhsExpr);
+            let start = exprName(startExpr);
+            let end = "";
+            let sentinel = "";
+            if (expr.slice['end']) {
+              const endExpr = zigAnalysis.exprs[expr.slice.end];
+              let end_ = exprName(endExpr);
+              end += end_;
+            }
+            if (expr.slice['sentinel']) {
+              const sentinelExpr = zigAnalysis.exprs[expr.slice.sentinel];
+              let sentinel_ = exprName(sentinelExpr);
+              sentinel += " :" + sentinel_;
+            }
+            payloadHtml += decl + "["+ start + ".." + end + sentinel + "]";
+            return payloadHtml;
+          }
+          case "sliceIndex": {
+            const sliceIndex = zigAnalysis.exprs[expr.sliceIndex];
+            return exprName(sliceIndex, opts);
           }
           case "switchOp":{
             let payloadHtml = "switch() {</br>";
@@ -1257,6 +1283,7 @@ var zigAnalysis;
           }
           case "builtinBinIndex" : {
             const builtinBinIndex = zigAnalysis.exprs[expr.builtinBinIndex];
+            console.log(expr)
             return exprName(builtinBinIndex, opts);
           }
           case "builtinBin": {
@@ -1265,6 +1292,8 @@ var zigAnalysis;
             let lhs = exprName(lhsOp, opts);
             let rhs = exprName(rhsOp, opts);
 
+            console.log(expr);
+
             let payloadHtml = "@";
             switch (expr.builtinBin.name) {
               case "float_to_int": {
@@ -1311,6 +1340,26 @@ var zigAnalysis;
                 payloadHtml += "hasField";
                 break;
               }
+              case "clz": {
+                payloadHtml += "clz";
+                break;
+              }
+              case "ctz": {
+                payloadHtml += "ctz";
+                break;
+              }
+              case "pop_count": {
+                payloadHtml += "popCount";
+                break;
+              }
+              case "byte_swap": {
+                payloadHtml += "byteSwap";
+                break;
+              }
+              case "bit_reverse": {
+                payloadHtml += "bitReverse";
+                break;
+              }
               default: console.log("builtin function not handled yet or doesn't exist!");
             };
             return payloadHtml + "(" + lhs + ", " + rhs + ")";
src/Autodoc.zig
@@ -668,6 +668,8 @@ const DocData = struct {
         compileError: []const u8,
         errorSets: usize,
         string: []const u8, // direct value
+        sliceIndex: usize,
+        slice: Slice,
         builtin: Builtin,
         builtinIndex: usize,
         builtinBin: BuiltinBin,
@@ -709,6 +711,12 @@ const DocData = struct {
             name: []const u8 = "", // fn name
             param: usize, // index in `exprs`
         };
+        const Slice = struct {
+            lhs: usize, // index in `exprs`
+            start: usize,
+            end: ?usize = null,
+            sentinel: ?usize = null, // index in `exprs`
+        };
         const As = struct {
             typeRefArg: ?usize, // index in `exprs`
             exprArg: usize, // index in `exprs`
@@ -833,6 +841,16 @@ const DocData = struct {
                     options,
                     w,
                 ),
+                .slice => |v| try std.json.stringify(
+                    struct { slice: Slice }{ .slice = v },
+                    options,
+                    w,
+                ),
+                .sliceIndex => |v| try std.json.stringify(
+                    struct { sliceIndex: usize }{ .sliceIndex = v },
+                    options,
+                    w,
+                ),
                 .typeOf_peer => |v| try std.json.stringify(
                     struct { typeOf_peer: []usize }{ .typeOf_peer = v },
                     options,
@@ -1106,6 +1124,123 @@ fn walkInstruction(
         //         .expr = .{ .binOpIndex = binop_index },
         //     };
         // },
+        .slice_start => {
+            const pl_node = data[inst_index].pl_node;
+            const extra = file.zir.extraData(Zir.Inst.SliceStart, pl_node.payload_index);
+
+            const slice_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } });
+
+            var lhs: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.lhs,
+                false,
+            );
+            var start: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.start,
+                false,
+            );
+
+            const lhs_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, lhs.expr);
+            const start_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, start.expr);
+            self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index } };
+
+            return DocData.WalkResult{
+                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+                .expr = .{ .sliceIndex = slice_index },
+            };
+        },
+        .slice_end => {
+            const pl_node = data[inst_index].pl_node;
+            const extra = file.zir.extraData(Zir.Inst.SliceEnd, pl_node.payload_index);
+
+            const slice_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } });
+
+            var lhs: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.lhs,
+                false,
+            );
+            var start: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.start,
+                false,
+            );
+            var end: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.end,
+                false,
+            );
+
+            const lhs_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, lhs.expr);
+            const start_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, start.expr);
+            const end_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, end.expr);
+            self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index, .end = end_index } };
+
+            return DocData.WalkResult{
+                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+                .expr = .{ .sliceIndex = slice_index },
+            };
+        },
+        .slice_sentinel => {
+            const pl_node = data[inst_index].pl_node;
+            const extra = file.zir.extraData(Zir.Inst.SliceSentinel, pl_node.payload_index);
+
+            const slice_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, .{ .slice = .{ .lhs = 0, .start = 0 } });
+
+            var lhs: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.lhs,
+                false,
+            );
+            var start: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.start,
+                false,
+            );
+            var end: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.end,
+                false,
+            );
+            var sentinel: DocData.WalkResult = try self.walkRef(
+                file,
+                parent_scope,
+                extra.data.sentinel,
+                false,
+            );
+
+            const lhs_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, lhs.expr);
+            const start_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, start.expr);
+            const end_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, end.expr);
+            const sentinel_index = self.exprs.items.len;
+            try self.exprs.append(self.arena, sentinel.expr);
+            self.exprs.items[slice_index] = .{ .slice = .{ .lhs = lhs_index, .start = start_index, .end = end_index, .sentinel = sentinel_index } };
+
+            return DocData.WalkResult{
+                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
+                .expr = .{ .sliceIndex = slice_index },
+            };
+        },
         .bit_or => {
             const pl_node = data[inst_index].pl_node;
             const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
@@ -1924,6 +2059,7 @@ fn walkInstruction(
             };
         },
 
+        // builtin functions
         .align_of,
         .bool_to_int,
         .embed_file,
@@ -1966,6 +2102,8 @@ fn walkInstruction(
                 .expr = .{ .builtinIndex = bin_index },
             };
         },
+        // @check
+        // .clz, .ctz, .pop_count, .byte_swap, .bit_reverse
         .float_to_int, .int_to_float, .int_to_ptr, .int_to_enum, .float_cast, .int_cast, .ptr_cast, .truncate, .align_cast, .has_decl, .has_field => {
             const pl_node = data[inst_index].pl_node;
             const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);