| ... | ... | @@ -671,34 +671,45 @@ fn cmdFmt(allocator: &Allocator, args: []const []const u8) !void { |
| 671 | 671 | }; |
| 672 | 672 | defer allocator.free(source_code); |
| 673 | 673 | |
| 674 | | var tokenizer = std.zig.Tokenizer.init(source_code); |
| 675 | | var parser = std.zig.Parser.init(&tokenizer, allocator, file_path); |
| 676 | | defer parser.deinit(); |
| 677 | | |
| 678 | | var tree = parser.parse() catch |err| { |
| 674 | var tree = std.zig.parse(allocator, source_code) catch |err| { |
| 679 | 675 | try stderr.print("error parsing file '{}': {}\n", file_path, err); |
| 680 | 676 | continue; |
| 681 | 677 | }; |
| 682 | 678 | defer tree.deinit(); |
| 683 | 679 | |
| 684 | | var original_file_backup = try Buffer.init(allocator, file_path); |
| 685 | | defer original_file_backup.deinit(); |
| 686 | | try original_file_backup.append(".backup"); |
| 687 | 680 | |
| 688 | | try os.rename(allocator, file_path, original_file_backup.toSliceConst()); |
| 681 | var error_it = tree.errors.iterator(0); |
| 682 | while (error_it.next()) |parse_error| { |
| 683 | const token = tree.tokens.at(parse_error.loc()); |
| 684 | const loc = tree.tokenLocation(0, parse_error.loc()); |
| 685 | try stderr.print("{}:{}:{}: error: ", file_path, loc.line + 1, loc.column + 1); |
| 686 | try tree.renderError(parse_error, stderr); |
| 687 | try stderr.print("\n{}\n", source_code[loc.line_start..loc.line_end]); |
| 688 | { |
| 689 | var i: usize = 0; |
| 690 | while (i < loc.column) : (i += 1) { |
| 691 | try stderr.write(" "); |
| 692 | } |
| 693 | } |
| 694 | { |
| 695 | const caret_count = token.end - token.start; |
| 696 | var i: usize = 0; |
| 697 | while (i < caret_count) : (i += 1) { |
| 698 | try stderr.write("~"); |
| 699 | } |
| 700 | } |
| 701 | try stderr.write("\n"); |
| 702 | } |
| 703 | if (tree.errors.len != 0) { |
| 704 | continue; |
| 705 | } |
| 689 | 706 | |
| 690 | 707 | try stderr.print("{}\n", file_path); |
| 691 | 708 | |
| 692 | | // TODO: BufferedAtomicFile has some access problems. |
| 693 | | var out_file = try os.File.openWrite(allocator, file_path); |
| 694 | | defer out_file.close(); |
| 709 | const baf = try io.BufferedAtomicFile.create(allocator, file_path); |
| 710 | defer baf.destroy(); |
| 695 | 711 | |
| 696 | | var out_file_stream = io.FileOutStream.init(&out_file); |
| 697 | | try parser.renderSource(out_file_stream.stream, tree.root_node); |
| 698 | | |
| 699 | | if (!flags.present("keep-backups")) { |
| 700 | | try os.deleteFile(allocator, original_file_backup.toSliceConst()); |
| 701 | | } |
| 712 | try std.zig.render(allocator, baf.stream(), &tree); |
| 702 | 713 | } |
| 703 | 714 | } |
| 704 | 715 | |