Skip to content

Commit d21a192

Browse files
committed
support zig fmt: off and zig fmt: on between top level decls
closes #1030 closes #1033
1 parent 8dfa66f commit d21a192

File tree

5 files changed

+70
-2
lines changed

5 files changed

+70
-2
lines changed

std/special/compiler_rt/udivmoddi4_test.zig

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// Disable formatting to avoid unnecessary source repository bloat.
2+
// zig fmt: off
13
const __udivmoddi4 = @import("udivmoddi4.zig").__udivmoddi4;
24
const assert = @import("std").debug.assert;
35

std/special/compiler_rt/udivmodti4_test.zig

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
// Disable formatting to avoid unnecessary source repository bloat.
2+
// zig fmt: off
13
const __udivmodti4 = @import("udivmodti4.zig").__udivmodti4;
24
const assert = @import("std").debug.assert;
35

std/zig/parser_test.zig

+26
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,29 @@
1+
test "zig fmt: comment to disable/enable zig fmt first" {
2+
try testCanonical(
3+
\\// Test trailing comma syntax
4+
\\// zig fmt: off
5+
\\
6+
\\const struct_trailing_comma = struct { x: i32, y: i32, };
7+
);
8+
}
9+
10+
test "zig fmt: comment to disable/enable zig fmt" {
11+
try testTransform(
12+
\\const a = b;
13+
\\// zig fmt: off
14+
\\const c = d;
15+
\\// zig fmt: on
16+
\\const e = f;
17+
,
18+
\\const a = b;
19+
\\// zig fmt: off
20+
\\const c = d;
21+
\\// zig fmt: on
22+
\\const e = f;
23+
\\
24+
);
25+
}
26+
127
test "zig fmt: pointer of unknown length" {
228
try testCanonical(
329
\\fn foo(ptr: [*]u8) void {}

std/zig/render.zig

+39-2
Original file line numberDiff line numberDiff line change
@@ -82,8 +82,45 @@ fn renderRoot(
8282

8383
var start_col: usize = 0;
8484
var it = tree.root_node.decls.iterator(0);
85-
while (it.next()) |decl| {
86-
try renderTopLevelDecl(allocator, stream, tree, 0, &start_col, decl.*);
85+
while (true) {
86+
var decl = (it.next() ?? return).*;
87+
// look for zig fmt: off comment
88+
var start_token_index = decl.firstToken();
89+
zig_fmt_loop: while (start_token_index != 0) {
90+
start_token_index -= 1;
91+
const start_token = tree.tokens.at(start_token_index);
92+
switch (start_token.id) {
93+
Token.Id.LineComment => {},
94+
Token.Id.DocComment => continue,
95+
else => break,
96+
}
97+
if (mem.eql(u8, mem.trim(u8, tree.tokenSlicePtr(start_token)[2..], " "), "zig fmt: off")) {
98+
var end_token_index = start_token_index;
99+
while (true) {
100+
end_token_index += 1;
101+
const end_token = tree.tokens.at(end_token_index);
102+
switch (end_token.id) {
103+
Token.Id.LineComment => {},
104+
Token.Id.Eof => {
105+
const start = tree.tokens.at(start_token_index + 1).start;
106+
try stream.write(tree.source[start..]);
107+
return;
108+
},
109+
else => continue,
110+
}
111+
if (mem.eql(u8, mem.trim(u8, tree.tokenSlicePtr(end_token)[2..], " "), "zig fmt: on")) {
112+
const start = tree.tokens.at(start_token_index + 1).start;
113+
try stream.print("{}\n", tree.source[start..end_token.end]);
114+
while (tree.tokens.at(decl.firstToken()).start < end_token.end) {
115+
decl = (it.next() ?? return).*;
116+
}
117+
break :zig_fmt_loop;
118+
}
119+
}
120+
}
121+
}
122+
123+
try renderTopLevelDecl(allocator, stream, tree, 0, &start_col, decl);
87124
if (it.peek()) |next_decl| {
88125
try renderExtraNewline(tree, stream, &start_col, next_decl.*);
89126
}

test/cases/syntax.zig

+1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// Test trailing comma syntax
2+
// zig fmt: off
23

34
const struct_trailing_comma = struct { x: i32, y: i32, };
45
const struct_no_comma = struct { x: i32, y: i32 };

0 commit comments

Comments
 (0)