Commit 9613aca417

Vallahor <vallahor91@gmail.com>
2022-06-03 03:33:28
autodoc: refactoring binOp
1 parent 918475e
Changed files (2)
lib
docs
src
lib/docs/main.js
@@ -1114,22 +1114,14 @@ var zigAnalysis;
             return exprName(sliceIndex, opts);
           }
           case "switchOp":{
-            let payloadHtml = "switch() {</br>";
-            for (let i = 0; i < expr.switchOp.cases.length; i++) {
-              const caseIndex = expr.switchOp.cases[i];
-              const item = zigAnalysis.exprs[caseIndex];
-              if (item['enumLiteral']) {
-                payloadHtml += "   " + " ." + exprName(item, opts) + " => {} " + "</br>";
-                continue;
-              }
-              payloadHtml += "    " + exprName(item, opts) + " => {} " + "</br>";
-            }
-              if (expr.switchOp.else_index !== 0) {
-                const else_index = expr.switchOp.else_index;
-                const item = zigAnalysis.exprs[else_index];
-                payloadHtml += "    " + "else" + " => {} " + "</br>";
-              }
-              payloadHtml += "}";
+            let condExpr = zigAnalysis.exprs[expr.switchOp.cond_index];
+            let node_name_ = expr.switchOp.node_name;
+            let file_name = expr.switchOp.file_name;
+            let line_start = expr.switchOp.line_start;
+            let payloadHtml = "";
+            let cond = exprName(condExpr, opts);
+            payloadHtml += "</br>" + "node_name: " + node_name_ + "</br>" + "file: " + file_name + "</br>" + "line_start: " + line_start + "</br>";
+            payloadHtml += "switch(" + cond + ") {...}";
             return payloadHtml;
           }
           case "switchIndex": {
@@ -1279,7 +1271,6 @@ var zigAnalysis;
           }
           case "builtinBinIndex" : {
             const builtinBinIndex = zigAnalysis.exprs[expr.builtinBinIndex];
-            console.log(expr)
             return exprName(builtinBinIndex, opts);
           }
           case "builtinBin": {
@@ -1288,8 +1279,6 @@ 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": {
@@ -1356,6 +1345,50 @@ var zigAnalysis;
                 payloadHtml += "bitReverse";
                 break;
               }
+              case "div_exact": {
+                payloadHtml +=  "divExact"; 
+                break;
+              }
+              case "div_floor": {
+                payloadHtml +=  "divFloor"; 
+                break;
+              }
+              case "div_trunc": {
+                payloadHtml +=  "divTrunc"; 
+                break;
+              }
+              case "mod": {
+                payloadHtml +=  "mod"; 
+                break;
+              }
+              case "rem": {
+                payloadHtml +=  "rem"; 
+                break;
+              }
+              case "mod_rem": {
+                payloadHtml +=  "rem"; 
+                break;
+              }
+              case "shl_exact": {
+                payloadHtml +=  "shlExact"; 
+                break;
+              }
+              case "shr_exact": {
+                payloadHtml +=  "shrExact"; 
+                break;
+              }
+              case "bitcast" : {
+                payloadHtml +=  "bitCast"; 
+                break;
+              }
+              case "align_cast" : {
+                payloadHtml +=  "alignCast"; 
+                break;
+              }
+              case "vector_type" : {
+                payloadHtml +=  "Vector"; 
+                break;
+              }
               default: console.log("builtin function not handled yet or doesn't exist!");
             };
             return payloadHtml + "(" + lhs + ", " + rhs + ")";
@@ -1386,97 +1419,79 @@ var zigAnalysis;
             }
 
             let operator = "";
-            // binOp.kind is described at Autodoc.zig
-            // Expr section in BinOp struct
-            switch (expr.binOp.opKind) {
-              case 0: {
+
+            switch (expr.binOp.name) {
+              case "add": {
                 operator += "+";
                 break;
               }
-              case 1: {
+              case "addwrap": {
+                operator += "+%";
+                break;
+              }
+              case "add_sat": {
+                operator += "+|";
+                break;
+              }
+              case "sub": {
                 operator += "-";
                 break;
               }
-              case 2: {
-                operator += "*";
+              case "subwrap": {
+                operator += "-%";
                 break;
               }
-              case 3: {
-                if (!expr.binOp.extact && !expr.binOp.floor && !expr.binOp.trunv) {
-                  operator += "/";
-                  break;
-                }
-                let print_div = "";
-                if (expr.binOp.exact) {
-                  print_div = "@divExact(";
-                }
-                if (expr.binOp.floor) {
-                  print_div = "@divFloor(";
-                }
-                if (expr.binOp.trunc) {
-                  print_div = "@divTrunc(";
-                }
-                return print_div + print_lhs + ", " + print_rhs + ")";
+              case "sub_sat": {
+                operator += "-|";
+                break;
+              }
+              case "mul": {
+                operator += "*";
+                break;
               }
-              case 4: {
-                return "@mod(" + print_lhs + ", " + print_rhs + ")";
+              case "mulwrap": {
+                operator += "*%";
+                break;
               }
-              case 5: {
-                return "@rem(" + print_lhs + ", " + print_rhs + ")";
+              case "mul_sat": {
+                operator += "*|";
+                break;
               }
-              case 6: {
-                // rem_mod
-                return "@rem(" + print_lhs + ", " + print_rhs + ")";
+              case "div": {
+                operator += "/";
+                break;
               }
-              case 7: {
-                if (expr.binOp.exact) {
-                  let print_shl = "@shlExact(";
-                  return print_shl + print_lhs + ", " + print_rhs + ")";
-                }
+              case "shl": {
                 operator += "<<";
                 break;
               }
-              case 8: {
-                if (expr.binOp.exact) {
-                  let print_shr = "@shrExact(";
-                  return print_shr + print_lhs + ", " + print_rhs + ")";
-                }
-                operator += ">>";
+              case "shl_sat": {
+                operator += "<<|";
                 break;
               }
-              case 9 : {
-                return "@bitCast(" + print_lhs + ", " + print_rhs + ")";
+              case "shr": {
+                operator += ">>";
+                break;
               }
-              case 10 : {
+              case "bit_or" : {
                 operator += "|";
                 break;
               }
-              case 11 : {
-                return "@alignCast(" + print_lhs + ", " + print_rhs + ")";
-              }
-              case 12 : {
+              case "bit_and" : {
                 operator += "&";
                 break;
               }
-              case 13 : {
+              case "array_cat" : {
                 operator += "++";
                 break;
               }
-              case 14 : {
+              case "array_mul" : {
                 operator += "**";
                 break;
               }
-              case 15 : {
-                return "@Vector(" + print_lhs + ", " + print_rhs + ")";
-              }
               default: console.log("operator not handled yet or doesn't exist!");
             };
-            if (expr.binOp.wrap) {
-              operator += "%";
-            }
-            if (expr.binOp.sat) {
-              operator += "|";
-            }
+
             return print_lhs + " " + operator + " " + print_rhs;
 
           }
@@ -1966,8 +1981,6 @@ var zigAnalysis;
                                       payloadHtml += '<span class="tok-kw">' + escapeHtml(name) + '</span>';
                                   } else if ("binOpIndex" in value) {
                                     payloadHtml += exprName(value, opts);
-                                    console.log(value);
-                                    console.log(payloadHtml);
                                   }else if ("comptimeExpr" in value) {
                                       let comptimeExpr = zigAnalysis.comptimeExprs[value.comptimeExpr].code;
                                       if (opts.wantHtml) {
@@ -1998,7 +2011,6 @@ var zigAnalysis;
                     }
 
                       if (fnObj.is_inferred_error) {
-                         console.log(fnObj)
                           payloadHtml += "!";
                       }
                       if (fnObj.ret != null) {
src/Autodoc.zig
@@ -676,31 +676,18 @@ const DocData = struct {
         builtinBinIndex: usize,
         switchIndex: usize, // index in `exprs`
         switchOp: SwitchOp,
-        // Index a `type` like struct with expressions
-        // it's necessary because when a caller ask by a binOp maybe there are
-        // more binary op inside them, so the caller get's the current `exprs` index
-        // and the binOp can walk the tree preserving the first index of the tree
-        // for examples see `.mul` and `analyzeFunctionExtended` in `has_align` section
         binOp: BinOp,
         binOpIndex: usize,
         const BinOp = struct {
             lhs: usize, // index in `exprs`
             rhs: usize, // index in `exprs`
-            // opKind
-            // Identify the operator in js
-            // 0: add, 1: sub, 2: mul, 3: div, 4: mod, 5: rem, 6: rem_mod, 7: shl, 8: shr, 9: bitcast, 10: bit_or, 11: align_cast, 12: bit_and, 13: array_cat, 14: array_mul, 15: vector
-            // Others binOp are not handled yet
-            opKind: usize = 0,
-            // flags to operations
-            wrap: bool = false,
-            sat: bool = false,
-            exact: bool = false,
-            floor: bool = false,
-            trunc: bool = false,
+            name: []const u8 = "", // tag name
         };
         const SwitchOp = struct {
-            cases: []usize,
-            else_index: ?usize,
+            cond_index: usize,
+            node_name: []const u8,
+            file_name: []const u8,
+            line_start: usize,
         };
         const BuiltinBin = struct {
             name: []const u8 = "", // fn name
@@ -1061,757 +1048,13 @@ fn walkInstruction(
                 .expr = .{ .int = .{ .value = int } },
             };
         },
-        .bitcast => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 9 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        // implementing in builtinBin @check if it's ok to delete it
-        // .align_cast => {
-        //     const pl_node = data[inst_index].pl_node;
-        //     const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-        //
-        //     const binop_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-        //
-        //     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 lhs_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, lhs.expr);
-        //     const rhs_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, rhs.expr);
-        //     self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 11 } };
-        //
-        //     return DocData.WalkResult{
-        //         .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-        //         .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 = self.decls.items[lhs.expr.declRef].value.typeRef,
-                .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 = self.decls.items[lhs.expr.declRef].value.typeRef,
-                .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 = self.decls.items[lhs.expr.declRef].value.typeRef,
-                .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);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 10 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .bit_and => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 12 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .add => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 0 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .addwrap => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .wrap = true, .opKind = 0 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .add_sat => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .sat = true, .opKind = 0 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-
-        .sub => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 1 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .subwrap => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .wrap = true, .opKind = 1 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .sub_sat => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .sat = true, .opKind = 1 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-
-        .mul => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 2 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .mulwrap => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .wrap = true, .opKind = 2 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .mul_sat => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .sat = true, .opKind = 2 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-
-        .div => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 3 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .div_exact => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 3 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .div_floor => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .floor = true, .opKind = 3 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .div_trunc => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .trunc = true, .opKind = 3 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-
-        .mod => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 4 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .rem => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .floor = true, .opKind = 5 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-
-        // @check how to test it
-        .mod_rem => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            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 lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .floor = true, .opKind = 6 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
 
-        .shl => {
+        .slice_start => {
             const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
+            const extra = file.zir.extraData(Zir.Inst.SliceStart, pl_node.payload_index);
 
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
+            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,
@@ -1819,30 +1062,30 @@ fn walkInstruction(
                 extra.data.lhs,
                 false,
             );
-            var rhs: DocData.WalkResult = try self.walkRef(
+            var start: DocData.WalkResult = try self.walkRef(
                 file,
                 parent_scope,
-                extra.data.rhs,
+                extra.data.start,
                 false,
             );
 
             const lhs_index = self.exprs.items.len;
             try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 7 } };
+            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 = .{ .binOpIndex = binop_index },
+                .typeRef = self.decls.items[lhs.expr.declRef].value.typeRef,
+                .expr = .{ .sliceIndex = slice_index },
             };
         },
-        .shl_exact => {
+        .slice_end => {
             const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
+            const extra = file.zir.extraData(Zir.Inst.SliceEnd, pl_node.payload_index);
 
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
+            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,
@@ -1850,62 +1093,38 @@ fn walkInstruction(
                 extra.data.lhs,
                 false,
             );
-            var rhs: DocData.WalkResult = try self.walkRef(
-                file,
-                parent_scope,
-                extra.data.rhs,
-                false,
-            );
-
-            const lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 7 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .shl_sat => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            var lhs: DocData.WalkResult = try self.walkRef(
+            var start: DocData.WalkResult = try self.walkRef(
                 file,
                 parent_scope,
-                extra.data.lhs,
+                extra.data.start,
                 false,
             );
-            var rhs: DocData.WalkResult = try self.walkRef(
+            var end: DocData.WalkResult = try self.walkRef(
                 file,
                 parent_scope,
-                extra.data.rhs,
+                extra.data.end,
                 false,
             );
 
             const lhs_index = self.exprs.items.len;
             try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .sat = true, .opKind = 7 } };
+            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 = .{ .binOpIndex = binop_index },
+                .typeRef = self.decls.items[lhs.expr.declRef].value.typeRef,
+                .expr = .{ .sliceIndex = slice_index },
             };
         },
-
-        .shr => {
+        .slice_sentinel => {
             const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
+            const extra = file.zir.extraData(Zir.Inst.SliceSentinel, pl_node.payload_index);
 
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
+            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,
@@ -1913,121 +1132,43 @@ fn walkInstruction(
                 extra.data.lhs,
                 false,
             );
-            var rhs: DocData.WalkResult = try self.walkRef(
+            var start: DocData.WalkResult = try self.walkRef(
                 file,
                 parent_scope,
-                extra.data.rhs,
+                extra.data.start,
                 false,
             );
-
-            const lhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .opKind = 8 } };
-
-            return DocData.WalkResult{
-                .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-                .expr = .{ .binOpIndex = binop_index },
-            };
-        },
-        .shr_exact => {
-            const pl_node = data[inst_index].pl_node;
-            const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-
-            const binop_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-
-            var lhs: DocData.WalkResult = try self.walkRef(
+            var end: DocData.WalkResult = try self.walkRef(
                 file,
                 parent_scope,
-                extra.data.lhs,
+                extra.data.end,
                 false,
             );
-            var rhs: DocData.WalkResult = try self.walkRef(
+            var sentinel: DocData.WalkResult = try self.walkRef(
                 file,
                 parent_scope,
-                extra.data.rhs,
+                extra.data.sentinel,
                 false,
             );
 
             const lhs_index = self.exprs.items.len;
             try self.exprs.append(self.arena, lhs.expr);
-            const rhs_index = self.exprs.items.len;
-            try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 8 } };
+            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 = .{ .binOpIndex = binop_index },
+                .typeRef = self.decls.items[lhs.expr.declRef].value.typeRef,
+                .expr = .{ .sliceIndex = slice_index },
             };
         },
 
-        // throwing this TODO
-        // TODO: handle `Array` in tryResolveDeclPath.type
-        // .array_cat => {
-        //     const pl_node = data[inst_index].pl_node;
-        //     const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-        //
-        //     const binop_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-        //
-        //     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 lhs_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, lhs.expr);
-        //     const rhs_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, rhs.expr);
-        //     self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 13 } };
-        //
-        //     return DocData.WalkResult{
-        //         .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-        //         .expr = .{ .binOpIndex = binop_index },
-        //     };
-        // },
-        // .array_mul => {
-        //     const pl_node = data[inst_index].pl_node;
-        //     const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
-        //
-        //     const binop_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, .{ .binOp = .{ .lhs = 0, .rhs = 0 } });
-        //
-        //     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 lhs_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, lhs.expr);
-        //     const rhs_index = self.exprs.items.len;
-        //     try self.exprs.append(self.arena, rhs.expr);
-        //     self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 14 } };
-        //
-        //     return DocData.WalkResult{
-        //         .typeRef = .{ .type = @enumToInt(Ref.type_type) },
-        //         .expr = .{ .binOpIndex = binop_index },
-        //     };
-        // },
-        .vector_type => {
+        // @check array_cat and array_mul
+        .add, .addwrap, .add_sat, .sub, .subwrap, .sub_sat, .mul, .mulwrap, .mul_sat, .div, .shl, .shl_sat, .shr, .bit_or, .bit_and => {
             const pl_node = data[inst_index].pl_node;
             const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
 
@@ -2051,7 +1192,11 @@ fn walkInstruction(
             try self.exprs.append(self.arena, lhs.expr);
             const rhs_index = self.exprs.items.len;
             try self.exprs.append(self.arena, rhs.expr);
-            self.exprs.items[binop_index] = .{ .binOp = .{ .lhs = lhs_index, .rhs = rhs_index, .exact = true, .opKind = 15 } };
+            self.exprs.items[binop_index] = .{ .binOp = .{
+                .name = @tagName(tags[inst_index]),
+                .lhs = lhs_index,
+                .rhs = rhs_index,
+            } };
 
             return DocData.WalkResult{
                 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
@@ -2104,7 +1249,28 @@ fn walkInstruction(
         },
         // @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 => {
+        .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,
+        .div_exact,
+        .div_floor,
+        .div_trunc,
+        .mod,
+        .rem,
+        .mod_rem,
+        .shl_exact,
+        .shr_exact,
+        .bitcast,
+        .vector_type,
+        => {
             const pl_node = data[inst_index].pl_node;
             const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
 
@@ -2629,106 +1795,22 @@ fn walkInstruction(
             // 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 cond_index = self.exprs.items.len;
+            _ = try self.walkRef(file, parent_scope, extra.data.operand, false);
+
+            const ast_index = self.ast_nodes.items.len - 1;
+            const ast = self.ast_nodes.items[ast_index];
 
             // 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];
-                extra_index += 1;
-                break :blk multi_cases_len;
-            } else 0;
-
-            var else_index: ?usize = null;
-            const special_prong = extra.data.bits.specialProng();
-            if (special_prong != .none) {
-                const body_len = file.zir.extra[extra_index];
-                extra_index += 1;
-                const body = file.zir.extra[extra_index..][0..body_len];
-                extra_index += body.len;
-                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});
-                    const item_index = self.exprs.items.len;
-                    try self.exprs.append(self.arena, item.expr);
-                    else_index = item_index;
-                }
-            }
-
-            // var array_type: ?DocData.Expr = null;
-            {
-                const scalar_cases_len = extra.data.bits.scalar_cases_len;
-                var scalar_i: usize = 0;
-                while (scalar_i < scalar_cases_len) : (scalar_i += 1) {
-                    const item_ref = @intToEnum(Ref, file.zir.extra[extra_index]);
-                    const item = try self.walkRef(file, parent_scope, item_ref, false);
-                    extra_index += 1;
-                    const body_len = file.zir.extra[extra_index];
-                    extra_index += 1;
-                    const body = file.zir.extra[extra_index..][0..body_len];
-                    extra_index += body_len;
-                    _ = body;
-                    array_data[scalar_i] = item.expr.as.exprArg;
-
-                    const body_ref = @intToEnum(Ref, file.zir.extra[extra_index]);
-                    if (extra.data.bits.is_ref) {
-                        const body_item = try self.walkRef(file, parent_scope, body_ref, false);
-                        _ = body_item;
-
-                        array_data[scalar_i] = item.expr.as.exprArg;
-                    } else {
-                        array_data[scalar_i] = 0;
-                        // TODO: this is wrong, decide an actual strategy
-                    }
-                    // 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});
-                }
-            }
-            {
-                var multi_i: usize = 0;
-                while (multi_i < multi_cases_len) : (multi_i += 1) {
-                    const items_len = file.zir.extra[extra_index];
-                    extra_index += 1;
-                    const ranges_len = file.zir.extra[extra_index];
-                    extra_index += 1;
-                    const body_len = file.zir.extra[extra_index];
-                    extra_index += 1;
-                    const items = file.zir.refSlice(extra_index, items_len);
-                    extra_index += items_len;
-                    _ = items;
-
-                    var range_i: usize = 0;
-                    while (range_i < ranges_len) : (range_i += 1) {
-                        extra_index += 1;
-                        extra_index += 1;
-                    }
-
-                    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("multi_cases_len = {}\n", .{multi_cases_len});
+            // std.debug.print("SWITCH BLOCK\n", .{});
+            // std.debug.print("file path = {any}\n", .{file.sub_file_path});
+            // std.debug.print("lazysrcloc = {any}\n", .{pl_node.src()});
+            // std.debug.print("ast = {any}\n", .{ast});
             // 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 } });
+            try self.exprs.append(self.arena, .{ .switchOp = .{ .cond_index = cond_index, .node_name = ast.name orelse "", .file_name = file.sub_file_path, .line_start = ast.line } });
 
             return DocData.WalkResult{
                 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
@@ -2746,13 +1828,6 @@ fn walkInstruction(
             const operand_index = self.exprs.items.len;
             try self.exprs.append(self.arena, operand.expr);
 
-            // const sep = "=" ** 200;
-            // std.debug.print("{s}\n", .{sep});
-            // std.debug.print("SWITCH COND\n", .{});
-            // std.debug.print("un_node {any} \n", .{un_node});
-            // std.debug.print("operand {any} \n", .{operand});
-            // std.debug.print("{s}\n", .{sep});
-
             return DocData.WalkResult{
                 .typeRef = operand.typeRef,
                 .expr = .{ .typeOf = operand_index },