@@ -82,8 +82,45 @@ fn renderRoot(
82
82
83
83
var start_col : usize = 0 ;
84
84
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 );
87
124
if (it .peek ()) | next_decl | {
88
125
try renderExtraNewline (tree , stream , & start_col , next_decl .* );
89
126
}
0 commit comments