From cea79554c2edceff30fe4815a3f784544f8557c3 Mon Sep 17 00:00:00 2001 From: Li Jin Date: Fri, 30 May 2025 17:31:03 +0800 Subject: Added a new test. --- spec/inputs/props.yue | 61 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 spec/inputs/props.yue (limited to 'spec/inputs/props.yue') diff --git a/spec/inputs/props.yue b/spec/inputs/props.yue new file mode 100644 index 0000000..bbb7aae --- /dev/null +++ b/spec/inputs/props.yue @@ -0,0 +1,61 @@ +class Props + __index: (name): nil => + cls = @.<> + if item := cls.__getter?[name] -- access properties + return item @ + elseif item := rawget cls, name -- access member functions + return item + else + c = cls + while c := c.<> -- recursive to access base classes + if item := c.__getter?[name] + cls.__getter ??= {} + cls.__getter[name] = item -- cache base properties to class + return item @ + elseif item := rawget c, name + rawset cls, name, item -- cache base member to class + return item + + __newindex: (name, value) => + cls = @.<> + if item := cls.__setter?[name] -- access properties + item @, value + else + c = cls + while c := c.<> -- recursive to access base classes + if item := c.__setter?[name] + cls.__setter ??= {} + cls.__setter[name] = item -- cache base property to class + item @, value + return + rawset @, name, value -- assign field to self + + assignReadOnly = -> error "assigning a readonly property" + + prop: (name, props) => + { + :get + :set = assignReadOnly + } = props + if getter := rawget @__base, "__getter" + getter[name] = get + else + rawset @__base, "__getter", [name]: get + if setter := rawget @__base, "__setter" + setter[name] = set + else + rawset @__base, "__setter", [name]: set + +class A extends Props + @prop 'x' + get: => @_x + 1000 + set: (v) => @_x = v + new: => + @_x = 0 + +class B extends A + @prop 'abc', get: => "hello" + +b = B! +b.x = 999 +print b.x, b.abc -- cgit v1.2.3-55-g6feb