| author | |
| committer | |
| log | f04f23a3aaeb0e0b3b17395fdc7ee0742a3f983e |
| tree | fba600f431f7a87f7ff9bf9011aaf6954a017748 |
| parent | 76e934dba802fb7f0fdc7ed9f3d8d1561078132a |
2 files changed, 105 insertions(+), 41 deletions(-)
lib/docs/main.js+29-29| ... | @@ -1062,6 +1062,13 @@ var zigAnalysis; | ... | @@ -1062,6 +1062,13 @@ var zigAnalysis; |
| 1062 | function exprName(expr, opts) { | 1062 | function exprName(expr, opts) { |
| 1063 | switch (Object.keys(expr)[0]) { | 1063 | switch (Object.keys(expr)[0]) { |
| 1064 | default: throw "oh no"; | 1064 | default: throw "oh no"; |
| 1065 | case "errorUnion": { | ||
| 1066 | const errUnionObj = zigAnalysis.types[expr.errorUnion]; | ||
| 1067 | let lhs = exprName(errUnionObj.lhs, opts); | ||
| 1068 | let rhs = exprName(errUnionObj.rhs, opts); | ||
| 1069 | return lhs + "!" + rhs; | ||
| 1070 | |||
| 1071 | } | ||
| 1065 | case "struct": { | 1072 | case "struct": { |
| 1066 | const struct_name = zigAnalysis.decls[expr.struct[0].val.typeRef.refPath[0].declRef].name; | 1073 | const struct_name = zigAnalysis.decls[expr.struct[0].val.typeRef.refPath[0].declRef].name; |
| 1067 | let struct_body = ""; | 1074 | let struct_body = ""; |
| ... | @@ -1084,7 +1091,6 @@ var zigAnalysis; | ... | @@ -1084,7 +1091,6 @@ var zigAnalysis; |
| 1084 | return struct_body; | 1091 | return struct_body; |
| 1085 | } | 1092 | } |
| 1086 | case "typeOf_peer": { | 1093 | case "typeOf_peer": { |
| 1087 | console.log(expr) | ||
| 1088 | let payloadHtml = "@TypeOf(" | 1094 | let payloadHtml = "@TypeOf(" |
| 1089 | for (let i = 0; i < expr.typeOf_peer.length; i++) { | 1095 | for (let i = 0; i < expr.typeOf_peer.length; i++) { |
| 1090 | let elem = zigAnalysis.exprs[expr.typeOf_peer[i]]; | 1096 | let elem = zigAnalysis.exprs[expr.typeOf_peer[i]]; |
| ... | @@ -1094,7 +1100,6 @@ var zigAnalysis; | ... | @@ -1094,7 +1100,6 @@ var zigAnalysis; |
| 1094 | } | 1100 | } |
| 1095 | } | 1101 | } |
| 1096 | payloadHtml += ")"; | 1102 | payloadHtml += ")"; |
| 1097 | console.log(payloadHtml) | ||
| 1098 | return payloadHtml; | 1103 | return payloadHtml; |
| 1099 | 1104 | ||
| 1100 | } | 1105 | } |
| ... | @@ -1111,7 +1116,7 @@ var zigAnalysis; | ... | @@ -1111,7 +1116,7 @@ var zigAnalysis; |
| 1111 | for (let i = 0; i < expr.array.length; i++) { | 1116 | for (let i = 0; i < expr.array.length; i++) { |
| 1112 | if (i != 0) payloadHtml += ", "; | 1117 | if (i != 0) payloadHtml += ", "; |
| 1113 | let elem = zigAnalysis.exprs[expr.array[i]]; | 1118 | let elem = zigAnalysis.exprs[expr.array[i]]; |
| 1114 | payloadHtml += exprName(elem); | 1119 | payloadHtml += exprName(elem, opts); |
| 1115 | } | 1120 | } |
| 1116 | return payloadHtml + "}"; | 1121 | return payloadHtml + "}"; |
| 1117 | } | 1122 | } |
| ... | @@ -1127,7 +1132,7 @@ var zigAnalysis; | ... | @@ -1127,7 +1132,7 @@ var zigAnalysis; |
| 1127 | default: throw "TODO"; | 1132 | default: throw "TODO"; |
| 1128 | case "declRef": | 1133 | case "declRef": |
| 1129 | case "refPath": { | 1134 | case "refPath": { |
| 1130 | payloadHtml += exprName(call.func); | 1135 | payloadHtml += exprName(call.func, opts); |
| 1131 | break; | 1136 | break; |
| 1132 | } | 1137 | } |
| 1133 | } | 1138 | } |
| ... | @@ -1135,7 +1140,7 @@ var zigAnalysis; | ... | @@ -1135,7 +1140,7 @@ var zigAnalysis; |
| 1135 | 1140 | ||
| 1136 | for (let i = 0; i < call.args.length; i++) { | 1141 | for (let i = 0; i < call.args.length; i++) { |
| 1137 | if (i != 0) payloadHtml += ", "; | 1142 | if (i != 0) payloadHtml += ", "; |
| 1138 | payloadHtml += exprName(call.args[i]); | 1143 | payloadHtml += exprName(call.args[i], opts); |
| 1139 | } | 1144 | } |
| 1140 | 1145 | ||
| 1141 | payloadHtml += ")"; | 1146 | payloadHtml += ")"; |
| ... | @@ -1173,7 +1178,6 @@ var zigAnalysis; | ... | @@ -1173,7 +1178,6 @@ var zigAnalysis; |
| 1173 | 1178 | ||
| 1174 | let typeObj = expr.type; | 1179 | let typeObj = expr.type; |
| 1175 | if (typeof typeObj === 'number') typeObj = zigAnalysis.types[typeObj]; | 1180 | if (typeof typeObj === 'number') typeObj = zigAnalysis.types[typeObj]; |
| 1176 | |||
| 1177 | switch (typeObj.kind) { | 1181 | switch (typeObj.kind) { |
| 1178 | default: throw "TODO"; | 1182 | default: throw "TODO"; |
| 1179 | case typeKinds.ComptimeExpr: | 1183 | case typeKinds.ComptimeExpr: |
| ... | @@ -1210,7 +1214,6 @@ var zigAnalysis; | ... | @@ -1210,7 +1214,6 @@ var zigAnalysis; |
| 1210 | let sentinel = ptrObj.sentinel ? ":"+exprName(ptrObj.sentinel, opts) : ""; | 1214 | let sentinel = ptrObj.sentinel ? ":"+exprName(ptrObj.sentinel, opts) : ""; |
| 1211 | let is_mutable = !ptrObj.is_mutable ? "const " : ""; | 1215 | let is_mutable = !ptrObj.is_mutable ? "const " : ""; |
| 1212 | let name = ""; | 1216 | let name = ""; |
| 1213 | console.log(ptrObj); | ||
| 1214 | switch (ptrObj.size) { | 1217 | switch (ptrObj.size) { |
| 1215 | default: | 1218 | default: |
| 1216 | console.log("TODO: implement unhandled pointer size case"); | 1219 | console.log("TODO: implement unhandled pointer size case"); |
| ... | @@ -1352,40 +1355,29 @@ var zigAnalysis; | ... | @@ -1352,40 +1355,29 @@ var zigAnalysis; |
| 1352 | { | 1355 | { |
| 1353 | let errSetObj = /** @type {ErrSetType} */(typeObj); | 1356 | let errSetObj = /** @type {ErrSetType} */(typeObj); |
| 1354 | if (errSetObj.fields == null) { | 1357 | if (errSetObj.fields == null) { |
| 1355 | if (wantHtml) { | ||
| 1356 | return '<span class="tok-type">anyerror</span>'; | 1358 | return '<span class="tok-type">anyerror</span>'; |
| 1357 | } else { | ||
| 1358 | return "anyerror"; | ||
| 1359 | } | ||
| 1360 | } else { | 1359 | } else { |
| 1361 | throw "TODO"; | 1360 | // throw "TODO"; |
| 1362 | // if (wantHtml) { | 1361 | let html = "error{" + errSetObj.fields[0].name + "}"; |
| 1363 | // return escapeHtml(typeObj.name); | 1362 | return html; |
| 1364 | // } else { | ||
| 1365 | // return typeObj.name; | ||
| 1366 | // } | ||
| 1367 | } | 1363 | } |
| 1368 | } | 1364 | } |
| 1365 | |||
| 1369 | case typeKinds.ErrorUnion: | 1366 | case typeKinds.ErrorUnion: |
| 1370 | { | 1367 | { |
| 1371 | throw "TODO"; | 1368 | let errUnionObj = /** @type {ErrUnionType} */(typeObj); |
| 1372 | // TODO: implement error union printing assuming that both | 1369 | let lhs = exprName(errUnionObj.lhs, opts); |
| 1373 | // payload and error union are walk results! | 1370 | let rhs = exprName(errUnionObj.rhs, opts); |
| 1374 | // let errUnionObj = /** @type {ErrUnionType} */(typeObj); | 1371 | return lhs + "!" + rhs; |
| 1375 | // let errSetTypeObj = /** @type {ErrSetType} */ (zigAnalysis.types[errUnionObj.err]); | ||
| 1376 | // let payloadHtml = typeValueName(errUnionObj.payload, wantHtml, wantSubLink, null); | ||
| 1377 | // if (fnDecl != null && errSetTypeObj.fn === fnDecl.value.type) { | ||
| 1378 | // // function index parameter supplied and this is the inferred error set of it | ||
| 1379 | // return "!" + payloadHtml; | ||
| 1380 | // } else { | ||
| 1381 | // return typeValueName(errUnionObj.err, wantHtml, wantSubLink, null) + "!" + payloadHtml; | ||
| 1382 | // } | ||
| 1383 | } | 1372 | } |
| 1384 | case typeKinds.Fn: | 1373 | case typeKinds.Fn: |
| 1385 | { | 1374 | { |
| 1386 | let fnObj = /** @type {Fn} */(typeObj); | 1375 | let fnObj = /** @type {Fn} */(typeObj); |
| 1387 | let payloadHtml = ""; | 1376 | let payloadHtml = ""; |
| 1388 | if (opts.wantHtml) { | 1377 | if (opts.wantHtml) { |
| 1378 | if (fnObj.is_extern) { | ||
| 1379 | payloadHtml += "pub \"extern\" "; | ||
| 1380 | } | ||
| 1389 | payloadHtml += '<span class="tok-kw">fn</span>'; | 1381 | payloadHtml += '<span class="tok-kw">fn</span>'; |
| 1390 | if (opts.fnDecl) { | 1382 | if (opts.fnDecl) { |
| 1391 | payloadHtml += ' <span class="tok-fn">'; | 1383 | payloadHtml += ' <span class="tok-fn">'; |
| ... | @@ -1533,6 +1525,14 @@ var zigAnalysis; | ... | @@ -1533,6 +1525,14 @@ var zigAnalysis; |
| 1533 | } | 1525 | } |
| 1534 | 1526 | ||
| 1535 | payloadHtml += ') '; | 1527 | payloadHtml += ') '; |
| 1528 | if (fnObj.has_cc) { | ||
| 1529 | let cc = zigAnalysis.types[fnObj.cc] | ||
| 1530 | payloadHtml += "callconv(." + cc.name + ") "; | ||
| 1531 | } | ||
| 1532 | |||
| 1533 | if (fnObj.is_inferred_error) { | ||
| 1534 | payloadHtml += "!"; | ||
| 1535 | } | ||
| 1536 | if (fnObj.ret != null) { | 1536 | if (fnObj.ret != null) { |
| 1537 | payloadHtml += exprName(fnObj.ret, opts); | 1537 | payloadHtml += exprName(fnObj.ret, opts); |
| 1538 | } else if (opts.wantHtml) { | 1538 | } else if (opts.wantHtml) { |
src/Autodoc.zig+76-12| ... | @@ -153,6 +153,9 @@ pub fn generateZirData(self: *Autodoc) !void { | ... | @@ -153,6 +153,9 @@ pub fn generateZirData(self: *Autodoc) !void { |
| 153 | .type_type => .{ | 153 | .type_type => .{ |
| 154 | .Type = .{ .name = tmpbuf.toOwnedSlice() }, | 154 | .Type = .{ .name = tmpbuf.toOwnedSlice() }, |
| 155 | }, | 155 | }, |
| 156 | .anyerror_type => .{ | ||
| 157 | .ErrorSet = .{ .name = tmpbuf.toOwnedSlice() }, | ||
| 158 | }, | ||
| 156 | }, | 159 | }, |
| 157 | ); | 160 | ); |
| 158 | } | 161 | } |
| ... | @@ -429,10 +432,11 @@ const DocData = struct { | ... | @@ -429,10 +432,11 @@ const DocData = struct { |
| 429 | name: []const u8, | 432 | name: []const u8, |
| 430 | child: Expr, | 433 | child: Expr, |
| 431 | }, | 434 | }, |
| 432 | ErrorUnion: struct { name: []const u8 }, | 435 | ErrorUnion: struct { lhs: Expr, rhs: Expr }, |
| 436 | // ErrorUnion: struct { name: []const u8 }, | ||
| 433 | ErrorSet: struct { | 437 | ErrorSet: struct { |
| 434 | name: []const u8, | 438 | name: []const u8, |
| 435 | fields: []const Field, | 439 | fields: ?[]const Field = null, |
| 436 | // TODO: fn field for inferred error sets? | 440 | // TODO: fn field for inferred error sets? |
| 437 | }, | 441 | }, |
| 438 | Enum: struct { | 442 | Enum: struct { |
| ... | @@ -454,6 +458,14 @@ const DocData = struct { | ... | @@ -454,6 +458,14 @@ const DocData = struct { |
| 454 | src: ?usize = null, // index into astNodes | 458 | src: ?usize = null, // index into astNodes |
| 455 | ret: Expr, | 459 | ret: Expr, |
| 456 | params: ?[]Expr = null, // (use src->fields to find names) | 460 | params: ?[]Expr = null, // (use src->fields to find names) |
| 461 | is_var_args: bool = false, | ||
| 462 | is_inferred_error: bool = false, | ||
| 463 | has_lib_name: bool = false, | ||
| 464 | has_cc: bool = false, | ||
| 465 | cc: ?usize = null, | ||
| 466 | has_align: bool = false, | ||
| 467 | is_test: bool = false, | ||
| 468 | is_extern: bool = false, | ||
| 457 | }, | 469 | }, |
| 458 | BoundFn: struct { name: []const u8 }, | 470 | BoundFn: struct { name: []const u8 }, |
| 459 | Opaque: struct { name: []const u8 }, | 471 | Opaque: struct { name: []const u8 }, |
| ... | @@ -492,6 +504,7 @@ const DocData = struct { | ... | @@ -492,6 +504,7 @@ const DocData = struct { |
| 492 | .Fn => |v| try printTypeBody(v, options, w), | 504 | .Fn => |v| try printTypeBody(v, options, w), |
| 493 | .Union => |v| try printTypeBody(v, options, w), | 505 | .Union => |v| try printTypeBody(v, options, w), |
| 494 | .ErrorSet => |v| try printTypeBody(v, options, w), | 506 | .ErrorSet => |v| try printTypeBody(v, options, w), |
| 507 | .ErrorUnion => |v| try printTypeBody(v, options, w), | ||
| 495 | .Enum => |v| try printTypeBody(v, options, w), | 508 | .Enum => |v| try printTypeBody(v, options, w), |
| 496 | .Int => |v| try printTypeBody(v, options, w), | 509 | .Int => |v| try printTypeBody(v, options, w), |
| 497 | .Float => |v| try printTypeBody(v, options, w), | 510 | .Float => |v| try printTypeBody(v, options, w), |
| ... | @@ -588,6 +601,7 @@ const DocData = struct { | ... | @@ -588,6 +601,7 @@ const DocData = struct { |
| 588 | enumLiteral: []const u8, // direct value | 601 | enumLiteral: []const u8, // direct value |
| 589 | typeOf: usize, // index in `exprs` | 602 | typeOf: usize, // index in `exprs` |
| 590 | typeOf_peer: []usize, | 603 | typeOf_peer: []usize, |
| 604 | errorUnion: usize, // index in `exprs` | ||
| 591 | as: As, | 605 | as: As, |
| 592 | sizeOf: usize, // index in `exprs` | 606 | sizeOf: usize, // index in `exprs` |
| 593 | compileError: []const u8, | 607 | compileError: []const u8, |
| ... | @@ -617,7 +631,7 @@ const DocData = struct { | ... | @@ -617,7 +631,7 @@ const DocData = struct { |
| 617 | \\{{ "{s}":{{}} }} | 631 | \\{{ "{s}":{{}} }} |
| 618 | , .{@tagName(self)}); | 632 | , .{@tagName(self)}); |
| 619 | }, | 633 | }, |
| 620 | .type, .comptimeExpr, .call, .this, .declRef, .typeOf => |v| { | 634 | .type, .comptimeExpr, .call, .this, .declRef, .typeOf, .errorUnion => |v| { |
| 621 | try w.print( | 635 | try w.print( |
| 622 | \\{{ "{s}":{} }} | 636 | \\{{ "{s}":{} }} |
| 623 | , .{ @tagName(self), v }); | 637 | , .{ @tagName(self), v }); |
| ... | @@ -853,7 +867,7 @@ fn walkInstruction( | ... | @@ -853,7 +867,7 @@ fn walkInstruction( |
| 853 | const literal = file.zir.nullTerminatedString(str_tok.start); | 867 | const literal = file.zir.nullTerminatedString(str_tok.start); |
| 854 | const type_index = self.types.items.len; | 868 | const type_index = self.types.items.len; |
| 855 | try self.types.append(self.arena, .{ | 869 | try self.types.append(self.arena, .{ |
| 856 | .EnumLiteral = .{ .name = "todo enum literal" }, | 870 | .EnumLiteral = .{ .name = literal }, |
| 857 | }); | 871 | }); |
| 858 | 872 | ||
| 859 | return DocData.WalkResult{ | 873 | return DocData.WalkResult{ |
| ... | @@ -872,8 +886,29 @@ fn walkInstruction( | ... | @@ -872,8 +886,29 @@ fn walkInstruction( |
| 872 | const pl_node = data[inst_index].pl_node; | 886 | const pl_node = data[inst_index].pl_node; |
| 873 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); | 887 | const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index); |
| 874 | 888 | ||
| 875 | // TODO: return the actual error union instread of cheating | 889 | var lhs: DocData.WalkResult = try self.walkRef( |
| 876 | return self.walkRef(file, parent_scope, extra.data.rhs, need_type); | 890 | file, |
| 891 | parent_scope, | ||
| 892 | extra.data.lhs, | ||
| 893 | false, | ||
| 894 | ); | ||
| 895 | var rhs: DocData.WalkResult = try self.walkRef( | ||
| 896 | file, | ||
| 897 | parent_scope, | ||
| 898 | extra.data.rhs, | ||
| 899 | false, | ||
| 900 | ); | ||
| 901 | |||
| 902 | const type_slot_index = self.types.items.len; | ||
| 903 | try self.types.append(self.arena, .{ .ErrorUnion = .{ | ||
| 904 | .lhs = lhs.expr, | ||
| 905 | .rhs = rhs.expr, | ||
| 906 | } }); | ||
| 907 | |||
| 908 | return DocData.WalkResult{ | ||
| 909 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, | ||
| 910 | .expr = .{ .errorUnion = type_slot_index }, | ||
| 911 | }; | ||
| 877 | }, | 912 | }, |
| 878 | .elem_type => { | 913 | .elem_type => { |
| 879 | const un_node = data[inst_index].un_node; | 914 | const un_node = data[inst_index].un_node; |
| ... | @@ -2744,14 +2779,43 @@ fn analyzeFunction( | ... | @@ -2744,14 +2779,43 @@ fn analyzeFunction( |
| 2744 | }; | 2779 | }; |
| 2745 | 2780 | ||
| 2746 | self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items; | 2781 | self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items; |
| 2747 | self.types.items[type_slot_index] = .{ | 2782 | self.types.items[type_slot_index] = switch (tags[inst_index]) { |
| 2748 | .Fn = .{ | 2783 | .func, .func_inferred => blk: { |
| 2749 | .name = "todo_name func", | 2784 | break :blk .{ |
| 2750 | .src = self_ast_node_index, | 2785 | .Fn = .{ |
| 2751 | .params = param_type_refs.items, | 2786 | .name = "todo_name func", |
| 2752 | .ret = ret_type_ref.expr, | 2787 | .src = self_ast_node_index, |
| 2788 | .params = param_type_refs.items, | ||
| 2789 | .ret = ret_type_ref.expr, | ||
| 2790 | }, | ||
| 2791 | }; | ||
| 2792 | }, | ||
| 2793 | .func_extended => blk: { | ||
| 2794 | const inst_data = data[inst_index].pl_node; | ||
| 2795 | const extra = file.zir.extraData(Zir.Inst.ExtendedFunc, inst_data.payload_index); | ||
| 2796 | |||
| 2797 | var cc_index: ?usize = null; | ||
| 2798 | if (extra.data.bits.has_cc) { | ||
| 2799 | const cc_ref = @intToEnum(Zir.Inst.Ref, file.zir.extra[extra.end]); | ||
| 2800 | _ = try self.walkRef(file, scope, cc_ref, false); | ||
| 2801 | cc_index = self.types.items.len - 1; | ||
| 2802 | } | ||
| 2803 | break :blk .{ | ||
| 2804 | .Fn = .{ | ||
| 2805 | .name = "todo_name func", | ||
| 2806 | .src = self_ast_node_index, | ||
| 2807 | .params = param_type_refs.items, | ||
| 2808 | .ret = ret_type_ref.expr, | ||
| 2809 | .is_extern = extra.data.bits.is_extern, | ||
| 2810 | .has_cc = extra.data.bits.has_cc, | ||
| 2811 | .is_inferred_error = extra.data.bits.is_inferred_error, | ||
| 2812 | .cc = cc_index, | ||
| 2813 | }, | ||
| 2814 | }; | ||
| 2753 | }, | 2815 | }, |
| 2816 | else => unreachable, | ||
| 2754 | }; | 2817 | }; |
| 2818 | |||
| 2755 | return DocData.WalkResult{ | 2819 | return DocData.WalkResult{ |
| 2756 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, | 2820 | .typeRef = .{ .type = @enumToInt(Ref.type_type) }, |
| 2757 | .expr = .{ .type = type_slot_index }, | 2821 | .expr = .{ .type = type_slot_index }, |