| ... | @@ -4,6 +4,7 @@ const io = std.io; | ... | @@ -4,6 +4,7 @@ const io = std.io; |
| 4 | const fs = std.fs; | 4 | const fs = std.fs; |
| 5 | const process = std.process; | 5 | const process = std.process; |
| 6 | const ChildProcess = std.ChildProcess; | 6 | const ChildProcess = std.ChildProcess; |
| | 7 | const Progress = std.Progress; |
| 7 | const print = std.debug.print; | 8 | const print = std.debug.print; |
| 8 | const mem = std.mem; | 9 | const mem = std.mem; |
| 9 | const testing = std.testing; | 10 | const testing = std.testing; |
| ... | @@ -234,7 +235,7 @@ fn parseError(tokenizer: *Tokenizer, token: Token, comptime fmt: []const u8, arg | ... | @@ -234,7 +235,7 @@ fn parseError(tokenizer: *Tokenizer, token: Token, comptime fmt: []const u8, arg |
| 234 | } | 235 | } |
| 235 | } | 236 | } |
| 236 | { | 237 | { |
| 237 | const caret_count = token.end - token.start; | 238 | const caret_count = std.math.min(token.end, loc.line_end) - token.start; |
| 238 | var i: usize = 0; | 239 | var i: usize = 0; |
| 239 | while (i < caret_count) : (i += 1) { | 240 | while (i < caret_count) : (i += 1) { |
| 240 | print("~", .{}); | 241 | print("~", .{}); |
| ... | @@ -1012,6 +1013,9 @@ fn tokenizeAndPrint(docgen_tokenizer: *Tokenizer, out: anytype, source_token: To | ... | @@ -1012,6 +1013,9 @@ fn tokenizeAndPrint(docgen_tokenizer: *Tokenizer, out: anytype, source_token: To |
| 1012 | | 1013 | |
| 1013 | fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: anytype, zig_exe: []const u8, do_code_tests: bool) !void { | 1014 | fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: anytype, zig_exe: []const u8, do_code_tests: bool) !void { |
| 1014 | var code_progress_index: usize = 0; | 1015 | var code_progress_index: usize = 0; |
| | 1016 | var progress = Progress{}; |
| | 1017 | const root_node = try progress.start("Generating docgen examples", toc.nodes.len); |
| | 1018 | defer root_node.end(); |
| 1015 | | 1019 | |
| 1016 | var env_map = try process.getEnvMap(allocator); | 1020 | var env_map = try process.getEnvMap(allocator); |
| 1017 | try env_map.set("ZIG_DEBUG_COLOR", "1"); | 1021 | try env_map.set("ZIG_DEBUG_COLOR", "1"); |
| ... | @@ -1058,8 +1062,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1058,8 +1062,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1058 | try tokenizeAndPrint(tokenizer, out, content_tok); | 1062 | try tokenizeAndPrint(tokenizer, out, content_tok); |
| 1059 | }, | 1063 | }, |
| 1060 | .Code => |code| { | 1064 | .Code => |code| { |
| 1061 | code_progress_index += 1; | 1065 | root_node.completeOne(); |
| 1062 | print("docgen example code {}/{}...", .{ code_progress_index, tokenizer.code_node_count }); | | |
| 1063 | | 1066 | |
| 1064 | const raw_source = tokenizer.buffer[code.source_token.start..code.source_token.end]; | 1067 | const raw_source = tokenizer.buffer[code.source_token.start..code.source_token.end]; |
| 1065 | const trimmed_raw_source = mem.trim(u8, raw_source, " \n"); | 1068 | const trimmed_raw_source = mem.trim(u8, raw_source, " \n"); |
| ... | @@ -1071,7 +1074,6 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1071,7 +1074,6 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1071 | try out.writeAll("</pre>"); | 1074 | try out.writeAll("</pre>"); |
| 1072 | | 1075 | |
| 1073 | if (!do_code_tests) { | 1076 | if (!do_code_tests) { |
| 1074 | print("SKIP\n", .{}); | | |
| 1075 | continue; | 1077 | continue; |
| 1076 | } | 1078 | } |
| 1077 | | 1079 | |
| ... | @@ -1133,12 +1135,14 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1133,12 +1135,14 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1133 | switch (result.term) { | 1135 | switch (result.term) { |
| 1134 | .Exited => |exit_code| { | 1136 | .Exited => |exit_code| { |
| 1135 | if (exit_code == 0) { | 1137 | if (exit_code == 0) { |
| | 1138 | progress.log("", .{}); |
| 1136 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); | 1139 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1137 | dumpArgs(build_args.items); | 1140 | dumpArgs(build_args.items); |
| 1138 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); | 1141 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); |
| 1139 | } | 1142 | } |
| 1140 | }, | 1143 | }, |
| 1141 | else => { | 1144 | else => { |
| | 1145 | progress.log("", .{}); |
| 1142 | print("{s}\nThe following command crashed:\n", .{result.stderr}); | 1146 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1143 | dumpArgs(build_args.items); | 1147 | dumpArgs(build_args.items); |
| 1144 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); | 1148 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); |
| ... | @@ -1187,6 +1191,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1187,6 +1191,7 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1187 | switch (result.term) { | 1191 | switch (result.term) { |
| 1188 | .Exited => |exit_code| { | 1192 | .Exited => |exit_code| { |
| 1189 | if (exit_code == 0) { | 1193 | if (exit_code == 0) { |
| | 1194 | progress.log("", .{}); |
| 1190 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); | 1195 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1191 | dumpArgs(run_args); | 1196 | dumpArgs(run_args); |
| 1192 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); | 1197 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); |
| ... | @@ -1266,18 +1271,21 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1266,18 +1271,21 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1266 | switch (result.term) { | 1271 | switch (result.term) { |
| 1267 | .Exited => |exit_code| { | 1272 | .Exited => |exit_code| { |
| 1268 | if (exit_code == 0) { | 1273 | if (exit_code == 0) { |
| | 1274 | progress.log("", .{}); |
| 1269 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); | 1275 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1270 | dumpArgs(test_args.items); | 1276 | dumpArgs(test_args.items); |
| 1271 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); | 1277 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); |
| 1272 | } | 1278 | } |
| 1273 | }, | 1279 | }, |
| 1274 | else => { | 1280 | else => { |
| | 1281 | progress.log("", .{}); |
| 1275 | print("{s}\nThe following command crashed:\n", .{result.stderr}); | 1282 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1276 | dumpArgs(test_args.items); | 1283 | dumpArgs(test_args.items); |
| 1277 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); | 1284 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); |
| 1278 | }, | 1285 | }, |
| 1279 | } | 1286 | } |
| 1280 | if (mem.indexOf(u8, result.stderr, error_match) == null) { | 1287 | if (mem.indexOf(u8, result.stderr, error_match) == null) { |
| | 1288 | progress.log("", .{}); |
| 1281 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); | 1289 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); |
| 1282 | return parseError(tokenizer, code.source_token, "example did not have expected compile error", .{}); | 1290 | return parseError(tokenizer, code.source_token, "example did not have expected compile error", .{}); |
| 1283 | } | 1291 | } |
| ... | @@ -1321,18 +1329,21 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1321,18 +1329,21 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1321 | switch (result.term) { | 1329 | switch (result.term) { |
| 1322 | .Exited => |exit_code| { | 1330 | .Exited => |exit_code| { |
| 1323 | if (exit_code == 0) { | 1331 | if (exit_code == 0) { |
| | 1332 | progress.log("", .{}); |
| 1324 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); | 1333 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1325 | dumpArgs(test_args.items); | 1334 | dumpArgs(test_args.items); |
| 1326 | return parseError(tokenizer, code.source_token, "example test incorrectly succeeded", .{}); | 1335 | return parseError(tokenizer, code.source_token, "example test incorrectly succeeded", .{}); |
| 1327 | } | 1336 | } |
| 1328 | }, | 1337 | }, |
| 1329 | else => { | 1338 | else => { |
| | 1339 | progress.log("", .{}); |
| 1330 | print("{s}\nThe following command crashed:\n", .{result.stderr}); | 1340 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1331 | dumpArgs(test_args.items); | 1341 | dumpArgs(test_args.items); |
| 1332 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); | 1342 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); |
| 1333 | }, | 1343 | }, |
| 1334 | } | 1344 | } |
| 1335 | if (mem.indexOf(u8, result.stderr, error_match) == null) { | 1345 | if (mem.indexOf(u8, result.stderr, error_match) == null) { |
| | 1346 | progress.log("", .{}); |
| 1336 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); | 1347 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); |
| 1337 | return parseError(tokenizer, code.source_token, "example did not have expected runtime safety error message", .{}); | 1348 | return parseError(tokenizer, code.source_token, "example did not have expected runtime safety error message", .{}); |
| 1338 | } | 1349 | } |
| ... | @@ -1400,18 +1411,21 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1400,18 +1411,21 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1400 | switch (result.term) { | 1411 | switch (result.term) { |
| 1401 | .Exited => |exit_code| { | 1412 | .Exited => |exit_code| { |
| 1402 | if (exit_code == 0) { | 1413 | if (exit_code == 0) { |
| | 1414 | progress.log("", .{}); |
| 1403 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); | 1415 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1404 | dumpArgs(build_args.items); | 1416 | dumpArgs(build_args.items); |
| 1405 | return parseError(tokenizer, code.source_token, "example build incorrectly succeeded", .{}); | 1417 | return parseError(tokenizer, code.source_token, "example build incorrectly succeeded", .{}); |
| 1406 | } | 1418 | } |
| 1407 | }, | 1419 | }, |
| 1408 | else => { | 1420 | else => { |
| | 1421 | progress.log("", .{}); |
| 1409 | print("{s}\nThe following command crashed:\n", .{result.stderr}); | 1422 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1410 | dumpArgs(build_args.items); | 1423 | dumpArgs(build_args.items); |
| 1411 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); | 1424 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); |
| 1412 | }, | 1425 | }, |
| 1413 | } | 1426 | } |
| 1414 | if (mem.indexOf(u8, result.stderr, error_match) == null) { | 1427 | if (mem.indexOf(u8, result.stderr, error_match) == null) { |
| | 1428 | progress.log("", .{}); |
| 1415 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); | 1429 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); |
| 1416 | return parseError(tokenizer, code.source_token, "example did not have expected compile error message", .{}); | 1430 | return parseError(tokenizer, code.source_token, "example did not have expected compile error message", .{}); |
| 1417 | } | 1431 | } |
| ... | @@ -1461,7 +1475,6 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any | ... | @@ -1461,7 +1475,6 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1461 | try out.print("\n{s}{s}</code></pre>\n", .{ escaped_stderr, escaped_stdout }); | 1475 | try out.print("\n{s}{s}</code></pre>\n", .{ escaped_stderr, escaped_stdout }); |
| 1462 | }, | 1476 | }, |
| 1463 | } | 1477 | } |
| 1464 | print("OK\n", .{}); | | |
| 1465 | }, | 1478 | }, |
| 1466 | } | 1479 | } |
| 1467 | } | 1480 | } |