aboutsummaryrefslogtreecommitdiff
path: root/spec
diff options
context:
space:
mode:
authorLi Jin <dragon-fly@qq.com>2023-08-07 09:57:27 +0800
committerLi Jin <dragon-fly@qq.com>2023-08-07 09:57:27 +0800
commitc9b70274787ed8a77e7b47c4628197f0c6c1ba30 (patch)
treefae88047d312962aebfd97a0183c2f9f19e2cc76 /spec
parentaff8e69bf589d2ee5f4a7b72b7e2f643d55b87fa (diff)
downloadyuescript-c9b70274787ed8a77e7b47c4628197f0c6c1ba30.tar.gz
yuescript-c9b70274787ed8a77e7b47c4628197f0c6c1ba30.tar.bz2
yuescript-c9b70274787ed8a77e7b47c4628197f0c6c1ba30.zip
fixing issue #143 and #144.
Diffstat (limited to 'spec')
-rw-r--r--spec/inputs/attrib.yue31
-rw-r--r--spec/outputs/5.1/attrib.lua238
-rw-r--r--spec/outputs/attrib.lua45
3 files changed, 290 insertions, 24 deletions
diff --git a/spec/inputs/attrib.yue b/spec/inputs/attrib.yue
index 500ef0f..fbff75a 100644
--- a/spec/inputs/attrib.yue
+++ b/spec/inputs/attrib.yue
@@ -1,3 +1,5 @@
1const a, b, c, d = 1, 2, 3, 4
2
1do 3do
2 close a, b = setmetatable {},__close:=> print "closed" 4 close a, b = setmetatable {},__close:=> print "closed"
3 const c, d = 123, 'abc' 5 const c, d = 123, 'abc'
@@ -6,6 +8,12 @@ do
6 const c, d 8 const c, d
7 9
8do 10do
11 const a, {b, c}, {d} = f!, f1!
12
13do
14 const a, {b, c}, {d} = f!
15
16do
9 close v = if flag 17 close v = if flag
10 func! 18 func!
11 else 19 else
@@ -22,27 +30,24 @@ do
22 close d = 30 close d =
23 :value if a ?? b 31 :value if a ?? b
24 32
25macro defer = (item)-> "close _ = #{item}"
26macro defer_f = (func)-> "close _ = setmetatable {},__close:#{func}"
27
28do 33do
29 $defer with io.open "file.txt" 34 close _ = with io.open "file.txt"
30 \write "Hello" 35 \write "Hello"
31 36
32 $defer setmetatable {},__close:=> print "second" 37 close _ = <close>: -> print "second"
33 38
34 $defer_f -> print "first" 39 close _ = <close>: -> print "first"
35 40
36_defers = setmetatable {},__close:=> 41_defers = setmetatable {}, __close: =>
37 @[#@]! 42 @[#@]!
38 @[#@] = nil 43 @[#@] = nil
39 44
40macro defer_i = (item)-> " 45def = (item)->
41_defers[#_defers + 1] = #{item} 46 _defers[#_defers + 1] = item
42close _ = _defers" 47 _defers
43 48
44do 49do
45 $defer_i -> print 3 50 close _ = def -> print 3
46 $defer_i -> print 2 51 close _ = def -> print 2
47 $defer_i -> print 1 52 close _ = def -> print 1
48 53
diff --git a/spec/outputs/5.1/attrib.lua b/spec/outputs/5.1/attrib.lua
new file mode 100644
index 0000000..f782b45
--- /dev/null
+++ b/spec/outputs/5.1/attrib.lua
@@ -0,0 +1,238 @@
1local a, b, c, d = 1, 2, 3, 4
2do
3 local a, b = setmetatable({ }, {
4 __close = function(self)
5 return print("closed")
6 end
7 })
8 local _close_0 = assert(getmetatable(a).__close)
9 local _close_1 = assert(getmetatable(b).__close);
10 (function(_arg_0, ...)
11 local _ok_0 = _arg_0
12 _close_1(b)
13 _close_0(a)
14 if _ok_0 then
15 return ...
16 else
17 return error(...)
18 end
19 end)(pcall(function(...)
20 local c, d = 123, 'abc'
21 close(a, b)
22 return const(c, d)
23 end, ...))
24end
25do
26 local a = f()
27 local b, c, d
28 do
29 local _obj_0, _obj_1 = f1()
30 b, c = _obj_0[1], _obj_0[2]
31 d = _obj_1[1]
32 end
33end
34do
35 local a, b, c, d
36 do
37 local _obj_0, _obj_1, _obj_2 = f()
38 a = _obj_0
39 b, c = _obj_1[1], _obj_1[2]
40 d = _obj_2[1]
41 end
42end
43do
44 local v = (function()
45 if flag then
46 return func()
47 else
48 return setmetatable({ }, {
49 __close = function(self) end
50 })
51 end
52 end)()
53 local _close_0 = assert(getmetatable(v).__close);
54 (function(_arg_0, ...)
55 local _ok_0 = _arg_0
56 _close_0(v)
57 if _ok_0 then
58 return ...
59 else
60 return error(...)
61 end
62 end)(pcall(function(...)
63 local f = (function()
64 local _with_0 = io.open("file.txt")
65 _with_0:write("Hello")
66 return _with_0
67 end)()
68 local _close_1 = assert(getmetatable(f).__close)
69 return (function(_arg_0, ...)
70 local _ok_0 = _arg_0
71 _close_1(f)
72 if _ok_0 then
73 return ...
74 else
75 return error(...)
76 end
77 end)(pcall(function(...) end, ...))
78 end, ...))
79end
80do
81 local a = (function()
82 if true then
83 return 1
84 end
85 end)()
86 local b = (function()
87 if not false then
88 if x then
89 return 1
90 end
91 end
92 end)()
93 local _close_0 = assert(getmetatable(b).__close);
94 (function(_arg_0, ...)
95 local _ok_0 = _arg_0
96 _close_0(b)
97 if _ok_0 then
98 return ...
99 else
100 return error(...)
101 end
102 end)(pcall(function(...)
103 local c = (function()
104 if true then
105 local _exp_0 = x
106 if "abc" == _exp_0 then
107 return 998
108 end
109 end
110 end)()
111 local d = (function()
112 if (function()
113 if a ~= nil then
114 return a
115 else
116 return b
117 end
118 end)() then
119 return {
120 value = value
121 }
122 end
123 end)()
124 local _close_1 = assert(getmetatable(d).__close)
125 return (function(_arg_0, ...)
126 local _ok_0 = _arg_0
127 _close_1(d)
128 if _ok_0 then
129 return ...
130 else
131 return error(...)
132 end
133 end)(pcall(function(...) end, ...))
134 end, ...))
135end
136do
137 local _ = (function()
138 local _with_0 = io.open("file.txt")
139 _with_0:write("Hello")
140 return _with_0
141 end)()
142 local _close_0 = assert(getmetatable(_).__close);
143 (function(_arg_0, ...)
144 local _ok_0 = _arg_0
145 _close_0(_)
146 if _ok_0 then
147 return ...
148 else
149 return error(...)
150 end
151 end)(pcall(function(...)
152 local _ = setmetatable({ }, {
153 __close = function()
154 return print("second")
155 end
156 })
157 local _close_1 = assert(getmetatable(_).__close)
158 return (function(_arg_0, ...)
159 local _ok_0 = _arg_0
160 _close_1(_)
161 if _ok_0 then
162 return ...
163 else
164 return error(...)
165 end
166 end)(pcall(function(...)
167 local _ = setmetatable({ }, {
168 __close = function()
169 return print("first")
170 end
171 })
172 local _close_2 = assert(getmetatable(_).__close)
173 return (function(_arg_0, ...)
174 local _ok_0 = _arg_0
175 _close_2(_)
176 if _ok_0 then
177 return ...
178 else
179 return error(...)
180 end
181 end)(pcall(function(...) end, ...))
182 end, ...))
183 end, ...))
184end
185local _defers = setmetatable({ }, {
186 __close = function(self)
187 self[#self]()
188 self[#self] = nil
189 end
190})
191local def
192def = function(item)
193 _defers[#_defers + 1] = item
194 return _defers
195end
196do
197 local _ = def(function()
198 return print(3)
199 end)
200 local _close_0 = assert(getmetatable(_).__close)
201 return (function(_arg_0, ...)
202 local _ok_0 = _arg_0
203 _close_0(_)
204 if _ok_0 then
205 return ...
206 else
207 return error(...)
208 end
209 end)(pcall(function(...)
210 local _ = def(function()
211 return print(2)
212 end)
213 local _close_1 = assert(getmetatable(_).__close)
214 return (function(_arg_0, ...)
215 local _ok_0 = _arg_0
216 _close_1(_)
217 if _ok_0 then
218 return ...
219 else
220 return error(...)
221 end
222 end)(pcall(function(...)
223 local _ = def(function()
224 return print(1)
225 end)
226 local _close_2 = assert(getmetatable(_).__close)
227 return (function(_arg_0, ...)
228 local _ok_0 = _arg_0
229 _close_2(_)
230 if _ok_0 then
231 return ...
232 else
233 return error(...)
234 end
235 end)(pcall(function(...) end, ...))
236 end, ...))
237 end, ...))
238end
diff --git a/spec/outputs/attrib.lua b/spec/outputs/attrib.lua
index aaff747..919b7e0 100644
--- a/spec/outputs/attrib.lua
+++ b/spec/outputs/attrib.lua
@@ -1,14 +1,35 @@
1local a <const>, b <const>, c <const>, d <const> = 1, 2, 3, 4
1do 2do
2 local a <close>, b <close> = setmetatable({ }, { 3 local a, b = setmetatable({ }, {
3 __close = function(self) 4 __close = function(self)
4 return print("closed") 5 return print("closed")
5 end 6 end
6 }) 7 })
8 local _close_0 <close> = a
9 local _close_1 <close> = b
7 local c <const>, d <const> = 123, 'abc' 10 local c <const>, d <const> = 123, 'abc'
8 close(a, b) 11 close(a, b)
9 const(c, d) 12 const(c, d)
10end 13end
11do 14do
15 local a <const> = f()
16 local b, c, d
17 do
18 local _obj_0, _obj_1 = f1()
19 b, c = _obj_0[1], _obj_0[2]
20 d = _obj_1[1]
21 end
22end
23do
24 local a, b, c, d
25 do
26 local _obj_0, _obj_1, _obj_2 = f()
27 a = _obj_0
28 b, c = _obj_1[1], _obj_1[2]
29 d = _obj_2[1]
30 end
31end
32do
12 local v <close> = (function() 33 local v <close> = (function()
13 if flag then 34 if flag then
14 return func() 35 return func()
@@ -66,7 +87,7 @@ do
66 return _with_0 87 return _with_0
67 end)() 88 end)()
68 local _ <close> = setmetatable({ }, { 89 local _ <close> = setmetatable({ }, {
69 __close = function(self) 90 __close = function()
70 return print("second") 91 return print("second")
71 end 92 end
72 }) 93 })
@@ -82,17 +103,19 @@ local _defers = setmetatable({ }, {
82 self[#self] = nil 103 self[#self] = nil
83 end 104 end
84}) 105})
106local def
107def = function(item)
108 _defers[#_defers + 1] = item
109 return _defers
110end
85do 111do
86 _defers[#_defers + 1] = function() 112 local _ <close> = def(function()
87 return print(3) 113 return print(3)
88 end 114 end)
89 local _ <close> = _defers 115 local _ <close> = def(function()
90 _defers[#_defers + 1] = function()
91 return print(2) 116 return print(2)
92 end 117 end)
93 local _ <close> = _defers 118 local _ <close> = def(function()
94 _defers[#_defers + 1] = function()
95 return print(1) 119 return print(1)
96 end 120 end)
97 local _ <close> = _defers
98end 121end