feature. See also
. The project being documented here (as the example) is the Zig library itself.
ast.renderBuiltinCall
fn renderBuiltinCall(c: *Context, builtin: []const u8, args: []const Node) !NodeIndex
File
Code
fn renderBuiltinCall(c: *Context, builtin: []const u8, args: []const Node) !NodeIndex {
const builtin_tok = try c.addToken(.builtin, builtin);
_ = try c.addToken(.l_paren, "(");
var arg_1: ?NodeIndex = null;
var arg_2: ?NodeIndex = null;
var arg_3: ?NodeIndex = null;
var arg_4: ?NodeIndex = null;
switch (args.len) {
0 => {},
1 => {
arg_1 = try renderNode(c, args[0]);
},
2 => {
arg_1 = try renderNode(c, args[0]);
_ = try c.addToken(.comma, ",");
arg_2 = try renderNode(c, args[1]);
},
4 => {
arg_1 = try renderNode(c, args[0]);
_ = try c.addToken(.comma, ",");
arg_2 = try renderNode(c, args[1]);
_ = try c.addToken(.comma, ",");
arg_3 = try renderNode(c, args[2]);
_ = try c.addToken(.comma, ",");
arg_4 = try renderNode(c, args[3]);
},
else => unreachable,
}
_ = try c.addToken(.r_paren, ")");
if (args.len <= 2) {
return c.addNode(.{
.tag = .builtin_call_two,
.main_token = builtin_tok,
.data = .{ .opt_node_and_opt_node = .{
.fromOptional(arg_1), .fromOptional(arg_2),
} },
});
} else {
std.debug.assert(args.len == 4);
const params = try c.listToSpan(&.{ arg_1.?, arg_2.?, arg_3.?, arg_4.? });
return c.addNode(.{
.tag = .builtin_call,
.main_token = builtin_tok,
.data = .{ .extra_range = .{
.start = params.start,
.end = params.end,
} },
});
}
}