authorgravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-19 23:59:00-04:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2020-04-19 23:59:00-04:00
logaf4ccf34c1aac9c9914aa9cd5f3c857b7b90615d
tree429915d307f426bae5a1ee6cda30914e24ddad35
parentf7786d0ca822baee75b2d9fd2f3ef4f24421b2a9

ir: render keyword parameters


1 files changed, 43 insertions(+), 6 deletions(-)

src-self-hosted/ir.zig+43-6
......@@ -218,24 +218,54 @@ pub const Tree = struct {
218218 }
219219 const Positionals = @TypeOf(inst.positionals);
220220 try stream.writeAll("= " ++ @tagName(inst_tag) ++ "(");
221 inline for (@typeInfo(Positionals).Struct.fields) |arg_field, i| {
221 const pos_fields = @typeInfo(Positionals).Struct.fields;
222 inline for (pos_fields) |arg_field, i| {
222223 if (i != 0) {
223224 try stream.writeAll(", ");
224225 }
225226 try self.writeParamToStream(stream, @field(inst.positionals, arg_field.name), inst_table);
226227 }
228
229 comptime var need_comma = pos_fields.len != 0;
230 const KW_Args = @TypeOf(inst.kw_args);
231 inline for (@typeInfo(KW_Args).Struct.fields) |arg_field, i| {
232 if (need_comma) {
233 try stream.writeAll(",\n ");
234 }
235 if (@typeInfo(arg_field.field_type) == .Optional) {
236 if (@field(inst.kw_args, arg_field.name)) |non_optional| {
237 try stream.print("{}=", .{arg_field.name});
238 try self.writeParamToStream(stream, non_optional, inst_table);
239 need_comma = true;
240 }
241 } else {
242 try stream.print("{}=", .{arg_field.name});
243 try self.writeParamToStream(stream, @field(inst.kw_args, arg_field.name), inst_table);
244 need_comma = true;
245 }
246 }
247
227248 try stream.writeByte(')');
228249 }
229250
230 pub fn writeParamToStream(self: Tree, stream: var, param: var, inst_table: *const InstPtrTable) !void {
251 fn writeParamToStream(self: Tree, stream: var, param: var, inst_table: *const InstPtrTable) !void {
252 if (@typeInfo(@TypeOf(param)) == .Enum) {
253 return stream.writeAll(@tagName(param));
254 }
231255 switch (@TypeOf(param)) {
232256 Value => {
233257 try stream.print("{}", .{param});
234258 },
235 *Inst => {
236 const info = inst_table.getValue(param).?;
237 const prefix = if (info.fn_body == null) "@" else "%";
238 try stream.print("{}{}", .{ prefix, info.index });
259 *Inst => return self.writeInstParamToStream(stream, param, inst_table),
260 []*Inst => {
261 try stream.writeByte('[');
262 for (param) |inst, i| {
263 if (i != 0) {
264 try stream.writeAll(", ");
265 }
266 try self.writeInstParamToStream(stream, inst, inst_table);
267 }
268 try stream.writeByte(']');
239269 },
240270 Inst.Fn.Body => {
241271 try stream.writeAll("{\n");
......@@ -246,9 +276,16 @@ pub const Tree = struct {
246276 }
247277 try stream.writeByte('}');
248278 },
279 bool => return stream.writeByte("01"[@boolToInt(param)]),
249280 else => |T| @compileError("unimplemented: rendering parameter of type " ++ @typeName(T)),
250281 }
251282 }
283
284 fn writeInstParamToStream(self: Tree, stream: var, inst: *Inst, inst_table: *const InstPtrTable) !void {
285 const info = inst_table.getValue(inst).?;
286 const prefix = if (info.fn_body == null) "@" else "%";
287 try stream.print("{}{}", .{ prefix, info.index });
288 }
252289};
253290
254291const ParseContext = struct {