feat: #get property accessors (no-paren method-as-field)
A method declared `name :: (self: *T) -> R #get => expr;` is invoked via no-paren field syntax (`obj.name`) instead of `obj.name()`. It is an ordinary method (registered `Type.method`, flagged is_get); field-access lowering and inference dispatch to it when no real field of that name exists, by synthesizing a no-arg `obj.name()` call routed through the normal call path (so receiver address-of and generic binding are reused). - Lexer/token: `#get`. Parser: parsed after the return type in parseFnDecl; hasFnBodyAfterArrow treats it as a body marker so struct-body methods parse. - Resolution: getAccessorFor handles a generic-struct instance and a plain struct. A REAL field of the same name wins (a getter never shadows stored data). An explicit postfix-deref receiver (`p.*.getter`) dispatches on the inner pointer so it takes the working auto-deref path. - Works on plain + generic structs (incl. getters returning the type param), in expressions/conditions/args/loop-bounds, chained, and via a pointer receiver. Examples: types/0196 (basic) + types/0197 (stress). Known narrow limitations (clean errors / workarounds, not silent): a getter RESULT used directly as a method/getter receiver (`o.gi.dbl`) errors — bind it to a local first; a getter named `len`/`ptr` returning non-i64 mis-infers (the .len/.ptr builtin-field shortcut).
This commit is contained in:
@@ -2322,6 +2322,7 @@ pub fn declareFunction(self: *Lowering, fd: *const ast.FnDecl, name: []const u8)
|
||||
func.is_variadic = is_variadic;
|
||||
func.has_implicit_ctx = wants_ctx;
|
||||
func.is_naked = (fd.abi == .naked);
|
||||
func.is_get = fd.is_get;
|
||||
self.extern_name_map.put(name, c_name) catch {};
|
||||
self.fn_decl_fids.put(fd, fid) catch {};
|
||||
return;
|
||||
@@ -2336,6 +2337,7 @@ pub fn declareFunction(self: *Lowering, fd: *const ast.FnDecl, name: []const u8)
|
||||
func.is_variadic = is_variadic;
|
||||
func.has_implicit_ctx = wants_ctx;
|
||||
func.is_naked = (fd.abi == .naked);
|
||||
func.is_get = fd.is_get;
|
||||
if (weldedCompilerFn(self, fd, name)) func.compiler_welded = true;
|
||||
// A BODIED `abi(.compiler)` function is a user compiler-domain function (e.g. a
|
||||
// post-link callback): the VM runs its sx body, but it NEVER runs in the binary
|
||||
|
||||
Reference in New Issue
Block a user