authorgravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-19 20:48:06+02:00
committergravatar for git@vexu.euVeikka Tuominen <git@vexu.eu> 2021-02-19 20:48:06+02:00
log6f6568b1fdb30fc8574b3047470510b798307717
treedf0dda484bb618ee097207d0eb3de726b5385e0f
parentd672c20b8a8d93ba200160b3698c5edab531e091
signature Commit is signed but in an unrecognized format.

translate-c: correctly add semicolon to if statements


2 files changed, 7 insertions(+), 16 deletions(-)

src/translate_c/ast.zig+5-16
...@@ -1902,36 +1902,25 @@ fn addSemicolonIfNeeded(c: *Context, node: Node) !void {...@@ -1902,36 +1902,25 @@ fn addSemicolonIfNeeded(c: *Context, node: Node) !void {
1902 .var_decl, .var_simple, .arg_redecl, .alias, .enum_redecl, .block, .empty_block, .block_single, .@"switch" => {},1902 .var_decl, .var_simple, .arg_redecl, .alias, .enum_redecl, .block, .empty_block, .block_single, .@"switch" => {},
1903 .while_true => {1903 .while_true => {
1904 const payload = node.castTag(.while_true).?.data;1904 const payload = node.castTag(.while_true).?.data;
1905 return addSemicolonIfNotBlock(c, payload, .yes_if);1905 return addSemicolonIfNotBlock(c, payload);
1906 },1906 },
1907 .@"while" => {1907 .@"while" => {
1908 const payload = node.castTag(.@"while").?.data;1908 const payload = node.castTag(.@"while").?.data;
1909 return addSemicolonIfNotBlock(c, payload.body, .yes_if);1909 return addSemicolonIfNotBlock(c, payload.body);
1910 },1910 },
1911 .@"if" => {1911 .@"if" => {
1912 const payload = node.castTag(.@"if").?.data;1912 const payload = node.castTag(.@"if").?.data;
1913 if (payload.@"else") |some|1913 if (payload.@"else") |some|
1914 return addSemicolonIfNotBlock(c, some, .no_if);1914 return addSemicolonIfNeeded(c, some);
1915 return addSemicolonIfNotBlock(c, payload.then, .no_if);1915 return addSemicolonIfNotBlock(c, payload.then);
1916 },1916 },
1917 else => _ = try c.addToken(.semicolon, ";"),1917 else => _ = try c.addToken(.semicolon, ";"),
1918 }1918 }
1919}1919}
19201920
1921fn addSemicolonIfNotBlock(c: *Context, node: Node, if_needs_semicolon: enum{ yes_if, no_if}) !void {1921fn addSemicolonIfNotBlock(c: *Context, node: Node) !void {
1922 switch (node.tag()) {1922 switch (node.tag()) {
1923 .block, .empty_block, .block_single => {},1923 .block, .empty_block, .block_single => {},
1924 .@"if" => {
1925 if (if_needs_semicolon == .yes_if) {
1926 _ = try c.addToken(.semicolon, ";");
1927 return;
1928 }
1929
1930 const payload = node.castTag(.@"if").?.data;
1931 if (payload.@"else") |some|
1932 return addSemicolonIfNotBlock(c, some, .no_if);
1933 return addSemicolonIfNotBlock(c, payload.then, .no_if);
1934 },
1935 else => _ = try c.addToken(.semicolon, ";"),1924 else => _ = try c.addToken(.semicolon, ";"),
1936 }1925 }
1937}1926}
test/translate_c.zig+2
...@@ -10,6 +10,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -10,6 +10,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
10 \\ } else {10 \\ } else {
11 \\ int b = 2;11 \\ int b = 2;
12 \\ }12 \\ }
13 \\ if (1) if (1) {}
13 \\}14 \\}
14 , &[_][]const u8{15 , &[_][]const u8{
15 \\pub export fn foo() void {16 \\pub export fn foo() void {
...@@ -18,6 +19,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {...@@ -18,6 +19,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
18 \\ } else {19 \\ } else {
19 \\ var b: c_int = 2;20 \\ var b: c_int = 2;
20 \\ };21 \\ };
22 \\ if (true) if (true) {};
21 \\}23 \\}
22 });24 });
2325