authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-09 00:18:01-05:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2019-12-09 00:18:01-05:00
log8b3c0bbeeef080b77d0cb7999682abc52de437e3
tree0bddf7eb99d6daaaa2e5ee80b51a6766aefb7d9c
parentd571fad20eac23cadf6116742ad4abab5ed281e5
signaturelock-open Commit is signed but in an unrecognized format.

update docgen to new format API


1 files changed, 146 insertions(+), 135 deletions(-)

doc/docgen.zig+146-135
...@@ -215,32 +215,33 @@ const Tokenizer = struct {...@@ -215,32 +215,33 @@ const Tokenizer = struct {
215 }215 }
216};216};
217217
218fn parseError(tokenizer: *Tokenizer, token: Token, comptime fmt: []const u8, args: ...) anyerror {218fn parseError(tokenizer: *Tokenizer, token: Token, comptime fmt: []const u8, args: var) anyerror {
219 const loc = tokenizer.getTokenLocation(token);219 const loc = tokenizer.getTokenLocation(token);
220 warn("{}:{}:{}: error: " ++ fmt ++ "\n", tokenizer.source_file_name, loc.line + 1, loc.column + 1, args);220 const args_prefix = .{ tokenizer.source_file_name, loc.line + 1, loc.column + 1 };
221 warn("{}:{}:{}: error: " ++ fmt ++ "\n", args_prefix ++ args);
221 if (loc.line_start <= loc.line_end) {222 if (loc.line_start <= loc.line_end) {
222 warn("{}\n", tokenizer.buffer[loc.line_start..loc.line_end]);223 warn("{}\n", .{tokenizer.buffer[loc.line_start..loc.line_end]});
223 {224 {
224 var i: usize = 0;225 var i: usize = 0;
225 while (i < loc.column) : (i += 1) {226 while (i < loc.column) : (i += 1) {
226 warn(" ");227 warn(" ", .{});
227 }228 }
228 }229 }
229 {230 {
230 const caret_count = token.end - token.start;231 const caret_count = token.end - token.start;
231 var i: usize = 0;232 var i: usize = 0;
232 while (i < caret_count) : (i += 1) {233 while (i < caret_count) : (i += 1) {
233 warn("~");234 warn("~", .{});
234 }235 }
235 }236 }
236 warn("\n");237 warn("\n", .{});
237 }238 }
238 return error.ParseError;239 return error.ParseError;
239}240}
240241
241fn assertToken(tokenizer: *Tokenizer, token: Token, id: Token.Id) !void {242fn assertToken(tokenizer: *Tokenizer, token: Token, id: Token.Id) !void {
242 if (token.id != id) {243 if (token.id != id) {
243 return parseError(tokenizer, token, "expected {}, found {}", @tagName(id), @tagName(token.id));244 return parseError(tokenizer, token, "expected {}, found {}", .{ @tagName(id), @tagName(token.id) });
244 }245 }
245}246}
246247
...@@ -339,7 +340,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -339,7 +340,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
339 switch (token.id) {340 switch (token.id) {
340 Token.Id.Eof => {341 Token.Id.Eof => {
341 if (header_stack_size != 0) {342 if (header_stack_size != 0) {
342 return parseError(tokenizer, token, "unbalanced headers");343 return parseError(tokenizer, token, "unbalanced headers", .{});
343 }344 }
344 try toc.write(" </ul>\n");345 try toc.write(" </ul>\n");
345 break;346 break;
...@@ -373,10 +374,15 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -373,10 +374,15 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
373 if (mem.eql(u8, param, "3col")) {374 if (mem.eql(u8, param, "3col")) {
374 columns = 3;375 columns = 3;
375 } else {376 } else {
376 return parseError(tokenizer, bracket_tok, "unrecognized header_open param: {}", param);377 return parseError(
378 tokenizer,
379 bracket_tok,
380 "unrecognized header_open param: {}",
381 .{param},
382 );
377 }383 }
378 },384 },
379 else => return parseError(tokenizer, bracket_tok, "invalid header_open token"),385 else => return parseError(tokenizer, bracket_tok, "invalid header_open token", .{}),
380 }386 }
381 }387 }
382388
...@@ -391,15 +397,15 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -391,15 +397,15 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
391 },397 },
392 });398 });
393 if (try urls.put(urlized, tag_token)) |entry| {399 if (try urls.put(urlized, tag_token)) |entry| {
394 parseError(tokenizer, tag_token, "duplicate header url: #{}", urlized) catch {};400 parseError(tokenizer, tag_token, "duplicate header url: #{}", .{urlized}) catch {};
395 parseError(tokenizer, entry.value, "other tag here") catch {};401 parseError(tokenizer, entry.value, "other tag here", .{}) catch {};
396 return error.ParseError;402 return error.ParseError;
397 }403 }
398 if (last_action == Action.Open) {404 if (last_action == Action.Open) {
399 try toc.writeByte('\n');405 try toc.writeByte('\n');
400 try toc.writeByteNTimes(' ', header_stack_size * 4);406 try toc.writeByteNTimes(' ', header_stack_size * 4);
401 if (last_columns) |n| {407 if (last_columns) |n| {
402 try toc.print("<ul style=\"columns: {}\">\n", n);408 try toc.print("<ul style=\"columns: {}\">\n", .{n});
403 } else {409 } else {
404 try toc.write("<ul>\n");410 try toc.write("<ul>\n");
405 }411 }
...@@ -408,10 +414,10 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -408,10 +414,10 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
408 }414 }
409 last_columns = columns;415 last_columns = columns;
410 try toc.writeByteNTimes(' ', 4 + header_stack_size * 4);416 try toc.writeByteNTimes(' ', 4 + header_stack_size * 4);
411 try toc.print("<li><a id=\"toc-{}\" href=\"#{}\">{}</a>", urlized, urlized, content);417 try toc.print("<li><a id=\"toc-{}\" href=\"#{}\">{}</a>", .{ urlized, urlized, content });
412 } else if (mem.eql(u8, tag_name, "header_close")) {418 } else if (mem.eql(u8, tag_name, "header_close")) {
413 if (header_stack_size == 0) {419 if (header_stack_size == 0) {
414 return parseError(tokenizer, tag_token, "unbalanced close header");420 return parseError(tokenizer, tag_token, "unbalanced close header", .{});
415 }421 }
416 header_stack_size -= 1;422 header_stack_size -= 1;
417 _ = try eatToken(tokenizer, Token.Id.BracketClose);423 _ = try eatToken(tokenizer, Token.Id.BracketClose);
...@@ -442,7 +448,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -442,7 +448,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
442 try nodes.append(Node{ .SeeAlso = list.toOwnedSlice() });448 try nodes.append(Node{ .SeeAlso = list.toOwnedSlice() });
443 break;449 break;
444 },450 },
445 else => return parseError(tokenizer, see_also_tok, "invalid see_also token"),451 else => return parseError(tokenizer, see_also_tok, "invalid see_also token", .{}),
446 }452 }
447 }453 }
448 } else if (mem.eql(u8, tag_name, "link")) {454 } else if (mem.eql(u8, tag_name, "link")) {
...@@ -459,7 +465,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -459,7 +465,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
459 _ = try eatToken(tokenizer, Token.Id.BracketClose);465 _ = try eatToken(tokenizer, Token.Id.BracketClose);
460 break :blk tokenizer.buffer[explicit_text.start..explicit_text.end];466 break :blk tokenizer.buffer[explicit_text.start..explicit_text.end];
461 },467 },
462 else => return parseError(tokenizer, tok, "invalid link token"),468 else => return parseError(tokenizer, tok, "invalid link token", .{}),
463 }469 }
464 };470 };
465471
...@@ -482,7 +488,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -482,7 +488,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
482 _ = try eatToken(tokenizer, Token.Id.BracketClose);488 _ = try eatToken(tokenizer, Token.Id.BracketClose);
483 },489 },
484 Token.Id.BracketClose => {},490 Token.Id.BracketClose => {},
485 else => return parseError(tokenizer, token, "invalid token"),491 else => return parseError(tokenizer, token, "invalid token", .{}),
486 }492 }
487 const code_kind_str = tokenizer.buffer[code_kind_tok.start..code_kind_tok.end];493 const code_kind_str = tokenizer.buffer[code_kind_tok.start..code_kind_tok.end];
488 var code_kind_id: Code.Id = undefined;494 var code_kind_id: Code.Id = undefined;
...@@ -512,7 +518,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -512,7 +518,7 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
512 code_kind_id = Code.Id{ .Obj = null };518 code_kind_id = Code.Id{ .Obj = null };
513 is_inline = true;519 is_inline = true;
514 } else {520 } else {
515 return parseError(tokenizer, code_kind_tok, "unrecognized code kind: {}", code_kind_str);521 return parseError(tokenizer, code_kind_tok, "unrecognized code kind: {}", .{code_kind_str});
516 }522 }
517523
518 var mode = builtin.Mode.Debug;524 var mode = builtin.Mode.Debug;
...@@ -550,7 +556,12 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -550,7 +556,12 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
550 _ = try eatToken(tokenizer, Token.Id.BracketClose);556 _ = try eatToken(tokenizer, Token.Id.BracketClose);
551 break content_tok;557 break content_tok;
552 } else {558 } else {
553 return parseError(tokenizer, end_code_tag, "invalid token inside code_begin: {}", end_tag_name);559 return parseError(
560 tokenizer,
561 end_code_tag,
562 "invalid token inside code_begin: {}",
563 .{end_tag_name},
564 );
554 }565 }
555 _ = try eatToken(tokenizer, Token.Id.BracketClose);566 _ = try eatToken(tokenizer, Token.Id.BracketClose);
556 } else567 } else
...@@ -575,15 +586,20 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {...@@ -575,15 +586,20 @@ fn genToc(allocator: *mem.Allocator, tokenizer: *Tokenizer) !Toc {
575 const end_syntax_tag = try eatToken(tokenizer, Token.Id.TagContent);586 const end_syntax_tag = try eatToken(tokenizer, Token.Id.TagContent);
576 const end_tag_name = tokenizer.buffer[end_syntax_tag.start..end_syntax_tag.end];587 const end_tag_name = tokenizer.buffer[end_syntax_tag.start..end_syntax_tag.end];
577 if (!mem.eql(u8, end_tag_name, "endsyntax")) {588 if (!mem.eql(u8, end_tag_name, "endsyntax")) {
578 return parseError(tokenizer, end_syntax_tag, "invalid token inside syntax: {}", end_tag_name);589 return parseError(
590 tokenizer,
591 end_syntax_tag,
592 "invalid token inside syntax: {}",
593 .{end_tag_name},
594 );
579 }595 }
580 _ = try eatToken(tokenizer, Token.Id.BracketClose);596 _ = try eatToken(tokenizer, Token.Id.BracketClose);
581 try nodes.append(Node{ .Syntax = content_tok });597 try nodes.append(Node{ .Syntax = content_tok });
582 } else {598 } else {
583 return parseError(tokenizer, tag_token, "unrecognized tag name: {}", tag_name);599 return parseError(tokenizer, tag_token, "unrecognized tag name: {}", .{tag_name});
584 }600 }
585 },601 },
586 else => return parseError(tokenizer, token, "invalid token"),602 else => return parseError(tokenizer, token, "invalid token", .{}),
587 }603 }
588 }604 }
589605
...@@ -729,7 +745,7 @@ fn termColor(allocator: *mem.Allocator, input: []const u8) ![]u8 {...@@ -729,7 +745,7 @@ fn termColor(allocator: *mem.Allocator, input: []const u8) ![]u8 {
729 try out.write("</span>");745 try out.write("</span>");
730 }746 }
731 if (first_number != 0 or second_number != 0) {747 if (first_number != 0 or second_number != 0) {
732 try out.print("<span class=\"t{}_{}\">", first_number, second_number);748 try out.print("<span class=\"t{}_{}\">", .{ first_number, second_number });
733 open_span_count += 1;749 open_span_count += 1;
734 }750 }
735 },751 },
...@@ -960,6 +976,7 @@ fn tokenizeAndPrintRaw(docgen_tokenizer: *Tokenizer, out: var, source_token: Tok...@@ -960,6 +976,7 @@ fn tokenizeAndPrintRaw(docgen_tokenizer: *Tokenizer, out: var, source_token: Tok
960 docgen_tokenizer,976 docgen_tokenizer,
961 source_token,977 source_token,
962 "syntax error",978 "syntax error",
979 .{},
963 ),980 ),
964 }981 }
965 index = token.end;982 index = token.end;
...@@ -987,9 +1004,9 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -987,9 +1004,9 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
987 },1004 },
988 Node.Link => |info| {1005 Node.Link => |info| {
989 if (!toc.urls.contains(info.url)) {1006 if (!toc.urls.contains(info.url)) {
990 return parseError(tokenizer, info.token, "url not found: {}", info.url);1007 return parseError(tokenizer, info.token, "url not found: {}", .{info.url});
991 }1008 }
992 try out.print("<a href=\"#{}\">{}</a>", info.url, info.name);1009 try out.print("<a href=\"#{}\">{}</a>", .{ info.url, info.name });
993 },1010 },
994 Node.Nav => {1011 Node.Nav => {
995 try out.write(toc.toc);1012 try out.write(toc.toc);
...@@ -1002,12 +1019,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1002,12 +1019,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1002 Node.HeaderOpen => |info| {1019 Node.HeaderOpen => |info| {
1003 try out.print(1020 try out.print(
1004 "<h{} id=\"{}\"><a href=\"#toc-{}\">{}</a> <a class=\"hdr\" href=\"#{}\">§</a></h{}>\n",1021 "<h{} id=\"{}\"><a href=\"#toc-{}\">{}</a> <a class=\"hdr\" href=\"#{}\">§</a></h{}>\n",
1005 info.n,1022 .{ info.n, info.url, info.url, info.name, info.url, info.n },
1006 info.url,
1007 info.url,
1008 info.name,
1009 info.url,
1010 info.n,
1011 );1023 );
1012 },1024 },
1013 Node.SeeAlso => |items| {1025 Node.SeeAlso => |items| {
...@@ -1015,9 +1027,9 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1015,9 +1027,9 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1015 for (items) |item| {1027 for (items) |item| {
1016 const url = try urlize(allocator, item.name);1028 const url = try urlize(allocator, item.name);
1017 if (!toc.urls.contains(url)) {1029 if (!toc.urls.contains(url)) {
1018 return parseError(tokenizer, item.token, "url not found: {}", url);1030 return parseError(tokenizer, item.token, "url not found: {}", .{url});
1019 }1031 }
1020 try out.print("<li><a href=\"#{}\">{}</a></li>\n", url, item.name);1032 try out.print("<li><a href=\"#{}\">{}</a></li>\n", .{ url, item.name });
1021 }1033 }
1022 try out.write("</ul>\n");1034 try out.write("</ul>\n");
1023 },1035 },
...@@ -1026,17 +1038,17 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1026,17 +1038,17 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1026 },1038 },
1027 Node.Code => |code| {1039 Node.Code => |code| {
1028 code_progress_index += 1;1040 code_progress_index += 1;
1029 warn("docgen example code {}/{}...", code_progress_index, tokenizer.code_node_count);1041 warn("docgen example code {}/{}...", .{ code_progress_index, tokenizer.code_node_count });
10301042
1031 const raw_source = tokenizer.buffer[code.source_token.start..code.source_token.end];1043 const raw_source = tokenizer.buffer[code.source_token.start..code.source_token.end];
1032 const trimmed_raw_source = mem.trim(u8, raw_source, " \n");1044 const trimmed_raw_source = mem.trim(u8, raw_source, " \n");
1033 if (!code.is_inline) {1045 if (!code.is_inline) {
1034 try out.print("<p class=\"file\">{}.zig</p>", code.name);1046 try out.print("<p class=\"file\">{}.zig</p>", .{code.name});
1035 }1047 }
1036 try out.write("<pre>");1048 try out.write("<pre>");
1037 try tokenizeAndPrint(tokenizer, out, code.source_token);1049 try tokenizeAndPrint(tokenizer, out, code.source_token);
1038 try out.write("</pre>");1050 try out.write("</pre>");
1039 const name_plus_ext = try std.fmt.allocPrint(allocator, "{}.zig", code.name);1051 const name_plus_ext = try std.fmt.allocPrint(allocator, "{}.zig", .{code.name});
1040 const tmp_source_file_name = try fs.path.join(1052 const tmp_source_file_name = try fs.path.join(
1041 allocator,1053 allocator,
1042 &[_][]const u8{ tmp_dir_name, name_plus_ext },1054 &[_][]const u8{ tmp_dir_name, name_plus_ext },
...@@ -1045,7 +1057,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1045,7 +1057,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
10451057
1046 switch (code.id) {1058 switch (code.id) {
1047 Code.Id.Exe => |expected_outcome| code_block: {1059 Code.Id.Exe => |expected_outcome| code_block: {
1048 const name_plus_bin_ext = try std.fmt.allocPrint(allocator, "{}{}", code.name, exe_ext);1060 const name_plus_bin_ext = try std.fmt.allocPrint(allocator, "{}{}", .{ code.name, exe_ext });
1049 var build_args = std.ArrayList([]const u8).init(allocator);1061 var build_args = std.ArrayList([]const u8).init(allocator);
1050 defer build_args.deinit();1062 defer build_args.deinit();
1051 try build_args.appendSlice(&[_][]const u8{1063 try build_args.appendSlice(&[_][]const u8{
...@@ -1059,40 +1071,40 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1059,40 +1071,40 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1059 "--cache",1071 "--cache",
1060 "on",1072 "on",
1061 });1073 });
1062 try out.print("<pre><code class=\"shell\">$ zig build-exe {}.zig", code.name);1074 try out.print("<pre><code class=\"shell\">$ zig build-exe {}.zig", .{code.name});
1063 switch (code.mode) {1075 switch (code.mode) {
1064 builtin.Mode.Debug => {},1076 builtin.Mode.Debug => {},
1065 builtin.Mode.ReleaseSafe => {1077 builtin.Mode.ReleaseSafe => {
1066 try build_args.append("--release-safe");1078 try build_args.append("--release-safe");
1067 try out.print(" --release-safe");1079 try out.print(" --release-safe", .{});
1068 },1080 },
1069 builtin.Mode.ReleaseFast => {1081 builtin.Mode.ReleaseFast => {
1070 try build_args.append("--release-fast");1082 try build_args.append("--release-fast");
1071 try out.print(" --release-fast");1083 try out.print(" --release-fast", .{});
1072 },1084 },
1073 builtin.Mode.ReleaseSmall => {1085 builtin.Mode.ReleaseSmall => {
1074 try build_args.append("--release-small");1086 try build_args.append("--release-small");
1075 try out.print(" --release-small");1087 try out.print(" --release-small", .{});
1076 },1088 },
1077 }1089 }
1078 for (code.link_objects) |link_object| {1090 for (code.link_objects) |link_object| {
1079 const name_with_ext = try std.fmt.allocPrint(allocator, "{}{}", link_object, obj_ext);1091 const name_with_ext = try std.fmt.allocPrint(allocator, "{}{}", .{ link_object, obj_ext });
1080 const full_path_object = try fs.path.join(1092 const full_path_object = try fs.path.join(
1081 allocator,1093 allocator,
1082 &[_][]const u8{ tmp_dir_name, name_with_ext },1094 &[_][]const u8{ tmp_dir_name, name_with_ext },
1083 );1095 );
1084 try build_args.append("--object");1096 try build_args.append("--object");
1085 try build_args.append(full_path_object);1097 try build_args.append(full_path_object);
1086 try out.print(" --object {}", name_with_ext);1098 try out.print(" --object {}", .{name_with_ext});
1087 }1099 }
1088 if (code.link_libc) {1100 if (code.link_libc) {
1089 try build_args.append("-lc");1101 try build_args.append("-lc");
1090 try out.print(" -lc");1102 try out.print(" -lc", .{});
1091 }1103 }
1092 if (code.target_str) |triple| {1104 if (code.target_str) |triple| {
1093 try build_args.appendSlice(&[_][]const u8{ "-target", triple });1105 try build_args.appendSlice(&[_][]const u8{ "-target", triple });
1094 if (!code.is_inline) {1106 if (!code.is_inline) {
1095 try out.print(" -target {}", triple);1107 try out.print(" -target {}", .{triple});
1096 }1108 }
1097 }1109 }
1098 if (expected_outcome == .BuildFail) {1110 if (expected_outcome == .BuildFail) {
...@@ -1106,29 +1118,29 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1106,29 +1118,29 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1106 switch (result.term) {1118 switch (result.term) {
1107 .Exited => |exit_code| {1119 .Exited => |exit_code| {
1108 if (exit_code == 0) {1120 if (exit_code == 0) {
1109 warn("{}\nThe following command incorrectly succeeded:\n", result.stderr);1121 warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr});
1110 for (build_args.toSliceConst()) |arg|1122 for (build_args.toSliceConst()) |arg|
1111 warn("{} ", arg)1123 warn("{} ", .{arg})
1112 else1124 else
1113 warn("\n");1125 warn("\n", .{});
1114 return parseError(tokenizer, code.source_token, "example incorrectly compiled");1126 return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{});
1115 }1127 }
1116 },1128 },
1117 else => {1129 else => {
1118 warn("{}\nThe following command crashed:\n", result.stderr);1130 warn("{}\nThe following command crashed:\n", .{result.stderr});
1119 for (build_args.toSliceConst()) |arg|1131 for (build_args.toSliceConst()) |arg|
1120 warn("{} ", arg)1132 warn("{} ", .{arg})
1121 else1133 else
1122 warn("\n");1134 warn("\n", .{});
1123 return parseError(tokenizer, code.source_token, "example compile crashed");1135 return parseError(tokenizer, code.source_token, "example compile crashed", .{});
1124 },1136 },
1125 }1137 }
1126 const escaped_stderr = try escapeHtml(allocator, result.stderr);1138 const escaped_stderr = try escapeHtml(allocator, result.stderr);
1127 const colored_stderr = try termColor(allocator, escaped_stderr);1139 const colored_stderr = try termColor(allocator, escaped_stderr);
1128 try out.print("\n{}</code></pre>\n", colored_stderr);1140 try out.print("\n{}</code></pre>\n", .{colored_stderr});
1129 break :code_block;1141 break :code_block;
1130 }1142 }
1131 const exec_result = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile");1143 const exec_result = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile", .{});
11321144
1133 if (code.target_str) |triple| {1145 if (code.target_str) |triple| {
1134 if (mem.startsWith(u8, triple, "wasm32") or1146 if (mem.startsWith(u8, triple, "wasm32") or
...@@ -1137,7 +1149,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1137,7 +1149,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1137 (builtin.os != .linux or builtin.arch != .x86_64))1149 (builtin.os != .linux or builtin.arch != .x86_64))
1138 {1150 {
1139 // skip execution1151 // skip execution
1140 try out.print("</code></pre>\n");1152 try out.print("</code></pre>\n", .{});
1141 break :code_block;1153 break :code_block;
1142 }1154 }
1143 }1155 }
...@@ -1152,12 +1164,12 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1152,12 +1164,12 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1152 switch (result.term) {1164 switch (result.term) {
1153 .Exited => |exit_code| {1165 .Exited => |exit_code| {
1154 if (exit_code == 0) {1166 if (exit_code == 0) {
1155 warn("{}\nThe following command incorrectly succeeded:\n", result.stderr);1167 warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr});
1156 for (run_args) |arg|1168 for (run_args) |arg|
1157 warn("{} ", arg)1169 warn("{} ", .{arg})
1158 else1170 else
1159 warn("\n");1171 warn("\n", .{});
1160 return parseError(tokenizer, code.source_token, "example incorrectly compiled");1172 return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{});
1161 }1173 }
1162 },1174 },
1163 .Signal => exited_with_signal = true,1175 .Signal => exited_with_signal = true,
...@@ -1165,7 +1177,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1165,7 +1177,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1165 }1177 }
1166 break :blk result;1178 break :blk result;
1167 } else blk: {1179 } else blk: {
1168 break :blk exec(allocator, &env_map, run_args) catch return parseError(tokenizer, code.source_token, "example crashed");1180 break :blk exec(allocator, &env_map, run_args) catch return parseError(tokenizer, code.source_token, "example crashed", .{});
1169 };1181 };
11701182
1171 const escaped_stderr = try escapeHtml(allocator, result.stderr);1183 const escaped_stderr = try escapeHtml(allocator, result.stderr);
...@@ -1174,11 +1186,11 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1174,11 +1186,11 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1174 const colored_stderr = try termColor(allocator, escaped_stderr);1186 const colored_stderr = try termColor(allocator, escaped_stderr);
1175 const colored_stdout = try termColor(allocator, escaped_stdout);1187 const colored_stdout = try termColor(allocator, escaped_stdout);
11761188
1177 try out.print("\n$ ./{}\n{}{}", code.name, colored_stdout, colored_stderr);1189 try out.print("\n$ ./{}\n{}{}", .{ code.name, colored_stdout, colored_stderr });
1178 if (exited_with_signal) {1190 if (exited_with_signal) {
1179 try out.print("(process terminated by signal)");1191 try out.print("(process terminated by signal)", .{});
1180 }1192 }
1181 try out.print("</code></pre>\n");1193 try out.print("</code></pre>\n", .{});
1182 },1194 },
1183 Code.Id.Test => {1195 Code.Id.Test => {
1184 var test_args = std.ArrayList([]const u8).init(allocator);1196 var test_args = std.ArrayList([]const u8).init(allocator);
...@@ -1191,34 +1203,34 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1191,34 +1203,34 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1191 "--cache",1203 "--cache",
1192 "on",1204 "on",
1193 });1205 });
1194 try out.print("<pre><code class=\"shell\">$ zig test {}.zig", code.name);1206 try out.print("<pre><code class=\"shell\">$ zig test {}.zig", .{code.name});
1195 switch (code.mode) {1207 switch (code.mode) {
1196 builtin.Mode.Debug => {},1208 builtin.Mode.Debug => {},
1197 builtin.Mode.ReleaseSafe => {1209 builtin.Mode.ReleaseSafe => {
1198 try test_args.append("--release-safe");1210 try test_args.append("--release-safe");
1199 try out.print(" --release-safe");1211 try out.print(" --release-safe", .{});
1200 },1212 },
1201 builtin.Mode.ReleaseFast => {1213 builtin.Mode.ReleaseFast => {
1202 try test_args.append("--release-fast");1214 try test_args.append("--release-fast");
1203 try out.print(" --release-fast");1215 try out.print(" --release-fast", .{});
1204 },1216 },
1205 builtin.Mode.ReleaseSmall => {1217 builtin.Mode.ReleaseSmall => {
1206 try test_args.append("--release-small");1218 try test_args.append("--release-small");
1207 try out.print(" --release-small");1219 try out.print(" --release-small", .{});
1208 },1220 },
1209 }1221 }
1210 if (code.link_libc) {1222 if (code.link_libc) {
1211 try test_args.append("-lc");1223 try test_args.append("-lc");
1212 try out.print(" -lc");1224 try out.print(" -lc", .{});
1213 }1225 }
1214 if (code.target_str) |triple| {1226 if (code.target_str) |triple| {
1215 try test_args.appendSlice(&[_][]const u8{ "-target", triple });1227 try test_args.appendSlice(&[_][]const u8{ "-target", triple });
1216 try out.print(" -target {}", triple);1228 try out.print(" -target {}", .{triple});
1217 }1229 }
1218 const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed");1230 const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed", .{});
1219 const escaped_stderr = try escapeHtml(allocator, result.stderr);1231 const escaped_stderr = try escapeHtml(allocator, result.stderr);
1220 const escaped_stdout = try escapeHtml(allocator, result.stdout);1232 const escaped_stdout = try escapeHtml(allocator, result.stdout);
1221 try out.print("\n{}{}</code></pre>\n", escaped_stderr, escaped_stdout);1233 try out.print("\n{}{}</code></pre>\n", .{ escaped_stderr, escaped_stdout });
1222 },1234 },
1223 Code.Id.TestError => |error_match| {1235 Code.Id.TestError => |error_match| {
1224 var test_args = std.ArrayList([]const u8).init(allocator);1236 var test_args = std.ArrayList([]const u8).init(allocator);
...@@ -1233,50 +1245,50 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1233,50 +1245,50 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1233 "--output-dir",1245 "--output-dir",
1234 tmp_dir_name,1246 tmp_dir_name,
1235 });1247 });
1236 try out.print("<pre><code class=\"shell\">$ zig test {}.zig", code.name);1248 try out.print("<pre><code class=\"shell\">$ zig test {}.zig", .{code.name});
1237 switch (code.mode) {1249 switch (code.mode) {
1238 builtin.Mode.Debug => {},1250 builtin.Mode.Debug => {},
1239 builtin.Mode.ReleaseSafe => {1251 builtin.Mode.ReleaseSafe => {
1240 try test_args.append("--release-safe");1252 try test_args.append("--release-safe");
1241 try out.print(" --release-safe");1253 try out.print(" --release-safe", .{});
1242 },1254 },
1243 builtin.Mode.ReleaseFast => {1255 builtin.Mode.ReleaseFast => {
1244 try test_args.append("--release-fast");1256 try test_args.append("--release-fast");
1245 try out.print(" --release-fast");1257 try out.print(" --release-fast", .{});
1246 },1258 },
1247 builtin.Mode.ReleaseSmall => {1259 builtin.Mode.ReleaseSmall => {
1248 try test_args.append("--release-small");1260 try test_args.append("--release-small");
1249 try out.print(" --release-small");1261 try out.print(" --release-small", .{});
1250 },1262 },
1251 }1263 }
1252 const result = try ChildProcess.exec(allocator, test_args.toSliceConst(), null, &env_map, max_doc_file_size);1264 const result = try ChildProcess.exec(allocator, test_args.toSliceConst(), null, &env_map, max_doc_file_size);
1253 switch (result.term) {1265 switch (result.term) {
1254 .Exited => |exit_code| {1266 .Exited => |exit_code| {
1255 if (exit_code == 0) {1267 if (exit_code == 0) {
1256 warn("{}\nThe following command incorrectly succeeded:\n", result.stderr);1268 warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr});
1257 for (test_args.toSliceConst()) |arg|1269 for (test_args.toSliceConst()) |arg|
1258 warn("{} ", arg)1270 warn("{} ", .{arg})
1259 else1271 else
1260 warn("\n");1272 warn("\n", .{});
1261 return parseError(tokenizer, code.source_token, "example incorrectly compiled");1273 return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{});
1262 }1274 }
1263 },1275 },
1264 else => {1276 else => {
1265 warn("{}\nThe following command crashed:\n", result.stderr);1277 warn("{}\nThe following command crashed:\n", .{result.stderr});
1266 for (test_args.toSliceConst()) |arg|1278 for (test_args.toSliceConst()) |arg|
1267 warn("{} ", arg)1279 warn("{} ", .{arg})
1268 else1280 else
1269 warn("\n");1281 warn("\n", .{});
1270 return parseError(tokenizer, code.source_token, "example compile crashed");1282 return parseError(tokenizer, code.source_token, "example compile crashed", .{});
1271 },1283 },
1272 }1284 }
1273 if (mem.indexOf(u8, result.stderr, error_match) == null) {1285 if (mem.indexOf(u8, result.stderr, error_match) == null) {
1274 warn("{}\nExpected to find '{}' in stderr", result.stderr, error_match);1286 warn("{}\nExpected to find '{}' in stderr", .{ result.stderr, error_match });
1275 return parseError(tokenizer, code.source_token, "example did not have expected compile error");1287 return parseError(tokenizer, code.source_token, "example did not have expected compile error", .{});
1276 }1288 }
1277 const escaped_stderr = try escapeHtml(allocator, result.stderr);1289 const escaped_stderr = try escapeHtml(allocator, result.stderr);
1278 const colored_stderr = try termColor(allocator, escaped_stderr);1290 const colored_stderr = try termColor(allocator, escaped_stderr);
1279 try out.print("\n{}</code></pre>\n", colored_stderr);1291 try out.print("\n{}</code></pre>\n", .{colored_stderr});
1280 },1292 },
12811293
1282 Code.Id.TestSafety => |error_match| {1294 Code.Id.TestSafety => |error_match| {
...@@ -1311,38 +1323,37 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1311,38 +1323,37 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1311 switch (result.term) {1323 switch (result.term) {
1312 .Exited => |exit_code| {1324 .Exited => |exit_code| {
1313 if (exit_code == 0) {1325 if (exit_code == 0) {
1314 warn("{}\nThe following command incorrectly succeeded:\n", result.stderr);1326 warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr});
1315 for (test_args.toSliceConst()) |arg|1327 for (test_args.toSliceConst()) |arg|
1316 warn("{} ", arg)1328 warn("{} ", .{arg})
1317 else1329 else
1318 warn("\n");1330 warn("\n", .{});
1319 return parseError(tokenizer, code.source_token, "example test incorrectly succeeded");1331 return parseError(tokenizer, code.source_token, "example test incorrectly succeeded", .{});
1320 }1332 }
1321 },1333 },
1322 else => {1334 else => {
1323 warn("{}\nThe following command crashed:\n", result.stderr);1335 warn("{}\nThe following command crashed:\n", .{result.stderr});
1324 for (test_args.toSliceConst()) |arg|1336 for (test_args.toSliceConst()) |arg|
1325 warn("{} ", arg)1337 warn("{} ", .{arg})
1326 else1338 else
1327 warn("\n");1339 warn("\n", .{});
1328 return parseError(tokenizer, code.source_token, "example compile crashed");1340 return parseError(tokenizer, code.source_token, "example compile crashed", .{});
1329 },1341 },
1330 }1342 }
1331 if (mem.indexOf(u8, result.stderr, error_match) == null) {1343 if (mem.indexOf(u8, result.stderr, error_match) == null) {
1332 warn("{}\nExpected to find '{}' in stderr", result.stderr, error_match);1344 warn("{}\nExpected to find '{}' in stderr", .{ result.stderr, error_match });
1333 return parseError(tokenizer, code.source_token, "example did not have expected runtime safety error message");1345 return parseError(tokenizer, code.source_token, "example did not have expected runtime safety error message", .{});
1334 }1346 }
1335 const escaped_stderr = try escapeHtml(allocator, result.stderr);1347 const escaped_stderr = try escapeHtml(allocator, result.stderr);
1336 const colored_stderr = try termColor(allocator, escaped_stderr);1348 const colored_stderr = try termColor(allocator, escaped_stderr);
1337 try out.print(1349 try out.print("<pre><code class=\"shell\">$ zig test {}.zig{}\n{}</code></pre>\n", .{
1338 "<pre><code class=\"shell\">$ zig test {}.zig{}\n{}</code></pre>\n",
1339 code.name,1350 code.name,
1340 mode_arg,1351 mode_arg,
1341 colored_stderr,1352 colored_stderr,
1342 );1353 });
1343 },1354 },
1344 Code.Id.Obj => |maybe_error_match| {1355 Code.Id.Obj => |maybe_error_match| {
1345 const name_plus_obj_ext = try std.fmt.allocPrint(allocator, "{}{}", code.name, obj_ext);1356 const name_plus_obj_ext = try std.fmt.allocPrint(allocator, "{}{}", .{ code.name, obj_ext });
1346 const tmp_obj_file_name = try fs.path.join(1357 const tmp_obj_file_name = try fs.path.join(
1347 allocator,1358 allocator,
1348 &[_][]const u8{ tmp_dir_name, name_plus_obj_ext },1359 &[_][]const u8{ tmp_dir_name, name_plus_obj_ext },
...@@ -1350,7 +1361,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1350,7 +1361,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1350 var build_args = std.ArrayList([]const u8).init(allocator);1361 var build_args = std.ArrayList([]const u8).init(allocator);
1351 defer build_args.deinit();1362 defer build_args.deinit();
13521363
1353 const name_plus_h_ext = try std.fmt.allocPrint(allocator, "{}.h", code.name);1364 const name_plus_h_ext = try std.fmt.allocPrint(allocator, "{}.h", .{code.name});
1354 const output_h_file_name = try fs.path.join(1365 const output_h_file_name = try fs.path.join(
1355 allocator,1366 allocator,
1356 &[_][]const u8{ tmp_dir_name, name_plus_h_ext },1367 &[_][]const u8{ tmp_dir_name, name_plus_h_ext },
...@@ -1369,7 +1380,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1369,7 +1380,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1369 });1380 });
13701381
1371 if (!code.is_inline) {1382 if (!code.is_inline) {
1372 try out.print("<pre><code class=\"shell\">$ zig build-obj {}.zig", code.name);1383 try out.print("<pre><code class=\"shell\">$ zig build-obj {}.zig", .{code.name});
1373 }1384 }
13741385
1375 switch (code.mode) {1386 switch (code.mode) {
...@@ -1377,26 +1388,26 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1377,26 +1388,26 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1377 builtin.Mode.ReleaseSafe => {1388 builtin.Mode.ReleaseSafe => {
1378 try build_args.append("--release-safe");1389 try build_args.append("--release-safe");
1379 if (!code.is_inline) {1390 if (!code.is_inline) {
1380 try out.print(" --release-safe");1391 try out.print(" --release-safe", .{});
1381 }1392 }
1382 },1393 },
1383 builtin.Mode.ReleaseFast => {1394 builtin.Mode.ReleaseFast => {
1384 try build_args.append("--release-fast");1395 try build_args.append("--release-fast");
1385 if (!code.is_inline) {1396 if (!code.is_inline) {
1386 try out.print(" --release-fast");1397 try out.print(" --release-fast", .{});
1387 }1398 }
1388 },1399 },
1389 builtin.Mode.ReleaseSmall => {1400 builtin.Mode.ReleaseSmall => {
1390 try build_args.append("--release-small");1401 try build_args.append("--release-small");
1391 if (!code.is_inline) {1402 if (!code.is_inline) {
1392 try out.print(" --release-small");1403 try out.print(" --release-small", .{});
1393 }1404 }
1394 },1405 },
1395 }1406 }
13961407
1397 if (code.target_str) |triple| {1408 if (code.target_str) |triple| {
1398 try build_args.appendSlice(&[_][]const u8{ "-target", triple });1409 try build_args.appendSlice(&[_][]const u8{ "-target", triple });
1399 try out.print(" -target {}", triple);1410 try out.print(" -target {}", .{triple});
1400 }1411 }
14011412
1402 if (maybe_error_match) |error_match| {1413 if (maybe_error_match) |error_match| {
...@@ -1404,35 +1415,35 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1404,35 +1415,35 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1404 switch (result.term) {1415 switch (result.term) {
1405 .Exited => |exit_code| {1416 .Exited => |exit_code| {
1406 if (exit_code == 0) {1417 if (exit_code == 0) {
1407 warn("{}\nThe following command incorrectly succeeded:\n", result.stderr);1418 warn("{}\nThe following command incorrectly succeeded:\n", .{result.stderr});
1408 for (build_args.toSliceConst()) |arg|1419 for (build_args.toSliceConst()) |arg|
1409 warn("{} ", arg)1420 warn("{} ", .{arg})
1410 else1421 else
1411 warn("\n");1422 warn("\n", .{});
1412 return parseError(tokenizer, code.source_token, "example build incorrectly succeeded");1423 return parseError(tokenizer, code.source_token, "example build incorrectly succeeded", .{});
1413 }1424 }
1414 },1425 },
1415 else => {1426 else => {
1416 warn("{}\nThe following command crashed:\n", result.stderr);1427 warn("{}\nThe following command crashed:\n", .{result.stderr});
1417 for (build_args.toSliceConst()) |arg|1428 for (build_args.toSliceConst()) |arg|
1418 warn("{} ", arg)1429 warn("{} ", .{arg})
1419 else1430 else
1420 warn("\n");1431 warn("\n", .{});
1421 return parseError(tokenizer, code.source_token, "example compile crashed");1432 return parseError(tokenizer, code.source_token, "example compile crashed", .{});
1422 },1433 },
1423 }1434 }
1424 if (mem.indexOf(u8, result.stderr, error_match) == null) {1435 if (mem.indexOf(u8, result.stderr, error_match) == null) {
1425 warn("{}\nExpected to find '{}' in stderr", result.stderr, error_match);1436 warn("{}\nExpected to find '{}' in stderr", .{ result.stderr, error_match });
1426 return parseError(tokenizer, code.source_token, "example did not have expected compile error message");1437 return parseError(tokenizer, code.source_token, "example did not have expected compile error message", .{});
1427 }1438 }
1428 const escaped_stderr = try escapeHtml(allocator, result.stderr);1439 const escaped_stderr = try escapeHtml(allocator, result.stderr);
1429 const colored_stderr = try termColor(allocator, escaped_stderr);1440 const colored_stderr = try termColor(allocator, escaped_stderr);
1430 try out.print("\n{}", colored_stderr);1441 try out.print("\n{}", .{colored_stderr});
1431 } else {1442 } else {
1432 _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile");1443 _ = exec(allocator, &env_map, build_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "example failed to compile", .{});
1433 }1444 }
1434 if (!code.is_inline) {1445 if (!code.is_inline) {
1435 try out.print("</code></pre>\n");1446 try out.print("</code></pre>\n", .{});
1436 }1447 }
1437 },1448 },
1438 Code.Id.Lib => {1449 Code.Id.Lib => {
...@@ -1446,33 +1457,33 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var...@@ -1446,33 +1457,33 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: var
1446 "--output-dir",1457 "--output-dir",
1447 tmp_dir_name,1458 tmp_dir_name,
1448 });1459 });
1449 try out.print("<pre><code class=\"shell\">$ zig build-lib {}.zig", code.name);1460 try out.print("<pre><code class=\"shell\">$ zig build-lib {}.zig", .{code.name});
1450 switch (code.mode) {1461 switch (code.mode) {
1451 builtin.Mode.Debug => {},1462 builtin.Mode.Debug => {},
1452 builtin.Mode.ReleaseSafe => {1463 builtin.Mode.ReleaseSafe => {
1453 try test_args.append("--release-safe");1464 try test_args.append("--release-safe");
1454 try out.print(" --release-safe");1465 try out.print(" --release-safe", .{});
1455 },1466 },
1456 builtin.Mode.ReleaseFast => {1467 builtin.Mode.ReleaseFast => {
1457 try test_args.append("--release-fast");1468 try test_args.append("--release-fast");
1458 try out.print(" --release-fast");1469 try out.print(" --release-fast", .{});
1459 },1470 },
1460 builtin.Mode.ReleaseSmall => {1471 builtin.Mode.ReleaseSmall => {
1461 try test_args.append("--release-small");1472 try test_args.append("--release-small");
1462 try out.print(" --release-small");1473 try out.print(" --release-small", .{});
1463 },1474 },
1464 }1475 }
1465 if (code.target_str) |triple| {1476 if (code.target_str) |triple| {
1466 try test_args.appendSlice(&[_][]const u8{ "-target", triple });1477 try test_args.appendSlice(&[_][]const u8{ "-target", triple });
1467 try out.print(" -target {}", triple);1478 try out.print(" -target {}", .{triple});
1468 }1479 }
1469 const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed");1480 const result = exec(allocator, &env_map, test_args.toSliceConst()) catch return parseError(tokenizer, code.source_token, "test failed", .{});
1470 const escaped_stderr = try escapeHtml(allocator, result.stderr);1481 const escaped_stderr = try escapeHtml(allocator, result.stderr);
1471 const escaped_stdout = try escapeHtml(allocator, result.stdout);1482 const escaped_stdout = try escapeHtml(allocator, result.stdout);
1472 try out.print("\n{}{}</code></pre>\n", escaped_stderr, escaped_stdout);1483 try out.print("\n{}{}</code></pre>\n", .{ escaped_stderr, escaped_stdout });
1473 },1484 },
1474 }1485 }
1475 warn("OK\n");1486 warn("OK\n", .{});
1476 },1487 },
1477 }1488 }
1478 }1489 }
...@@ -1483,20 +1494,20 @@ fn exec(allocator: *mem.Allocator, env_map: *std.BufMap, args: []const []const u...@@ -1483,20 +1494,20 @@ fn exec(allocator: *mem.Allocator, env_map: *std.BufMap, args: []const []const u
1483 switch (result.term) {1494 switch (result.term) {
1484 .Exited => |exit_code| {1495 .Exited => |exit_code| {
1485 if (exit_code != 0) {1496 if (exit_code != 0) {
1486 warn("{}\nThe following command exited with code {}:\n", result.stderr, exit_code);1497 warn("{}\nThe following command exited with code {}:\n", .{ result.stderr, exit_code });
1487 for (args) |arg|1498 for (args) |arg|
1488 warn("{} ", arg)1499 warn("{} ", .{arg})
1489 else1500 else
1490 warn("\n");1501 warn("\n", .{});
1491 return error.ChildExitError;1502 return error.ChildExitError;
1492 }1503 }
1493 },1504 },
1494 else => {1505 else => {
1495 warn("{}\nThe following command crashed:\n", result.stderr);1506 warn("{}\nThe following command crashed:\n", .{result.stderr});
1496 for (args) |arg|1507 for (args) |arg|
1497 warn("{} ", arg)1508 warn("{} ", .{arg})
1498 else1509 else
1499 warn("\n");1510 warn("\n", .{});
1500 return error.ChildCrashed;1511 return error.ChildCrashed;
1501 },1512 },
1502 }1513 }