authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-20 13:53:53-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-05-20 13:53:53-04:00
log8c10178a1e209af53d28cc70343d0ce908bccc1b
tree71e5cc488764897d62acee7e8a52ef58eb17976f
parent4617c5907a4b7933947a3223d19d637d143fd705

golly jeepers it's taking a long time to update translate-c


4 files changed, 341 insertions(+), 269 deletions(-)

lib/std/linked_list.zig+30
...@@ -49,6 +49,26 @@ pub fn SinglyLinkedList(comptime T: type) type {...@@ -49,6 +49,26 @@ pub fn SinglyLinkedList(comptime T: type) type {
49 node.next = next_node.next;49 node.next = next_node.next;
50 return next_node;50 return next_node;
51 }51 }
52
53 /// Iterate over the singly-linked list from this node, until the final node is found.
54 /// This operation is O(N).
55 pub fn findLast(node: *Node) *Node {
56 var it = node;
57 while (true) {
58 it = it.next orelse return it;
59 }
60 }
61
62 /// Iterate over each next node, returning the count of all nodes except the starting one.
63 /// This operation is O(N).
64 pub fn countChildren(node: *const Node) usize {
65 var count: usize = 0;
66 var it: ?*const Node = node;
67 while (it) |n| : (it = n.next) {
68 count += 1;
69 }
70 return count;
71 }
52 };72 };
5373
54 first: ?*Node = null,74 first: ?*Node = null,
...@@ -87,6 +107,16 @@ pub fn SinglyLinkedList(comptime T: type) type {...@@ -87,6 +107,16 @@ pub fn SinglyLinkedList(comptime T: type) type {
87 list.first = first.next;107 list.first = first.next;
88 return first;108 return first;
89 }109 }
110
111 /// Iterate over all nodes, returning the count.
112 /// This operation is O(N).
113 pub fn len(list: Self) usize {
114 if (list.first) |n| {
115 return 1 + n.countChildren();
116 } else {
117 return 0;
118 }
119 }
90 };120 };
91}121}
92122
lib/std/zig/render.zig+3-20
...@@ -915,8 +915,7 @@ fn renderExpression(...@@ -915,8 +915,7 @@ fn renderExpression(
915915
916 if (maybe_row_size) |row_size| {916 if (maybe_row_size) |row_size| {
917 // A place to store the width of each expression and its column's maximum917 // A place to store the width of each expression and its column's maximum
918 const exprs_len = countLen(exprs.first);918 var widths = try allocator.alloc(usize, exprs.len() + row_size);
919 var widths = try allocator.alloc(usize, exprs_len + row_size);
920 defer allocator.free(widths);919 defer allocator.free(widths);
921 mem.set(usize, widths, 0);920 mem.set(usize, widths, 0);
922921
...@@ -1391,7 +1390,7 @@ fn renderExpression(...@@ -1391,7 +1390,7 @@ fn renderExpression(
1391 {1390 {
1392 break :blk false;1391 break :blk false;
1393 }1392 }
1394 const last_node = findLast(builtin_call.params.first.?).data;1393 const last_node = builtin_call.params.first.?.findLast().data;
1395 const maybe_comma = tree.nextToken(last_node.lastToken());1394 const maybe_comma = tree.nextToken(last_node.lastToken());
1396 break :blk tree.tokens[maybe_comma].id == .Comma;1395 break :blk tree.tokens[maybe_comma].id == .Comma;
1397 };1396 };
...@@ -1615,7 +1614,7 @@ fn renderExpression(...@@ -1615,7 +1614,7 @@ fn renderExpression(
16151614
1616 assert(switch_case.items.first != null);1615 assert(switch_case.items.first != null);
1617 const src_has_trailing_comma = blk: {1616 const src_has_trailing_comma = blk: {
1618 const last_node = findLast(switch_case.items.first.?).data;1617 const last_node = switch_case.items.first.?.findLast().data;
1619 const maybe_comma = tree.nextToken(last_node.lastToken());1618 const maybe_comma = tree.nextToken(last_node.lastToken());
1620 break :blk tree.tokens[maybe_comma].id == .Comma;1619 break :blk tree.tokens[maybe_comma].id == .Comma;
1621 };1620 };
...@@ -2510,19 +2509,3 @@ fn copyFixingWhitespace(stream: var, slice: []const u8) @TypeOf(stream).Error!vo...@@ -2510,19 +2509,3 @@ fn copyFixingWhitespace(stream: var, slice: []const u8) @TypeOf(stream).Error!vo
2510 else => try stream.writeByte(byte),2509 else => try stream.writeByte(byte),
2511 };2510 };
2512}2511}
2513
2514fn countLen(node: ?*std.SinglyLinkedList(*ast.Node).Node) usize {
2515 var count: usize = 0;
2516 var it = node;
2517 while (it) |n| : (it = n.next) {
2518 count += 1;
2519 }
2520 return count;
2521}
2522
2523fn findLast(node: *std.SinglyLinkedList(*ast.Node).Node) *std.SinglyLinkedList(*ast.Node).Node {
2524 var it = node;
2525 while (true) {
2526 it = it.next orelse return it;
2527 }
2528}
src-self-hosted/main.zig+6-8
...@@ -600,8 +600,7 @@ pub fn cmdFmt(gpa: *Allocator, args: []const []const u8) !void {...@@ -600,8 +600,7 @@ pub fn cmdFmt(gpa: *Allocator, args: []const []const u8) !void {
600 };600 };
601 defer tree.deinit();601 defer tree.deinit();
602602
603 var error_it = tree.errors.iterator(0);603 for (tree.errors) |parse_error| {
604 while (error_it.next()) |parse_error| {
605 try printErrMsgToFile(gpa, parse_error, tree, "<stdin>", stderr_file, color);604 try printErrMsgToFile(gpa, parse_error, tree, "<stdin>", stderr_file, color);
606 }605 }
607 if (tree.errors.len != 0) {606 if (tree.errors.len != 0) {
...@@ -701,8 +700,7 @@ fn fmtPath(fmt: *Fmt, file_path: []const u8, check_mode: bool) FmtError!void {...@@ -701,8 +700,7 @@ fn fmtPath(fmt: *Fmt, file_path: []const u8, check_mode: bool) FmtError!void {
701 };700 };
702 defer tree.deinit();701 defer tree.deinit();
703702
704 var error_it = tree.errors.iterator(0);703 for (tree.errors) |parse_error| {
705 while (error_it.next()) |parse_error| {
706 try printErrMsgToFile(fmt.gpa, parse_error, tree, file_path, std.io.getStdErr(), fmt.color);704 try printErrMsgToFile(fmt.gpa, parse_error, tree, file_path, std.io.getStdErr(), fmt.color);
707 }705 }
708 if (tree.errors.len != 0) {706 if (tree.errors.len != 0) {
...@@ -730,7 +728,7 @@ fn fmtPath(fmt: *Fmt, file_path: []const u8, check_mode: bool) FmtError!void {...@@ -730,7 +728,7 @@ fn fmtPath(fmt: *Fmt, file_path: []const u8, check_mode: bool) FmtError!void {
730728
731fn printErrMsgToFile(729fn printErrMsgToFile(
732 gpa: *mem.Allocator,730 gpa: *mem.Allocator,
733 parse_error: *const ast.Error,731 parse_error: ast.Error,
734 tree: *ast.Tree,732 tree: *ast.Tree,
735 path: []const u8,733 path: []const u8,
736 file: fs.File,734 file: fs.File,
...@@ -745,15 +743,15 @@ fn printErrMsgToFile(...@@ -745,15 +743,15 @@ fn printErrMsgToFile(
745 const span_first = lok_token;743 const span_first = lok_token;
746 const span_last = lok_token;744 const span_last = lok_token;
747745
748 const first_token = tree.tokens.at(span_first);746 const first_token = tree.tokens[span_first];
749 const last_token = tree.tokens.at(span_last);747 const last_token = tree.tokens[span_last];
750 const start_loc = tree.tokenLocationPtr(0, first_token);748 const start_loc = tree.tokenLocationPtr(0, first_token);
751 const end_loc = tree.tokenLocationPtr(first_token.end, last_token);749 const end_loc = tree.tokenLocationPtr(first_token.end, last_token);
752750
753 var text_buf = std.ArrayList(u8).init(gpa);751 var text_buf = std.ArrayList(u8).init(gpa);
754 defer text_buf.deinit();752 defer text_buf.deinit();
755 const out_stream = text_buf.outStream();753 const out_stream = text_buf.outStream();
756 try parse_error.render(&tree.tokens, out_stream);754 try parse_error.render(tree.tokens, out_stream);
757 const text = text_buf.span();755 const text = text_buf.span();
758756
759 const stream = file.outStream();757 const stream = file.outStream();
src-self-hosted/translate_c.zig+302-241
...@@ -37,10 +37,10 @@ fn addrEql(a: usize, b: usize) bool {...@@ -37,10 +37,10 @@ fn addrEql(a: usize, b: usize) bool {
37}37}
3838
39const SymbolTable = std.StringHashMap(*ast.Node);39const SymbolTable = std.StringHashMap(*ast.Node);
40const AliasList = std.SegmentedList(struct {40const AliasList = std.ArrayList(struct {
41 alias: []const u8,41 alias: []const u8,
42 name: []const u8,42 name: []const u8,
43}, 4);43});
4444
45const Scope = struct {45const Scope = struct {
46 id: Id,46 id: Id,
...@@ -64,40 +64,50 @@ const Scope = struct {...@@ -64,40 +64,50 @@ const Scope = struct {
64 const Block = struct {64 const Block = struct {
65 base: Scope,65 base: Scope,
66 block_node: *ast.Node.Block,66 block_node: *ast.Node.Block,
67 statements_it: *?*std.SinglyLinkedList(*ast.Node),
67 variables: AliasList,68 variables: AliasList,
68 label: ?[]const u8,69 label: ?[]const u8,
69 mangle_count: u32 = 0,70 mangle_count: u32 = 0,
7071
71 /// Don't forget to set rbrace token and block_node later72 /// Don't forget to set rbrace token and block_node later
72 fn init(c: *Context, parent: *Scope, label: ?[]const u8) !*Block {73 fn init(c: *Context, parent: *Scope, label: ?[]const u8) !*Block {
73 const block = try c.a().create(Block);74 const block = try c.arena.create(Block);
74 block.* = .{75 block.* = .{
75 .base = .{76 .base = .{
76 .id = .Block,77 .id = .Block,
77 .parent = parent,78 .parent = parent,
78 },79 },
79 .block_node = undefined,80 .block_node = undefined,
80 .variables = AliasList.init(c.a()),81 .statements_it = undefined,
82 .variables = AliasList.init(c.arena),
81 .label = label,83 .label = label,
82 };84 };
83 return block;85 return block;
84 }86 }
8587
88 fn pushStatement(self: *Block, c: *Context, stmt: *ast.Node) !void {
89 self.statements_it = c.llpush(*ast.Node, self.statements_it, stmt);
90 }
91
92 fn setBlockNode(self: *Block, block: *ast.Node.Block) void {
93 self.block_node = block;
94 self.statements_it = &block.statements.first;
95 }
96
86 /// Given the desired name, return a name that does not shadow anything from outer scopes.97 /// Given the desired name, return a name that does not shadow anything from outer scopes.
87 /// Inserts the returned name into the scope.98 /// Inserts the returned name into the scope.
88 fn makeMangledName(scope: *Block, c: *Context, name: []const u8) ![]const u8 {99 fn makeMangledName(scope: *Block, c: *Context, name: []const u8) ![]const u8 {
89 var proposed_name = name;100 var proposed_name = name;
90 while (scope.contains(proposed_name)) {101 while (scope.contains(proposed_name)) {
91 scope.mangle_count += 1;102 scope.mangle_count += 1;
92 proposed_name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ name, scope.mangle_count });103 proposed_name = try std.fmt.allocPrint(c.arena, "{}_{}", .{ name, scope.mangle_count });
93 }104 }
94 try scope.variables.push(.{ .name = name, .alias = proposed_name });105 try scope.variables.append(.{ .name = name, .alias = proposed_name });
95 return proposed_name;106 return proposed_name;
96 }107 }
97108
98 fn getAlias(scope: *Block, name: []const u8) []const u8 {109 fn getAlias(scope: *Block, name: []const u8) []const u8 {
99 var it = scope.variables.iterator(0);110 for (scope.variables.items) |p| {
100 while (it.next()) |p| {
101 if (mem.eql(u8, p.name, name))111 if (mem.eql(u8, p.name, name))
102 return p.alias;112 return p.alias;
103 }113 }
...@@ -105,8 +115,7 @@ const Scope = struct {...@@ -105,8 +115,7 @@ const Scope = struct {
105 }115 }
106116
107 fn localContains(scope: *Block, name: []const u8) bool {117 fn localContains(scope: *Block, name: []const u8) bool {
108 var it = scope.variables.iterator(0);118 for (scope.variables.items) |p| {
109 while (it.next()) |p| {
110 if (mem.eql(u8, p.name, name))119 if (mem.eql(u8, p.name, name))
111 return true;120 return true;
112 }121 }
...@@ -132,8 +141,8 @@ const Scope = struct {...@@ -132,8 +141,8 @@ const Scope = struct {
132 .id = .Root,141 .id = .Root,
133 .parent = null,142 .parent = null,
134 },143 },
135 .sym_table = SymbolTable.init(c.a()),144 .sym_table = SymbolTable.init(c.arena),
136 .macro_table = SymbolTable.init(c.a()),145 .macro_table = SymbolTable.init(c.arena),
137 .context = c,146 .context = c,
138 };147 };
139 }148 }
...@@ -208,7 +217,10 @@ const Scope = struct {...@@ -208,7 +217,10 @@ const Scope = struct {
208};217};
209218
210pub const Context = struct {219pub const Context = struct {
211 tree: *ast.Tree,220 gpa: *mem.Allocator,
221 arena: *mem.Allocator,
222 tokens: std.ArrayListUnmanaged(Token),
223 errors: std.ArrayListUnmanaged(ast.Error),
212 source_buffer: *std.ArrayList(u8),224 source_buffer: *std.ArrayList(u8),
213 err: Error,225 err: Error,
214 source_manager: *ZigClangSourceManager,226 source_manager: *ZigClangSourceManager,
...@@ -217,6 +229,8 @@ pub const Context = struct {...@@ -217,6 +229,8 @@ pub const Context = struct {
217 global_scope: *Scope.Root,229 global_scope: *Scope.Root,
218 clang_context: *ZigClangASTContext,230 clang_context: *ZigClangASTContext,
219 mangle_count: u32 = 0,231 mangle_count: u32 = 0,
232 root_node: *ast.Node.Root,
233 root_decls_it: *?*std.SinglyLinkedList(*ast.Node).Node,
220234
221 /// This one is different than the root scope's name table. This contains235 /// This one is different than the root scope's name table. This contains
222 /// a list of names that we found by visiting all the top level decls without236 /// a list of names that we found by visiting all the top level decls without
...@@ -224,18 +238,45 @@ pub const Context = struct {...@@ -224,18 +238,45 @@ pub const Context = struct {
224 /// up front in a pre-processing step.238 /// up front in a pre-processing step.
225 global_names: std.StringHashMap(void),239 global_names: std.StringHashMap(void),
226240
241 /// Helper type to append elements to a singly linked list.
242 const LinkedListPusher = struct {
243 c: *Context,
244 it: *?*std.SinglyLinkedList(*ast.Node).Node,
245
246 fn push(self: *LinkedListPusher, element: *ast.Node) !void {
247 self.it = try self.c.llpush(*ast.Node, self.it, element);
248 }
249 };
250
251 /// Helper function to append items to a singly linked list.
252 fn llpusher(c: *Context, list: *std.SinglyLinkedList(*ast.Node)) LinkedListPusher {
253 assert(list.first == null);
254 return .{
255 .c = c,
256 .it = &list.first,
257 };
258 }
259
260 fn llpush(
261 c: *Context,
262 comptime T: type,
263 it: *?*std.SinglyLinkedList(T).Node,
264 data: T,
265 ) !*?*std.SinglyLinkedList(T).Node {
266 const llnode = try c.arena.create(std.SinglyLinkedList(T).Node);
267 llnode.* = .{ .data = data };
268 it.* = llnode;
269 return &llnode.next;
270 }
271
227 fn getMangle(c: *Context) u32 {272 fn getMangle(c: *Context) u32 {
228 c.mangle_count += 1;273 c.mangle_count += 1;
229 return c.mangle_count;274 return c.mangle_count;
230 }275 }
231276
232 fn a(c: *Context) *mem.Allocator {
233 return &c.tree.arena_allocator.allocator;
234 }
235
236 /// Convert a null-terminated C string to a slice allocated in the arena277 /// Convert a null-terminated C string to a slice allocated in the arena
237 fn str(c: *Context, s: [*:0]const u8) ![]u8 {278 fn str(c: *Context, s: [*:0]const u8) ![]u8 {
238 return mem.dupe(c.a(), u8, mem.spanZ(s));279 return mem.dupe(c.arena, u8, mem.spanZ(s));
239 }280 }
240281
241 /// Convert a clang source location to a file:line:column string282 /// Convert a clang source location to a file:line:column string
...@@ -246,12 +287,12 @@ pub const Context = struct {...@@ -246,12 +287,12 @@ pub const Context = struct {
246287
247 const line = ZigClangSourceManager_getSpellingLineNumber(c.source_manager, spelling_loc);288 const line = ZigClangSourceManager_getSpellingLineNumber(c.source_manager, spelling_loc);
248 const column = ZigClangSourceManager_getSpellingColumnNumber(c.source_manager, spelling_loc);289 const column = ZigClangSourceManager_getSpellingColumnNumber(c.source_manager, spelling_loc);
249 return std.fmt.allocPrint(c.a(), "{}:{}:{}", .{ filename, line, column });290 return std.fmt.allocPrint(c.arena, "{}:{}:{}", .{ filename, line, column });
250 }291 }
251};292};
252293
253pub fn translate(294pub fn translate(
254 backing_allocator: *mem.Allocator,295 gpa: *mem.Allocator,
255 args_begin: [*]?[*]const u8,296 args_begin: [*]?[*]const u8,
256 args_end: [*]?[*]const u8,297 args_end: [*]?[*]const u8,
257 errors: *[]ClangErrMsg,298 errors: *[]ClangErrMsg,
...@@ -269,47 +310,43 @@ pub fn translate(...@@ -269,47 +310,43 @@ pub fn translate(
269 };310 };
270 defer ZigClangASTUnit_delete(ast_unit);311 defer ZigClangASTUnit_delete(ast_unit);
271312
272 const tree = blk: {313 var source_buffer = std.ArrayList(u8).init(gpa);
273 var tree_arena = std.heap.ArenaAllocator.init(backing_allocator);314 defer source_buffer.deinit();
274 errdefer tree_arena.deinit();315
275316 // For memory that has the same lifetime as the Tree that we return
276 const tree = try tree_arena.allocator.create(ast.Tree);317 // from this function.
277 tree.* = .{318 var arena = std.heap.ArenaAllocator.init(gpa);
278 .source = undefined, // need to use toOwnedSlice later319 errdefer arena.deinit();
279 .root_node = undefined,320
280 .arena_allocator = tree_arena,321 const root_node = try arena.allocator.create(ast.Node.Root);
281 .tokens = undefined, // can't reference the allocator yet322 root_node.* = .{
282 .errors = undefined, // can't reference the allocator yet323 .decls = ast.Node.Root.DeclList{},
283 .generated = true,
284 };
285 break :blk tree;
286 };
287 const arena = &tree.arena_allocator.allocator; // now we can reference the allocator
288 errdefer tree.arena_allocator.deinit();
289 tree.tokens = ast.Tree.TokenList.init(arena);
290 tree.errors = ast.Tree.ErrorList.init(arena);
291
292 tree.root_node = try arena.create(ast.Node.Root);
293 tree.root_node.* = .{
294 .decls = ast.Node.Root.DeclList.init(arena),
295 // initialized with the eof token at the end324 // initialized with the eof token at the end
296 .eof_token = undefined,325 .eof_token = undefined,
297 };326 };
298327
299 var source_buffer = std.ArrayList(u8).init(arena);
300
301 var context = Context{328 var context = Context{
302 .tree = tree,329 .gpa = gpa,
330 .arena = &arena.allocator,
303 .source_buffer = &source_buffer,331 .source_buffer = &source_buffer,
304 .source_manager = ZigClangASTUnit_getSourceManager(ast_unit),332 .source_manager = ZigClangASTUnit_getSourceManager(ast_unit),
305 .err = undefined,333 .err = undefined,
306 .decl_table = DeclTable.init(arena),334 .decl_table = DeclTable.init(gpa),
307 .alias_list = AliasList.init(arena),335 .alias_list = AliasList.init(gpa),
308 .global_scope = try arena.create(Scope.Root),336 .global_scope = try arena.allocator.create(Scope.Root),
309 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,337 .clang_context = ZigClangASTUnit_getASTContext(ast_unit).?,
310 .global_names = std.StringHashMap(void).init(arena),338 .global_names = std.StringHashMap(void).init(gpa),
339 .tokens = .{},
340 .errors = .{},
341 .root_node = root_node,
342 .root_decls_it = &root_node.decls.first,
311 };343 };
312 context.global_scope.* = Scope.Root.init(&context);344 context.global_scope.* = Scope.Root.init(&context);
345 defer context.decl_table.deinit();
346 defer context.alias_list.deinit();
347 defer context.tokens.deinit(gpa);
348 defer context.errors.deinit(gpa);
349 defer context.global_names.deinit();
313350
314 try prepopulateGlobalNameTable(ast_unit, &context);351 try prepopulateGlobalNameTable(ast_unit, &context);
315352
...@@ -320,23 +357,30 @@ pub fn translate(...@@ -320,23 +357,30 @@ pub fn translate(
320 try transPreprocessorEntities(&context, ast_unit);357 try transPreprocessorEntities(&context, ast_unit);
321358
322 try addMacros(&context);359 try addMacros(&context);
323 var it = context.alias_list.iterator(0);360 for (context.alias_list.items) |alias| {
324 while (it.next()) |alias| {
325 if (!context.global_scope.sym_table.contains(alias.alias)) {361 if (!context.global_scope.sym_table.contains(alias.alias)) {
326 try createAlias(&context, alias);362 try createAlias(&context, alias);
327 }363 }
328 }364 }
329365
330 tree.root_node.eof_token = try appendToken(&context, .Eof, "");366 root_node.eof_token = try appendToken(&context, .Eof, "");
331 tree.source = source_buffer.toOwnedSlice();
332 if (false) {367 if (false) {
333 std.debug.warn("debug source:\n{}\n==EOF==\ntokens:\n", .{tree.source});368 std.debug.warn("debug source:\n{}\n==EOF==\ntokens:\n", .{source_buffer.items});
334 var i: usize = 0;369 for (context.tokens.items) |token| {
335 while (i < tree.tokens.len) : (i += 1) {
336 const token = tree.tokens.at(i);
337 std.debug.warn("{}\n", .{token});370 std.debug.warn("{}\n", .{token});
338 }371 }
339 }372 }
373
374 const tree = try arena.allocator.create(ast.Tree);
375 tree.* = .{
376 .gpa = gpa,
377 .source = try arena.allocator.dupe(u8, source_buffer.items),
378 .tokens = context.tokens.toOwnedSlice(gpa),
379 .errors = context.errors.toOwnedSlice(gpa),
380 .root_node = root_node,
381 .arena = arena.state,
382 .generated = true,
383 };
340 return tree;384 return tree;
341}385}
342386
...@@ -493,17 +537,19 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -493,17 +537,19 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
493 const block_scope = try Scope.Block.init(rp.c, &c.global_scope.base, null);537 const block_scope = try Scope.Block.init(rp.c, &c.global_scope.base, null);
494 var scope = &block_scope.base;538 var scope = &block_scope.base;
495 const block_node = try transCreateNodeBlock(rp.c, null);539 const block_node = try transCreateNodeBlock(rp.c, null);
496 block_scope.block_node = block_node;540 block_scope.setBlockNode(block_node);
497541
498 var it = proto_node.params.iterator(0);542 var it = proto_node.params.first;
499 var param_id: c_uint = 0;543 var param_id: c_uint = 0;
500 while (it.next()) |p| {544 var prev_node_link = &proto_node.params_first;
501 const param = @fieldParentPtr(ast.Node.ParamDecl, "base", p.*);545 while (it) |p_node| : ({prev_node_link = &p_node.next; it = p_node.next;}) {
546 const p = p_node.data;
547 const param = @fieldParentPtr(ast.Node.ParamDecl, "base", p);
502 const param_name = if (param.name_token) |name_tok|548 const param_name = if (param.name_token) |name_tok|
503 tokenSlice(c, name_tok)549 tokenSlice(c, name_tok)
504 else if (param.param_type == .var_args) {550 else if (param.param_type == .var_args) {
505 assert(it.next() == null);551 assert(p_node.next == null);
506 _ = proto_node.params.pop();552 prev_node_link.* = null;
507 break;553 break;
508 } else554 } else
509 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name});555 return failDecl(c, fn_decl_loc, fn_name, "function {} parameter has no name", .{fn_name});
...@@ -516,7 +562,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -516,7 +562,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
516562
517 const arg_name = blk: {563 const arg_name = blk: {
518 const param_prefix = if (is_const) "" else "arg_";564 const param_prefix = if (is_const) "" else "arg_";
519 const bare_arg_name = try std.fmt.allocPrint(c.a(), "{}{}", .{ param_prefix, mangled_param_name });565 const bare_arg_name = try std.fmt.allocPrint(c.arena, "{}{}", .{ param_prefix, mangled_param_name });
520 break :blk try block_scope.makeMangledName(c, bare_arg_name);566 break :blk try block_scope.makeMangledName(c, bare_arg_name);
521 };567 };
522568
...@@ -525,7 +571,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {...@@ -525,7 +571,7 @@ fn visitFnDecl(c: *Context, fn_decl: *const ZigClangFunctionDecl) Error!void {
525 node.eq_token = try appendToken(c, .Equal, "=");571 node.eq_token = try appendToken(c, .Equal, "=");
526 node.init_node = try transCreateNodeIdentifier(c, arg_name);572 node.init_node = try transCreateNodeIdentifier(c, arg_name);
527 node.semicolon_token = try appendToken(c, .Semicolon, ";");573 node.semicolon_token = try appendToken(c, .Semicolon, ";");
528 try block_node.statements.push(&node.base);574 block_scope.block_statements_it = try c.llpush(*ast.Node, block_scope.block_statements_it, &node.base);
529 param.name_token = try appendIdentifier(c, arg_name);575 param.name_token = try appendIdentifier(c, arg_name);
530 _ = try appendToken(c, .Colon, ":");576 _ = try appendToken(c, .Colon, ":");
531 }577 }
...@@ -560,7 +606,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -560,7 +606,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
560606
561 // TODO https://github.com/ziglang/zig/issues/3756607 // TODO https://github.com/ziglang/zig/issues/3756
562 // TODO https://github.com/ziglang/zig/issues/1802608 // TODO https://github.com/ziglang/zig/issues/1802
563 const checked_name = if (isZigPrimitiveType(var_name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ var_name, c.getMangle() }) else var_name;609 const checked_name = if (isZigPrimitiveType(var_name)) try std.fmt.allocPrint(c.arena, "{}_{}", .{ var_name, c.getMangle() }) else var_name;
564 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);610 const var_decl_loc = ZigClangVarDecl_getLocation(var_decl);
565611
566 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);612 const qual_type = ZigClangVarDecl_getTypeSourceInfo_getType(var_decl);
...@@ -620,7 +666,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -620,7 +666,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
620 _ = try appendToken(rp.c, .LParen, "(");666 _ = try appendToken(rp.c, .LParen, "(");
621 const expr = try transCreateNodeStringLiteral(667 const expr = try transCreateNodeStringLiteral(
622 rp.c,668 rp.c,
623 try std.fmt.allocPrint(rp.c.a(), "\"{}\"", .{str_ptr[0..str_len]}),669 try std.fmt.allocPrint(rp.c.arena, "\"{}\"", .{str_ptr[0..str_len]}),
624 );670 );
625 _ = try appendToken(rp.c, .RParen, ")");671 _ = try appendToken(rp.c, .RParen, ")");
626672
...@@ -643,7 +689,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {...@@ -643,7 +689,7 @@ fn visitVarDecl(c: *Context, var_decl: *const ZigClangVarDecl) Error!void {
643 break :blk null;689 break :blk null;
644 };690 };
645691
646 const node = try c.a().create(ast.Node.VarDecl);692 const node = try c.arena.create(ast.Node.VarDecl);
647 node.* = .{693 node.* = .{
648 .doc_comments = null,694 .doc_comments = null,
649 .visib_token = visib_tok,695 .visib_token = visib_tok,
...@@ -702,7 +748,7 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l...@@ -702,7 +748,7 @@ fn transTypeDef(c: *Context, typedef_decl: *const ZigClangTypedefNameDecl, top_l
702748
703 // TODO https://github.com/ziglang/zig/issues/3756749 // TODO https://github.com/ziglang/zig/issues/3756
704 // TODO https://github.com/ziglang/zig/issues/1802750 // TODO https://github.com/ziglang/zig/issues/1802
705 const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ typedef_name, c.getMangle() }) else typedef_name;751 const checked_name = if (isZigPrimitiveType(typedef_name)) try std.fmt.allocPrint(c.arena, "{}_{}", .{ typedef_name, c.getMangle() }) else typedef_name;
706 if (checkForBuiltinTypedef(checked_name)) |builtin| {752 if (checkForBuiltinTypedef(checked_name)) |builtin| {
707 return transTypeDefAsBuiltin(c, typedef_decl, builtin);753 return transTypeDefAsBuiltin(c, typedef_decl, builtin);
708 }754 }
...@@ -745,7 +791,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -745,7 +791,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
745 // Record declarations such as `struct {...} x` have no name but they're not791 // Record declarations such as `struct {...} x` have no name but they're not
746 // anonymous hence here isAnonymousStructOrUnion is not needed792 // anonymous hence here isAnonymousStructOrUnion is not needed
747 if (bare_name.len == 0) {793 if (bare_name.len == 0) {
748 bare_name = try std.fmt.allocPrint(c.a(), "unnamed_{}", .{c.getMangle()});794 bare_name = try std.fmt.allocPrint(c.arena, "unnamed_{}", .{c.getMangle()});
749 is_unnamed = true;795 is_unnamed = true;
750 }796 }
751797
...@@ -762,7 +808,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -762,7 +808,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
762 return null;808 return null;
763 }809 }
764810
765 const name = try std.fmt.allocPrint(c.a(), "{}_{}", .{ container_kind_name, bare_name });811 const name = try std.fmt.allocPrint(c.arena, "{}_{}", .{ container_kind_name, bare_name });
766 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);812 _ = try c.decl_table.put(@ptrToInt(ZigClangRecordDecl_getCanonicalDecl(record_decl)), name);
767813
768 const node = try transCreateNodeVarDecl(c, !is_unnamed, true, name);814 const node = try transCreateNodeVarDecl(c, !is_unnamed, true, name);
...@@ -785,15 +831,16 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -785,15 +831,16 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
785 const container_tok = try appendToken(c, container_kind, container_kind_name);831 const container_tok = try appendToken(c, container_kind, container_kind_name);
786 const lbrace_token = try appendToken(c, .LBrace, "{");832 const lbrace_token = try appendToken(c, .LBrace, "{");
787833
788 const container_node = try c.a().create(ast.Node.ContainerDecl);834 const container_node = try c.arena.create(ast.Node.ContainerDecl);
789 container_node.* = .{835 container_node.* = .{
790 .layout_token = layout_tok,836 .layout_token = layout_tok,
791 .kind_token = container_tok,837 .kind_token = container_tok,
792 .init_arg_expr = .None,838 .init_arg_expr = .None,
793 .fields_and_decls = ast.Node.ContainerDecl.DeclList.init(c.a()),839 .fields_and_decls = ast.Node.ContainerDecl.DeclList{},
794 .lbrace_token = lbrace_token,840 .lbrace_token = lbrace_token,
795 .rbrace_token = undefined,841 .rbrace_token = undefined,
796 };842 };
843 var container_fields_and_decls = c.llpusher(&container_node.fields_and_decls);
797844
798 var unnamed_field_count: u32 = 0;845 var unnamed_field_count: u32 = 0;
799 var it = ZigClangRecordDecl_field_begin(record_def);846 var it = ZigClangRecordDecl_field_begin(record_def);
...@@ -821,7 +868,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -821,7 +868,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
821 var raw_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, field_decl)));868 var raw_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, field_decl)));
822 if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl) or raw_name.len == 0) {869 if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl) or raw_name.len == 0) {
823 // Context.getMangle() is not used here because doing so causes unpredictable field names for anonymous fields.870 // Context.getMangle() is not used here because doing so causes unpredictable field names for anonymous fields.
824 raw_name = try std.fmt.allocPrint(c.a(), "unnamed_{}", .{unnamed_field_count});871 raw_name = try std.fmt.allocPrint(c.arena, "unnamed_{}", .{unnamed_field_count});
825 unnamed_field_count += 1;872 unnamed_field_count += 1;
826 is_anon = true;873 is_anon = true;
827 }874 }
...@@ -851,7 +898,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -851,7 +898,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
851 break :blk null;898 break :blk null;
852 };899 };
853900
854 const field_node = try c.a().create(ast.Node.ContainerField);901 const field_node = try c.arena.create(ast.Node.ContainerField);
855 field_node.* = .{902 field_node.* = .{
856 .doc_comments = null,903 .doc_comments = null,
857 .comptime_token = null,904 .comptime_token = null,
...@@ -868,7 +915,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*...@@ -868,7 +915,7 @@ fn transRecordDecl(c: *Context, record_decl: *const ZigClangRecordDecl) Error!?*
868 );915 );
869 }916 }
870917
871 try container_node.fields_and_decls.push(&field_node.base);918 try container_fields_and_decls.push(&field_node.base);
872 _ = try appendToken(c, .Comma, ",");919 _ = try appendToken(c, .Comma, ",");
873 }920 }
874 container_node.rbrace_token = try appendToken(c, .RBrace, "}");921 container_node.rbrace_token = try appendToken(c, .RBrace, "}");
...@@ -892,11 +939,11 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -892,11 +939,11 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
892 var bare_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, enum_decl)));939 var bare_name = try c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, enum_decl)));
893 var is_unnamed = false;940 var is_unnamed = false;
894 if (bare_name.len == 0) {941 if (bare_name.len == 0) {
895 bare_name = try std.fmt.allocPrint(c.a(), "unnamed_{}", .{c.getMangle()});942 bare_name = try std.fmt.allocPrint(c.arena, "unnamed_{}", .{c.getMangle()});
896 is_unnamed = true;943 is_unnamed = true;
897 }944 }
898945
899 const name = try std.fmt.allocPrint(c.a(), "enum_{}", .{bare_name});946 const name = try std.fmt.allocPrint(c.arena, "enum_{}", .{bare_name});
900 _ = try c.decl_table.put(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)), name);947 _ = try c.decl_table.put(@ptrToInt(ZigClangEnumDecl_getCanonicalDecl(enum_decl)), name);
901 const node = try transCreateNodeVarDecl(c, !is_unnamed, true, name);948 const node = try transCreateNodeVarDecl(c, !is_unnamed, true, name);
902 node.eq_token = try appendToken(c, .Equal, "=");949 node.eq_token = try appendToken(c, .Equal, "=");
...@@ -916,15 +963,16 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -916,15 +963,16 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
916 const extern_tok = try appendToken(c, .Keyword_extern, "extern");963 const extern_tok = try appendToken(c, .Keyword_extern, "extern");
917 const container_tok = try appendToken(c, .Keyword_enum, "enum");964 const container_tok = try appendToken(c, .Keyword_enum, "enum");
918965
919 const container_node = try c.a().create(ast.Node.ContainerDecl);966 const container_node = try c.arena.create(ast.Node.ContainerDecl);
920 container_node.* = .{967 container_node.* = .{
921 .layout_token = extern_tok,968 .layout_token = extern_tok,
922 .kind_token = container_tok,969 .kind_token = container_tok,
923 .init_arg_expr = .None,970 .init_arg_expr = .None,
924 .fields_and_decls = ast.Node.ContainerDecl.DeclList.init(c.a()),971 .fields_and_decls = ast.Node.ContainerDecl.DeclList{},
925 .lbrace_token = undefined,972 .lbrace_token = undefined,
926 .rbrace_token = undefined,973 .rbrace_token = undefined,
927 };974 };
975 var container_node_fields_and_decls = c.llpusher(&container_node.fields_and_decls);
928976
929 const int_type = ZigClangEnumDecl_getIntegerType(enum_decl);977 const int_type = ZigClangEnumDecl_getIntegerType(enum_decl);
930 // The underlying type may be null in case of forward-declared enum978 // The underlying type may be null in case of forward-declared enum
...@@ -971,7 +1019,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -971,7 +1019,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
971 } else1019 } else
972 null;1020 null;
9731021
974 const field_node = try c.a().create(ast.Node.ContainerField);1022 const field_node = try c.arena.create(ast.Node.ContainerField);
975 field_node.* = .{1023 field_node.* = .{
976 .doc_comments = null,1024 .doc_comments = null,
977 .comptime_token = null,1025 .comptime_token = null,
...@@ -981,7 +1029,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -981,7 +1029,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
981 .align_expr = null,1029 .align_expr = null,
982 };1030 };
9831031
984 try container_node.fields_and_decls.push(&field_node.base);1032 try container_node_fields_and_decls.push(&field_node.base);
985 _ = try appendToken(c, .Comma, ",");1033 _ = try appendToken(c, .Comma, ",");
9861034
987 // In C each enum value is in the global namespace. So we put them there too.1035 // In C each enum value is in the global namespace. So we put them there too.
...@@ -992,7 +1040,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -992,7 +1040,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
992 const enum_ident = try transCreateNodeIdentifier(c, name);1040 const enum_ident = try transCreateNodeIdentifier(c, name);
993 const period_tok = try appendToken(c, .Period, ".");1041 const period_tok = try appendToken(c, .Period, ".");
994 const field_ident = try transCreateNodeIdentifier(c, field_name);1042 const field_ident = try transCreateNodeIdentifier(c, field_name);
995 const field_access_node = try c.a().create(ast.Node.InfixOp);1043 const field_access_node = try c.arena.create(ast.Node.InfixOp);
996 field_access_node.* = .{1044 field_access_node.* = .{
997 .op_token = period_tok,1045 .op_token = period_tok,
998 .lhs = enum_ident,1046 .lhs = enum_ident,
...@@ -1006,7 +1054,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -1006,7 +1054,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
1006 try addTopLevelDecl(c, field_name, &tld_node.base);1054 try addTopLevelDecl(c, field_name, &tld_node.base);
1007 }1055 }
1008 // make non exhaustive1056 // make non exhaustive
1009 const field_node = try c.a().create(ast.Node.ContainerField);1057 const field_node = try c.arena.create(ast.Node.ContainerField);
1010 field_node.* = .{1058 field_node.* = .{
1011 .doc_comments = null,1059 .doc_comments = null,
1012 .comptime_token = null,1060 .comptime_token = null,
...@@ -1016,7 +1064,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No...@@ -1016,7 +1064,7 @@ fn transEnumDecl(c: *Context, enum_decl: *const ZigClangEnumDecl) Error!?*ast.No
1016 .align_expr = null,1064 .align_expr = null,
1017 };1065 };
10181066
1019 try container_node.fields_and_decls.push(&field_node.base);1067 try container_node_fields_and_decls.push(&field_node.base);
1020 _ = try appendToken(c, .Comma, ",");1068 _ = try appendToken(c, .Comma, ",");
1021 container_node.rbrace_token = try appendToken(c, .RBrace, "}");1069 container_node.rbrace_token = try appendToken(c, .RBrace, "}");
10221070
...@@ -1071,7 +1119,7 @@ fn transStmt(...@@ -1071,7 +1119,7 @@ fn transStmt(
1071 .ParenExprClass => {1119 .ParenExprClass => {
1072 const expr = try transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), .used, lrvalue);1120 const expr = try transExpr(rp, scope, ZigClangParenExpr_getSubExpr(@ptrCast(*const ZigClangParenExpr, stmt)), .used, lrvalue);
1073 if (expr.id == .GroupedExpression) return maybeSuppressResult(rp, scope, result_used, expr);1121 if (expr.id == .GroupedExpression) return maybeSuppressResult(rp, scope, result_used, expr);
1074 const node = try rp.c.a().create(ast.Node.GroupedExpression);1122 const node = try rp.c.arena.create(ast.Node.GroupedExpression);
1075 node.* = .{1123 node.* = .{
1076 .lparen = try appendToken(rp.c, .LParen, "("),1124 .lparen = try appendToken(rp.c, .LParen, "("),
1077 .expr = expr,1125 .expr = expr,
...@@ -1116,7 +1164,7 @@ fn transStmt(...@@ -1116,7 +1164,7 @@ fn transStmt(
1116 const source_expr = ZigClangOpaqueValueExpr_getSourceExpr(@ptrCast(*const ZigClangOpaqueValueExpr, stmt)).?;1164 const source_expr = ZigClangOpaqueValueExpr_getSourceExpr(@ptrCast(*const ZigClangOpaqueValueExpr, stmt)).?;
1117 const expr = try transExpr(rp, scope, source_expr, .used, lrvalue);1165 const expr = try transExpr(rp, scope, source_expr, .used, lrvalue);
1118 if (expr.id == .GroupedExpression) return maybeSuppressResult(rp, scope, result_used, expr);1166 if (expr.id == .GroupedExpression) return maybeSuppressResult(rp, scope, result_used, expr);
1119 const node = try rp.c.a().create(ast.Node.GroupedExpression);1167 const node = try rp.c.arena.create(ast.Node.GroupedExpression);
1120 node.* = .{1168 node.* = .{
1121 .lparen = try appendToken(rp.c, .LParen, "("),1169 .lparen = try appendToken(rp.c, .LParen, "("),
1122 .expr = expr,1170 .expr = expr,
...@@ -1147,18 +1195,18 @@ fn transBinaryOperator(...@@ -1147,18 +1195,18 @@ fn transBinaryOperator(
1147 var op_token: ast.TokenIndex = undefined;1195 var op_token: ast.TokenIndex = undefined;
1148 var op_id: ast.Node.InfixOp.Op = undefined;1196 var op_id: ast.Node.InfixOp.Op = undefined;
1149 switch (op) {1197 switch (op) {
1150 .Assign => return transCreateNodeAssign(rp, scope, result_used, ZigClangBinaryOperator_getLHS(stmt), ZigClangBinaryOperator_getRHS(stmt)),1198 .Assign => return try transCreateNodeAssign(rp, scope, result_used, ZigClangBinaryOperator_getLHS(stmt), ZigClangBinaryOperator_getRHS(stmt)),
1151 .Comma => {1199 .Comma => {
1152 const block_scope = try scope.findBlockScope(rp.c);1200 const block_scope = try scope.findBlockScope(rp.c);
1153 const expr = block_scope.base.parent == scope;1201 const expr = block_scope.base.parent == scope;
1154 const lparen = if (expr) blk: {1202 const lparen = if (expr) blk: {
1155 const l = try appendToken(rp.c, .LParen, "(");1203 const l = try appendToken(rp.c, .LParen, "(");
1156 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);1204 block_scope.setBlockNode(try transCreateNodeBlock(rp.c, block_scope.label));
1157 break :blk l;1205 break :blk l;
1158 } else undefined;1206 } else undefined;
11591207
1160 const lhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getLHS(stmt), .unused, .r_value);1208 const lhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getLHS(stmt), .unused, .r_value);
1161 try block_scope.block_node.statements.push(lhs);1209 try block_scope.statements.push(lhs);
11621210
1163 const rhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);1211 const rhs = try transExpr(rp, &block_scope.base, ZigClangBinaryOperator_getRHS(stmt), .used, .r_value);
1164 if (expr) {1212 if (expr) {
...@@ -1168,7 +1216,7 @@ fn transBinaryOperator(...@@ -1168,7 +1216,7 @@ fn transBinaryOperator(
1168 try block_scope.block_node.statements.push(&break_node.base);1216 try block_scope.block_node.statements.push(&break_node.base);
1169 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");1217 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
1170 const rparen = try appendToken(rp.c, .RParen, ")");1218 const rparen = try appendToken(rp.c, .RParen, ")");
1171 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);1219 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
1172 grouped_expr.* = .{1220 grouped_expr.* = .{
1173 .lparen = lparen,1221 .lparen = lparen,
1174 .expr = &block_scope.block_node.base,1222 .expr = &block_scope.block_node.base,
...@@ -1335,7 +1383,7 @@ fn transCompoundStmtInline(...@@ -1335,7 +1383,7 @@ fn transCompoundStmtInline(
13351383
1336fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) TransError!*ast.Node {1384fn transCompoundStmt(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangCompoundStmt) TransError!*ast.Node {
1337 const block_scope = try Scope.Block.init(rp.c, scope, null);1385 const block_scope = try Scope.Block.init(rp.c, scope, null);
1338 block_scope.block_node = try transCreateNodeBlock(rp.c, null);1386 block_scope.setBlockNode(try transCreateNodeBlock(rp.c, null));
1339 try transCompoundStmtInline(rp, &block_scope.base, stmt, block_scope.block_node);1387 try transCompoundStmtInline(rp, &block_scope.base, stmt, block_scope.block_node);
1340 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");1388 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
1341 return &block_scope.block_node.base;1389 return &block_scope.block_node.base;
...@@ -1458,7 +1506,7 @@ fn transImplicitCastExpr(...@@ -1458,7 +1506,7 @@ fn transImplicitCastExpr(
1458 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {1506 switch (ZigClangImplicitCastExpr_getCastKind(expr)) {
1459 .BitCast, .FloatingCast, .FloatingToIntegral, .IntegralToFloating, .IntegralCast, .PointerToIntegral, .IntegralToPointer => {1507 .BitCast, .FloatingCast, .FloatingToIntegral, .IntegralToFloating, .IntegralCast, .PointerToIntegral, .IntegralToPointer => {
1460 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);1508 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);
1461 return transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);1509 return try transCCast(rp, scope, ZigClangImplicitCastExpr_getBeginLoc(expr), dest_type, src_type, sub_expr_node);
1462 },1510 },
1463 .LValueToRValue, .NoOp, .FunctionToPointerDecay => {1511 .LValueToRValue, .NoOp, .FunctionToPointerDecay => {
1464 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);1512 const sub_expr_node = try transExpr(rp, scope, sub_expr, .used, .r_value);
...@@ -1539,7 +1587,7 @@ fn transBoolExpr(...@@ -1539,7 +1587,7 @@ fn transBoolExpr(
15391587
1540 if (grouped) {1588 if (grouped) {
1541 const rparen = try appendToken(rp.c, .RParen, ")");1589 const rparen = try appendToken(rp.c, .RParen, ")");
1542 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);1590 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
1543 grouped_expr.* = .{1591 grouped_expr.* = .{
1544 .lparen = lparen,1592 .lparen = lparen,
1545 .expr = node,1593 .expr = node,
...@@ -1747,13 +1795,13 @@ fn transStringLiteral(...@@ -1747,13 +1795,13 @@ fn transStringLiteral(
1747 len = 0;1795 len = 0;
1748 for (str) |c| len += escapeChar(c, &char_buf).len;1796 for (str) |c| len += escapeChar(c, &char_buf).len;
17491797
1750 const buf = try rp.c.a().alloc(u8, len + "\"\"".len);1798 const buf = try rp.c.arena.alloc(u8, len + "\"\"".len);
1751 buf[0] = '"';1799 buf[0] = '"';
1752 writeEscapedString(buf[1..], str);1800 writeEscapedString(buf[1..], str);
1753 buf[buf.len - 1] = '"';1801 buf[buf.len - 1] = '"';
17541802
1755 const token = try appendToken(rp.c, .StringLiteral, buf);1803 const token = try appendToken(rp.c, .StringLiteral, buf);
1756 const node = try rp.c.a().create(ast.Node.StringLiteral);1804 const node = try rp.c.arena.create(ast.Node.StringLiteral);
1757 node.* = .{1805 node.* = .{
1758 .token = token,1806 .token = token,
1759 };1807 };
...@@ -2038,13 +2086,13 @@ fn transInitListExprRecord(...@@ -2038,13 +2086,13 @@ fn transInitListExprRecord(
2038 var raw_name = try rp.c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, field_decl)));2086 var raw_name = try rp.c.str(ZigClangNamedDecl_getName_bytes_begin(@ptrCast(*const ZigClangNamedDecl, field_decl)));
2039 if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl)) {2087 if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl)) {
2040 const name = rp.c.decl_table.get(@ptrToInt(ZigClangFieldDecl_getCanonicalDecl(field_decl))).?;2088 const name = rp.c.decl_table.get(@ptrToInt(ZigClangFieldDecl_getCanonicalDecl(field_decl))).?;
2041 raw_name = try mem.dupe(rp.c.a(), u8, name.value);2089 raw_name = try mem.dupe(rp.c.arena, u8, name.value);
2042 }2090 }
2043 const field_name_tok = try appendIdentifier(rp.c, raw_name);2091 const field_name_tok = try appendIdentifier(rp.c, raw_name);
20442092
2045 _ = try appendToken(rp.c, .Equal, "=");2093 _ = try appendToken(rp.c, .Equal, "=");
20462094
2047 const field_init_node = try rp.c.a().create(ast.Node.FieldInitializer);2095 const field_init_node = try rp.c.arena.create(ast.Node.FieldInitializer);
2048 field_init_node.* = .{2096 field_init_node.* = .{
2049 .period_token = period_tok,2097 .period_token = period_tok,
2050 .name_token = field_name_tok,2098 .name_token = field_name_tok,
...@@ -2133,7 +2181,7 @@ fn transInitListExprArray(...@@ -2133,7 +2181,7 @@ fn transInitListExprArray(
2133 &filler_init_node.base2181 &filler_init_node.base
2134 else blk: {2182 else blk: {
2135 const mul_tok = try appendToken(rp.c, .AsteriskAsterisk, "**");2183 const mul_tok = try appendToken(rp.c, .AsteriskAsterisk, "**");
2136 const mul_node = try rp.c.a().create(ast.Node.InfixOp);2184 const mul_node = try rp.c.arena.create(ast.Node.InfixOp);
2137 mul_node.* = .{2185 mul_node.* = .{
2138 .op_token = mul_tok,2186 .op_token = mul_tok,
2139 .lhs = &filler_init_node.base,2187 .lhs = &filler_init_node.base,
...@@ -2147,7 +2195,7 @@ fn transInitListExprArray(...@@ -2147,7 +2195,7 @@ fn transInitListExprArray(
2147 return rhs_node;2195 return rhs_node;
2148 }2196 }
21492197
2150 const cat_node = try rp.c.a().create(ast.Node.InfixOp);2198 const cat_node = try rp.c.arena.create(ast.Node.InfixOp);
2151 cat_node.* = .{2199 cat_node.* = .{
2152 .op_token = cat_tok,2200 .op_token = cat_tok,
2153 .lhs = &init_node.base,2201 .lhs = &init_node.base,
...@@ -2382,7 +2430,7 @@ fn transForLoop(...@@ -2382,7 +2430,7 @@ fn transForLoop(
2382 if (ZigClangForStmt_getInit(stmt)) |init| {2430 if (ZigClangForStmt_getInit(stmt)) |init| {
2383 block_scope = try Scope.Block.init(rp.c, scope, null);2431 block_scope = try Scope.Block.init(rp.c, scope, null);
2384 const block = try transCreateNodeBlock(rp.c, null);2432 const block = try transCreateNodeBlock(rp.c, null);
2385 block_scope.?.block_node = block;2433 block_scope.?.setBlockNode(block);
2386 loop_scope.parent = &block_scope.?.base;2434 loop_scope.parent = &block_scope.?.base;
2387 const result = try transStmt(rp, &block_scope.?.base, init, .unused, .r_value);2435 const result = try transStmt(rp, &block_scope.?.base, init, .unused, .r_value);
2388 if (result != &block.base)2436 if (result != &block.base)
...@@ -2445,7 +2493,7 @@ fn transSwitch(...@@ -2445,7 +2493,7 @@ fn transSwitch(
2445 const block_scope = try Scope.Block.init(rp.c, &switch_scope.base, null);2493 const block_scope = try Scope.Block.init(rp.c, &switch_scope.base, null);
2446 // tmp block that all statements will go before being picked up by a case or default2494 // tmp block that all statements will go before being picked up by a case or default
2447 const block = try transCreateNodeBlock(rp.c, null);2495 const block = try transCreateNodeBlock(rp.c, null);
2448 block_scope.block_node = block;2496 block_scope.setBlockNode(block);
24492497
2450 const switch_block = try transCreateNodeBlock(rp.c, null);2498 const switch_block = try transCreateNodeBlock(rp.c, null);
2451 try switch_block.statements.push(&switch_node.base);2499 try switch_block.statements.push(&switch_node.base);
...@@ -2479,7 +2527,7 @@ fn transCase(...@@ -2479,7 +2527,7 @@ fn transCase(
2479) TransError!*ast.Node {2527) TransError!*ast.Node {
2480 const block_scope = scope.findBlockScope(rp.c) catch unreachable;2528 const block_scope = scope.findBlockScope(rp.c) catch unreachable;
2481 const switch_scope = scope.getSwitch();2529 const switch_scope = scope.getSwitch();
2482 const label = try std.fmt.allocPrint(rp.c.a(), "__case_{}", .{switch_scope.cases.len - @boolToInt(switch_scope.has_default)});2530 const label = try std.fmt.allocPrint(rp.c.arena, "__case_{}", .{switch_scope.cases.len() - @boolToInt(switch_scope.has_default)});
2483 _ = try appendToken(rp.c, .Semicolon, ";");2531 _ = try appendToken(rp.c, .Semicolon, ";");
24842532
2485 const expr = if (ZigClangCaseStmt_getRHS(stmt)) |rhs| blk: {2533 const expr = if (ZigClangCaseStmt_getRHS(stmt)) |rhs| blk: {
...@@ -2487,7 +2535,7 @@ fn transCase(...@@ -2487,7 +2535,7 @@ fn transCase(
2487 const ellips = try appendToken(rp.c, .Ellipsis3, "...");2535 const ellips = try appendToken(rp.c, .Ellipsis3, "...");
2488 const rhs_node = try transExpr(rp, scope, rhs, .used, .r_value);2536 const rhs_node = try transExpr(rp, scope, rhs, .used, .r_value);
24892537
2490 const node = try rp.c.a().create(ast.Node.InfixOp);2538 const node = try rp.c.arena.create(ast.Node.InfixOp);
2491 node.* = .{2539 node.* = .{
2492 .op_token = ellips,2540 .op_token = ellips,
2493 .lhs = lhs_node,2541 .lhs = lhs_node,
...@@ -2606,7 +2654,7 @@ fn transCharLiteral(...@@ -2606,7 +2654,7 @@ fn transCharLiteral(
2606 }2654 }
2607 var char_buf: [4]u8 = undefined;2655 var char_buf: [4]u8 = undefined;
2608 const token = try appendTokenFmt(rp.c, .CharLiteral, "'{}'", .{escapeChar(@intCast(u8, val), &char_buf)});2656 const token = try appendTokenFmt(rp.c, .CharLiteral, "'{}'", .{escapeChar(@intCast(u8, val), &char_buf)});
2609 const node = try rp.c.a().create(ast.Node.CharLiteral);2657 const node = try rp.c.arena.create(ast.Node.CharLiteral);
2610 node.* = .{2658 node.* = .{
2611 .token = token,2659 .token = token,
2612 };2660 };
...@@ -2646,7 +2694,7 @@ fn transStmtExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangStmtExpr,...@@ -2646,7 +2694,7 @@ fn transStmtExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangStmtExpr,
2646 const lparen = try appendToken(rp.c, .LParen, "(");2694 const lparen = try appendToken(rp.c, .LParen, "(");
2647 const block_scope = try Scope.Block.init(rp.c, scope, "blk");2695 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
2648 const block = try transCreateNodeBlock(rp.c, "blk");2696 const block = try transCreateNodeBlock(rp.c, "blk");
2649 block_scope.block_node = block;2697 block_scope.setBlockNode(block);
26502698
2651 var it = ZigClangCompoundStmt_body_begin(comp);2699 var it = ZigClangCompoundStmt_body_begin(comp);
2652 const end_it = ZigClangCompoundStmt_body_end(comp);2700 const end_it = ZigClangCompoundStmt_body_end(comp);
...@@ -2661,7 +2709,7 @@ fn transStmtExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangStmtExpr,...@@ -2661,7 +2709,7 @@ fn transStmtExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangStmtExpr,
2661 try block.statements.push(&break_node.base);2709 try block.statements.push(&break_node.base);
2662 block.rbrace = try appendToken(rp.c, .RBrace, "}");2710 block.rbrace = try appendToken(rp.c, .RBrace, "}");
2663 const rparen = try appendToken(rp.c, .RParen, ")");2711 const rparen = try appendToken(rp.c, .RParen, ")");
2664 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);2712 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
2665 grouped_expr.* = .{2713 grouped_expr.* = .{
2666 .lparen = lparen,2714 .lparen = lparen,
2667 .expr = &block.base,2715 .expr = &block.base,
...@@ -2686,7 +2734,7 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE...@@ -2686,7 +2734,7 @@ fn transMemberExpr(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangMemberE
2686 const field_decl = @ptrCast(*const struct_ZigClangFieldDecl, member_decl);2734 const field_decl = @ptrCast(*const struct_ZigClangFieldDecl, member_decl);
2687 if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl)) {2735 if (ZigClangFieldDecl_isAnonymousStructOrUnion(field_decl)) {
2688 const name = rp.c.decl_table.get(@ptrToInt(ZigClangFieldDecl_getCanonicalDecl(field_decl))).?;2736 const name = rp.c.decl_table.get(@ptrToInt(ZigClangFieldDecl_getCanonicalDecl(field_decl))).?;
2689 break :blk try mem.dupe(rp.c.a(), u8, name.value);2737 break :blk try mem.dupe(rp.c.arena, u8, name.value);
2690 }2738 }
2691 }2739 }
2692 const decl = @ptrCast(*const ZigClangNamedDecl, member_decl);2740 const decl = @ptrCast(*const ZigClangNamedDecl, member_decl);
...@@ -2941,7 +2989,7 @@ fn transCreatePreCrement(...@@ -2941,7 +2989,7 @@ fn transCreatePreCrement(
2941 // zig: break :blk _ref.*2989 // zig: break :blk _ref.*
2942 // zig: })2990 // zig: })
2943 const block_scope = try Scope.Block.init(rp.c, scope, "blk");2991 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
2944 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);2992 block_scope.setBlockNode(try transCreateNodeBlock(rp.c, block_scope.label));
2945 const ref = try block_scope.makeMangledName(rp.c, "ref");2993 const ref = try block_scope.makeMangledName(rp.c, "ref");
29462994
2947 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);2995 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);
...@@ -2967,7 +3015,7 @@ fn transCreatePreCrement(...@@ -2967,7 +3015,7 @@ fn transCreatePreCrement(
2967 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");3015 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
2968 // semicolon must immediately follow rbrace because it is the last token in a block3016 // semicolon must immediately follow rbrace because it is the last token in a block
2969 _ = try appendToken(rp.c, .Semicolon, ";");3017 _ = try appendToken(rp.c, .Semicolon, ";");
2970 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);3018 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
2971 grouped_expr.* = .{3019 grouped_expr.* = .{
2972 .lparen = try appendToken(rp.c, .LParen, "("),3020 .lparen = try appendToken(rp.c, .LParen, "("),
2973 .expr = &block_scope.block_node.base,3021 .expr = &block_scope.block_node.base,
...@@ -3007,7 +3055,7 @@ fn transCreatePostCrement(...@@ -3007,7 +3055,7 @@ fn transCreatePostCrement(
3007 // zig: break :blk _tmp3055 // zig: break :blk _tmp
3008 // zig: })3056 // zig: })
3009 const block_scope = try Scope.Block.init(rp.c, scope, "blk");3057 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
3010 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);3058 block_scope.setBlockNode(try transCreateNodeBlock(rp.c, block_scope.label));
3011 const ref = try block_scope.makeMangledName(rp.c, "ref");3059 const ref = try block_scope.makeMangledName(rp.c, "ref");
30123060
3013 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);3061 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);
...@@ -3040,7 +3088,7 @@ fn transCreatePostCrement(...@@ -3040,7 +3088,7 @@ fn transCreatePostCrement(
3040 try block_scope.block_node.statements.push(&break_node.base);3088 try block_scope.block_node.statements.push(&break_node.base);
3041 _ = try appendToken(rp.c, .Semicolon, ";");3089 _ = try appendToken(rp.c, .Semicolon, ";");
3042 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");3090 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
3043 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);3091 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
3044 grouped_expr.* = .{3092 grouped_expr.* = .{
3045 .lparen = try appendToken(rp.c, .LParen, "("),3093 .lparen = try appendToken(rp.c, .LParen, "("),
3046 .expr = &block_scope.block_node.base,3094 .expr = &block_scope.block_node.base,
...@@ -3106,7 +3154,7 @@ fn transCreateCompoundAssign(...@@ -3106,7 +3154,7 @@ fn transCreateCompoundAssign(
31063154
3107 if ((is_mod or is_div) and is_signed) {3155 if ((is_mod or is_div) and is_signed) {
3108 const op_token = try appendToken(rp.c, .Equal, "=");3156 const op_token = try appendToken(rp.c, .Equal, "=");
3109 const op_node = try rp.c.a().create(ast.Node.InfixOp);3157 const op_node = try rp.c.arena.create(ast.Node.InfixOp);
3110 const builtin = if (is_mod) "@rem" else "@divTrunc";3158 const builtin = if (is_mod) "@rem" else "@divTrunc";
3111 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, builtin);3159 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, builtin);
3112 const lhs_node = try transExpr(rp, scope, lhs, .used, .l_value);3160 const lhs_node = try transExpr(rp, scope, lhs, .used, .l_value);
...@@ -3152,7 +3200,7 @@ fn transCreateCompoundAssign(...@@ -3152,7 +3200,7 @@ fn transCreateCompoundAssign(
3152 // zig: break :blk _ref.*3200 // zig: break :blk _ref.*
3153 // zig: })3201 // zig: })
3154 const block_scope = try Scope.Block.init(rp.c, scope, "blk");3202 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
3155 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);3203 block_scope.setBlockNode(try transCreateNodeBlock(rp.c, block_scope.label));
3156 const ref = try block_scope.makeMangledName(rp.c, "ref");3204 const ref = try block_scope.makeMangledName(rp.c, "ref");
31573205
3158 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);3206 const node = try transCreateNodeVarDecl(rp.c, false, true, ref);
...@@ -3169,7 +3217,7 @@ fn transCreateCompoundAssign(...@@ -3169,7 +3217,7 @@ fn transCreateCompoundAssign(
31693217
3170 if ((is_mod or is_div) and is_signed) {3218 if ((is_mod or is_div) and is_signed) {
3171 const op_token = try appendToken(rp.c, .Equal, "=");3219 const op_token = try appendToken(rp.c, .Equal, "=");
3172 const op_node = try rp.c.a().create(ast.Node.InfixOp);3220 const op_node = try rp.c.arena.create(ast.Node.InfixOp);
3173 const builtin = if (is_mod) "@rem" else "@divTrunc";3221 const builtin = if (is_mod) "@rem" else "@divTrunc";
3174 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, builtin);3222 const builtin_node = try transCreateNodeBuiltinFnCall(rp.c, builtin);
3175 try builtin_node.params.push(try transCreateNodePtrDeref(rp.c, lhs_node));3223 try builtin_node.params.push(try transCreateNodePtrDeref(rp.c, lhs_node));
...@@ -3211,7 +3259,7 @@ fn transCreateCompoundAssign(...@@ -3211,7 +3259,7 @@ fn transCreateCompoundAssign(
3211 break_node.rhs = ref_node;3259 break_node.rhs = ref_node;
3212 try block_scope.block_node.statements.push(&break_node.base);3260 try block_scope.block_node.statements.push(&break_node.base);
3213 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");3261 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
3214 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);3262 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
3215 grouped_expr.* = .{3263 grouped_expr.* = .{
3216 .lparen = try appendToken(rp.c, .LParen, "("),3264 .lparen = try appendToken(rp.c, .LParen, "("),
3217 .expr = &block_scope.block_node.base,3265 .expr = &block_scope.block_node.base,
...@@ -3295,7 +3343,7 @@ fn transBreak(rp: RestorePoint, scope: *Scope) TransError!*ast.Node {...@@ -3295,7 +3343,7 @@ fn transBreak(rp: RestorePoint, scope: *Scope) TransError!*ast.Node {
3295fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFloatingLiteral, used: ResultUsed) TransError!*ast.Node {3343fn transFloatingLiteral(rp: RestorePoint, scope: *Scope, stmt: *const ZigClangFloatingLiteral, used: ResultUsed) TransError!*ast.Node {
3296 // TODO use something more accurate3344 // TODO use something more accurate
3297 const dbl = ZigClangAPFloat_getValueAsApproximateDouble(stmt);3345 const dbl = ZigClangAPFloat_getValueAsApproximateDouble(stmt);
3298 const node = try rp.c.a().create(ast.Node.FloatLiteral);3346 const node = try rp.c.arena.create(ast.Node.FloatLiteral);
3299 node.* = .{3347 node.* = .{
3300 .token = try appendTokenFmt(rp.c, .FloatLiteral, "{d}", .{dbl}),3348 .token = try appendTokenFmt(rp.c, .FloatLiteral, "{d}", .{dbl}),
3301 };3349 };
...@@ -3318,7 +3366,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const...@@ -3318,7 +3366,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const
3318 const lparen = try appendToken(rp.c, .LParen, "(");3366 const lparen = try appendToken(rp.c, .LParen, "(");
33193367
3320 const block_scope = try Scope.Block.init(rp.c, scope, "blk");3368 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
3321 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);3369 block_scope.setBlockNode(try transCreateNodeBlock(rp.c, block_scope.label));
33223370
3323 const mangled_name = try block_scope.makeMangledName(rp.c, "cond_temp");3371 const mangled_name = try block_scope.makeMangledName(rp.c, "cond_temp");
3324 const tmp_var = try transCreateNodeVarDecl(rp.c, false, true, mangled_name);3372 const tmp_var = try transCreateNodeVarDecl(rp.c, false, true, mangled_name);
...@@ -3351,7 +3399,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const...@@ -3351,7 +3399,7 @@ fn transBinaryConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const
3351 try block_scope.block_node.statements.push(&break_node.base);3399 try block_scope.block_node.statements.push(&break_node.base);
3352 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");3400 block_scope.block_node.rbrace = try appendToken(rp.c, .RBrace, "}");
33533401
3354 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);3402 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
3355 grouped_expr.* = .{3403 grouped_expr.* = .{
3356 .lparen = lparen,3404 .lparen = lparen,
3357 .expr = &block_scope.block_node.base,3405 .expr = &block_scope.block_node.base,
...@@ -3384,7 +3432,7 @@ fn transConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigCla...@@ -3384,7 +3432,7 @@ fn transConditionalOperator(rp: RestorePoint, scope: *Scope, stmt: *const ZigCla
33843432
3385 if (grouped) {3433 if (grouped) {
3386 const rparen = try appendToken(rp.c, .RParen, ")");3434 const rparen = try appendToken(rp.c, .RParen, ")");
3387 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);3435 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
3388 grouped_expr.* = .{3436 grouped_expr.* = .{
3389 .lparen = lparen,3437 .lparen = lparen,
3390 .expr = &if_node.base,3438 .expr = &if_node.base,
...@@ -3415,7 +3463,7 @@ fn maybeSuppressResult(...@@ -3415,7 +3463,7 @@ fn maybeSuppressResult(
3415 }3463 }
3416 const lhs = try transCreateNodeIdentifier(rp.c, "_");3464 const lhs = try transCreateNodeIdentifier(rp.c, "_");
3417 const op_token = try appendToken(rp.c, .Equal, "=");3465 const op_token = try appendToken(rp.c, .Equal, "=");
3418 const op_node = try rp.c.a().create(ast.Node.InfixOp);3466 const op_node = try rp.c.arena.create(ast.Node.InfixOp);
3419 op_node.* = .{3467 op_node.* = .{
3420 .op_token = op_token,3468 .op_token = op_token,
3421 .lhs = lhs,3469 .lhs = lhs,
...@@ -3426,7 +3474,7 @@ fn maybeSuppressResult(...@@ -3426,7 +3474,7 @@ fn maybeSuppressResult(
3426}3474}
34273475
3428fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {3476fn addTopLevelDecl(c: *Context, name: []const u8, decl_node: *ast.Node) !void {
3429 try c.tree.root_node.decls.push(decl_node);3477 c.root_decls_it = try c.llpush(*ast.Node, c.root_decls_it, decl_node);
3430 _ = try c.global_scope.sym_table.put(name, decl_node);3478 _ = try c.global_scope.sym_table.put(name, decl_node);
3431}3479}
34323480
...@@ -3524,7 +3572,7 @@ fn qualTypeToLog2IntRef(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigC...@@ -3524,7 +3572,7 @@ fn qualTypeToLog2IntRef(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigC
3524 if (int_bit_width != 0) {3572 if (int_bit_width != 0) {
3525 // we can perform the log2 now.3573 // we can perform the log2 now.
3526 const cast_bit_width = math.log2_int(u64, int_bit_width);3574 const cast_bit_width = math.log2_int(u64, int_bit_width);
3527 const node = try rp.c.a().create(ast.Node.IntegerLiteral);3575 const node = try rp.c.arena.create(ast.Node.IntegerLiteral);
3528 node.* = .{3576 node.* = .{
3529 .token = try appendTokenFmt(rp.c, .Identifier, "u{}", .{cast_bit_width}),3577 .token = try appendTokenFmt(rp.c, .Identifier, "u{}", .{cast_bit_width}),
3530 };3578 };
...@@ -3547,7 +3595,7 @@ fn qualTypeToLog2IntRef(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigC...@@ -3547,7 +3595,7 @@ fn qualTypeToLog2IntRef(rp: RestorePoint, qt: ZigClangQualType, source_loc: ZigC
35473595
3548 const import_fn_call = try transCreateNodeBuiltinFnCall(rp.c, "@import");3596 const import_fn_call = try transCreateNodeBuiltinFnCall(rp.c, "@import");
3549 const std_token = try appendToken(rp.c, .StringLiteral, "\"std\"");3597 const std_token = try appendToken(rp.c, .StringLiteral, "\"std\"");
3550 const std_node = try rp.c.a().create(ast.Node.StringLiteral);3598 const std_node = try rp.c.arena.create(ast.Node.StringLiteral);
3551 std_node.* = .{3599 std_node.* = .{
3552 .token = std_token,3600 .token = std_token,
3553 };3601 };
...@@ -3749,7 +3797,7 @@ fn transCreateNodeAssign(...@@ -3749,7 +3797,7 @@ fn transCreateNodeAssign(
3749 // zig: break :blk _tmp3797 // zig: break :blk _tmp
3750 // zig: })3798 // zig: })
3751 const block_scope = try Scope.Block.init(rp.c, scope, "blk");3799 const block_scope = try Scope.Block.init(rp.c, scope, "blk");
3752 block_scope.block_node = try transCreateNodeBlock(rp.c, block_scope.label);3800 block_scope.setBlockNode(try transCreateNodeBlock(rp.c, block_scope.label));
3753 const tmp = try block_scope.makeMangledName(rp.c, "tmp");3801 const tmp = try block_scope.makeMangledName(rp.c, "tmp");
37543802
3755 const node = try transCreateNodeVarDecl(rp.c, false, true, tmp);3803 const node = try transCreateNodeVarDecl(rp.c, false, true, tmp);
...@@ -3786,10 +3834,10 @@ fn transCreateNodeAssign(...@@ -3786,10 +3834,10 @@ fn transCreateNodeAssign(
3786fn transCreateNodeBuiltinFnCall(c: *Context, name: []const u8) !*ast.Node.BuiltinCall {3834fn transCreateNodeBuiltinFnCall(c: *Context, name: []const u8) !*ast.Node.BuiltinCall {
3787 const builtin_token = try appendToken(c, .Builtin, name);3835 const builtin_token = try appendToken(c, .Builtin, name);
3788 _ = try appendToken(c, .LParen, "(");3836 _ = try appendToken(c, .LParen, "(");
3789 const node = try c.a().create(ast.Node.BuiltinCall);3837 const node = try c.arena.create(ast.Node.BuiltinCall);
3790 node.* = .{3838 node.* = .{
3791 .builtin_token = builtin_token,3839 .builtin_token = builtin_token,
3792 .params = ast.Node.BuiltinCall.ParamList.init(c.a()),3840 .params = ast.Node.BuiltinCall.ParamList{},
3793 .rparen_token = undefined, // set after appending args3841 .rparen_token = undefined, // set after appending args
3794 };3842 };
3795 return node;3843 return node;
...@@ -3797,12 +3845,12 @@ fn transCreateNodeBuiltinFnCall(c: *Context, name: []const u8) !*ast.Node.Builti...@@ -3797,12 +3845,12 @@ fn transCreateNodeBuiltinFnCall(c: *Context, name: []const u8) !*ast.Node.Builti
37973845
3798fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {3846fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {
3799 _ = try appendToken(c, .LParen, "(");3847 _ = try appendToken(c, .LParen, "(");
3800 const node = try c.a().create(ast.Node.SuffixOp);3848 const node = try c.arena.create(ast.Node.SuffixOp);
3801 node.* = .{3849 node.* = .{
3802 .lhs = .{ .node = fn_expr },3850 .lhs = .{ .node = fn_expr },
3803 .op = .{3851 .op = .{
3804 .Call = .{3852 .Call = .{
3805 .params = ast.Node.SuffixOp.Op.Call.ParamList.init(c.a()),3853 .params = ast.Node.SuffixOp.Op.Call.ParamList{},
3806 .async_token = null,3854 .async_token = null,
3807 },3855 },
3808 },3856 },
...@@ -3812,7 +3860,7 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {...@@ -3812,7 +3860,7 @@ fn transCreateNodeFnCall(c: *Context, fn_expr: *ast.Node) !*ast.Node.SuffixOp {
3812}3860}
38133861
3814fn transCreateNodeFieldAccess(c: *Context, container: *ast.Node, field_name: []const u8) !*ast.Node {3862fn transCreateNodeFieldAccess(c: *Context, container: *ast.Node, field_name: []const u8) !*ast.Node {
3815 const field_access_node = try c.a().create(ast.Node.InfixOp);3863 const field_access_node = try c.arena.create(ast.Node.InfixOp);
3816 field_access_node.* = .{3864 field_access_node.* = .{
3817 .op_token = try appendToken(c, .Period, "."),3865 .op_token = try appendToken(c, .Period, "."),
3818 .lhs = container,3866 .lhs = container,
...@@ -3828,7 +3876,7 @@ fn transCreateNodePrefixOp(...@@ -3828,7 +3876,7 @@ fn transCreateNodePrefixOp(
3828 op_tok_id: std.zig.Token.Id,3876 op_tok_id: std.zig.Token.Id,
3829 bytes: []const u8,3877 bytes: []const u8,
3830) !*ast.Node.PrefixOp {3878) !*ast.Node.PrefixOp {
3831 const node = try c.a().create(ast.Node.PrefixOp);3879 const node = try c.arena.create(ast.Node.PrefixOp);
3832 node.* = .{3880 node.* = .{
3833 .op_token = try appendToken(c, op_tok_id, bytes),3881 .op_token = try appendToken(c, op_tok_id, bytes),
3834 .op = op,3882 .op = op,
...@@ -3851,7 +3899,7 @@ fn transCreateNodeInfixOp(...@@ -3851,7 +3899,7 @@ fn transCreateNodeInfixOp(
3851 try appendToken(rp.c, .LParen, "(")3899 try appendToken(rp.c, .LParen, "(")
3852 else3900 else
3853 null;3901 null;
3854 const node = try rp.c.a().create(ast.Node.InfixOp);3902 const node = try rp.c.arena.create(ast.Node.InfixOp);
3855 node.* = .{3903 node.* = .{
3856 .op_token = op_token,3904 .op_token = op_token,
3857 .lhs = lhs_node,3905 .lhs = lhs_node,
...@@ -3860,7 +3908,7 @@ fn transCreateNodeInfixOp(...@@ -3860,7 +3908,7 @@ fn transCreateNodeInfixOp(
3860 };3908 };
3861 if (!grouped) return maybeSuppressResult(rp, scope, used, &node.base);3909 if (!grouped) return maybeSuppressResult(rp, scope, used, &node.base);
3862 const rparen = try appendToken(rp.c, .RParen, ")");3910 const rparen = try appendToken(rp.c, .RParen, ")");
3863 const grouped_expr = try rp.c.a().create(ast.Node.GroupedExpression);3911 const grouped_expr = try rp.c.arena.create(ast.Node.GroupedExpression);
3864 grouped_expr.* = .{3912 grouped_expr.* = .{
3865 .lparen = lparen.?,3913 .lparen = lparen.?,
3866 .expr = &node.base,3914 .expr = &node.base,
...@@ -3904,7 +3952,7 @@ fn transCreateNodePtrType(...@@ -3904,7 +3952,7 @@ fn transCreateNodePtrType(
3904 is_volatile: bool,3952 is_volatile: bool,
3905 op_tok_id: std.zig.Token.Id,3953 op_tok_id: std.zig.Token.Id,
3906) !*ast.Node.PrefixOp {3954) !*ast.Node.PrefixOp {
3907 const node = try c.a().create(ast.Node.PrefixOp);3955 const node = try c.arena.create(ast.Node.PrefixOp);
3908 const op_token = switch (op_tok_id) {3956 const op_token = switch (op_tok_id) {
3909 .LBracket => blk: {3957 .LBracket => blk: {
3910 const lbracket = try appendToken(c, .LBracket, "[");3958 const lbracket = try appendToken(c, .LBracket, "[");
...@@ -3946,8 +3994,8 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {...@@ -3946,8 +3994,8 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {
3946 ZigClangAPSInt_free(aps_int);3994 ZigClangAPSInt_free(aps_int);
3947 };3995 };
39483996
3949 const limbs = try c.a().alloc(math.big.Limb, num_limbs);3997 const limbs = try c.arena.alloc(math.big.Limb, num_limbs);
3950 defer c.a().free(limbs);3998 defer c.arena.free(limbs);
39513999
3952 const data = ZigClangAPSInt_getRawData(aps_int);4000 const data = ZigClangAPSInt_getRawData(aps_int);
3953 switch (@sizeOf(math.big.Limb)) {4001 switch (@sizeOf(math.big.Limb)) {
...@@ -3972,12 +4020,12 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {...@@ -3972,12 +4020,12 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {
3972 }4020 }
39734021
3974 const big: math.big.int.Const = .{ .limbs = limbs, .positive = !is_negative };4022 const big: math.big.int.Const = .{ .limbs = limbs, .positive = !is_negative };
3975 const str = big.toStringAlloc(c.a(), 10, false) catch |err| switch (err) {4023 const str = big.toStringAlloc(c.arena, 10, false) catch |err| switch (err) {
3976 error.OutOfMemory => return error.OutOfMemory,4024 error.OutOfMemory => return error.OutOfMemory,
3977 };4025 };
3978 defer c.a().free(str);4026 defer c.arena.free(str);
3979 const token = try appendToken(c, .IntegerLiteral, str);4027 const token = try appendToken(c, .IntegerLiteral, str);
3980 const node = try c.a().create(ast.Node.IntegerLiteral);4028 const node = try c.arena.create(ast.Node.IntegerLiteral);
3981 node.* = .{4029 node.* = .{
3982 .token = token,4030 .token = token,
3983 };4031 };
...@@ -3986,7 +4034,7 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {...@@ -3986,7 +4034,7 @@ fn transCreateNodeAPInt(c: *Context, int: *const ZigClangAPSInt) !*ast.Node {
39864034
3987fn transCreateNodeReturnExpr(c: *Context) !*ast.Node.ControlFlowExpression {4035fn transCreateNodeReturnExpr(c: *Context) !*ast.Node.ControlFlowExpression {
3988 const ltoken = try appendToken(c, .Keyword_return, "return");4036 const ltoken = try appendToken(c, .Keyword_return, "return");
3989 const node = try c.a().create(ast.Node.ControlFlowExpression);4037 const node = try c.arena.create(ast.Node.ControlFlowExpression);
3990 node.* = .{4038 node.* = .{
3991 .ltoken = ltoken,4039 .ltoken = ltoken,
3992 .kind = .Return,4040 .kind = .Return,
...@@ -3997,7 +4045,7 @@ fn transCreateNodeReturnExpr(c: *Context) !*ast.Node.ControlFlowExpression {...@@ -3997,7 +4045,7 @@ fn transCreateNodeReturnExpr(c: *Context) !*ast.Node.ControlFlowExpression {
39974045
3998fn transCreateNodeUndefinedLiteral(c: *Context) !*ast.Node {4046fn transCreateNodeUndefinedLiteral(c: *Context) !*ast.Node {
3999 const token = try appendToken(c, .Keyword_undefined, "undefined");4047 const token = try appendToken(c, .Keyword_undefined, "undefined");
4000 const node = try c.a().create(ast.Node.UndefinedLiteral);4048 const node = try c.arena.create(ast.Node.UndefinedLiteral);
4001 node.* = .{4049 node.* = .{
4002 .token = token,4050 .token = token,
4003 };4051 };
...@@ -4006,7 +4054,7 @@ fn transCreateNodeUndefinedLiteral(c: *Context) !*ast.Node {...@@ -4006,7 +4054,7 @@ fn transCreateNodeUndefinedLiteral(c: *Context) !*ast.Node {
40064054
4007fn transCreateNodeNullLiteral(c: *Context) !*ast.Node {4055fn transCreateNodeNullLiteral(c: *Context) !*ast.Node {
4008 const token = try appendToken(c, .Keyword_null, "null");4056 const token = try appendToken(c, .Keyword_null, "null");
4009 const node = try c.a().create(ast.Node.NullLiteral);4057 const node = try c.arena.create(ast.Node.NullLiteral);
4010 node.* = .{4058 node.* = .{
4011 .token = token,4059 .token = token,
4012 };4060 };
...@@ -4018,7 +4066,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {...@@ -4018,7 +4066,7 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {
4018 try appendToken(c, .Keyword_true, "true")4066 try appendToken(c, .Keyword_true, "true")
4019 else4067 else
4020 try appendToken(c, .Keyword_false, "false");4068 try appendToken(c, .Keyword_false, "false");
4021 const node = try c.a().create(ast.Node.BoolLiteral);4069 const node = try c.arena.create(ast.Node.BoolLiteral);
4022 node.* = .{4070 node.* = .{
4023 .token = token,4071 .token = token,
4024 };4072 };
...@@ -4027,11 +4075,11 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {...@@ -4027,11 +4075,11 @@ fn transCreateNodeBoolLiteral(c: *Context, value: bool) !*ast.Node {
40274075
4028fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp {4076fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp {
4029 _ = try appendToken(c, .LBrace, "{");4077 _ = try appendToken(c, .LBrace, "{");
4030 const node = try c.a().create(ast.Node.SuffixOp);4078 const node = try c.arena.create(ast.Node.SuffixOp);
4031 node.* = .{4079 node.* = .{
4032 .lhs = .{ .node = ty },4080 .lhs = .{ .node = ty },
4033 .op = .{4081 .op = .{
4034 .ArrayInitializer = ast.Node.SuffixOp.Op.InitList.init(c.a()),4082 .ArrayInitializer = ast.Node.SuffixOp.Op.InitList{},
4035 },4083 },
4036 .rtoken = undefined, // set after appending values4084 .rtoken = undefined, // set after appending values
4037 };4085 };
...@@ -4040,11 +4088,11 @@ fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.Suffix...@@ -4040,11 +4088,11 @@ fn transCreateNodeArrayInitializer(c: *Context, ty: *ast.Node) !*ast.Node.Suffix
40404088
4041fn transCreateNodeStructInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp {4089fn transCreateNodeStructInitializer(c: *Context, ty: *ast.Node) !*ast.Node.SuffixOp {
4042 _ = try appendToken(c, .LBrace, "{");4090 _ = try appendToken(c, .LBrace, "{");
4043 const node = try c.a().create(ast.Node.SuffixOp);4091 const node = try c.arena.create(ast.Node.SuffixOp);
4044 node.* = .{4092 node.* = .{
4045 .lhs = .{ .node = ty },4093 .lhs = .{ .node = ty },
4046 .op = .{4094 .op = .{
4047 .StructInitializer = ast.Node.SuffixOp.Op.InitList.init(c.a()),4095 .StructInitializer = ast.Node.SuffixOp.Op.InitList{},
4048 },4096 },
4049 .rtoken = undefined, // set after appending values4097 .rtoken = undefined, // set after appending values
4050 };4098 };
...@@ -4053,7 +4101,7 @@ fn transCreateNodeStructInitializer(c: *Context, ty: *ast.Node) !*ast.Node.Suffi...@@ -4053,7 +4101,7 @@ fn transCreateNodeStructInitializer(c: *Context, ty: *ast.Node) !*ast.Node.Suffi
40534101
4054fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {4102fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {
4055 const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int});4103 const token = try appendTokenFmt(c, .IntegerLiteral, "{}", .{int});
4056 const node = try c.a().create(ast.Node.IntegerLiteral);4104 const node = try c.arena.create(ast.Node.IntegerLiteral);
4057 node.* = .{4105 node.* = .{
4058 .token = token,4106 .token = token,
4059 };4107 };
...@@ -4062,7 +4110,7 @@ fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {...@@ -4062,7 +4110,7 @@ fn transCreateNodeInt(c: *Context, int: var) !*ast.Node {
40624110
4063fn transCreateNodeFloat(c: *Context, int: var) !*ast.Node {4111fn transCreateNodeFloat(c: *Context, int: var) !*ast.Node {
4064 const token = try appendTokenFmt(c, .FloatLiteral, "{}", .{int});4112 const token = try appendTokenFmt(c, .FloatLiteral, "{}", .{int});
4065 const node = try c.a().create(ast.Node.FloatLiteral);4113 const node = try c.arena.create(ast.Node.FloatLiteral);
4066 node.* = .{4114 node.* = .{
4067 .token = token,4115 .token = token,
4068 };4116 };
...@@ -4085,20 +4133,22 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -4085,20 +4133,22 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
4085 const name_tok = try appendIdentifier(c, name);4133 const name_tok = try appendIdentifier(c, name);
4086 _ = try appendToken(c, .LParen, "(");4134 _ = try appendToken(c, .LParen, "(");
40874135
4088 var fn_params = ast.Node.FnProto.ParamList.init(c.a());4136 var fn_params = ast.Node.FnProto.ParamList{};
4089 var it = proto_alias.params.iterator(0);4137 var fn_params_list = &fn_params.first;
4090 while (it.next()) |pn| {4138 var it = proto_alias.params.first;
4091 if (it.index != 0) {4139 while (it) |pn_node| : (it = pn_node.next) {
4140 const pn = pn_node.data;
4141 if (pn_node != proto_alias.params.first.?) {
4092 _ = try appendToken(c, .Comma, ",");4142 _ = try appendToken(c, .Comma, ",");
4093 }4143 }
4094 const param = pn.*.cast(ast.Node.ParamDecl).?;4144 const param = pn.cast(ast.Node.ParamDecl).?;
40954145
4096 const param_name_tok = param.name_token orelse4146 const param_name_tok = param.name_token orelse
4097 try appendTokenFmt(c, .Identifier, "arg_{}", .{c.getMangle()});4147 try appendTokenFmt(c, .Identifier, "arg_{}", .{c.getMangle()});
40984148
4099 _ = try appendToken(c, .Colon, ":");4149 _ = try appendToken(c, .Colon, ":");
41004150
4101 const param_node = try c.a().create(ast.Node.ParamDecl);4151 const param_node = try c.arena.create(ast.Node.ParamDecl);
4102 param_node.* = .{4152 param_node.* = .{
4103 .doc_comments = null,4153 .doc_comments = null,
4104 .comptime_token = null,4154 .comptime_token = null,
...@@ -4106,12 +4156,12 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -4106,12 +4156,12 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
4106 .name_token = param_name_tok,4156 .name_token = param_name_tok,
4107 .param_type = param.param_type,4157 .param_type = param.param_type,
4108 };4158 };
4109 try fn_params.push(&param_node.base);4159 fn_params_list = try c.llpush(*ast.Node, fn_params_list, &param_node.base);
4110 }4160 }
41114161
4112 _ = try appendToken(c, .RParen, ")");4162 _ = try appendToken(c, .RParen, ")");
41134163
4114 const fn_proto = try c.a().create(ast.Node.FnProto);4164 const fn_proto = try c.arena.create(ast.Node.FnProto);
4115 fn_proto.* = .{4165 fn_proto.* = .{
4116 .doc_comments = null,4166 .doc_comments = null,
4117 .visib_token = pub_tok,4167 .visib_token = pub_tok,
...@@ -4129,24 +4179,28 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -4129,24 +4179,28 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
4129 };4179 };
41304180
4131 const block = try transCreateNodeBlock(c, null);4181 const block = try transCreateNodeBlock(c, null);
4182 var block_statements_it = &block.statements.first;
41324183
4133 const return_expr = try transCreateNodeReturnExpr(c);4184 const return_expr = try transCreateNodeReturnExpr(c);
4134 const unwrap_expr = try transCreateNodeUnwrapNull(c, ref.cast(ast.Node.VarDecl).?.init_node.?);4185 const unwrap_expr = try transCreateNodeUnwrapNull(c, ref.cast(ast.Node.VarDecl).?.init_node.?);
4135 const call_expr = try transCreateNodeFnCall(c, unwrap_expr);4186 const call_expr = try transCreateNodeFnCall(c, unwrap_expr);
4136 it = fn_params.iterator(0);4187 var call_params_it = &call_expr.op.Call.params.first;
4137 while (it.next()) |pn| {4188
4138 if (it.index != 0) {4189 it = fn_params.first;
4190 while (it) |pn_node| : (it = pn_node.next) {
4191 const pn = pn_node.data;
4192 if (fn_params.first.? != pn_node) {
4139 _ = try appendToken(c, .Comma, ",");4193 _ = try appendToken(c, .Comma, ",");
4140 }4194 }
4141 const param = pn.*.cast(ast.Node.ParamDecl).?;4195 const param = pn.cast(ast.Node.ParamDecl).?;
4142 try call_expr.op.Call.params.push(try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)));4196 call_params_it = try c.llpush(*ast.Node, call_params_it, try transCreateNodeIdentifier(c, tokenSlice(c, param.name_token.?)),);
4143 }4197 }
4144 call_expr.rtoken = try appendToken(c, .RParen, ")");4198 call_expr.rtoken = try appendToken(c, .RParen, ")");
4145 return_expr.rhs = &call_expr.base;4199 return_expr.rhs = &call_expr.base;
4146 _ = try appendToken(c, .Semicolon, ";");4200 _ = try appendToken(c, .Semicolon, ";");
41474201
4148 block.rbrace = try appendToken(c, .RBrace, "}");4202 block.rbrace = try appendToken(c, .RBrace, "}");
4149 try block.statements.push(&return_expr.base);4203 block_statements_it = try c.llpush(*ast.Node, block_statements_it, &return_expr.base);
4150 fn_proto.body_node = &block.base;4204 fn_proto.body_node = &block.base;
4151 return &fn_proto.base;4205 return &fn_proto.base;
4152}4206}
...@@ -4154,7 +4208,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a...@@ -4154,7 +4208,7 @@ fn transCreateNodeMacroFn(c: *Context, name: []const u8, ref: *ast.Node, proto_a
4154fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node {4208fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node {
4155 _ = try appendToken(c, .Period, ".");4209 _ = try appendToken(c, .Period, ".");
4156 const qm = try appendToken(c, .QuestionMark, "?");4210 const qm = try appendToken(c, .QuestionMark, "?");
4157 const node = try c.a().create(ast.Node.SuffixOp);4211 const node = try c.arena.create(ast.Node.SuffixOp);
4158 node.* = .{4212 node.* = .{
4159 .op = .UnwrapOptional,4213 .op = .UnwrapOptional,
4160 .lhs = .{ .node = wrapped },4214 .lhs = .{ .node = wrapped },
...@@ -4164,7 +4218,7 @@ fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node {...@@ -4164,7 +4218,7 @@ fn transCreateNodeUnwrapNull(c: *Context, wrapped: *ast.Node) !*ast.Node {
4164}4218}
41654219
4166fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {4220fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {
4167 const node = try c.a().create(ast.Node.EnumLiteral);4221 const node = try c.arena.create(ast.Node.EnumLiteral);
4168 node.* = .{4222 node.* = .{
4169 .dot = try appendToken(c, .Period, "."),4223 .dot = try appendToken(c, .Period, "."),
4170 .name = try appendIdentifier(c, name),4224 .name = try appendIdentifier(c, name),
...@@ -4173,7 +4227,7 @@ fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {...@@ -4173,7 +4227,7 @@ fn transCreateNodeEnumLiteral(c: *Context, name: []const u8) !*ast.Node {
4173}4227}
41744228
4175fn transCreateNodeStringLiteral(c: *Context, str: []const u8) !*ast.Node {4229fn transCreateNodeStringLiteral(c: *Context, str: []const u8) !*ast.Node {
4176 const node = try c.a().create(ast.Node.StringLiteral);4230 const node = try c.arena.create(ast.Node.StringLiteral);
4177 node.* = .{4231 node.* = .{
4178 .token = try appendToken(c, .StringLiteral, str),4232 .token = try appendToken(c, .StringLiteral, str),
4179 };4233 };
...@@ -4183,7 +4237,7 @@ fn transCreateNodeStringLiteral(c: *Context, str: []const u8) !*ast.Node {...@@ -4183,7 +4237,7 @@ fn transCreateNodeStringLiteral(c: *Context, str: []const u8) !*ast.Node {
4183fn transCreateNodeIf(c: *Context) !*ast.Node.If {4237fn transCreateNodeIf(c: *Context) !*ast.Node.If {
4184 const if_tok = try appendToken(c, .Keyword_if, "if");4238 const if_tok = try appendToken(c, .Keyword_if, "if");
4185 _ = try appendToken(c, .LParen, "(");4239 _ = try appendToken(c, .LParen, "(");
4186 const node = try c.a().create(ast.Node.If);4240 const node = try c.arena.create(ast.Node.If);
4187 node.* = .{4241 node.* = .{
4188 .if_token = if_tok,4242 .if_token = if_tok,
4189 .condition = undefined,4243 .condition = undefined,
...@@ -4195,7 +4249,7 @@ fn transCreateNodeIf(c: *Context) !*ast.Node.If {...@@ -4195,7 +4249,7 @@ fn transCreateNodeIf(c: *Context) !*ast.Node.If {
4195}4249}
41964250
4197fn transCreateNodeElse(c: *Context) !*ast.Node.Else {4251fn transCreateNodeElse(c: *Context) !*ast.Node.Else {
4198 const node = try c.a().create(ast.Node.Else);4252 const node = try c.arena.create(ast.Node.Else);
4199 node.* = .{4253 node.* = .{
4200 .else_token = try appendToken(c, .Keyword_else, "else"),4254 .else_token = try appendToken(c, .Keyword_else, "else"),
4201 .payload = null,4255 .payload = null,
...@@ -4210,11 +4264,11 @@ fn transCreateNodeBlock(c: *Context, label: ?[]const u8) !*ast.Node.Block {...@@ -4210,11 +4264,11 @@ fn transCreateNodeBlock(c: *Context, label: ?[]const u8) !*ast.Node.Block {
4210 _ = try appendToken(c, .Colon, ":");4264 _ = try appendToken(c, .Colon, ":");
4211 break :blk ll;4265 break :blk ll;
4212 } else null;4266 } else null;
4213 const block_node = try c.a().create(ast.Node.Block);4267 const block_node = try c.arena.create(ast.Node.Block);
4214 block_node.* = .{4268 block_node.* = .{
4215 .label = label_node,4269 .label = label_node,
4216 .lbrace = try appendToken(c, .LBrace, "{"),4270 .lbrace = try appendToken(c, .LBrace, "{"),
4217 .statements = ast.Node.Block.StatementList.init(c.a()),4271 .statements = ast.Node.Block.StatementList{},
4218 .rbrace = undefined,4272 .rbrace = undefined,
4219 };4273 };
4220 return block_node;4274 return block_node;
...@@ -4226,7 +4280,7 @@ fn transCreateNodeBreak(c: *Context, label: ?[]const u8) !*ast.Node.ControlFlowE...@@ -4226,7 +4280,7 @@ fn transCreateNodeBreak(c: *Context, label: ?[]const u8) !*ast.Node.ControlFlowE
4226 _ = try appendToken(c, .Colon, ":");4280 _ = try appendToken(c, .Colon, ":");
4227 break :blk try transCreateNodeIdentifier(c, l);4281 break :blk try transCreateNodeIdentifier(c, l);
4228 } else null;4282 } else null;
4229 const node = try c.a().create(ast.Node.ControlFlowExpression);4283 const node = try c.arena.create(ast.Node.ControlFlowExpression);
4230 node.* = .{4284 node.* = .{
4231 .ltoken = ltoken,4285 .ltoken = ltoken,
4232 .kind = .{ .Break = label_node },4286 .kind = .{ .Break = label_node },
...@@ -4240,7 +4294,7 @@ fn transCreateNodeVarDecl(c: *Context, is_pub: bool, is_const: bool, name: []con...@@ -4240,7 +4294,7 @@ fn transCreateNodeVarDecl(c: *Context, is_pub: bool, is_const: bool, name: []con
4240 const mut_tok = if (is_const) try appendToken(c, .Keyword_const, "const") else try appendToken(c, .Keyword_var, "var");4294 const mut_tok = if (is_const) try appendToken(c, .Keyword_const, "const") else try appendToken(c, .Keyword_var, "var");
4241 const name_tok = try appendIdentifier(c, name);4295 const name_tok = try appendIdentifier(c, name);
42424296
4243 const node = try c.a().create(ast.Node.VarDecl);4297 const node = try c.arena.create(ast.Node.VarDecl);
4244 node.* = .{4298 node.* = .{
4245 .doc_comments = null,4299 .doc_comments = null,
4246 .visib_token = visib_tok,4300 .visib_token = visib_tok,
...@@ -4264,7 +4318,7 @@ fn transCreateNodeWhile(c: *Context) !*ast.Node.While {...@@ -4264,7 +4318,7 @@ fn transCreateNodeWhile(c: *Context) !*ast.Node.While {
4264 const while_tok = try appendToken(c, .Keyword_while, "while");4318 const while_tok = try appendToken(c, .Keyword_while, "while");
4265 _ = try appendToken(c, .LParen, "(");4319 _ = try appendToken(c, .LParen, "(");
42664320
4267 const node = try c.a().create(ast.Node.While);4321 const node = try c.arena.create(ast.Node.While);
4268 node.* = .{4322 node.* = .{
4269 .label = null,4323 .label = null,
4270 .inline_token = null,4324 .inline_token = null,
...@@ -4280,7 +4334,7 @@ fn transCreateNodeWhile(c: *Context) !*ast.Node.While {...@@ -4280,7 +4334,7 @@ fn transCreateNodeWhile(c: *Context) !*ast.Node.While {
42804334
4281fn transCreateNodeContinue(c: *Context) !*ast.Node {4335fn transCreateNodeContinue(c: *Context) !*ast.Node {
4282 const ltoken = try appendToken(c, .Keyword_continue, "continue");4336 const ltoken = try appendToken(c, .Keyword_continue, "continue");
4283 const node = try c.a().create(ast.Node.ControlFlowExpression);4337 const node = try c.arena.create(ast.Node.ControlFlowExpression);
4284 node.* = .{4338 node.* = .{
4285 .ltoken = ltoken,4339 .ltoken = ltoken,
4286 .kind = .{ .Continue = null },4340 .kind = .{ .Continue = null },
...@@ -4294,11 +4348,11 @@ fn transCreateNodeSwitch(c: *Context) !*ast.Node.Switch {...@@ -4294,11 +4348,11 @@ fn transCreateNodeSwitch(c: *Context) !*ast.Node.Switch {
4294 const switch_tok = try appendToken(c, .Keyword_switch, "switch");4348 const switch_tok = try appendToken(c, .Keyword_switch, "switch");
4295 _ = try appendToken(c, .LParen, "(");4349 _ = try appendToken(c, .LParen, "(");
42964350
4297 const node = try c.a().create(ast.Node.Switch);4351 const node = try c.arena.create(ast.Node.Switch);
4298 node.* = .{4352 node.* = .{
4299 .switch_token = switch_tok,4353 .switch_token = switch_tok,
4300 .expr = undefined,4354 .expr = undefined,
4301 .cases = ast.Node.Switch.CaseList.init(c.a()),4355 .cases = ast.Node.Switch.CaseList{},
4302 .rbrace = undefined,4356 .rbrace = undefined,
4303 };4357 };
4304 return node;4358 return node;
...@@ -4307,9 +4361,9 @@ fn transCreateNodeSwitch(c: *Context) !*ast.Node.Switch {...@@ -4307,9 +4361,9 @@ fn transCreateNodeSwitch(c: *Context) !*ast.Node.Switch {
4307fn transCreateNodeSwitchCase(c: *Context, lhs: *ast.Node) !*ast.Node.SwitchCase {4361fn transCreateNodeSwitchCase(c: *Context, lhs: *ast.Node) !*ast.Node.SwitchCase {
4308 const arrow_tok = try appendToken(c, .EqualAngleBracketRight, "=>");4362 const arrow_tok = try appendToken(c, .EqualAngleBracketRight, "=>");
43094363
4310 const node = try c.a().create(ast.Node.SwitchCase);4364 const node = try c.arena.create(ast.Node.SwitchCase);
4311 node.* = .{4365 node.* = .{
4312 .items = ast.Node.SwitchCase.ItemList.init(c.a()),4366 .items = ast.Node.SwitchCase.ItemList{},
4313 .arrow_token = arrow_tok,4367 .arrow_token = arrow_tok,
4314 .payload = null,4368 .payload = null,
4315 .expr = undefined,4369 .expr = undefined,
...@@ -4319,7 +4373,7 @@ fn transCreateNodeSwitchCase(c: *Context, lhs: *ast.Node) !*ast.Node.SwitchCase...@@ -4319,7 +4373,7 @@ fn transCreateNodeSwitchCase(c: *Context, lhs: *ast.Node) !*ast.Node.SwitchCase
4319}4373}
43204374
4321fn transCreateNodeSwitchElse(c: *Context) !*ast.Node {4375fn transCreateNodeSwitchElse(c: *Context) !*ast.Node {
4322 const node = try c.a().create(ast.Node.SwitchElse);4376 const node = try c.arena.create(ast.Node.SwitchElse);
4323 node.* = .{4377 node.* = .{
4324 .token = try appendToken(c, .Keyword_else, "else"),4378 .token = try appendToken(c, .Keyword_else, "else"),
4325 };4379 };
...@@ -4352,7 +4406,7 @@ fn transCreateNodeShiftOp(...@@ -4352,7 +4406,7 @@ fn transCreateNodeShiftOp(
4352 try cast_node.params.push(rhs);4406 try cast_node.params.push(rhs);
4353 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");4407 cast_node.rparen_token = try appendToken(rp.c, .RParen, ")");
43544408
4355 const node = try rp.c.a().create(ast.Node.InfixOp);4409 const node = try rp.c.arena.create(ast.Node.InfixOp);
4356 node.* = .{4410 node.* = .{
4357 .op_token = op_token,4411 .op_token = op_token,
4358 .lhs = lhs,4412 .lhs = lhs,
...@@ -4364,7 +4418,7 @@ fn transCreateNodeShiftOp(...@@ -4364,7 +4418,7 @@ fn transCreateNodeShiftOp(
4364}4418}
43654419
4366fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {4420fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {
4367 const node = try c.a().create(ast.Node.SuffixOp);4421 const node = try c.arena.create(ast.Node.SuffixOp);
4368 node.* = .{4422 node.* = .{
4369 .lhs = .{ .node = lhs },4423 .lhs = .{ .node = lhs },
4370 .op = .Deref,4424 .op = .Deref,
...@@ -4375,7 +4429,7 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {...@@ -4375,7 +4429,7 @@ fn transCreateNodePtrDeref(c: *Context, lhs: *ast.Node) !*ast.Node {
43754429
4376fn transCreateNodeArrayAccess(c: *Context, lhs: *ast.Node) !*ast.Node.SuffixOp {4430fn transCreateNodeArrayAccess(c: *Context, lhs: *ast.Node) !*ast.Node.SuffixOp {
4377 _ = try appendToken(c, .LBrace, "[");4431 _ = try appendToken(c, .LBrace, "[");
4378 const node = try c.a().create(ast.Node.SuffixOp);4432 const node = try c.arena.create(ast.Node.SuffixOp);
4379 node.* = .{4433 node.* = .{
4380 .lhs = .{ .node = lhs },4434 .lhs = .{ .node = lhs },
4381 .op = .{4435 .op = .{
...@@ -4392,7 +4446,7 @@ const RestorePoint = struct {...@@ -4392,7 +4446,7 @@ const RestorePoint = struct {
4392 src_buf_index: usize,4446 src_buf_index: usize,
43934447
4394 fn activate(self: RestorePoint) void {4448 fn activate(self: RestorePoint) void {
4395 self.c.tree.tokens.shrink(self.token_index);4449 self.c.tokens.shrink(self.c.gpa, self.token_index);
4396 self.c.source_buffer.shrink(self.src_buf_index);4450 self.c.source_buffer.shrink(self.src_buf_index);
4397 }4451 }
4398};4452};
...@@ -4400,7 +4454,7 @@ const RestorePoint = struct {...@@ -4400,7 +4454,7 @@ const RestorePoint = struct {
4400fn makeRestorePoint(c: *Context) RestorePoint {4454fn makeRestorePoint(c: *Context) RestorePoint {
4401 return RestorePoint{4455 return RestorePoint{
4402 .c = c,4456 .c = c,
4403 .token_index = c.tree.tokens.len,4457 .token_index = c.tokens.items.len,
4404 .src_buf_index = c.source_buffer.items.len,4458 .src_buf_index = c.source_buffer.items.len,
4405 };4459 };
4406}4460}
...@@ -4647,7 +4701,8 @@ fn finishTransFnProto(...@@ -4647,7 +4701,8 @@ fn finishTransFnProto(
4647 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;4701 const name_tok = if (fn_decl_context) |ctx| try appendIdentifier(rp.c, ctx.fn_name) else null;
4648 const lparen_tok = try appendToken(rp.c, .LParen, "(");4702 const lparen_tok = try appendToken(rp.c, .LParen, "(");
46494703
4650 var fn_params = ast.Node.FnProto.ParamList.init(rp.c.a());4704 var fn_params = ast.Node.FnProto.ParamList{};
4705 var fn_params_list = rp.c.llpusher(&fn_params);
4651 const param_count: usize = if (fn_proto_ty != null) ZigClangFunctionProtoType_getNumParams(fn_proto_ty.?) else 0;4706 const param_count: usize = if (fn_proto_ty != null) ZigClangFunctionProtoType_getNumParams(fn_proto_ty.?) else 0;
46524707
4653 var i: usize = 0;4708 var i: usize = 0;
...@@ -4672,7 +4727,7 @@ fn finishTransFnProto(...@@ -4672,7 +4727,7 @@ fn finishTransFnProto(
46724727
4673 const type_node = try transQualType(rp, param_qt, source_loc);4728 const type_node = try transQualType(rp, param_qt, source_loc);
46744729
4675 const param_node = try rp.c.a().create(ast.Node.ParamDecl);4730 const param_node = try rp.c.arena.create(ast.Node.ParamDecl);
4676 param_node.* = .{4731 param_node.* = .{
4677 .doc_comments = null,4732 .doc_comments = null,
4678 .comptime_token = null,4733 .comptime_token = null,
...@@ -4680,7 +4735,7 @@ fn finishTransFnProto(...@@ -4680,7 +4735,7 @@ fn finishTransFnProto(
4680 .name_token = param_name_tok,4735 .name_token = param_name_tok,
4681 .param_type = .{ .type_expr = type_node },4736 .param_type = .{ .type_expr = type_node },
4682 };4737 };
4683 try fn_params.push(&param_node.base);4738 try fn_params_list.push(&param_node.base);
46844739
4685 if (i + 1 < param_count) {4740 if (i + 1 < param_count) {
4686 _ = try appendToken(rp.c, .Comma, ",");4741 _ = try appendToken(rp.c, .Comma, ",");
...@@ -4692,7 +4747,7 @@ fn finishTransFnProto(...@@ -4692,7 +4747,7 @@ fn finishTransFnProto(
4692 _ = try appendToken(rp.c, .Comma, ",");4747 _ = try appendToken(rp.c, .Comma, ",");
4693 }4748 }
46944749
4695 const var_arg_node = try rp.c.a().create(ast.Node.ParamDecl);4750 const var_arg_node = try rp.c.arena.create(ast.Node.ParamDecl);
4696 var_arg_node.* = .{4751 var_arg_node.* = .{
4697 .doc_comments = null,4752 .doc_comments = null,
4698 .comptime_token = null,4753 .comptime_token = null,
...@@ -4700,7 +4755,7 @@ fn finishTransFnProto(...@@ -4700,7 +4755,7 @@ fn finishTransFnProto(
4700 .name_token = null,4755 .name_token = null,
4701 .param_type = .{ .var_args = try appendToken(rp.c, .Ellipsis3, "...") }4756 .param_type = .{ .var_args = try appendToken(rp.c, .Ellipsis3, "...") }
4702 };4757 };
4703 try fn_params.push(&var_arg_node.base);4758 try fn_params_list.push(&var_arg_node.base);
4704 }4759 }
47054760
4706 const rparen_tok = try appendToken(rp.c, .RParen, ")");4761 const rparen_tok = try appendToken(rp.c, .RParen, ")");
...@@ -4713,7 +4768,7 @@ fn finishTransFnProto(...@@ -4713,7 +4768,7 @@ fn finishTransFnProto(
4713 _ = try appendToken(rp.c, .LParen, "(");4768 _ = try appendToken(rp.c, .LParen, "(");
4714 const expr = try transCreateNodeStringLiteral(4769 const expr = try transCreateNodeStringLiteral(
4715 rp.c,4770 rp.c,
4716 try std.fmt.allocPrint(rp.c.a(), "\"{}\"", .{str_ptr[0..str_len]}),4771 try std.fmt.allocPrint(rp.c.arena, "\"{}\"", .{str_ptr[0..str_len]}),
4717 );4772 );
4718 _ = try appendToken(rp.c, .RParen, ")");4773 _ = try appendToken(rp.c, .RParen, ")");
47194774
...@@ -4767,7 +4822,7 @@ fn finishTransFnProto(...@@ -4767,7 +4822,7 @@ fn finishTransFnProto(
4767 }4822 }
4768 };4823 };
47694824
4770 const fn_proto = try rp.c.a().create(ast.Node.FnProto);4825 const fn_proto = try rp.c.arena.create(ast.Node.FnProto);
4771 fn_proto.* = .{4826 fn_proto.* = .{
4772 .doc_comments = null,4827 .doc_comments = null,
4773 .visib_token = pub_tok,4828 .visib_token = pub_tok,
...@@ -4816,20 +4871,21 @@ pub fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comp...@@ -4816,20 +4871,21 @@ pub fn failDecl(c: *Context, loc: ZigClangSourceLocation, name: []const u8, comp
4816 const semi_tok = try appendToken(c, .Semicolon, ";");4871 const semi_tok = try appendToken(c, .Semicolon, ";");
4817 _ = try appendTokenFmt(c, .LineComment, "// {}", .{c.locStr(loc)});4872 _ = try appendTokenFmt(c, .LineComment, "// {}", .{c.locStr(loc)});
48184873
4819 const msg_node = try c.a().create(ast.Node.StringLiteral);4874 const msg_node = try c.arena.create(ast.Node.StringLiteral);
4820 msg_node.* = .{4875 msg_node.* = .{
4821 .token = msg_tok,4876 .token = msg_tok,
4822 };4877 };
48234878
4824 const call_node = try c.a().create(ast.Node.BuiltinCall);4879 const call_node = try c.arena.create(ast.Node.BuiltinCall);
4825 call_node.* = .{4880 call_node.* = .{
4826 .builtin_token = builtin_tok,4881 .builtin_token = builtin_tok,
4827 .params = ast.Node.BuiltinCall.ParamList.init(c.a()),4882 .params = ast.Node.BuiltinCall.ParamList{},
4828 .rparen_token = rparen_tok,4883 .rparen_token = rparen_tok,
4829 };4884 };
4830 try call_node.params.push(&msg_node.base);4885 var call_params_it = &call_node.params.first;
4886 call_params_it = try c.llpush(*ast.Node, call_params_it, &msg_node.base);
48314887
4832 const var_decl_node = try c.a().create(ast.Node.VarDecl);4888 const var_decl_node = try c.arena.create(ast.Node.VarDecl);
4833 var_decl_node.* = .{4889 var_decl_node.* = .{
4834 .doc_comments = null,4890 .doc_comments = null,
4835 .visib_token = pub_tok,4891 .visib_token = pub_tok,
...@@ -4861,9 +4917,9 @@ fn appendTokenFmt(c: *Context, token_id: Token.Id, comptime format: []const u8,...@@ -4861,9 +4917,9 @@ fn appendTokenFmt(c: *Context, token_id: Token.Id, comptime format: []const u8,
48614917
4862 try c.source_buffer.outStream().print(format, args);4918 try c.source_buffer.outStream().print(format, args);
4863 const end_index = c.source_buffer.items.len;4919 const end_index = c.source_buffer.items.len;
4864 const token_index = c.tree.tokens.len;4920 const token_index = c.tokens.items.len;
4865 const new_token = try c.tree.tokens.addOne();4921 const new_token = try c.tokens.addOne(c.gpa);
4866 errdefer c.tree.tokens.shrink(token_index);4922 errdefer c.tokens.shrink(c.gpa, token_index);
48674923
4868 new_token.* = .{4924 new_token.* = .{
4869 .id = token_id,4925 .id = token_id,
...@@ -4931,7 +4987,7 @@ fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {...@@ -4931,7 +4987,7 @@ fn appendIdentifier(c: *Context, name: []const u8) !ast.TokenIndex {
49314987
4932fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node {4988fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node {
4933 const token_index = try appendIdentifier(c, name);4989 const token_index = try appendIdentifier(c, name);
4934 const identifier = try c.a().create(ast.Node.Identifier);4990 const identifier = try c.arena.create(ast.Node.Identifier);
4935 identifier.* = .{4991 identifier.* = .{
4936 .token = token_index,4992 .token = token_index,
4937 };4993 };
...@@ -4940,7 +4996,7 @@ fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node {...@@ -4940,7 +4996,7 @@ fn transCreateNodeIdentifier(c: *Context, name: []const u8) !*ast.Node {
49404996
4941fn transCreateNodeIdentifierUnchecked(c: *Context, name: []const u8) !*ast.Node {4997fn transCreateNodeIdentifierUnchecked(c: *Context, name: []const u8) !*ast.Node {
4942 const token_index = try appendTokenFmt(c, .Identifier, "{}", .{name});4998 const token_index = try appendTokenFmt(c, .Identifier, "{}", .{name});
4943 const identifier = try c.a().create(ast.Node.Identifier);4999 const identifier = try c.arena.create(ast.Node.Identifier);
4944 identifier.* = .{5000 identifier.* = .{
4945 .token = token_index,5001 .token = token_index,
4946 };5002 };
...@@ -4955,7 +5011,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {...@@ -4955,7 +5011,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
4955 // TODO if we see #undef, delete it from the table5011 // TODO if we see #undef, delete it from the table
4956 var it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit);5012 var it = ZigClangASTUnit_getLocalPreprocessingEntities_begin(unit);
4957 const it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit);5013 const it_end = ZigClangASTUnit_getLocalPreprocessingEntities_end(unit);
4958 var tok_list = CTokenList.init(c.a());5014 var tok_list = CTokenList.init(c.arena);
4959 const scope = c.global_scope;5015 const scope = c.global_scope;
49605016
4961 while (it.I != it_end.I) : (it.I += 1) {5017 while (it.I != it_end.I) : (it.I += 1) {
...@@ -4970,7 +5026,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {...@@ -4970,7 +5026,7 @@ fn transPreprocessorEntities(c: *Context, unit: *ZigClangASTUnit) Error!void {
4970 const name = try c.str(raw_name);5026 const name = try c.str(raw_name);
4971 // TODO https://github.com/ziglang/zig/issues/37565027 // TODO https://github.com/ziglang/zig/issues/3756
4972 // TODO https://github.com/ziglang/zig/issues/18025028 // TODO https://github.com/ziglang/zig/issues/1802
4973 const mangled_name = if (isZigPrimitiveType(name)) try std.fmt.allocPrint(c.a(), "{}_{}", .{ name, c.getMangle() }) else name;5029 const mangled_name = if (isZigPrimitiveType(name)) try std.fmt.allocPrint(c.arena, "{}_{}", .{ name, c.getMangle() }) else name;
4974 if (scope.containsNow(mangled_name)) {5030 if (scope.containsNow(mangled_name)) {
4975 continue;5031 continue;
4976 }5032 }
...@@ -5078,7 +5134,8 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5078,7 +5134,8 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5078 .{},5134 .{},
5079 );5135 );
5080 }5136 }
5081 var fn_params = ast.Node.FnProto.ParamList.init(c.a());5137 var fn_params = ast.Node.FnProto.ParamList{};
5138 var fn_params_it = &fn_params.first;
5082 while (true) {5139 while (true) {
5083 const param_tok = it.next().?;5140 const param_tok = it.next().?;
5084 if (param_tok.id != .Identifier) {5141 if (param_tok.id != .Identifier) {
...@@ -5096,12 +5153,12 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5096,12 +5153,12 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5096 _ = try appendToken(c, .Colon, ":");5153 _ = try appendToken(c, .Colon, ":");
50975154
5098 const token_index = try appendToken(c, .Keyword_var, "var");5155 const token_index = try appendToken(c, .Keyword_var, "var");
5099 const identifier = try c.a().create(ast.Node.Identifier);5156 const identifier = try c.arena.create(ast.Node.Identifier);
5100 identifier.* = .{5157 identifier.* = .{
5101 .token = token_index,5158 .token = token_index,
5102 };5159 };
51035160
5104 const param_node = try c.a().create(ast.Node.ParamDecl);5161 const param_node = try c.arena.create(ast.Node.ParamDecl);
5105 param_node.* = .{5162 param_node.* = .{
5106 .doc_comments = null,5163 .doc_comments = null,
5107 .comptime_token = null,5164 .comptime_token = null,
...@@ -5109,7 +5166,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5109,7 +5166,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5109 .name_token = param_name_tok,5166 .name_token = param_name_tok,
5110 .param_type = .{ .type_expr = &identifier.base },5167 .param_type = .{ .type_expr = &identifier.base },
5111 };5168 };
5112 try fn_params.push(&param_node.base);5169 fn_params_it = try c.llpush(*ast.Node, fn_params_it, &param_node.base);
51135170
5114 if (it.peek().?.id != .Comma)5171 if (it.peek().?.id != .Comma)
5115 break;5172 break;
...@@ -5131,8 +5188,9 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5131,8 +5188,9 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
51315188
5132 const type_of = try transCreateNodeBuiltinFnCall(c, "@TypeOf");5189 const type_of = try transCreateNodeBuiltinFnCall(c, "@TypeOf");
5133 type_of.rparen_token = try appendToken(c, .RParen, ")");5190 type_of.rparen_token = try appendToken(c, .RParen, ")");
5191 var type_of_params = c.llpusher(&type_of.params);
51345192
5135 const fn_proto = try c.a().create(ast.Node.FnProto);5193 const fn_proto = try c.arena.create(ast.Node.FnProto);
5136 fn_proto.* = .{5194 fn_proto.* = .{
5137 .visib_token = pub_tok,5195 .visib_token = pub_tok,
5138 .extern_export_inline_token = inline_tok,5196 .extern_export_inline_token = inline_tok,
...@@ -5150,6 +5208,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5150,6 +5208,7 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5150 };5208 };
51515209
5152 const block = try transCreateNodeBlock(c, null);5210 const block = try transCreateNodeBlock(c, null);
5211 var block_statements = c.llpusher(&block.statements);
51535212
5154 const return_expr = try transCreateNodeReturnExpr(c);5213 const return_expr = try transCreateNodeReturnExpr(c);
5155 const expr = try parseCExpr(c, it, source, source_loc, scope);5214 const expr = try parseCExpr(c, it, source, source_loc, scope);
...@@ -5165,16 +5224,16 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5165,16 +5224,16 @@ fn transMacroFnDefine(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5165 _ = try appendToken(c, .Semicolon, ";");5224 _ = try appendToken(c, .Semicolon, ";");
5166 const type_of_arg = if (expr.id != .Block) expr else blk: {5225 const type_of_arg = if (expr.id != .Block) expr else blk: {
5167 const blk = @fieldParentPtr(ast.Node.Block, "base", expr);5226 const blk = @fieldParentPtr(ast.Node.Block, "base", expr);
5168 const blk_last = blk.statements.at(blk.statements.len - 1).*;5227 const blk_last = blk.statements.first.?.findLast().data;
5169 std.debug.assert(blk_last.id == .ControlFlowExpression);5228 std.debug.assert(blk_last.id == .ControlFlowExpression);
5170 const br = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", blk_last);5229 const br = @fieldParentPtr(ast.Node.ControlFlowExpression, "base", blk_last);
5171 break :blk br.rhs.?;5230 break :blk br.rhs.?;
5172 };5231 };
5173 try type_of.params.push(type_of_arg);5232 try type_of_params.push(type_of_arg);
5174 return_expr.rhs = expr;5233 return_expr.rhs = expr;
51755234
5176 block.rbrace = try appendToken(c, .RBrace, "}");5235 block.rbrace = try appendToken(c, .RBrace, "}");
5177 try block.statements.push(&return_expr.base);5236 try block_statements.push(&return_expr.base);
5178 fn_proto.body_node = &block.base;5237 fn_proto.body_node = &block.base;
5179 _ = try c.global_scope.macro_table.put(name, &fn_proto.base);5238 _ = try c.global_scope.macro_table.put(name, &fn_proto.base);
5180}5239}
...@@ -5208,14 +5267,14 @@ fn parseCExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, source_...@@ -5208,14 +5267,14 @@ fn parseCExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8, source_
5208 .Comma => {5267 .Comma => {
5209 _ = try appendToken(c, .Semicolon, ";");5268 _ = try appendToken(c, .Semicolon, ";");
5210 const block_scope = try Scope.Block.init(c, scope, "blk");5269 const block_scope = try Scope.Block.init(c, scope, "blk");
5211 block_scope.block_node = try transCreateNodeBlock(c, block_scope.label);5270 block_scope.setBlockNode(try transCreateNodeBlock(c, block_scope.label));
52125271
5213 var last = node;5272 var last = node;
5214 while (true) {5273 while (true) {
5215 // suppress result5274 // suppress result
5216 const lhs = try transCreateNodeIdentifier(c, "_");5275 const lhs = try transCreateNodeIdentifier(c, "_");
5217 const op_token = try appendToken(c, .Equal, "=");5276 const op_token = try appendToken(c, .Equal, "=");
5218 const op_node = try c.a().create(ast.Node.InfixOp);5277 const op_node = try c.arena.create(ast.Node.InfixOp);
5219 op_node.* = .{5278 op_node.* = .{
5220 .op_token = op_token,5279 .op_token = op_token,
5221 .lhs = lhs,5280 .lhs = lhs,
...@@ -5253,11 +5312,11 @@ fn parseCNumLit(c: *Context, tok: *CToken, source: []const u8, source_loc: ZigCl...@@ -5253,11 +5312,11 @@ fn parseCNumLit(c: *Context, tok: *CToken, source: []const u8, source_loc: ZigCl
5253 switch (lit_bytes[1]) {5312 switch (lit_bytes[1]) {
5254 '0'...'7' => {5313 '0'...'7' => {
5255 // Octal5314 // Octal
5256 lit_bytes = try std.fmt.allocPrint(c.a(), "0o{}", .{lit_bytes});5315 lit_bytes = try std.fmt.allocPrint(c.arena, "0o{}", .{lit_bytes});
5257 },5316 },
5258 'X' => {5317 'X' => {
5259 // Hexadecimal with capital X, valid in C but not in Zig5318 // Hexadecimal with capital X, valid in C but not in Zig
5260 lit_bytes = try std.fmt.allocPrint(c.a(), "0x{}", .{lit_bytes[2..]});5319 lit_bytes = try std.fmt.allocPrint(c.arena, "0x{}", .{lit_bytes[2..]});
5261 },5320 },
5262 else => {},5321 else => {},
5263 }5322 }
...@@ -5288,7 +5347,7 @@ fn parseCNumLit(c: *Context, tok: *CToken, source: []const u8, source_loc: ZigCl...@@ -5288,7 +5347,7 @@ fn parseCNumLit(c: *Context, tok: *CToken, source: []const u8, source_loc: ZigCl
5288 return &cast_node.base;5347 return &cast_node.base;
5289 } else if (tok.id == .FloatLiteral) {5348 } else if (tok.id == .FloatLiteral) {
5290 if (lit_bytes[0] == '.')5349 if (lit_bytes[0] == '.')
5291 lit_bytes = try std.fmt.allocPrint(c.a(), "0{}", .{lit_bytes});5350 lit_bytes = try std.fmt.allocPrint(c.arena, "0{}", .{lit_bytes});
5292 if (tok.id.FloatLiteral == .None) {5351 if (tok.id.FloatLiteral == .None) {
5293 return transCreateNodeFloat(c, lit_bytes);5352 return transCreateNodeFloat(c, lit_bytes);
5294 }5353 }
...@@ -5318,7 +5377,7 @@ fn zigifyEscapeSequences(ctx: *Context, source_bytes: []const u8, name: []const...@@ -5318,7 +5377,7 @@ fn zigifyEscapeSequences(ctx: *Context, source_bytes: []const u8, name: []const
5318 break;5377 break;
5319 }5378 }
5320 } else return source;5379 } else return source;
5321 var bytes = try ctx.a().alloc(u8, source.len * 2);5380 var bytes = try ctx.arena.alloc(u8, source.len * 2);
5322 var state: enum {5381 var state: enum {
5323 Start,5382 Start,
5324 Escape,5383 Escape,
...@@ -5472,14 +5531,14 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5472,14 +5531,14 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5472 const first_tok = it.list.at(0);5531 const first_tok = it.list.at(0);
5473 if (source[tok.start] != '\'' or source[tok.start + 1] == '\\' or tok.end - tok.start == 3) {5532 if (source[tok.start] != '\'' or source[tok.start + 1] == '\\' or tok.end - tok.start == 3) {
5474 const token = try appendToken(c, .CharLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));5533 const token = try appendToken(c, .CharLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));
5475 const node = try c.a().create(ast.Node.CharLiteral);5534 const node = try c.arena.create(ast.Node.CharLiteral);
5476 node.* = .{5535 node.* = .{
5477 .token = token,5536 .token = token,
5478 };5537 };
5479 return &node.base;5538 return &node.base;
5480 } else {5539 } else {
5481 const token = try appendTokenFmt(c, .IntegerLiteral, "0x{x}", .{source[tok.start+1..tok.end-1]});5540 const token = try appendTokenFmt(c, .IntegerLiteral, "0x{x}", .{source[tok.start+1..tok.end-1]});
5482 const node = try c.a().create(ast.Node.IntegerLiteral);5541 const node = try c.arena.create(ast.Node.IntegerLiteral);
5483 node.* = .{5542 node.* = .{
5484 .token = token,5543 .token = token,
5485 };5544 };
...@@ -5489,7 +5548,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5489,7 +5548,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5489 .StringLiteral => {5548 .StringLiteral => {
5490 const first_tok = it.list.at(0);5549 const first_tok = it.list.at(0);
5491 const token = try appendToken(c, .StringLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));5550 const token = try appendToken(c, .StringLiteral, try zigifyEscapeSequences(c, source[tok.start..tok.end], source[first_tok.start..first_tok.end], source_loc));
5492 const node = try c.a().create(ast.Node.StringLiteral);5551 const node = try c.arena.create(ast.Node.StringLiteral);
5493 node.* = .{5552 node.* = .{
5494 .token = token,5553 .token = token,
5495 };5554 };
...@@ -5572,7 +5631,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5572,7 +5631,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5572 const type_info_node = try transCreateNodeBuiltinFnCall(c, "@typeInfo");5631 const type_info_node = try transCreateNodeBuiltinFnCall(c, "@typeInfo");
5573 try type_info_node.params.push(inner_node);5632 try type_info_node.params.push(inner_node);
5574 type_info_node.rparen_token = try appendToken(c, .LParen, ")");5633 type_info_node.rparen_token = try appendToken(c, .LParen, ")");
5575 const cmp_node = try c.a().create(ast.Node.InfixOp);5634 const cmp_node = try c.arena.create(ast.Node.InfixOp);
5576 cmp_node.* = .{5635 cmp_node.* = .{
5577 .op_token = try appendToken(c, .EqualEqual, "=="),5636 .op_token = try appendToken(c, .EqualEqual, "=="),
5578 .lhs = &type_info_node.base,5637 .lhs = &type_info_node.base,
...@@ -5597,7 +5656,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5597,7 +5656,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5597 as_node.rparen_token = try appendToken(c, .RParen, ")");5656 as_node.rparen_token = try appendToken(c, .RParen, ")");
5598 else_node.body = &as_node.base;5657 else_node.body = &as_node.base;
55995658
5600 const group_node = try c.a().create(ast.Node.GroupedExpression);5659 const group_node = try c.arena.create(ast.Node.GroupedExpression);
5601 group_node.* = .{5660 group_node.* = .{
5602 .lparen = lparen,5661 .lparen = lparen,
5603 .expr = &if_node.base,5662 .expr = &if_node.base,
...@@ -5621,7 +5680,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5621,7 +5680,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5621 type_of_1.rparen_token = try appendToken(c, .RParen, ")");5680 type_of_1.rparen_token = try appendToken(c, .RParen, ")");
5622 type_info_1.rparen_token = try appendToken(c, .RParen, ")");5681 type_info_1.rparen_token = try appendToken(c, .RParen, ")");
56235682
5624 const cmp_1 = try c.a().create(ast.Node.InfixOp);5683 const cmp_1 = try c.arena.create(ast.Node.InfixOp);
5625 cmp_1.* = .{5684 cmp_1.* = .{
5626 .op_token = try appendToken(c, .EqualEqual, "=="),5685 .op_token = try appendToken(c, .EqualEqual, "=="),
5627 .lhs = &type_info_1.base,5686 .lhs = &type_info_1.base,
...@@ -5633,7 +5692,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5633,7 +5692,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
56335692
5634 const period_tok = try appendToken(c, .Period, ".");5693 const period_tok = try appendToken(c, .Period, ".");
5635 const child_ident = try transCreateNodeIdentifier(c, "Child");5694 const child_ident = try transCreateNodeIdentifier(c, "Child");
5636 const inner_node_child = try c.a().create(ast.Node.InfixOp);5695 const inner_node_child = try c.arena.create(ast.Node.InfixOp);
5637 inner_node_child.* = .{5696 inner_node_child.* = .{
5638 .op_token = period_tok,5697 .op_token = period_tok,
5639 .lhs = inner_node,5698 .lhs = inner_node,
...@@ -5669,7 +5728,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5669,7 +5728,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5669 type_of_2.rparen_token = try appendToken(c, .RParen, ")");5728 type_of_2.rparen_token = try appendToken(c, .RParen, ")");
5670 type_info_2.rparen_token = try appendToken(c, .RParen, ")");5729 type_info_2.rparen_token = try appendToken(c, .RParen, ")");
56715730
5672 const cmp_2 = try c.a().create(ast.Node.InfixOp);5731 const cmp_2 = try c.arena.create(ast.Node.InfixOp);
5673 cmp_2.* = .{5732 cmp_2.* = .{
5674 .op_token = try appendToken(c, .EqualEqual, "=="),5733 .op_token = try appendToken(c, .EqualEqual, "=="),
5675 .lhs = &type_info_2.base,5734 .lhs = &type_info_2.base,
...@@ -5677,7 +5736,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5677,7 +5736,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5677 .rhs = try transCreateNodeEnumLiteral(c, "Int"),5736 .rhs = try transCreateNodeEnumLiteral(c, "Int"),
5678 };5737 };
5679 if_2.condition = &cmp_2.base;5738 if_2.condition = &cmp_2.base;
5680 const cmp_4 = try c.a().create(ast.Node.InfixOp);5739 const cmp_4 = try c.arena.create(ast.Node.InfixOp);
5681 cmp_4.* = .{5740 cmp_4.* = .{
5682 .op_token = try appendToken(c, .Keyword_and, "and"),5741 .op_token = try appendToken(c, .Keyword_and, "and"),
5683 .lhs = &cmp_2.base,5742 .lhs = &cmp_2.base,
...@@ -5687,7 +5746,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5687,7 +5746,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5687 const type_info_3 = try transCreateNodeBuiltinFnCall(c, "@typeInfo");5746 const type_info_3 = try transCreateNodeBuiltinFnCall(c, "@typeInfo");
5688 try type_info_3.params.push(inner_node);5747 try type_info_3.params.push(inner_node);
5689 type_info_3.rparen_token = try appendToken(c, .LParen, ")");5748 type_info_3.rparen_token = try appendToken(c, .LParen, ")");
5690 const cmp_3 = try c.a().create(ast.Node.InfixOp);5749 const cmp_3 = try c.arena.create(ast.Node.InfixOp);
5691 cmp_3.* = .{5750 cmp_3.* = .{
5692 .op_token = try appendToken(c, .EqualEqual, "=="),5751 .op_token = try appendToken(c, .EqualEqual, "=="),
5693 .lhs = &type_info_3.base,5752 .lhs = &type_info_3.base,
...@@ -5714,7 +5773,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5714,7 +5773,7 @@ fn parseCPrimaryExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5714 as.rparen_token = try appendToken(c, .RParen, ")");5773 as.rparen_token = try appendToken(c, .RParen, ")");
5715 else_2.body = &as.base;5774 else_2.body = &as.base;
57165775
5717 const group_node = try c.a().create(ast.Node.GroupedExpression);5776 const group_node = try c.arena.create(ast.Node.GroupedExpression);
5718 group_node.* = .{5777 group_node.* = .{
5719 .lparen = lparen,5778 .lparen = lparen,
5720 .expr = &if_1.base,5779 .expr = &if_1.base,
...@@ -5740,7 +5799,7 @@ fn macroBoolToInt(c: *Context, node: *ast.Node) !*ast.Node {...@@ -5740,7 +5799,7 @@ fn macroBoolToInt(c: *Context, node: *ast.Node) !*ast.Node {
5740 if (!isBoolRes(node)) {5799 if (!isBoolRes(node)) {
5741 if (node.id != .InfixOp) return node;5800 if (node.id != .InfixOp) return node;
57425801
5743 const group_node = try c.a().create(ast.Node.GroupedExpression);5802 const group_node = try c.arena.create(ast.Node.GroupedExpression);
5744 group_node.* = .{5803 group_node.* = .{
5745 .lparen = try appendToken(c, .LParen, "("),5804 .lparen = try appendToken(c, .LParen, "("),
5746 .expr = node,5805 .expr = node,
...@@ -5759,7 +5818,7 @@ fn macroIntToBool(c: *Context, node: *ast.Node) !*ast.Node {...@@ -5759,7 +5818,7 @@ fn macroIntToBool(c: *Context, node: *ast.Node) !*ast.Node {
5759 if (isBoolRes(node)) {5818 if (isBoolRes(node)) {
5760 if (node.id != .InfixOp) return node;5819 if (node.id != .InfixOp) return node;
57615820
5762 const group_node = try c.a().create(ast.Node.GroupedExpression);5821 const group_node = try c.arena.create(ast.Node.GroupedExpression);
5763 group_node.* = .{5822 group_node.* = .{
5764 .lparen = try appendToken(c, .LParen, "("),5823 .lparen = try appendToken(c, .LParen, "("),
5765 .expr = node,5824 .expr = node,
...@@ -5770,14 +5829,14 @@ fn macroIntToBool(c: *Context, node: *ast.Node) !*ast.Node {...@@ -5770,14 +5829,14 @@ fn macroIntToBool(c: *Context, node: *ast.Node) !*ast.Node {
57705829
5771 const op_token = try appendToken(c, .BangEqual, "!=");5830 const op_token = try appendToken(c, .BangEqual, "!=");
5772 const zero = try transCreateNodeInt(c, 0);5831 const zero = try transCreateNodeInt(c, 0);
5773 const res = try c.a().create(ast.Node.InfixOp);5832 const res = try c.arena.create(ast.Node.InfixOp);
5774 res.* = .{5833 res.* = .{
5775 .op_token = op_token,5834 .op_token = op_token,
5776 .lhs = node,5835 .lhs = node,
5777 .op = .BangEqual,5836 .op = .BangEqual,
5778 .rhs = zero,5837 .rhs = zero,
5779 };5838 };
5780 const group_node = try c.a().create(ast.Node.GroupedExpression);5839 const group_node = try c.arena.create(ast.Node.GroupedExpression);
5781 group_node.* = .{5840 group_node.* = .{
5782 .lparen = try appendToken(c, .LParen, "("),5841 .lparen = try appendToken(c, .LParen, "("),
5783 .expr = &res.base,5842 .expr = &res.base,
...@@ -5989,7 +6048,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -5989,7 +6048,7 @@ fn parseCSuffixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
5989 const cast_fn = if (bool_op) macroIntToBool else macroBoolToInt;6048 const cast_fn = if (bool_op) macroIntToBool else macroBoolToInt;
5990 const lhs_node = try cast_fn(c, node);6049 const lhs_node = try cast_fn(c, node);
5991 const rhs_node = try parseCPrefixOpExpr(c, it, source, source_loc, scope);6050 const rhs_node = try parseCPrefixOpExpr(c, it, source, source_loc, scope);
5992 const op_node = try c.a().create(ast.Node.InfixOp);6051 const op_node = try c.arena.create(ast.Node.InfixOp);
5993 op_node.* = .{6052 op_node.* = .{
5994 .op_token = op_token,6053 .op_token = op_token,
5995 .lhs = lhs_node,6054 .lhs = lhs_node,
...@@ -6037,7 +6096,7 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,...@@ -6037,7 +6096,7 @@ fn parseCPrefixOpExpr(c: *Context, it: *CTokenList.Iterator, source: []const u8,
6037}6096}
60386097
6039fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 {6098fn tokenSlice(c: *Context, token: ast.TokenIndex) []u8 {
6040 const tok = c.tree.tokens.at(token);6099 const tok = c.tokens.items[token];
6041 const slice = c.source_buffer.span()[tok.start..tok.end];6100 const slice = c.source_buffer.span()[tok.start..tok.end];
6042 return if (mem.startsWith(u8, slice, "@\""))6101 return if (mem.startsWith(u8, slice, "@\""))
6043 slice[2 .. slice.len - 1]6102 slice[2 .. slice.len - 1]
...@@ -6060,9 +6119,10 @@ fn getContainer(c: *Context, node: *ast.Node) ?*ast.Node {...@@ -6060,9 +6119,10 @@ fn getContainer(c: *Context, node: *ast.Node) ?*ast.Node {
6060 return null;6119 return null;
6061 if (getContainerTypeOf(c, infix.lhs)) |ty_node| {6120 if (getContainerTypeOf(c, infix.lhs)) |ty_node| {
6062 if (ty_node.cast(ast.Node.ContainerDecl)) |container| {6121 if (ty_node.cast(ast.Node.ContainerDecl)) |container| {
6063 var it = container.fields_and_decls.iterator(0);6122 var it = container.fields_and_decls.first;
6064 while (it.next()) |field_ref| {6123 while (it) |field_ref_node| : (it = field_ref_node.next) {
6065 const field = field_ref.*.cast(ast.Node.ContainerField).?;6124 const field_ref = field_ref_node.data;
6125 const field = field_ref.cast(ast.Node.ContainerField).?;
6066 const ident = infix.rhs.cast(ast.Node.Identifier).?;6126 const ident = infix.rhs.cast(ast.Node.Identifier).?;
6067 if (mem.eql(u8, tokenSlice(c, field.name_token), tokenSlice(c, ident.token))) {6127 if (mem.eql(u8, tokenSlice(c, field.name_token), tokenSlice(c, ident.token))) {
6068 return getContainer(c, field.type_expr.?);6128 return getContainer(c, field.type_expr.?);
...@@ -6087,9 +6147,10 @@ fn getContainerTypeOf(c: *Context, ref: *ast.Node) ?*ast.Node {...@@ -6087,9 +6147,10 @@ fn getContainerTypeOf(c: *Context, ref: *ast.Node) ?*ast.Node {
6087 return null;6147 return null;
6088 if (getContainerTypeOf(c, infix.lhs)) |ty_node| {6148 if (getContainerTypeOf(c, infix.lhs)) |ty_node| {
6089 if (ty_node.cast(ast.Node.ContainerDecl)) |container| {6149 if (ty_node.cast(ast.Node.ContainerDecl)) |container| {
6090 var it = container.fields_and_decls.iterator(0);6150 var it = container.fields_and_decls.first;
6091 while (it.next()) |field_ref| {6151 while (it) |field_ref_node| : (it = field_ref_node.next) {
6092 const field = field_ref.*.cast(ast.Node.ContainerField).?;6152 const field_ref = field_ref_node.data;
6153 const field = field_ref.cast(ast.Node.ContainerField).?;
6093 const ident = infix.rhs.cast(ast.Node.Identifier).?;6154 const ident = infix.rhs.cast(ast.Node.Identifier).?;
6094 if (mem.eql(u8, tokenSlice(c, field.name_token), tokenSlice(c, ident.token))) {6155 if (mem.eql(u8, tokenSlice(c, field.name_token), tokenSlice(c, ident.token))) {
6095 return getContainer(c, field.type_expr.?);6156 return getContainer(c, field.type_expr.?);