authorgravatar for vallahor91@gmail.comVallahor <vallahor91@gmail.com> 2022-05-28 00:34:35-03:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2022-07-19 19:10:11-07:00
logf04f23a3aaeb0e0b3b17395fdc7ee0742a3f983e
treefba600f431f7a87f7ff9bf9011aaf6954a017748
parent76e934dba802fb7f0fdc7ed9f3d8d1561078132a

add: extern, callconv and return errors


2 files changed, 105 insertions(+), 41 deletions(-)

lib/docs/main.js+29-29
......@@ -1062,6 +1062,13 @@ var zigAnalysis;
10621062 function exprName(expr, opts) {
10631063 switch (Object.keys(expr)[0]) {
10641064 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 }
10651072 case "struct": {
10661073 const struct_name = zigAnalysis.decls[expr.struct[0].val.typeRef.refPath[0].declRef].name;
10671074 let struct_body = "";
......@@ -1084,7 +1091,6 @@ var zigAnalysis;
10841091 return struct_body;
10851092 }
10861093 case "typeOf_peer": {
1087 console.log(expr)
10881094 let payloadHtml = "@TypeOf("
10891095 for (let i = 0; i < expr.typeOf_peer.length; i++) {
10901096 let elem = zigAnalysis.exprs[expr.typeOf_peer[i]];
......@@ -1094,7 +1100,6 @@ var zigAnalysis;
10941100 }
10951101 }
10961102 payloadHtml += ")";
1097 console.log(payloadHtml)
10981103 return payloadHtml;
10991104
11001105 }
......@@ -1111,7 +1116,7 @@ var zigAnalysis;
11111116 for (let i = 0; i < expr.array.length; i++) {
11121117 if (i != 0) payloadHtml += ", ";
11131118 let elem = zigAnalysis.exprs[expr.array[i]];
1114 payloadHtml += exprName(elem);
1119 payloadHtml += exprName(elem, opts);
11151120 }
11161121 return payloadHtml + "}";
11171122 }
......@@ -1127,7 +1132,7 @@ var zigAnalysis;
11271132 default: throw "TODO";
11281133 case "declRef":
11291134 case "refPath": {
1130 payloadHtml += exprName(call.func);
1135 payloadHtml += exprName(call.func, opts);
11311136 break;
11321137 }
11331138 }
......@@ -1135,7 +1140,7 @@ var zigAnalysis;
11351140
11361141 for (let i = 0; i < call.args.length; i++) {
11371142 if (i != 0) payloadHtml += ", ";
1138 payloadHtml += exprName(call.args[i]);
1143 payloadHtml += exprName(call.args[i], opts);
11391144 }
11401145
11411146 payloadHtml += ")";
......@@ -1173,7 +1178,6 @@ var zigAnalysis;
11731178
11741179 let typeObj = expr.type;
11751180 if (typeof typeObj === 'number') typeObj = zigAnalysis.types[typeObj];
1176
11771181 switch (typeObj.kind) {
11781182 default: throw "TODO";
11791183 case typeKinds.ComptimeExpr:
......@@ -1210,7 +1214,6 @@ var zigAnalysis;
12101214 let sentinel = ptrObj.sentinel ? ":"+exprName(ptrObj.sentinel, opts) : "";
12111215 let is_mutable = !ptrObj.is_mutable ? "const " : "";
12121216 let name = "";
1213 console.log(ptrObj);
12141217 switch (ptrObj.size) {
12151218 default:
12161219 console.log("TODO: implement unhandled pointer size case");
......@@ -1352,40 +1355,29 @@ var zigAnalysis;
13521355 {
13531356 let errSetObj = /** @type {ErrSetType} */(typeObj);
13541357 if (errSetObj.fields == null) {
1355 if (wantHtml) {
13561358 return '<span class="tok-type">anyerror</span>';
1357 } else {
1358 return "anyerror";
1359 }
13601359 } else {
1361 throw "TODO";
1362 // if (wantHtml) {
1363 // return escapeHtml(typeObj.name);
1364 // } else {
1365 // return typeObj.name;
1366 // }
1360 // throw "TODO";
1361 let html = "error{" + errSetObj.fields[0].name + "}";
1362 return html;
13671363 }
13681364 }
1365
13691366 case typeKinds.ErrorUnion:
13701367 {
1371 throw "TODO";
1372 // TODO: implement error union printing assuming that both
1373 // payload and error union are walk results!
1374 // let errUnionObj = /** @type {ErrUnionType} */(typeObj);
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 // }
1368 let errUnionObj = /** @type {ErrUnionType} */(typeObj);
1369 let lhs = exprName(errUnionObj.lhs, opts);
1370 let rhs = exprName(errUnionObj.rhs, opts);
1371 return lhs + "!" + rhs;
13831372 }
13841373 case typeKinds.Fn:
13851374 {
13861375 let fnObj = /** @type {Fn} */(typeObj);
13871376 let payloadHtml = "";
13881377 if (opts.wantHtml) {
1378 if (fnObj.is_extern) {
1379 payloadHtml += "pub \"extern\" ";
1380 }
13891381 payloadHtml += '<span class="tok-kw">fn</span>';
13901382 if (opts.fnDecl) {
13911383 payloadHtml += ' <span class="tok-fn">';
......@@ -1533,6 +1525,14 @@ var zigAnalysis;
15331525 }
15341526
15351527 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 }
15361536 if (fnObj.ret != null) {
15371537 payloadHtml += exprName(fnObj.ret, opts);
15381538 } else if (opts.wantHtml) {
src/Autodoc.zig+76-12
......@@ -153,6 +153,9 @@ pub fn generateZirData(self: *Autodoc) !void {
153153 .type_type => .{
154154 .Type = .{ .name = tmpbuf.toOwnedSlice() },
155155 },
156 .anyerror_type => .{
157 .ErrorSet = .{ .name = tmpbuf.toOwnedSlice() },
158 },
156159 },
157160 );
158161 }
......@@ -429,10 +432,11 @@ const DocData = struct {
429432 name: []const u8,
430433 child: Expr,
431434 },
432 ErrorUnion: struct { name: []const u8 },
435 ErrorUnion: struct { lhs: Expr, rhs: Expr },
436 // ErrorUnion: struct { name: []const u8 },
433437 ErrorSet: struct {
434438 name: []const u8,
435 fields: []const Field,
439 fields: ?[]const Field = null,
436440 // TODO: fn field for inferred error sets?
437441 },
438442 Enum: struct {
......@@ -454,6 +458,14 @@ const DocData = struct {
454458 src: ?usize = null, // index into astNodes
455459 ret: Expr,
456460 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,
457469 },
458470 BoundFn: struct { name: []const u8 },
459471 Opaque: struct { name: []const u8 },
......@@ -492,6 +504,7 @@ const DocData = struct {
492504 .Fn => |v| try printTypeBody(v, options, w),
493505 .Union => |v| try printTypeBody(v, options, w),
494506 .ErrorSet => |v| try printTypeBody(v, options, w),
507 .ErrorUnion => |v| try printTypeBody(v, options, w),
495508 .Enum => |v| try printTypeBody(v, options, w),
496509 .Int => |v| try printTypeBody(v, options, w),
497510 .Float => |v| try printTypeBody(v, options, w),
......@@ -588,6 +601,7 @@ const DocData = struct {
588601 enumLiteral: []const u8, // direct value
589602 typeOf: usize, // index in `exprs`
590603 typeOf_peer: []usize,
604 errorUnion: usize, // index in `exprs`
591605 as: As,
592606 sizeOf: usize, // index in `exprs`
593607 compileError: []const u8,
......@@ -617,7 +631,7 @@ const DocData = struct {
617631 \\{{ "{s}":{{}} }}
618632 , .{@tagName(self)});
619633 },
620 .type, .comptimeExpr, .call, .this, .declRef, .typeOf => |v| {
634 .type, .comptimeExpr, .call, .this, .declRef, .typeOf, .errorUnion => |v| {
621635 try w.print(
622636 \\{{ "{s}":{} }}
623637 , .{ @tagName(self), v });
......@@ -853,7 +867,7 @@ fn walkInstruction(
853867 const literal = file.zir.nullTerminatedString(str_tok.start);
854868 const type_index = self.types.items.len;
855869 try self.types.append(self.arena, .{
856 .EnumLiteral = .{ .name = "todo enum literal" },
870 .EnumLiteral = .{ .name = literal },
857871 });
858872
859873 return DocData.WalkResult{
......@@ -872,8 +886,29 @@ fn walkInstruction(
872886 const pl_node = data[inst_index].pl_node;
873887 const extra = file.zir.extraData(Zir.Inst.Bin, pl_node.payload_index);
874888
875 // TODO: return the actual error union instread of cheating
876 return self.walkRef(file, parent_scope, extra.data.rhs, need_type);
889 var lhs: DocData.WalkResult = try self.walkRef(
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 };
877912 },
878913 .elem_type => {
879914 const un_node = data[inst_index].un_node;
......@@ -2744,14 +2779,43 @@ fn analyzeFunction(
27442779 };
27452780
27462781 self.ast_nodes.items[self_ast_node_index].fields = param_ast_indexes.items;
2747 self.types.items[type_slot_index] = .{
2748 .Fn = .{
2749 .name = "todo_name func",
2750 .src = self_ast_node_index,
2751 .params = param_type_refs.items,
2752 .ret = ret_type_ref.expr,
2782 self.types.items[type_slot_index] = switch (tags[inst_index]) {
2783 .func, .func_inferred => blk: {
2784 break :blk .{
2785 .Fn = .{
2786 .name = "todo_name func",
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 };
27532815 },
2816 else => unreachable,
27542817 };
2818
27552819 return DocData.WalkResult{
27562820 .typeRef = .{ .type = @enumToInt(Ref.type_type) },
27572821 .expr = .{ .type = type_slot_index },