This commit is contained in:
agra
2026-02-11 02:22:00 +02:00
parent 89fc6427c4
commit 7bb4fe0c5f
7 changed files with 251 additions and 14 deletions

View File

@@ -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;