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;...@@ -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;
10991104
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;
11351140
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 }
11401145
1141 payloadHtml += ")";1146 payloadHtml += ")";
...@@ -1173,7 +1178,6 @@ var zigAnalysis;...@@ -1173,7 +1178,6 @@ var zigAnalysis;
11731178
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 both1369 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 }
15341526
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 astNodes458 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 value601 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 });
858872
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);
874888
875 // TODO: return the actual error union instread of cheating889 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 };
27452780
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 },