From bf441ed2448fdf4c5f12282ca448a62c5b71d26e Mon Sep 17 00:00:00 2001 From: Marc Tiehuis Date: Sun, 15 Jul 2018 00:07:47 +1200 Subject: [PATCH] Add --stdin option to zig fmt --- src-self-hosted/main.zig | 63 +++++++++++++++++++++++++++++++--------- 1 file changed, 49 insertions(+), 14 deletions(-) diff --git a/src-self-hosted/main.zig b/src-self-hosted/main.zig index 058459a2d8c8c9709e30cf60a284ad4e31198695..972aaae9ace55cc00bb7115da9202d8265bee6b2 100644 --- a/src-self-hosted/main.zig +++ b/src-self-hosted/main.zig @@ -527,6 +527,7 @@ const usage_fmt = \\Options: \\ --help Print this help and exit \\ --color [auto|off|on] Enable or disable colored error messages + \\ --stdin Format code from stdin \\ \\ ; @@ -538,6 +539,7 @@ const args_fmt_spec = []Flag{ "off", "on", }), + Flag.Bool("--stdin"), }; const Fmt = struct { @@ -579,25 +581,58 @@ fn cmdFmt(allocator: *Allocator, args: []const []const u8) !void { os.exit(0); } + const color = blk: { + if (flags.single("color")) |color_flag| { + if (mem.eql(u8, color_flag, "auto")) { + break :blk errmsg.Color.Auto; + } else if (mem.eql(u8, color_flag, "on")) { + break :blk errmsg.Color.On; + } else if (mem.eql(u8, color_flag, "off")) { + break :blk errmsg.Color.Off; + } else unreachable; + } else { + break :blk errmsg.Color.Auto; + } + }; + + if (flags.present("stdin")) { + if (flags.positionals.len != 0) { + try stderr.write("cannot use --stdin with positional arguments\n"); + os.exit(1); + } + + var stdin_file = try io.getStdIn(); + var stdin = io.FileInStream.init(&stdin_file); + + const source_code = try stdin.stream.readAllAlloc(allocator, @maxValue(usize)); + defer allocator.free(source_code); + + var tree = std.zig.parse(allocator, source_code) catch |err| { + try stderr.print("error parsing stdin: {}\n", err); + os.exit(1); + }; + defer tree.deinit(); + + var error_it = tree.errors.iterator(0); + while (error_it.next()) |parse_error| { + const msg = try errmsg.createFromParseError(allocator, parse_error, &tree, ""); + defer allocator.destroy(msg); + + try errmsg.printToFile(&stderr_file, msg, color); + } + if (tree.errors.len != 0) { + os.exit(1); + } + + _ = try std.zig.render(allocator, stdout, &tree); + return; + } + if (flags.positionals.len == 0) { try stderr.write("expected at least one source file argument\n"); os.exit(1); } - const color = blk: { - if (flags.single("color")) |color_flag| { - if (mem.eql(u8, color_flag, "auto")) { - break :blk errmsg.Color.Auto; - } else if (mem.eql(u8, color_flag, "on")) { - break :blk errmsg.Color.On; - } else if (mem.eql(u8, color_flag, "off")) { - break :blk errmsg.Color.Off; - } else unreachable; - } else { - break :blk errmsg.Color.Auto; - } - }; - var fmt = Fmt{ .seen = std.HashMap([]const u8, void, mem.hash_slice_u8, mem.eql_slice_u8).init(allocator), .queue = std.LinkedList([]const u8).init(), -- 2.54.0