translate-c: correctly add semicolon to if statements

This commit is contained in:
Veikka Tuominen
2021-02-19 20:48:06 +02:00
parent d672c20b8a
commit 6f6568b1fd
2 changed files with 7 additions and 16 deletions

View File

@@ -1902,36 +1902,25 @@ fn addSemicolonIfNeeded(c: *Context, node: Node) !void {
.var_decl, .var_simple, .arg_redecl, .alias, .enum_redecl, .block, .empty_block, .block_single, .@"switch" => {},
.while_true => {
const payload = node.castTag(.while_true).?.data;
return addSemicolonIfNotBlock(c, payload, .yes_if);
return addSemicolonIfNotBlock(c, payload);
},
.@"while" => {
const payload = node.castTag(.@"while").?.data;
return addSemicolonIfNotBlock(c, payload.body, .yes_if);
return addSemicolonIfNotBlock(c, payload.body);
},
.@"if" => {
const payload = node.castTag(.@"if").?.data;
if (payload.@"else") |some|
return addSemicolonIfNotBlock(c, some, .no_if);
return addSemicolonIfNotBlock(c, payload.then, .no_if);
return addSemicolonIfNeeded(c, some);
return addSemicolonIfNotBlock(c, payload.then);
},
else => _ = try c.addToken(.semicolon, ";"),
}
}
fn addSemicolonIfNotBlock(c: *Context, node: Node, if_needs_semicolon: enum{ yes_if, no_if}) !void {
fn addSemicolonIfNotBlock(c: *Context, node: Node) !void {
switch (node.tag()) {
.block, .empty_block, .block_single => {},
.@"if" => {
if (if_needs_semicolon == .yes_if) {
_ = try c.addToken(.semicolon, ";");
return;
}
const payload = node.castTag(.@"if").?.data;
if (payload.@"else") |some|
return addSemicolonIfNotBlock(c, some, .no_if);
return addSemicolonIfNotBlock(c, payload.then, .no_if);
},
else => _ = try c.addToken(.semicolon, ";"),
}
}

View File

@@ -10,6 +10,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\ } else {
\\ int b = 2;
\\ }
\\ if (1) if (1) {}
\\}
, &[_][]const u8{
\\pub export fn foo() void {
@@ -18,6 +19,7 @@ pub fn addCases(cases: *tests.TranslateCContext) void {
\\ } else {
\\ var b: c_int = 2;
\\ };
\\ if (true) if (true) {};
\\}
});