ufcs
This commit is contained in:
@@ -4087,6 +4087,28 @@ pub const CodeGen = struct {
|
||||
}
|
||||
}
|
||||
|
||||
// UFCS: obj.method(args...) → method(obj, args...)
|
||||
if (call_node.callee.data == .field_access) {
|
||||
const fa = call_node.callee.data.field_access;
|
||||
const method_name = fa.field;
|
||||
// Check if a free function with this name exists
|
||||
const method_z = self.allocator.dupeZ(u8, method_name) catch method_name;
|
||||
if (self.generic_templates.contains(method_name) or
|
||||
c.LLVMGetNamedFunction(self.module, method_z.ptr) != null)
|
||||
{
|
||||
// Build new args: [obj, original_args...]
|
||||
var ufcs_args = try self.allocator.alloc(*Node, call_node.args.len + 1);
|
||||
ufcs_args[0] = fa.object;
|
||||
for (call_node.args, 0..) |arg, i| {
|
||||
ufcs_args[i + 1] = arg;
|
||||
}
|
||||
return self.genCallByName(method_name, .{
|
||||
.callee = call_node.callee,
|
||||
.args = ufcs_args,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Resolve callee — must be an identifier
|
||||
if (call_node.callee.data != .identifier) return self.emitError("callee must be an identifier");
|
||||
const callee_name = call_node.callee.data.identifier.name;
|
||||
|
||||
Reference in New Issue
Block a user