Commit bb80daf509

Jimmi Holst Christensen <jhc@liab.dk>
2018-03-07 10:39:32
Ast Render no longer outputs erroneous semicolon closes #813
1 parent d96dd5b
src/ast_render.cpp
@@ -490,7 +490,10 @@ static void render_node_extra(AstRender *ar, AstNode *node, bool grouped) {
                 AstNode *statement = node->data.block.statements.at(i);
                 print_indent(ar);
                 render_node_grouped(ar, statement);
-                fprintf(ar->f, ";");
+
+                if (!statement_terminates_without_semicolon(statement))
+                    fprintf(ar->f, ";");
+
                 fprintf(ar->f, "\n");
             }
             ar->indent -= ar->indent_size;
src/parser.cpp
@@ -2315,7 +2315,7 @@ static AstNode *ast_parse_expression(ParseContext *pc, size_t *token_index, bool
     return nullptr;
 }
 
-static bool statement_terminates_without_semicolon(AstNode *node) {
+bool statement_terminates_without_semicolon(AstNode *node) {
     switch (node->type) {
         case NodeTypeIfBoolExpr:
             if (node->data.if_bool_expr.else_node)
src/parser.hpp
@@ -23,4 +23,6 @@ void ast_print(AstNode *node, int indent);
 
 void ast_visit_node_children(AstNode *node, void (*visit)(AstNode **, void *context), void *context);
 
+bool statement_terminates_without_semicolon(AstNode *node);
+
 #endif
test/translate_c.zig
@@ -351,7 +351,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\    var i: c_int = 0;
         \\    while (a > c_uint(0)) {
         \\        a >>= @import("std").math.Log2Int(c_uint)(1);
-        \\    };
+        \\    }
         \\    return i;
         \\}
     );
@@ -498,7 +498,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\    var i: c_int = 0;
         \\    while (a > c_uint(0)) {
         \\        a >>= u5(1);
-        \\    };
+        \\    }
         \\    return i;
         \\}
     );
@@ -867,12 +867,12 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\    while (true) {
         \\        a -= 1;
         \\        if (!(a != 0)) break;
-        \\    };
+        \\    }
         \\    var b: c_int = 2;
         \\    while (true) {
         \\        b -= 1;
         \\        if (!(b != 0)) break;
-        \\    };
+        \\    }
         \\}
     );
 
@@ -962,8 +962,8 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\pub fn foo() void {
         \\    {
         \\        var i: c_int = 0;
-        \\        while (i < 10) : (i += 1) {};
-        \\    };
+        \\        while (i < 10) : (i += 1) {}
+        \\    }
         \\}
     );
 
@@ -973,7 +973,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\}
     ,
         \\pub fn foo() void {
-        \\    while (true) {};
+        \\    while (true) {}
         \\}
     );
 
@@ -987,7 +987,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\pub fn foo() void {
         \\    while (true) {
         \\        break;
-        \\    };
+        \\    }
         \\}
     );
 
@@ -1001,7 +1001,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\pub fn foo() void {
         \\    while (true) {
         \\        continue;
-        \\    };
+        \\    }
         \\}
     );
 
@@ -1058,7 +1058,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
         \\    {
         \\        var x_0: c_int = 2;
         \\        x_0 += 1;
-        \\    };
+        \\    }
         \\    return x;
         \\}
     );
@@ -1147,7 +1147,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
        \\        return 0;
        \\    } else {
        \\        return 1;
-       \\    };
+       \\    }
        \\}
     );
 
@@ -1164,7 +1164,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
        \\        break :__to_bool_expr @bitCast(@IntType(false, @sizeOf(@typeOf(_tmp)) * 8), _tmp) != 0;
        \\    }) {
        \\        return 0;
-       \\    };
+       \\    }
        \\}
     );
 
@@ -1185,7 +1185,7 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
        \\        break :__to_bool_expr @bitCast(@IntType(false, @sizeOf(@typeOf(_tmp)) * 8), _tmp) != 0;
        \\    }) {
        \\        return 0;
-       \\    };
+       \\    }
        \\    {
        \\        var j: c_int = 4;
        \\        while (__to_bool_expr: {
@@ -1193,8 +1193,8 @@ pub fn addCases(cases: &tests.TranslateCContext) void {
        \\            break :__to_bool_expr @bitCast(@IntType(false, @sizeOf(@typeOf(_tmp)) * 8), _tmp) != 0;
        \\        }) : (j -= 1) {
        \\            return 0;
-       \\        };
-       \\    };
+       \\        }
+       \\    }
        \\}
     );
 }