rufus-lua-moon 0.3.2 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/vendor/leafo/moon/init.moon +1 -3
- data/vendor/leafo/moonscript/base.lua +1 -3
- data/vendor/leafo/moonscript/cmd/coverage.lua +2 -1
- data/vendor/leafo/moonscript/cmd/lint.lua +9 -5
- data/vendor/leafo/moonscript/compile.lua +20 -12
- data/vendor/leafo/moonscript/compile/statement.lua +2 -3
- data/vendor/leafo/moonscript/compile/value.lua +16 -6
- data/vendor/leafo/moonscript/data.lua +2 -1
- data/vendor/leafo/moonscript/parse.lua +28 -21
- data/vendor/leafo/moonscript/parse/env.lua +3 -2
- data/vendor/leafo/moonscript/parse/util.lua +4 -22
- data/vendor/leafo/moonscript/transform.lua +2 -1632
- data/vendor/leafo/moonscript/transform/accumulator.lua +110 -0
- data/vendor/leafo/moonscript/transform/class.lua +486 -0
- data/vendor/leafo/moonscript/transform/comprehension.lua +54 -0
- data/vendor/leafo/moonscript/transform/destructure.lua +3 -2
- data/vendor/leafo/moonscript/transform/names.lua +4 -2
- data/vendor/leafo/moonscript/transform/statement.lua +741 -0
- data/vendor/leafo/moonscript/transform/statements.lua +115 -0
- data/vendor/leafo/moonscript/transform/transformer.lua +74 -0
- data/vendor/leafo/moonscript/transform/value.lua +265 -0
- data/vendor/leafo/moonscript/types.lua +16 -14
- data/vendor/leafo/moonscript/util.lua +0 -9
- data/vendor/leafo/moonscript/version.lua +1 -1
- metadata +8 -1
@@ -0,0 +1,54 @@
|
|
1
|
+
local is_value
|
2
|
+
is_value = require("moonscript.types").is_value
|
3
|
+
local construct_comprehension
|
4
|
+
construct_comprehension = function(inner, clauses)
|
5
|
+
local current_stms = inner
|
6
|
+
for i = #clauses, 1, -1 do
|
7
|
+
local clause = clauses[i]
|
8
|
+
local t = clause[1]
|
9
|
+
local _exp_0 = t
|
10
|
+
if "for" == _exp_0 then
|
11
|
+
local _, name, bounds
|
12
|
+
_, name, bounds = clause[1], clause[2], clause[3]
|
13
|
+
current_stms = {
|
14
|
+
"for",
|
15
|
+
name,
|
16
|
+
bounds,
|
17
|
+
current_stms
|
18
|
+
}
|
19
|
+
elseif "foreach" == _exp_0 then
|
20
|
+
local _, names, iter
|
21
|
+
_, names, iter = clause[1], clause[2], clause[3]
|
22
|
+
current_stms = {
|
23
|
+
"foreach",
|
24
|
+
names,
|
25
|
+
{
|
26
|
+
iter
|
27
|
+
},
|
28
|
+
current_stms
|
29
|
+
}
|
30
|
+
elseif "when" == _exp_0 then
|
31
|
+
local _, cond
|
32
|
+
_, cond = clause[1], clause[2]
|
33
|
+
current_stms = {
|
34
|
+
"if",
|
35
|
+
cond,
|
36
|
+
current_stms
|
37
|
+
}
|
38
|
+
else
|
39
|
+
current_stms = error("Unknown comprehension clause: " .. t)
|
40
|
+
end
|
41
|
+
current_stms = {
|
42
|
+
current_stms
|
43
|
+
}
|
44
|
+
end
|
45
|
+
return current_stms[1]
|
46
|
+
end
|
47
|
+
local comprehension_has_value
|
48
|
+
comprehension_has_value = function(comp)
|
49
|
+
return is_value(comp[2])
|
50
|
+
end
|
51
|
+
return {
|
52
|
+
construct_comprehension = construct_comprehension,
|
53
|
+
comprehension_has_value = comprehension_has_value
|
54
|
+
}
|
@@ -68,7 +68,7 @@ extract_assign_names = function(name, accum, prefix)
|
|
68
68
|
local s
|
69
69
|
if ntype(key) == "key_literal" then
|
70
70
|
local key_name = key[2]
|
71
|
-
if ntype(key_name) == "
|
71
|
+
if ntype(key_name) == "colon" then
|
72
72
|
s = key_name
|
73
73
|
else
|
74
74
|
s = {
|
@@ -228,5 +228,6 @@ end
|
|
228
228
|
return {
|
229
229
|
has_destructure = has_destructure,
|
230
230
|
split_assign = split_assign,
|
231
|
-
build_assign = build_assign
|
231
|
+
build_assign = build_assign,
|
232
|
+
extract_assign_names = extract_assign_names
|
232
233
|
}
|
@@ -4,13 +4,14 @@ local unpack
|
|
4
4
|
unpack = require("moonscript.util").unpack
|
5
5
|
local LocalName
|
6
6
|
do
|
7
|
+
local _class_0
|
7
8
|
local _base_0 = {
|
8
9
|
get_name = function(self)
|
9
10
|
return self.name
|
10
11
|
end
|
11
12
|
}
|
12
13
|
_base_0.__index = _base_0
|
13
|
-
|
14
|
+
_class_0 = setmetatable({
|
14
15
|
__init = function(self, name)
|
15
16
|
self.name = name
|
16
17
|
self[1] = "temp_name"
|
@@ -30,6 +31,7 @@ do
|
|
30
31
|
end
|
31
32
|
local NameProxy
|
32
33
|
do
|
34
|
+
local _class_0
|
33
35
|
local _base_0 = {
|
34
36
|
get_name = function(self, scope, dont_put)
|
35
37
|
if dont_put == nil then
|
@@ -81,7 +83,7 @@ do
|
|
81
83
|
end
|
82
84
|
}
|
83
85
|
_base_0.__index = _base_0
|
84
|
-
|
86
|
+
_class_0 = setmetatable({
|
85
87
|
__init = function(self, prefix)
|
86
88
|
self.prefix = prefix
|
87
89
|
self[1] = "temp_name"
|
@@ -0,0 +1,741 @@
|
|
1
|
+
local Transformer
|
2
|
+
Transformer = require("moonscript.transform.transformer").Transformer
|
3
|
+
local NameProxy
|
4
|
+
NameProxy = require("moonscript.transform.names").NameProxy
|
5
|
+
local Run, transform_last_stm, implicitly_return, last_stm
|
6
|
+
do
|
7
|
+
local _obj_0 = require("moonscript.transform.statements")
|
8
|
+
Run, transform_last_stm, implicitly_return, last_stm = _obj_0.Run, _obj_0.transform_last_stm, _obj_0.implicitly_return, _obj_0.last_stm
|
9
|
+
end
|
10
|
+
local types = require("moonscript.types")
|
11
|
+
local build, ntype, is_value, smart_node, value_is_singular, is_slice, NOOP
|
12
|
+
build, ntype, is_value, smart_node, value_is_singular, is_slice, NOOP = types.build, types.ntype, types.is_value, types.smart_node, types.value_is_singular, types.is_slice, types.NOOP
|
13
|
+
local insert
|
14
|
+
insert = table.insert
|
15
|
+
local destructure = require("moonscript.transform.destructure")
|
16
|
+
local construct_comprehension
|
17
|
+
construct_comprehension = require("moonscript.transform.comprehension").construct_comprehension
|
18
|
+
local unpack
|
19
|
+
unpack = require("moonscript.util").unpack
|
20
|
+
local with_continue_listener
|
21
|
+
with_continue_listener = function(body)
|
22
|
+
local continue_name = nil
|
23
|
+
return {
|
24
|
+
Run(function(self)
|
25
|
+
return self:listen("continue", function()
|
26
|
+
if not (continue_name) then
|
27
|
+
continue_name = NameProxy("continue")
|
28
|
+
self:put_name(continue_name)
|
29
|
+
end
|
30
|
+
return continue_name
|
31
|
+
end)
|
32
|
+
end),
|
33
|
+
build.group(body),
|
34
|
+
Run(function(self)
|
35
|
+
if not (continue_name) then
|
36
|
+
return
|
37
|
+
end
|
38
|
+
local last = last_stm(body)
|
39
|
+
local enclose_lines = types.terminating[last and ntype(last)]
|
40
|
+
self:put_name(continue_name, nil)
|
41
|
+
return self:splice(function(lines)
|
42
|
+
if enclose_lines then
|
43
|
+
lines = {
|
44
|
+
"do",
|
45
|
+
{
|
46
|
+
lines
|
47
|
+
}
|
48
|
+
}
|
49
|
+
end
|
50
|
+
return {
|
51
|
+
{
|
52
|
+
"assign",
|
53
|
+
{
|
54
|
+
continue_name
|
55
|
+
},
|
56
|
+
{
|
57
|
+
"false"
|
58
|
+
}
|
59
|
+
},
|
60
|
+
{
|
61
|
+
"repeat",
|
62
|
+
"true",
|
63
|
+
{
|
64
|
+
lines,
|
65
|
+
{
|
66
|
+
"assign",
|
67
|
+
{
|
68
|
+
continue_name
|
69
|
+
},
|
70
|
+
{
|
71
|
+
"true"
|
72
|
+
}
|
73
|
+
}
|
74
|
+
}
|
75
|
+
},
|
76
|
+
{
|
77
|
+
"if",
|
78
|
+
{
|
79
|
+
"not",
|
80
|
+
continue_name
|
81
|
+
},
|
82
|
+
{
|
83
|
+
{
|
84
|
+
"break"
|
85
|
+
}
|
86
|
+
}
|
87
|
+
}
|
88
|
+
}
|
89
|
+
end)
|
90
|
+
end)
|
91
|
+
}
|
92
|
+
end
|
93
|
+
local extract_declarations
|
94
|
+
extract_declarations = function(self, body, start, out)
|
95
|
+
if body == nil then
|
96
|
+
body = self.current_stms
|
97
|
+
end
|
98
|
+
if start == nil then
|
99
|
+
start = self.current_stm_i + 1
|
100
|
+
end
|
101
|
+
if out == nil then
|
102
|
+
out = { }
|
103
|
+
end
|
104
|
+
for i = start, #body do
|
105
|
+
local _continue_0 = false
|
106
|
+
repeat
|
107
|
+
local stm = body[i]
|
108
|
+
if stm == nil then
|
109
|
+
_continue_0 = true
|
110
|
+
break
|
111
|
+
end
|
112
|
+
stm = self.transform.statement(stm)
|
113
|
+
body[i] = stm
|
114
|
+
local _exp_0 = stm[1]
|
115
|
+
if "assign" == _exp_0 or "declare" == _exp_0 then
|
116
|
+
local _list_0 = stm[2]
|
117
|
+
for _index_0 = 1, #_list_0 do
|
118
|
+
local name = _list_0[_index_0]
|
119
|
+
if ntype(name) == "ref" then
|
120
|
+
insert(out, name)
|
121
|
+
elseif type(name) == "string" then
|
122
|
+
insert(out, name)
|
123
|
+
end
|
124
|
+
end
|
125
|
+
elseif "group" == _exp_0 then
|
126
|
+
extract_declarations(self, stm[2], 1, out)
|
127
|
+
end
|
128
|
+
_continue_0 = true
|
129
|
+
until true
|
130
|
+
if not _continue_0 then
|
131
|
+
break
|
132
|
+
end
|
133
|
+
end
|
134
|
+
return out
|
135
|
+
end
|
136
|
+
local expand_elseif_assign
|
137
|
+
expand_elseif_assign = function(ifstm)
|
138
|
+
for i = 4, #ifstm do
|
139
|
+
local case = ifstm[i]
|
140
|
+
if ntype(case) == "elseif" and ntype(case[2]) == "assign" then
|
141
|
+
local split = {
|
142
|
+
unpack(ifstm, 1, i - 1)
|
143
|
+
}
|
144
|
+
insert(split, {
|
145
|
+
"else",
|
146
|
+
{
|
147
|
+
{
|
148
|
+
"if",
|
149
|
+
case[2],
|
150
|
+
case[3],
|
151
|
+
unpack(ifstm, i + 1)
|
152
|
+
}
|
153
|
+
}
|
154
|
+
})
|
155
|
+
return split
|
156
|
+
end
|
157
|
+
end
|
158
|
+
return ifstm
|
159
|
+
end
|
160
|
+
return Transformer({
|
161
|
+
transform = function(self, tuple)
|
162
|
+
local _, node, fn
|
163
|
+
_, node, fn = tuple[1], tuple[2], tuple[3]
|
164
|
+
return fn(node)
|
165
|
+
end,
|
166
|
+
root_stms = function(self, body)
|
167
|
+
return transform_last_stm(body, implicitly_return(self))
|
168
|
+
end,
|
169
|
+
["return"] = function(self, node)
|
170
|
+
local ret_val = node[2]
|
171
|
+
local ret_val_type = ntype(ret_val)
|
172
|
+
if ret_val_type == "explist" and #ret_val == 2 then
|
173
|
+
ret_val = ret_val[2]
|
174
|
+
ret_val_type = ntype(ret_val)
|
175
|
+
end
|
176
|
+
if types.cascading[ret_val_type] then
|
177
|
+
return implicitly_return(self)(ret_val)
|
178
|
+
end
|
179
|
+
if ret_val_type == "chain" or ret_val_type == "comprehension" or ret_val_type == "tblcomprehension" then
|
180
|
+
local Value = require("moonscript.transform.value")
|
181
|
+
ret_val = Value:transform_once(self, ret_val)
|
182
|
+
if ntype(ret_val) == "block_exp" then
|
183
|
+
return build.group(transform_last_stm(ret_val[2], function(stm)
|
184
|
+
return {
|
185
|
+
"return",
|
186
|
+
stm
|
187
|
+
}
|
188
|
+
end))
|
189
|
+
end
|
190
|
+
end
|
191
|
+
node[2] = ret_val
|
192
|
+
return node
|
193
|
+
end,
|
194
|
+
declare_glob = function(self, node)
|
195
|
+
local names = extract_declarations(self)
|
196
|
+
if node[2] == "^" then
|
197
|
+
do
|
198
|
+
local _accum_0 = { }
|
199
|
+
local _len_0 = 1
|
200
|
+
for _index_0 = 1, #names do
|
201
|
+
local _continue_0 = false
|
202
|
+
repeat
|
203
|
+
local name = names[_index_0]
|
204
|
+
if not (name[2]:match("^%u")) then
|
205
|
+
_continue_0 = true
|
206
|
+
break
|
207
|
+
end
|
208
|
+
local _value_0 = name
|
209
|
+
_accum_0[_len_0] = _value_0
|
210
|
+
_len_0 = _len_0 + 1
|
211
|
+
_continue_0 = true
|
212
|
+
until true
|
213
|
+
if not _continue_0 then
|
214
|
+
break
|
215
|
+
end
|
216
|
+
end
|
217
|
+
names = _accum_0
|
218
|
+
end
|
219
|
+
end
|
220
|
+
return {
|
221
|
+
"declare",
|
222
|
+
names
|
223
|
+
}
|
224
|
+
end,
|
225
|
+
assign = function(self, node)
|
226
|
+
local names, values = unpack(node, 2)
|
227
|
+
local num_values = #values
|
228
|
+
local num_names = #values
|
229
|
+
if num_names == 1 and num_values == 1 then
|
230
|
+
local first_value = values[1]
|
231
|
+
local first_name = names[1]
|
232
|
+
local first_type = ntype(first_value)
|
233
|
+
if first_type == "chain" then
|
234
|
+
local Value = require("moonscript.transform.value")
|
235
|
+
first_value = Value:transform_once(self, first_value)
|
236
|
+
first_type = ntype(first_value)
|
237
|
+
end
|
238
|
+
local _exp_0 = ntype(first_value)
|
239
|
+
if "block_exp" == _exp_0 then
|
240
|
+
local block_body = first_value[2]
|
241
|
+
local idx = #block_body
|
242
|
+
block_body[idx] = build.assign_one(first_name, block_body[idx])
|
243
|
+
return build.group({
|
244
|
+
{
|
245
|
+
"declare",
|
246
|
+
{
|
247
|
+
first_name
|
248
|
+
}
|
249
|
+
},
|
250
|
+
{
|
251
|
+
"do",
|
252
|
+
block_body
|
253
|
+
}
|
254
|
+
})
|
255
|
+
elseif "comprehension" == _exp_0 or "tblcomprehension" == _exp_0 or "foreach" == _exp_0 or "for" == _exp_0 or "while" == _exp_0 then
|
256
|
+
local Value = require("moonscript.transform.value")
|
257
|
+
return build.assign_one(first_name, Value:transform_once(self, first_value))
|
258
|
+
else
|
259
|
+
values[1] = first_value
|
260
|
+
end
|
261
|
+
end
|
262
|
+
local transformed
|
263
|
+
if num_values == 1 then
|
264
|
+
local value = values[1]
|
265
|
+
local t = ntype(value)
|
266
|
+
if t == "decorated" then
|
267
|
+
value = self.transform.statement(value)
|
268
|
+
t = ntype(value)
|
269
|
+
end
|
270
|
+
if types.cascading[t] then
|
271
|
+
local ret
|
272
|
+
ret = function(stm)
|
273
|
+
if is_value(stm) then
|
274
|
+
return {
|
275
|
+
"assign",
|
276
|
+
names,
|
277
|
+
{
|
278
|
+
stm
|
279
|
+
}
|
280
|
+
}
|
281
|
+
else
|
282
|
+
return stm
|
283
|
+
end
|
284
|
+
end
|
285
|
+
transformed = build.group({
|
286
|
+
{
|
287
|
+
"declare",
|
288
|
+
names
|
289
|
+
},
|
290
|
+
self.transform.statement(value, ret, node)
|
291
|
+
})
|
292
|
+
end
|
293
|
+
end
|
294
|
+
node = transformed or node
|
295
|
+
if destructure.has_destructure(names) then
|
296
|
+
return destructure.split_assign(self, node)
|
297
|
+
end
|
298
|
+
return node
|
299
|
+
end,
|
300
|
+
continue = function(self, node)
|
301
|
+
local continue_name = self:send("continue")
|
302
|
+
if not (continue_name) then
|
303
|
+
error("continue must be inside of a loop")
|
304
|
+
end
|
305
|
+
return build.group({
|
306
|
+
build.assign_one(continue_name, "true"),
|
307
|
+
{
|
308
|
+
"break"
|
309
|
+
}
|
310
|
+
})
|
311
|
+
end,
|
312
|
+
export = function(self, node)
|
313
|
+
if #node > 2 then
|
314
|
+
if node[2] == "class" then
|
315
|
+
local cls = smart_node(node[3])
|
316
|
+
return build.group({
|
317
|
+
{
|
318
|
+
"export",
|
319
|
+
{
|
320
|
+
cls.name
|
321
|
+
}
|
322
|
+
},
|
323
|
+
cls
|
324
|
+
})
|
325
|
+
else
|
326
|
+
return build.group({
|
327
|
+
{
|
328
|
+
"export",
|
329
|
+
node[2]
|
330
|
+
},
|
331
|
+
build.assign({
|
332
|
+
names = node[2],
|
333
|
+
values = node[3]
|
334
|
+
})
|
335
|
+
})
|
336
|
+
end
|
337
|
+
else
|
338
|
+
return nil
|
339
|
+
end
|
340
|
+
end,
|
341
|
+
update = function(self, node)
|
342
|
+
local _, name, op, exp = unpack(node)
|
343
|
+
local op_final = op:match("^(.+)=$")
|
344
|
+
if not op_final then
|
345
|
+
error("Unknown op: " .. op)
|
346
|
+
end
|
347
|
+
if not (value_is_singular(exp)) then
|
348
|
+
exp = {
|
349
|
+
"parens",
|
350
|
+
exp
|
351
|
+
}
|
352
|
+
end
|
353
|
+
return build.assign_one(name, {
|
354
|
+
"exp",
|
355
|
+
name,
|
356
|
+
op_final,
|
357
|
+
exp
|
358
|
+
})
|
359
|
+
end,
|
360
|
+
import = function(self, node)
|
361
|
+
local _, names, source = unpack(node)
|
362
|
+
local table_values
|
363
|
+
do
|
364
|
+
local _accum_0 = { }
|
365
|
+
local _len_0 = 1
|
366
|
+
for _index_0 = 1, #names do
|
367
|
+
local name = names[_index_0]
|
368
|
+
local dest_name
|
369
|
+
if ntype(name) == "colon" then
|
370
|
+
dest_name = name[2]
|
371
|
+
else
|
372
|
+
dest_name = name
|
373
|
+
end
|
374
|
+
local _value_0 = {
|
375
|
+
{
|
376
|
+
"key_literal",
|
377
|
+
name
|
378
|
+
},
|
379
|
+
dest_name
|
380
|
+
}
|
381
|
+
_accum_0[_len_0] = _value_0
|
382
|
+
_len_0 = _len_0 + 1
|
383
|
+
end
|
384
|
+
table_values = _accum_0
|
385
|
+
end
|
386
|
+
local dest = {
|
387
|
+
"table",
|
388
|
+
table_values
|
389
|
+
}
|
390
|
+
return {
|
391
|
+
"assign",
|
392
|
+
{
|
393
|
+
dest
|
394
|
+
},
|
395
|
+
{
|
396
|
+
source
|
397
|
+
},
|
398
|
+
[-1] = node[-1]
|
399
|
+
}
|
400
|
+
end,
|
401
|
+
comprehension = function(self, node, action)
|
402
|
+
local _, exp, clauses = unpack(node)
|
403
|
+
action = action or function(exp)
|
404
|
+
return {
|
405
|
+
exp
|
406
|
+
}
|
407
|
+
end
|
408
|
+
return construct_comprehension(action(exp), clauses)
|
409
|
+
end,
|
410
|
+
["do"] = function(self, node, ret)
|
411
|
+
if ret then
|
412
|
+
node[2] = transform_last_stm(node[2], ret)
|
413
|
+
end
|
414
|
+
return node
|
415
|
+
end,
|
416
|
+
decorated = function(self, node)
|
417
|
+
local stm, dec = unpack(node, 2)
|
418
|
+
local wrapped
|
419
|
+
local _exp_0 = dec[1]
|
420
|
+
if "if" == _exp_0 then
|
421
|
+
local cond, fail = unpack(dec, 2)
|
422
|
+
if fail then
|
423
|
+
fail = {
|
424
|
+
"else",
|
425
|
+
{
|
426
|
+
fail
|
427
|
+
}
|
428
|
+
}
|
429
|
+
end
|
430
|
+
wrapped = {
|
431
|
+
"if",
|
432
|
+
cond,
|
433
|
+
{
|
434
|
+
stm
|
435
|
+
},
|
436
|
+
fail
|
437
|
+
}
|
438
|
+
elseif "unless" == _exp_0 then
|
439
|
+
wrapped = {
|
440
|
+
"unless",
|
441
|
+
dec[2],
|
442
|
+
{
|
443
|
+
stm
|
444
|
+
}
|
445
|
+
}
|
446
|
+
elseif "comprehension" == _exp_0 then
|
447
|
+
wrapped = {
|
448
|
+
"comprehension",
|
449
|
+
stm,
|
450
|
+
dec[2]
|
451
|
+
}
|
452
|
+
else
|
453
|
+
wrapped = error("Unknown decorator " .. dec[1])
|
454
|
+
end
|
455
|
+
if ntype(stm) == "assign" then
|
456
|
+
wrapped = build.group({
|
457
|
+
build.declare({
|
458
|
+
names = (function()
|
459
|
+
local _accum_0 = { }
|
460
|
+
local _len_0 = 1
|
461
|
+
local _list_0 = stm[2]
|
462
|
+
for _index_0 = 1, #_list_0 do
|
463
|
+
local name = _list_0[_index_0]
|
464
|
+
if ntype(name) == "ref" then
|
465
|
+
_accum_0[_len_0] = name
|
466
|
+
_len_0 = _len_0 + 1
|
467
|
+
end
|
468
|
+
end
|
469
|
+
return _accum_0
|
470
|
+
end)()
|
471
|
+
}),
|
472
|
+
wrapped
|
473
|
+
})
|
474
|
+
end
|
475
|
+
return wrapped
|
476
|
+
end,
|
477
|
+
unless = function(self, node)
|
478
|
+
return {
|
479
|
+
"if",
|
480
|
+
{
|
481
|
+
"not",
|
482
|
+
{
|
483
|
+
"parens",
|
484
|
+
node[2]
|
485
|
+
}
|
486
|
+
},
|
487
|
+
unpack(node, 3)
|
488
|
+
}
|
489
|
+
end,
|
490
|
+
["if"] = function(self, node, ret)
|
491
|
+
if ntype(node[2]) == "assign" then
|
492
|
+
local _, assign, body = unpack(node)
|
493
|
+
if destructure.has_destructure(assign[2]) then
|
494
|
+
local name = NameProxy("des")
|
495
|
+
body = {
|
496
|
+
destructure.build_assign(self, assign[2][1], name),
|
497
|
+
build.group(node[3])
|
498
|
+
}
|
499
|
+
return build["do"]({
|
500
|
+
build.assign_one(name, assign[3][1]),
|
501
|
+
{
|
502
|
+
"if",
|
503
|
+
name,
|
504
|
+
body,
|
505
|
+
unpack(node, 4)
|
506
|
+
}
|
507
|
+
})
|
508
|
+
else
|
509
|
+
local name = assign[2][1]
|
510
|
+
return build["do"]({
|
511
|
+
assign,
|
512
|
+
{
|
513
|
+
"if",
|
514
|
+
name,
|
515
|
+
unpack(node, 3)
|
516
|
+
}
|
517
|
+
})
|
518
|
+
end
|
519
|
+
end
|
520
|
+
node = expand_elseif_assign(node)
|
521
|
+
if ret then
|
522
|
+
smart_node(node)
|
523
|
+
node['then'] = transform_last_stm(node['then'], ret)
|
524
|
+
for i = 4, #node do
|
525
|
+
local case = node[i]
|
526
|
+
local body_idx = #node[i]
|
527
|
+
case[body_idx] = transform_last_stm(case[body_idx], ret)
|
528
|
+
end
|
529
|
+
end
|
530
|
+
return node
|
531
|
+
end,
|
532
|
+
with = function(self, node, ret)
|
533
|
+
local exp, block = unpack(node, 2)
|
534
|
+
local copy_scope = true
|
535
|
+
local scope_name, named_assign
|
536
|
+
do
|
537
|
+
local last = last_stm(block)
|
538
|
+
if last then
|
539
|
+
if types.terminating[ntype(last)] then
|
540
|
+
ret = false
|
541
|
+
end
|
542
|
+
end
|
543
|
+
end
|
544
|
+
if ntype(exp) == "assign" then
|
545
|
+
local names, values = unpack(exp, 2)
|
546
|
+
local first_name = names[1]
|
547
|
+
if ntype(first_name) == "ref" then
|
548
|
+
scope_name = first_name
|
549
|
+
named_assign = exp
|
550
|
+
exp = values[1]
|
551
|
+
copy_scope = false
|
552
|
+
else
|
553
|
+
scope_name = NameProxy("with")
|
554
|
+
exp = values[1]
|
555
|
+
values[1] = scope_name
|
556
|
+
named_assign = {
|
557
|
+
"assign",
|
558
|
+
names,
|
559
|
+
values
|
560
|
+
}
|
561
|
+
end
|
562
|
+
elseif self:is_local(exp) then
|
563
|
+
scope_name = exp
|
564
|
+
copy_scope = false
|
565
|
+
end
|
566
|
+
scope_name = scope_name or NameProxy("with")
|
567
|
+
local out = build["do"]({
|
568
|
+
copy_scope and build.assign_one(scope_name, exp) or NOOP,
|
569
|
+
named_assign or NOOP,
|
570
|
+
Run(function(self)
|
571
|
+
return self:set("scope_var", scope_name)
|
572
|
+
end),
|
573
|
+
unpack(block)
|
574
|
+
})
|
575
|
+
if ret then
|
576
|
+
table.insert(out[2], ret(scope_name))
|
577
|
+
end
|
578
|
+
return out
|
579
|
+
end,
|
580
|
+
foreach = function(self, node, _)
|
581
|
+
smart_node(node)
|
582
|
+
local source = unpack(node.iter)
|
583
|
+
local destructures = { }
|
584
|
+
do
|
585
|
+
local _accum_0 = { }
|
586
|
+
local _len_0 = 1
|
587
|
+
for i, name in ipairs(node.names) do
|
588
|
+
if ntype(name) == "table" then
|
589
|
+
do
|
590
|
+
local proxy = NameProxy("des")
|
591
|
+
insert(destructures, destructure.build_assign(self, name, proxy))
|
592
|
+
_accum_0[_len_0] = proxy
|
593
|
+
end
|
594
|
+
else
|
595
|
+
_accum_0[_len_0] = name
|
596
|
+
end
|
597
|
+
_len_0 = _len_0 + 1
|
598
|
+
end
|
599
|
+
node.names = _accum_0
|
600
|
+
end
|
601
|
+
if next(destructures) then
|
602
|
+
insert(destructures, build.group(node.body))
|
603
|
+
node.body = destructures
|
604
|
+
end
|
605
|
+
if ntype(source) == "unpack" then
|
606
|
+
local list = source[2]
|
607
|
+
local index_name = NameProxy("index")
|
608
|
+
local list_name = self:is_local(list) and list or NameProxy("list")
|
609
|
+
local slice_var = nil
|
610
|
+
local bounds
|
611
|
+
if is_slice(list) then
|
612
|
+
local slice = list[#list]
|
613
|
+
table.remove(list)
|
614
|
+
table.remove(slice, 1)
|
615
|
+
if self:is_local(list) then
|
616
|
+
list_name = list
|
617
|
+
end
|
618
|
+
if slice[2] and slice[2] ~= "" then
|
619
|
+
local max_tmp_name = NameProxy("max")
|
620
|
+
slice_var = build.assign_one(max_tmp_name, slice[2])
|
621
|
+
slice[2] = {
|
622
|
+
"exp",
|
623
|
+
max_tmp_name,
|
624
|
+
"<",
|
625
|
+
0,
|
626
|
+
"and",
|
627
|
+
{
|
628
|
+
"length",
|
629
|
+
list_name
|
630
|
+
},
|
631
|
+
"+",
|
632
|
+
max_tmp_name,
|
633
|
+
"or",
|
634
|
+
max_tmp_name
|
635
|
+
}
|
636
|
+
else
|
637
|
+
slice[2] = {
|
638
|
+
"length",
|
639
|
+
list_name
|
640
|
+
}
|
641
|
+
end
|
642
|
+
bounds = slice
|
643
|
+
else
|
644
|
+
bounds = {
|
645
|
+
1,
|
646
|
+
{
|
647
|
+
"length",
|
648
|
+
list_name
|
649
|
+
}
|
650
|
+
}
|
651
|
+
end
|
652
|
+
return build.group({
|
653
|
+
list_name ~= list and build.assign_one(list_name, list) or NOOP,
|
654
|
+
slice_var or NOOP,
|
655
|
+
build["for"]({
|
656
|
+
name = index_name,
|
657
|
+
bounds = bounds,
|
658
|
+
body = {
|
659
|
+
{
|
660
|
+
"assign",
|
661
|
+
node.names,
|
662
|
+
{
|
663
|
+
NameProxy.index(list_name, index_name)
|
664
|
+
}
|
665
|
+
},
|
666
|
+
build.group(node.body)
|
667
|
+
}
|
668
|
+
})
|
669
|
+
})
|
670
|
+
end
|
671
|
+
node.body = with_continue_listener(node.body)
|
672
|
+
end,
|
673
|
+
["while"] = function(self, node)
|
674
|
+
smart_node(node)
|
675
|
+
node.body = with_continue_listener(node.body)
|
676
|
+
end,
|
677
|
+
["for"] = function(self, node)
|
678
|
+
smart_node(node)
|
679
|
+
node.body = with_continue_listener(node.body)
|
680
|
+
end,
|
681
|
+
switch = function(self, node, ret)
|
682
|
+
local _, exp, conds = unpack(node)
|
683
|
+
local exp_name = NameProxy("exp")
|
684
|
+
local convert_cond
|
685
|
+
convert_cond = function(cond)
|
686
|
+
local t, case_exps, body = unpack(cond)
|
687
|
+
local out = { }
|
688
|
+
insert(out, t == "case" and "elseif" or "else")
|
689
|
+
if t ~= "else" then
|
690
|
+
local cond_exp = { }
|
691
|
+
for i, case in ipairs(case_exps) do
|
692
|
+
if i == 1 then
|
693
|
+
insert(cond_exp, "exp")
|
694
|
+
else
|
695
|
+
insert(cond_exp, "or")
|
696
|
+
end
|
697
|
+
if not (value_is_singular(case)) then
|
698
|
+
case = {
|
699
|
+
"parens",
|
700
|
+
case
|
701
|
+
}
|
702
|
+
end
|
703
|
+
insert(cond_exp, {
|
704
|
+
"exp",
|
705
|
+
case,
|
706
|
+
"==",
|
707
|
+
exp_name
|
708
|
+
})
|
709
|
+
end
|
710
|
+
insert(out, cond_exp)
|
711
|
+
else
|
712
|
+
body = case_exps
|
713
|
+
end
|
714
|
+
if ret then
|
715
|
+
body = transform_last_stm(body, ret)
|
716
|
+
end
|
717
|
+
insert(out, body)
|
718
|
+
return out
|
719
|
+
end
|
720
|
+
local first = true
|
721
|
+
local if_stm = {
|
722
|
+
"if"
|
723
|
+
}
|
724
|
+
for _index_0 = 1, #conds do
|
725
|
+
local cond = conds[_index_0]
|
726
|
+
local if_cond = convert_cond(cond)
|
727
|
+
if first then
|
728
|
+
first = false
|
729
|
+
insert(if_stm, if_cond[2])
|
730
|
+
insert(if_stm, if_cond[3])
|
731
|
+
else
|
732
|
+
insert(if_stm, if_cond)
|
733
|
+
end
|
734
|
+
end
|
735
|
+
return build.group({
|
736
|
+
build.assign_one(exp_name, exp),
|
737
|
+
if_stm
|
738
|
+
})
|
739
|
+
end,
|
740
|
+
class = require("moonscript.transform.class")
|
741
|
+
})
|