From b082cd4580890190218f876bf28816b4878ae85c Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 30 May 2018 16:08:40 -0400 Subject: [PATCH] zig fmt: field access does not cause spaces for slicing See #1003 --- std/zig/parser_test.zig | 2 ++ std/zig/render.zig | 19 ++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/std/zig/parser_test.zig b/std/zig/parser_test.zig index bd5b3291e0..69903bc3fd 100644 --- a/std/zig/parser_test.zig +++ b/std/zig/parser_test.zig @@ -2,7 +2,9 @@ test "zig fmt: spaces around slice operator" { try testCanonical( \\var a = b[c..d]; \\var a = b[c + 1 .. d]; + \\var a = b[c + 1 ..]; \\var a = b[c .. d + 1]; + \\var a = b[c.a..d.e]; \\ ); } diff --git a/std/zig/render.zig b/std/zig/render.zig index 50ef4b2a16..ac07917ff1 100644 --- a/std/zig/render.zig +++ b/std/zig/render.zig @@ -530,13 +530,14 @@ fn renderExpression( const lbracket = tree.prevToken(range.start.firstToken()); const dotdot = tree.nextToken(range.start.lastToken()); - const spaces_around_op = range.start.id == ast.Node.Id.InfixOp or - (if (range.end) |end| end.id == ast.Node.Id.InfixOp else false); - const op_space = if (spaces_around_op) Space.Space else Space.None; + const after_start_space_bool = nodeCausesSliceOpSpace(range.start) or + (if (range.end) |end| nodeCausesSliceOpSpace(end) else false); + const after_start_space = if (after_start_space_bool) Space.Space else Space.None; + const after_op_space = if (range.end != null) after_start_space else Space.None; try renderToken(tree, stream, lbracket, indent, start_col, Space.None); // [ - try renderExpression(allocator, stream, tree, indent, start_col, range.start, op_space); - try renderToken(tree, stream, dotdot, indent, start_col, op_space); // .. + try renderExpression(allocator, stream, tree, indent, start_col, range.start, after_start_space); + try renderToken(tree, stream, dotdot, indent, start_col, after_op_space); // .. if (range.end) |end| { try renderExpression(allocator, stream, tree, indent, start_col, end, Space.None); } @@ -1959,3 +1960,11 @@ fn nodeIsBlock(base: &const ast.Node) bool { else => false, }; } + +fn nodeCausesSliceOpSpace(base: &ast.Node) bool { + const infix_op = base.cast(ast.Node.InfixOp) ?? return false; + return switch (infix_op.op) { + ast.Node.InfixOp.Op.Period => false, + else => true, + }; +}