aboutsummaryrefslogtreecommitdiff
path: root/spec/outputs/props.lua
blob: 2c282e0b3517ac58b9150634c3a67bb9359a2e00 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
local Props
do
	local _class_0
	local assignReadOnly
	local _base_0 = {
		__index = function(self, name)
			local cls = getmetatable(self)
			do
				local item
				do
					local _obj_0 = cls.__getter
					if _obj_0 ~= nil then
						item = _obj_0[name]
					end
				end
				if item then
					return item(self)
				else
					item = rawget(cls, name)
					if item then
						return item
					else
						local c = cls
						repeat
							c = getmetatable(c)
							if c then
								local _obj_0 = c.__getter
								if _obj_0 ~= nil then
									item = _obj_0[name]
								end
								if item then
									if cls.__getter == nil then
										cls.__getter = { }
									end
									cls.__getter[name] = item
									return item(self)
								else
									item = rawget(c, name)
									if item then
										rawset(cls, name, item)
										return item
									end
								end
							else
								break
							end
						until false
					end
				end
			end
			return nil
		end,
		__newindex = function(self, name, value)
			local cls = getmetatable(self)
			local item
			local _obj_0 = cls.__setter
			if _obj_0 ~= nil then
				item = _obj_0[name]
			end
			if item then
				return item(self, value)
			else
				local c = cls
				repeat
					c = getmetatable(c)
					if c then
						local _obj_1 = c.__setter
						if _obj_1 ~= nil then
							item = _obj_1[name]
						end
						if item then
							if cls.__setter == nil then
								cls.__setter = { }
							end
							cls.__setter[name] = item
							item(self, value)
							return
						end
					else
						break
					end
				until false
				return rawset(self, name, value)
			end
		end,
		prop = function(self, name, props)
			local get, set = props.get, props.set
			if set == nil then
				set = assignReadOnly
			end
			do
				local getter = rawget(self.__base, "__getter")
				if getter then
					getter[name] = get
				else
					rawset(self.__base, "__getter", {
						[name] = get
					})
				end
			end
			local setter = rawget(self.__base, "__setter")
			if setter then
				setter[name] = set
			else
				return rawset(self.__base, "__setter", {
					[name] = set
				})
			end
		end
	}
	if _base_0.__index == nil then
		_base_0.__index = _base_0
	end
	_class_0 = setmetatable({
		__init = function() end,
		__base = _base_0,
		__name = "Props"
	}, {
		__index = _base_0,
		__call = function(cls, ...)
			local _self_0 = setmetatable({ }, _base_0)
			cls.__init(_self_0, ...)
			return _self_0
		end
	})
	_base_0.__class = _class_0
	local self = _class_0;
	assignReadOnly = function()
		return error("assigning a readonly property")
	end
	Props = _class_0
end
local A
do
	local _class_0
	local _parent_0 = Props
	local _base_0 = { }
	for _key_0, _val_0 in pairs(_parent_0.__base) do
		if _base_0[_key_0] == nil and _key_0:match("^__") and not (_key_0 == "__index" and _val_0 == _parent_0.__base) then
			_base_0[_key_0] = _val_0
		end
	end
	if _base_0.__index == nil then
		_base_0.__index = _base_0
	end
	setmetatable(_base_0, _parent_0.__base)
	_class_0 = setmetatable({
		__init = function(self)
			self._x = 0
		end,
		__base = _base_0,
		__name = "A",
		__parent = _parent_0
	}, {
		__index = function(cls, name)
			local val = rawget(_base_0, name)
			if val == nil then
				local parent = rawget(cls, "__parent")
				if parent then
					return parent[name]
				end
			else
				return val
			end
		end,
		__call = function(cls, ...)
			local _self_0 = setmetatable({ }, _base_0)
			cls.__init(_self_0, ...)
			return _self_0
		end
	})
	_base_0.__class = _class_0
	local self = _class_0;
	self:prop('x', {
		get = function(self)
			return self._x + 1000
		end,
		set = function(self, v)
			self._x = v
		end
	})
	if _parent_0.__inherited then
		_parent_0.__inherited(_parent_0, _class_0)
	end
	A = _class_0
end
local B
do
	local _class_0
	local _parent_0 = A
	local _base_0 = { }
	for _key_0, _val_0 in pairs(_parent_0.__base) do
		if _base_0[_key_0] == nil and _key_0:match("^__") and not (_key_0 == "__index" and _val_0 == _parent_0.__base) then
			_base_0[_key_0] = _val_0
		end
	end
	if _base_0.__index == nil then
		_base_0.__index = _base_0
	end
	setmetatable(_base_0, _parent_0.__base)
	_class_0 = setmetatable({
		__init = function(self, ...)
			return _class_0.__parent.__init(self, ...)
		end,
		__base = _base_0,
		__name = "B",
		__parent = _parent_0
	}, {
		__index = function(cls, name)
			local val = rawget(_base_0, name)
			if val == nil then
				local parent = rawget(cls, "__parent")
				if parent then
					return parent[name]
				end
			else
				return val
			end
		end,
		__call = function(cls, ...)
			local _self_0 = setmetatable({ }, _base_0)
			cls.__init(_self_0, ...)
			return _self_0
		end
	})
	_base_0.__class = _class_0
	local self = _class_0;
	self:prop('abc', {
		get = function(self)
			return "hello"
		end
	})
	if _parent_0.__inherited then
		_parent_0.__inherited(_parent_0, _class_0)
	end
	B = _class_0
end
local b = B()
b.x = 999
return print(b.x, b.abc)