| ... | ... | @@ -4,6 +4,7 @@ const io = std.io; |
| 4 | 4 | const fs = std.fs; |
| 5 | 5 | const process = std.process; |
| 6 | 6 | const ChildProcess = std.ChildProcess; |
| 7 | const Progress = std.Progress; |
| 7 | 8 | const print = std.debug.print; |
| 8 | 9 | const mem = std.mem; |
| 9 | 10 | const testing = std.testing; |
| ... | ... | @@ -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 | 239 | var i: usize = 0; |
| 239 | 240 | while (i < caret_count) : (i += 1) { |
| 240 | 241 | print("~", .{}); |
| ... | ... | @@ -1012,6 +1013,9 @@ fn tokenizeAndPrint(docgen_tokenizer: *Tokenizer, out: anytype, source_token: To |
| 1012 | 1013 | |
| 1013 | 1014 | fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: anytype, zig_exe: []const u8, do_code_tests: bool) !void { |
| 1014 | 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 | 1020 | var env_map = try process.getEnvMap(allocator); |
| 1017 | 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 | 1062 | try tokenizeAndPrint(tokenizer, out, content_tok); |
| 1059 | 1063 | }, |
| 1060 | 1064 | .Code => |code| { |
| 1061 | | code_progress_index += 1; |
| 1062 | | print("docgen example code {}/{}...", .{ code_progress_index, tokenizer.code_node_count }); |
| 1065 | root_node.completeOne(); |
| 1063 | 1066 | |
| 1064 | 1067 | const raw_source = tokenizer.buffer[code.source_token.start..code.source_token.end]; |
| 1065 | 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 | 1074 | try out.writeAll("</pre>"); |
| 1072 | 1075 | |
| 1073 | 1076 | if (!do_code_tests) { |
| 1074 | | print("SKIP\n", .{}); |
| 1075 | 1077 | continue; |
| 1076 | 1078 | } |
| 1077 | 1079 | |
| ... | ... | @@ -1133,12 +1135,14 @@ fn genHtml(allocator: *mem.Allocator, tokenizer: *Tokenizer, toc: *Toc, out: any |
| 1133 | 1135 | switch (result.term) { |
| 1134 | 1136 | .Exited => |exit_code| { |
| 1135 | 1137 | if (exit_code == 0) { |
| 1138 | progress.log("", .{}); |
| 1136 | 1139 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1137 | 1140 | dumpArgs(build_args.items); |
| 1138 | 1141 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); |
| 1139 | 1142 | } |
| 1140 | 1143 | }, |
| 1141 | 1144 | else => { |
| 1145 | progress.log("", .{}); |
| 1142 | 1146 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1143 | 1147 | dumpArgs(build_args.items); |
| 1144 | 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 | 1191 | switch (result.term) { |
| 1188 | 1192 | .Exited => |exit_code| { |
| 1189 | 1193 | if (exit_code == 0) { |
| 1194 | progress.log("", .{}); |
| 1190 | 1195 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1191 | 1196 | dumpArgs(run_args); |
| 1192 | 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 | 1271 | switch (result.term) { |
| 1267 | 1272 | .Exited => |exit_code| { |
| 1268 | 1273 | if (exit_code == 0) { |
| 1274 | progress.log("", .{}); |
| 1269 | 1275 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1270 | 1276 | dumpArgs(test_args.items); |
| 1271 | 1277 | return parseError(tokenizer, code.source_token, "example incorrectly compiled", .{}); |
| 1272 | 1278 | } |
| 1273 | 1279 | }, |
| 1274 | 1280 | else => { |
| 1281 | progress.log("", .{}); |
| 1275 | 1282 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1276 | 1283 | dumpArgs(test_args.items); |
| 1277 | 1284 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); |
| 1278 | 1285 | }, |
| 1279 | 1286 | } |
| 1280 | 1287 | if (mem.indexOf(u8, result.stderr, error_match) == null) { |
| 1288 | progress.log("", .{}); |
| 1281 | 1289 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); |
| 1282 | 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 | 1329 | switch (result.term) { |
| 1322 | 1330 | .Exited => |exit_code| { |
| 1323 | 1331 | if (exit_code == 0) { |
| 1332 | progress.log("", .{}); |
| 1324 | 1333 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1325 | 1334 | dumpArgs(test_args.items); |
| 1326 | 1335 | return parseError(tokenizer, code.source_token, "example test incorrectly succeeded", .{}); |
| 1327 | 1336 | } |
| 1328 | 1337 | }, |
| 1329 | 1338 | else => { |
| 1339 | progress.log("", .{}); |
| 1330 | 1340 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1331 | 1341 | dumpArgs(test_args.items); |
| 1332 | 1342 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); |
| 1333 | 1343 | }, |
| 1334 | 1344 | } |
| 1335 | 1345 | if (mem.indexOf(u8, result.stderr, error_match) == null) { |
| 1346 | progress.log("", .{}); |
| 1336 | 1347 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); |
| 1337 | 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 | 1411 | switch (result.term) { |
| 1401 | 1412 | .Exited => |exit_code| { |
| 1402 | 1413 | if (exit_code == 0) { |
| 1414 | progress.log("", .{}); |
| 1403 | 1415 | print("{s}\nThe following command incorrectly succeeded:\n", .{result.stderr}); |
| 1404 | 1416 | dumpArgs(build_args.items); |
| 1405 | 1417 | return parseError(tokenizer, code.source_token, "example build incorrectly succeeded", .{}); |
| 1406 | 1418 | } |
| 1407 | 1419 | }, |
| 1408 | 1420 | else => { |
| 1421 | progress.log("", .{}); |
| 1409 | 1422 | print("{s}\nThe following command crashed:\n", .{result.stderr}); |
| 1410 | 1423 | dumpArgs(build_args.items); |
| 1411 | 1424 | return parseError(tokenizer, code.source_token, "example compile crashed", .{}); |
| 1412 | 1425 | }, |
| 1413 | 1426 | } |
| 1414 | 1427 | if (mem.indexOf(u8, result.stderr, error_match) == null) { |
| 1428 | progress.log("", .{}); |
| 1415 | 1429 | print("{s}\nExpected to find '{s}' in stderr\n", .{ result.stderr, error_match }); |
| 1416 | 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 | 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 | } |