Skip to content

Commit 7ccaee7

Browse files
committed
translate-c: support goto: switch-case support
1 parent 0e5b47c commit 7ccaee7

File tree

2 files changed

+303
-16
lines changed

2 files changed

+303
-16
lines changed

lib/compiler/aro_translate_c/ast.zig

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ pub const Node = extern union {
6161
warning,
6262
@"struct",
6363
@"union",
64+
@"enum",
6465
@"comptime",
6566
@"defer",
6667
array_init,
@@ -360,6 +361,7 @@ pub const Node = extern union {
360361
.var_decl => Payload.VarDecl,
361362
.func => Payload.Func,
362363
.@"struct", .@"union" => Payload.Record,
364+
.@"enum" => Payload.Enum,
363365
.tuple => Payload.TupleInit,
364366
.container_init => Payload.ContainerInit,
365367
.container_init_dot => Payload.ContainerInitDot,
@@ -582,6 +584,11 @@ pub const Payload = struct {
582584
};
583585
};
584586

587+
pub const Enum = struct {
588+
base: Payload,
589+
data: []const []const u8,
590+
};
591+
585592
pub const TupleInit = struct {
586593
base: Payload,
587594
data: []Node,
@@ -1935,6 +1942,40 @@ fn renderNode(c: *Context, node: Node) Allocator.Error!NodeIndex {
19351942
return renderFieldAccess(c, lhs, payload.field_name);
19361943
},
19371944
.@"struct", .@"union" => return renderRecord(c, node),
1945+
.@"enum" => {
1946+
const payload = node.castTag(.@"enum").?.data;
1947+
1948+
const enum_tok = try c.addToken(.keyword_enum, "enum");
1949+
_ = try c.addToken(.l_brace, "{");
1950+
const members = try c.gpa.alloc(NodeIndex, payload.len);
1951+
defer c.gpa.free(members);
1952+
1953+
for (payload, members) |field, *member| {
1954+
const name_tok = try c.addIdentifier(field);
1955+
1956+
member.* = try c.addNode(.{
1957+
.tag = .container_field_init,
1958+
.main_token = name_tok,
1959+
.data = .{
1960+
.lhs = 0,
1961+
.rhs = 0,
1962+
},
1963+
});
1964+
_ = try c.addToken(.comma, ",");
1965+
}
1966+
1967+
_ = try c.addToken(.r_brace, "}");
1968+
1969+
const span = try c.listToSpan(members);
1970+
return c.addNode(.{
1971+
.tag = .container_decl_trailing,
1972+
.main_token = enum_tok,
1973+
.data = .{
1974+
.lhs = span.start,
1975+
.rhs = span.end,
1976+
},
1977+
});
1978+
},
19381979
.enum_constant => {
19391980
const payload = node.castTag(.enum_constant).?.data;
19401981

@@ -2441,6 +2482,7 @@ fn renderNodeGrouped(c: *Context, node: Node) !NodeIndex {
24412482
.@"if",
24422483
.@"struct",
24432484
.@"union",
2485+
.@"enum",
24442486
.array_init,
24452487
.vector_zero_init,
24462488
.tuple,

0 commit comments

Comments
 (0)