@@ -458,6 +458,7 @@ pub const Payload = struct {
458
458
is_const : bool ,
459
459
is_extern : bool ,
460
460
is_export : bool ,
461
+ is_threadlocal : bool ,
461
462
alignment : ? c_uint ,
462
463
linksection_string : ? []const u8 ,
463
464
name : []const u8 ,
@@ -1164,42 +1165,42 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
1164
1165
},
1165
1166
});
1166
1167
},
1167
- .add = > return renderBinOp (c , node , .add , .plus , "+" ),
1168
+ .add = > return renderBinOpGrouped (c , node , .add , .plus , "+" ),
1168
1169
.add_assign = > return renderBinOp (c , node , .assign_add , .plus_equal , "+=" ),
1169
- .add_wrap = > return renderBinOp (c , node , .add_wrap , .plus_percent , "+%" ),
1170
+ .add_wrap = > return renderBinOpGrouped (c , node , .add_wrap , .plus_percent , "+%" ),
1170
1171
.add_wrap_assign = > return renderBinOp (c , node , .assign_add_wrap , .plus_percent_equal , "+%=" ),
1171
- .sub = > return renderBinOp (c , node , .sub , .minus , "-" ),
1172
+ .sub = > return renderBinOpGrouped (c , node , .sub , .minus , "-" ),
1172
1173
.sub_assign = > return renderBinOp (c , node , .assign_sub , .minus_equal , "-=" ),
1173
- .sub_wrap = > return renderBinOp (c , node , .sub_wrap , .minus_percent , "-%" ),
1174
+ .sub_wrap = > return renderBinOpGrouped (c , node , .sub_wrap , .minus_percent , "-%" ),
1174
1175
.sub_wrap_assign = > return renderBinOp (c , node , .assign_sub_wrap , .minus_percent_equal , "-%=" ),
1175
- .mul = > return renderBinOp (c , node , .mul , .asterisk , "*" ),
1176
+ .mul = > return renderBinOpGrouped (c , node , .mul , .asterisk , "*" ),
1176
1177
.mul_assign = > return renderBinOp (c , node , .assign_mul , .asterisk_equal , "*=" ),
1177
- .mul_wrap = > return renderBinOp (c , node , .mul_wrap , .asterisk_percent , "*= " ),
1178
+ .mul_wrap = > return renderBinOpGrouped (c , node , .mul_wrap , .asterisk_percent , "*% " ),
1178
1179
.mul_wrap_assign = > return renderBinOp (c , node , .assign_mul_wrap , .asterisk_percent_equal , "*%=" ),
1179
- .div = > return renderBinOp (c , node , .div , .slash , "/" ),
1180
+ .div = > return renderBinOpGrouped (c , node , .div , .slash , "/" ),
1180
1181
.div_assign = > return renderBinOp (c , node , .assign_div , .slash_equal , "/=" ),
1181
- .shl = > return renderBinOp (c , node , .bit_shift_left , .angle_bracket_angle_bracket_left , "<<" ),
1182
+ .shl = > return renderBinOpGrouped (c , node , .bit_shift_left , .angle_bracket_angle_bracket_left , "<<" ),
1182
1183
.shl_assign = > return renderBinOp (c , node , .assign_bit_shift_left , .angle_bracket_angle_bracket_left_equal , "<<=" ),
1183
- .shr = > return renderBinOp (c , node , .bit_shift_right , .angle_bracket_angle_bracket_right , ">>" ),
1184
+ .shr = > return renderBinOpGrouped (c , node , .bit_shift_right , .angle_bracket_angle_bracket_right , ">>" ),
1184
1185
.shr_assign = > return renderBinOp (c , node , .assign_bit_shift_right , .angle_bracket_angle_bracket_right_equal , ">>=" ),
1185
- .mod = > return renderBinOp (c , node , .mod , .percent , "%" ),
1186
+ .mod = > return renderBinOpGrouped (c , node , .mod , .percent , "%" ),
1186
1187
.mod_assign = > return renderBinOp (c , node , .assign_mod , .percent_equal , "%=" ),
1187
- .@"and" = > return renderBinOp (c , node , .bool_and , .keyword_and , "and" ),
1188
- .@"or" = > return renderBinOp (c , node , .bool_or , .keyword_or , "or" ),
1189
- .less_than = > return renderBinOp (c , node , .less_than , .angle_bracket_left , "<" ),
1190
- .less_than_equal = > return renderBinOp (c , node , .less_or_equal , .angle_bracket_left_equal , "<=" ),
1191
- .greater_than = > return renderBinOp (c , node , .greater_than , .angle_bracket_right , ">=" ),
1192
- .greater_than_equal = > return renderBinOp (c , node , .greater_or_equal , .angle_bracket_right_equal , ">=" ),
1193
- .equal = > return renderBinOp (c , node , .equal_equal , .equal_equal , "==" ),
1194
- .not_equal = > return renderBinOp (c , node , .bang_equal , .bang_equal , "!=" ),
1195
- .bit_and = > return renderBinOp (c , node , .bit_and , .ampersand , "&" ),
1188
+ .@"and" = > return renderBinOpGrouped (c , node , .bool_and , .keyword_and , "and" ),
1189
+ .@"or" = > return renderBinOpGrouped (c , node , .bool_or , .keyword_or , "or" ),
1190
+ .less_than = > return renderBinOpGrouped (c , node , .less_than , .angle_bracket_left , "<" ),
1191
+ .less_than_equal = > return renderBinOpGrouped (c , node , .less_or_equal , .angle_bracket_left_equal , "<=" ),
1192
+ .greater_than = > return renderBinOpGrouped (c , node , .greater_than , .angle_bracket_right , ">=" ),
1193
+ .greater_than_equal = > return renderBinOpGrouped (c , node , .greater_or_equal , .angle_bracket_right_equal , ">=" ),
1194
+ .equal = > return renderBinOpGrouped (c , node , .equal_equal , .equal_equal , "==" ),
1195
+ .not_equal = > return renderBinOpGrouped (c , node , .bang_equal , .bang_equal , "!=" ),
1196
+ .bit_and = > return renderBinOpGrouped (c , node , .bit_and , .ampersand , "&" ),
1196
1197
.bit_and_assign = > return renderBinOp (c , node , .assign_bit_and , .ampersand_equal , "&=" ),
1197
- .bit_or = > return renderBinOp (c , node , .bit_or , .pipe , "|" ),
1198
+ .bit_or = > return renderBinOpGrouped (c , node , .bit_or , .pipe , "|" ),
1198
1199
.bit_or_assign = > return renderBinOp (c , node , .assign_bit_or , .pipe_equal , "|=" ),
1199
- .bit_xor = > return renderBinOp (c , node , .bit_xor , .caret , "^" ),
1200
+ .bit_xor = > return renderBinOpGrouped (c , node , .bit_xor , .caret , "^" ),
1200
1201
.bit_xor_assign = > return renderBinOp (c , node , .assign_bit_xor , .caret_equal , "^=" ),
1201
1202
.array_cat = > return renderBinOp (c , node , .array_cat , .plus_plus , "++" ),
1202
- .ellipsis3 = > return renderBinOp (c , node , .switch_range , .ellipsis3 , "..." ),
1203
+ .ellipsis3 = > return renderBinOpGrouped (c , node , .switch_range , .ellipsis3 , "..." ),
1203
1204
.assign = > return renderBinOp (c , node , .assign , .equal , "=" ),
1204
1205
.empty_block = > {
1205
1206
const l_brace = try c .addToken (.l_brace , "{" );
@@ -1222,7 +1223,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
1222
1223
1223
1224
_ = try c .addToken (.r_brace , "}" );
1224
1225
return c .addNode (.{
1225
- .tag = .block_two ,
1226
+ .tag = .block_two_semicolon ,
1226
1227
.main_token = l_brace ,
1227
1228
.data = .{
1228
1229
.lhs = stmt ,
@@ -1410,13 +1411,13 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
1410
1411
var cases = try c .gpa .alloc (NodeIndex , payload .cases .len );
1411
1412
defer c .gpa .free (cases );
1412
1413
for (payload .cases ) | case , i | {
1413
- if (i != 0 ) _ = try c .addToken (.comma , "," );
1414
1414
cases [i ] = try renderNode (c , case );
1415
+ _ = try c .addToken (.comma , "," );
1415
1416
}
1416
1417
const span = try c .listToSpan (cases );
1417
1418
_ = try c .addToken (.r_brace , "}" );
1418
1419
return c .addNode (.{
1419
- .tag = .@"switch" ,
1420
+ .tag = .switch_comma ,
1420
1421
.main_token = switch_tok ,
1421
1422
.data = .{
1422
1423
.lhs = cond ,
@@ -1623,9 +1624,10 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
1623
1624
const payload = node .castTag (.tuple ).? .data ;
1624
1625
_ = try c .addToken (.period , "." );
1625
1626
const l_brace = try c .addToken (.l_brace , "{" );
1626
- var inits = try c .gpa .alloc (NodeIndex , std .math .max (payload .len , 1 ));
1627
+ var inits = try c .gpa .alloc (NodeIndex , std .math .max (payload .len , 2 ));
1627
1628
defer c .gpa .free (inits );
1628
1629
inits [0 ] = 0 ;
1630
+ inits [1 ] = 0 ;
1629
1631
for (payload ) | init , i | {
1630
1632
if (i != 0 ) _ = try c .addToken (.comma , "," );
1631
1633
inits [i ] = try renderNode (c , init );
@@ -1661,17 +1663,17 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
1661
1663
defer c .gpa .free (inits );
1662
1664
inits [0 ] = 0 ;
1663
1665
for (payload .inits ) | init , i | {
1664
- if (i != 0 ) _ = try c .addToken (.comma , "," );
1665
1666
_ = try c .addToken (.period , "." );
1666
1667
_ = try c .addIdentifier (init .name );
1667
1668
_ = try c .addToken (.equal , "=" );
1668
1669
inits [i ] = try renderNode (c , init .value );
1670
+ _ = try c .addToken (.comma , "," );
1669
1671
}
1670
1672
_ = try c .addToken (.r_brace , "}" );
1671
1673
1672
1674
if (payload .inits .len < 2 ) {
1673
1675
return c .addNode (.{
1674
- .tag = .struct_init_one ,
1676
+ .tag = .struct_init_one_comma ,
1675
1677
.main_token = l_brace ,
1676
1678
.data = .{
1677
1679
.lhs = lhs ,
@@ -1681,7 +1683,7 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
1681
1683
} else {
1682
1684
const span = try c .listToSpan (inits );
1683
1685
return c .addNode (.{
1684
- .tag = .struct_init ,
1686
+ .tag = .struct_init_comma ,
1685
1687
.main_token = l_brace ,
1686
1688
.data = .{
1687
1689
.lhs = lhs ,
@@ -1791,13 +1793,13 @@ fn renderArrayInit(c: *Context, lhs: NodeIndex, inits: []const Node) !NodeIndex
1791
1793
defer c .gpa .free (rendered );
1792
1794
rendered [0 ] = 0 ;
1793
1795
for (inits ) | init , i | {
1794
- if (i != 0 ) _ = try c .addToken (.comma , "," );
1795
1796
rendered [i ] = try renderNode (c , init );
1797
+ _ = try c .addToken (.comma , "," );
1796
1798
}
1797
1799
_ = try c .addToken (.r_brace , "}" );
1798
1800
if (inits .len < 2 ) {
1799
1801
return c .addNode (.{
1800
- .tag = .array_init_one ,
1802
+ .tag = .array_init_one_comma ,
1801
1803
.main_token = l_brace ,
1802
1804
.data = .{
1803
1805
.lhs = lhs ,
@@ -1807,7 +1809,7 @@ fn renderArrayInit(c: *Context, lhs: NodeIndex, inits: []const Node) !NodeIndex
1807
1809
} else {
1808
1810
const span = try c .listToSpan (rendered );
1809
1811
return c .addNode (.{
1810
- .tag = .array_init ,
1812
+ .tag = .array_init_comma ,
1811
1813
.main_token = l_brace ,
1812
1814
.data = .{
1813
1815
.lhs = lhs ,
@@ -1842,25 +1844,32 @@ fn renderArrayType(c: *Context, len: usize, elem_type: Node) !NodeIndex {
1842
1844
fn addSemicolonIfNeeded (c : * Context , node : Node ) ! void {
1843
1845
switch (node .tag ()) {
1844
1846
.warning = > unreachable ,
1845
- .var_decl , .var_simple , .arg_redecl , .alias , .enum_redecl , .block , .empty_block , .@"switch" = > {},
1847
+ .var_decl , .var_simple , .arg_redecl , .alias , .enum_redecl , .block , .empty_block , .block_single , . @"switch" = > {},
1846
1848
.while_true = > {
1847
1849
const payload = node .castTag (.while_true ).? .data ;
1848
- return addSemicolonIfNeeded (c , payload );
1850
+ return addSemicolonIfNotBlock (c , payload );
1849
1851
},
1850
1852
.@"while" = > {
1851
1853
const payload = node .castTag (.@"while" ).? .data ;
1852
- return addSemicolonIfNeeded (c , payload .body );
1854
+ return addSemicolonIfNotBlock (c , payload .body );
1853
1855
},
1854
1856
.@"if" = > {
1855
1857
const payload = node .castTag (.@"if" ).? .data ;
1856
1858
if (payload .@"else" ) | some |
1857
- return addSemicolonIfNeeded (c , some );
1858
- return addSemicolonIfNeeded (c , payload .then );
1859
+ return addSemicolonIfNotBlock (c , some );
1860
+ return addSemicolonIfNotBlock (c , payload .then );
1859
1861
},
1860
1862
else = > _ = try c .addToken (.semicolon , ";" ),
1861
1863
}
1862
1864
}
1863
1865
1866
+ fn addSemicolonIfNotBlock (c : * Context , node : Node ) ! void {
1867
+ switch (node .tag ()) {
1868
+ .block , .empty_block , .block_single , = > {},
1869
+ else = > _ = try c .addToken (.semicolon , ";" ),
1870
+ }
1871
+ }
1872
+
1864
1873
fn renderNodeGrouped (c : * Context , node : Node ) ! NodeIndex {
1865
1874
switch (node .tag ()) {
1866
1875
.null_literal ,
@@ -1918,6 +1927,7 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
1918
1927
.func ,
1919
1928
.call ,
1920
1929
.array_type ,
1930
+ .bool_to_int ,
1921
1931
= > {
1922
1932
// no grouping needed
1923
1933
return renderNode (c , node );
@@ -1926,7 +1936,6 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
1926
1936
.opaque_literal ,
1927
1937
.empty_array ,
1928
1938
.block_single ,
1929
- .bool_to_int ,
1930
1939
.add ,
1931
1940
.add_wrap ,
1932
1941
.sub ,
@@ -2022,7 +2031,7 @@ fn renderPrefixOp(c: *Context, node: Node, tag: std.zig.ast.Node.Tag, tok_tag: T
2022
2031
});
2023
2032
}
2024
2033
2025
- fn renderBinOp (c : * Context , node : Node , tag : std.zig.ast.Node.Tag , tok_tag : TokenTag , bytes : []const u8 ) ! NodeIndex {
2034
+ fn renderBinOpGrouped (c : * Context , node : Node , tag : std.zig.ast.Node.Tag , tok_tag : TokenTag , bytes : []const u8 ) ! NodeIndex {
2026
2035
const payload = @fieldParentPtr (Payload .BinOp , "base" , node .ptr_otherwise ).data ;
2027
2036
const lhs = try renderNodeGrouped (c , payload .lhs );
2028
2037
return c .addNode (.{
@@ -2035,6 +2044,19 @@ fn renderBinOp(c: *Context, node: Node, tag: std.zig.ast.Node.Tag, tok_tag: Toke
2035
2044
});
2036
2045
}
2037
2046
2047
+ fn renderBinOp (c : * Context , node : Node , tag : std.zig.ast.Node.Tag , tok_tag : TokenTag , bytes : []const u8 ) ! NodeIndex {
2048
+ const payload = @fieldParentPtr (Payload .BinOp , "base" , node .ptr_otherwise ).data ;
2049
+ const lhs = try renderNode (c , payload .lhs );
2050
+ return c .addNode (.{
2051
+ .tag = tag ,
2052
+ .main_token = try c .addToken (tok_tag , bytes ),
2053
+ .data = .{
2054
+ .lhs = lhs ,
2055
+ .rhs = try renderNode (c , payload .rhs ),
2056
+ },
2057
+ });
2058
+ }
2059
+
2038
2060
fn renderStdImport (c : * Context , first : []const u8 , second : []const u8 ) ! NodeIndex {
2039
2061
const import_tok = try c .addToken (.builtin , "@import" );
2040
2062
_ = try c .addToken (.l_paren , "(" );
@@ -2143,6 +2165,7 @@ fn renderVar(c: *Context, node: Node) !NodeIndex {
2143
2165
if (payload .is_pub ) _ = try c .addToken (.keyword_pub , "pub" );
2144
2166
if (payload .is_extern ) _ = try c .addToken (.keyword_extern , "extern" );
2145
2167
if (payload .is_export ) _ = try c .addToken (.keyword_export , "export" );
2168
+ if (payload .is_threadlocal ) _ = try c .addToken (.keyword_threadlocal , "threadlocal" );
2146
2169
const mut_tok = if (payload .is_const )
2147
2170
try c .addToken (.keyword_const , "const" )
2148
2171
else
0 commit comments