rufus-lua-moon 0.2.3.2 → 0.2.4.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/rufus/lua/moon/version.rb +1 -1
- data/vendor/lua/moon/all.moon +5 -7
- data/vendor/lua/moon/init.moon +6 -8
- data/vendor/lua/moonscript/base.lua +2 -0
- data/vendor/lua/moonscript/compile/statement.lua +25 -26
- data/vendor/lua/moonscript/compile/value.lua +43 -36
- data/vendor/lua/moonscript/compile.lua +69 -128
- data/vendor/lua/moonscript/data.lua +9 -21
- data/vendor/lua/moonscript/dump.lua +6 -6
- data/vendor/lua/moonscript/errors.lua +18 -12
- data/vendor/lua/moonscript/init.lua +15 -13
- data/vendor/lua/moonscript/parse.lua +5 -5
- data/vendor/lua/moonscript/transform/destructure.lua +44 -39
- data/vendor/lua/moonscript/transform/names.lua +12 -41
- data/vendor/lua/moonscript/transform.lua +298 -322
- data/vendor/lua/moonscript/types.lua +18 -11
- data/vendor/lua/moonscript/util.lua +26 -22
- data/vendor/lua/moonscript/version.lua +1 -1
- metadata +2 -1
@@ -1,45 +1,41 @@
|
|
1
1
|
local types = require("moonscript.types")
|
2
2
|
local util = require("moonscript.util")
|
3
3
|
local data = require("moonscript.data")
|
4
|
-
local reversed, unpack
|
5
|
-
|
6
|
-
local
|
4
|
+
local reversed, unpack
|
5
|
+
reversed, unpack = util.reversed, util.unpack
|
6
|
+
local ntype, mtype, build, smart_node, is_slice, value_is_singular
|
7
|
+
ntype, mtype, build, smart_node, is_slice, value_is_singular = types.ntype, types.mtype, types.build, types.smart_node, types.is_slice, types.value_is_singular
|
8
|
+
local insert
|
9
|
+
do
|
10
|
+
local _obj_0 = table
|
11
|
+
insert = _obj_0.insert
|
12
|
+
end
|
7
13
|
local NameProxy, LocalName
|
8
14
|
do
|
9
|
-
local
|
10
|
-
NameProxy, LocalName =
|
15
|
+
local _obj_0 = require("moonscript.transform.names")
|
16
|
+
NameProxy, LocalName = _obj_0.NameProxy, _obj_0.LocalName
|
11
17
|
end
|
12
18
|
local destructure = require("moonscript.transform.destructure")
|
13
|
-
local
|
14
|
-
|
19
|
+
local NOOP = {
|
20
|
+
"noop"
|
21
|
+
}
|
22
|
+
local Run, apply_to_last, is_singular, extract_declarations, expand_elseif_assign, constructor_name, with_continue_listener, Transformer, construct_comprehension, Statement, Accumulator, default_accumulator, implicitly_return, Value
|
15
23
|
do
|
16
|
-
local _parent_0 = nil
|
17
24
|
local _base_0 = {
|
18
25
|
call = function(self, state)
|
19
26
|
return self.fn(state)
|
20
27
|
end
|
21
28
|
}
|
22
29
|
_base_0.__index = _base_0
|
23
|
-
if _parent_0 then
|
24
|
-
setmetatable(_base_0, _parent_0.__base)
|
25
|
-
end
|
26
30
|
local _class_0 = setmetatable({
|
27
31
|
__init = function(self, fn)
|
28
32
|
self.fn = fn
|
29
33
|
self[1] = "run"
|
30
34
|
end,
|
31
35
|
__base = _base_0,
|
32
|
-
__name = "Run"
|
33
|
-
__parent = _parent_0
|
36
|
+
__name = "Run"
|
34
37
|
}, {
|
35
|
-
__index =
|
36
|
-
local val = rawget(_base_0, name)
|
37
|
-
if val == nil and _parent_0 then
|
38
|
-
return _parent_0[name]
|
39
|
-
else
|
40
|
-
return val
|
41
|
-
end
|
42
|
-
end,
|
38
|
+
__index = _base_0,
|
43
39
|
__call = function(cls, ...)
|
44
40
|
local _self_0 = setmetatable({}, _base_0)
|
45
41
|
cls.__init(_self_0, ...)
|
@@ -47,12 +43,8 @@ do
|
|
47
43
|
end
|
48
44
|
})
|
49
45
|
_base_0.__class = _class_0
|
50
|
-
if _parent_0 and _parent_0.__inherited then
|
51
|
-
_parent_0.__inherited(_parent_0, _class_0)
|
52
|
-
end
|
53
46
|
Run = _class_0
|
54
47
|
end
|
55
|
-
local apply_to_last
|
56
48
|
apply_to_last = function(stms, fn)
|
57
49
|
local last_exp_id = 0
|
58
50
|
for i = #stms, 1, -1 do
|
@@ -67,7 +59,11 @@ apply_to_last = function(stms, fn)
|
|
67
59
|
local _len_0 = 1
|
68
60
|
for i, stm in ipairs(stms) do
|
69
61
|
if i == last_exp_id then
|
70
|
-
_accum_0[_len_0] =
|
62
|
+
_accum_0[_len_0] = {
|
63
|
+
"transform",
|
64
|
+
stm,
|
65
|
+
fn
|
66
|
+
}
|
71
67
|
else
|
72
68
|
_accum_0[_len_0] = stm
|
73
69
|
end
|
@@ -76,7 +72,6 @@ apply_to_last = function(stms, fn)
|
|
76
72
|
return _accum_0
|
77
73
|
end)()
|
78
74
|
end
|
79
|
-
local is_singular
|
80
75
|
is_singular = function(body)
|
81
76
|
if #body ~= 1 then
|
82
77
|
return false
|
@@ -87,7 +82,6 @@ is_singular = function(body)
|
|
87
82
|
return body[1]
|
88
83
|
end
|
89
84
|
end
|
90
|
-
local extract_declarations
|
91
85
|
extract_declarations = function(self, body, start, out)
|
92
86
|
if body == nil then
|
93
87
|
body = self.current_stms
|
@@ -128,7 +122,6 @@ extract_declarations = function(self, body, start, out)
|
|
128
122
|
end
|
129
123
|
return out
|
130
124
|
end
|
131
|
-
local expand_elseif_assign
|
132
125
|
expand_elseif_assign = function(ifstm)
|
133
126
|
for i = 4, #ifstm do
|
134
127
|
local case = ifstm[i]
|
@@ -152,8 +145,7 @@ expand_elseif_assign = function(ifstm)
|
|
152
145
|
end
|
153
146
|
return ifstm
|
154
147
|
end
|
155
|
-
|
156
|
-
local with_continue_listener
|
148
|
+
constructor_name = "new"
|
157
149
|
with_continue_listener = function(body)
|
158
150
|
local continue_name = nil
|
159
151
|
return {
|
@@ -216,10 +208,20 @@ with_continue_listener = function(body)
|
|
216
208
|
end)
|
217
209
|
}
|
218
210
|
end
|
219
|
-
local Transformer
|
220
211
|
do
|
221
|
-
local _parent_0 = nil
|
222
212
|
local _base_0 = {
|
213
|
+
transform_once = function(self, scope, node, ...)
|
214
|
+
if self.seen_nodes[node] then
|
215
|
+
return node
|
216
|
+
end
|
217
|
+
self.seen_nodes[node] = true
|
218
|
+
local transformer = self.transformers[ntype(node)]
|
219
|
+
if transformer then
|
220
|
+
return transformer(scope, node, ...) or node
|
221
|
+
else
|
222
|
+
return node
|
223
|
+
end
|
224
|
+
end,
|
223
225
|
transform = function(self, scope, node, ...)
|
224
226
|
if self.seen_nodes[node] then
|
225
227
|
return node
|
@@ -253,9 +255,6 @@ do
|
|
253
255
|
end
|
254
256
|
}
|
255
257
|
_base_0.__index = _base_0
|
256
|
-
if _parent_0 then
|
257
|
-
setmetatable(_base_0, _parent_0.__base)
|
258
|
-
end
|
259
258
|
local _class_0 = setmetatable({
|
260
259
|
__init = function(self, transformers)
|
261
260
|
self.transformers = transformers
|
@@ -264,17 +263,9 @@ do
|
|
264
263
|
})
|
265
264
|
end,
|
266
265
|
__base = _base_0,
|
267
|
-
__name = "Transformer"
|
268
|
-
__parent = _parent_0
|
266
|
+
__name = "Transformer"
|
269
267
|
}, {
|
270
|
-
__index =
|
271
|
-
local val = rawget(_base_0, name)
|
272
|
-
if val == nil and _parent_0 then
|
273
|
-
return _parent_0[name]
|
274
|
-
else
|
275
|
-
return val
|
276
|
-
end
|
277
|
-
end,
|
268
|
+
__index = _base_0,
|
278
269
|
__call = function(cls, ...)
|
279
270
|
local _self_0 = setmetatable({}, _base_0)
|
280
271
|
cls.__init(_self_0, ...)
|
@@ -282,12 +273,8 @@ do
|
|
282
273
|
end
|
283
274
|
})
|
284
275
|
_base_0.__class = _class_0
|
285
|
-
if _parent_0 and _parent_0.__inherited then
|
286
|
-
_parent_0.__inherited(_parent_0, _class_0)
|
287
|
-
end
|
288
276
|
Transformer = _class_0
|
289
277
|
end
|
290
|
-
local construct_comprehension
|
291
278
|
construct_comprehension = function(inner, clauses)
|
292
279
|
local current_stms = inner
|
293
280
|
for _, clause in reversed(clauses) do
|
@@ -295,10 +282,7 @@ construct_comprehension = function(inner, clauses)
|
|
295
282
|
local _exp_0 = t
|
296
283
|
if "for" == _exp_0 then
|
297
284
|
local name, bounds
|
298
|
-
|
299
|
-
local _obj_0 = clause
|
300
|
-
_, name, bounds = _obj_0[1], _obj_0[2], _obj_0[3]
|
301
|
-
end
|
285
|
+
_, name, bounds = clause[1], clause[2], clause[3]
|
302
286
|
current_stms = {
|
303
287
|
"for",
|
304
288
|
name,
|
@@ -307,10 +291,7 @@ construct_comprehension = function(inner, clauses)
|
|
307
291
|
}
|
308
292
|
elseif "foreach" == _exp_0 then
|
309
293
|
local names, iter
|
310
|
-
|
311
|
-
local _obj_0 = clause
|
312
|
-
_, names, iter = _obj_0[1], _obj_0[2], _obj_0[3]
|
313
|
-
end
|
294
|
+
_, names, iter = clause[1], clause[2], clause[3]
|
314
295
|
current_stms = {
|
315
296
|
"foreach",
|
316
297
|
names,
|
@@ -321,10 +302,7 @@ construct_comprehension = function(inner, clauses)
|
|
321
302
|
}
|
322
303
|
elseif "when" == _exp_0 then
|
323
304
|
local cond
|
324
|
-
|
325
|
-
local _obj_0 = clause
|
326
|
-
_, cond = _obj_0[1], _obj_0[2]
|
327
|
-
end
|
305
|
+
_, cond = clause[1], clause[2]
|
328
306
|
current_stms = {
|
329
307
|
"if",
|
330
308
|
cond,
|
@@ -339,21 +317,37 @@ construct_comprehension = function(inner, clauses)
|
|
339
317
|
end
|
340
318
|
return current_stms[1]
|
341
319
|
end
|
342
|
-
|
320
|
+
Statement = Transformer({
|
321
|
+
transform = function(self, tuple)
|
322
|
+
local _, node, fn
|
323
|
+
_, node, fn = tuple[1], tuple[2], tuple[3]
|
324
|
+
return fn(node)
|
325
|
+
end,
|
343
326
|
root_stms = function(self, body)
|
344
327
|
return apply_to_last(body, implicitly_return(self))
|
345
328
|
end,
|
329
|
+
["return"] = function(self, node)
|
330
|
+
node[2] = Value:transform_once(self, node[2])
|
331
|
+
if "block_exp" == ntype(node[2]) then
|
332
|
+
local block_exp = node[2]
|
333
|
+
local block_body = block_exp[2]
|
334
|
+
local idx = #block_body
|
335
|
+
node[2] = block_body[idx]
|
336
|
+
block_body[idx] = node
|
337
|
+
return build.group(block_body)
|
338
|
+
end
|
339
|
+
return node
|
340
|
+
end,
|
346
341
|
declare_glob = function(self, node)
|
347
342
|
local names = extract_declarations(self)
|
348
343
|
if node[2] == "^" then
|
349
|
-
|
344
|
+
do
|
350
345
|
local _accum_0 = { }
|
351
346
|
local _len_0 = 1
|
352
|
-
|
353
|
-
for _index_0 = 1, #_list_0 do
|
347
|
+
for _index_0 = 1, #names do
|
354
348
|
local _continue_0 = false
|
355
349
|
repeat
|
356
|
-
local name =
|
350
|
+
local name = names[_index_0]
|
357
351
|
if not (name:match("^%u")) then
|
358
352
|
_continue_0 = true
|
359
353
|
break
|
@@ -367,8 +361,8 @@ local Statement = Transformer({
|
|
367
361
|
break
|
368
362
|
end
|
369
363
|
end
|
370
|
-
|
371
|
-
end
|
364
|
+
names = _accum_0
|
365
|
+
end
|
372
366
|
end
|
373
367
|
return {
|
374
368
|
"declare",
|
@@ -377,8 +371,34 @@ local Statement = Transformer({
|
|
377
371
|
end,
|
378
372
|
assign = function(self, node)
|
379
373
|
local names, values = unpack(node, 2)
|
374
|
+
local num_values = #values
|
375
|
+
local num_names = #values
|
376
|
+
if num_names == 1 and num_values == 1 then
|
377
|
+
local first_value = values[1]
|
378
|
+
local first_name = names[1]
|
379
|
+
local _exp_0 = ntype(first_value)
|
380
|
+
if "block_exp" == _exp_0 then
|
381
|
+
local block_body = first_value[2]
|
382
|
+
local idx = #block_body
|
383
|
+
block_body[idx] = build.assign_one(first_name, block_body[idx])
|
384
|
+
return build.group({
|
385
|
+
{
|
386
|
+
"declare",
|
387
|
+
{
|
388
|
+
first_name
|
389
|
+
}
|
390
|
+
},
|
391
|
+
{
|
392
|
+
"do",
|
393
|
+
block_body
|
394
|
+
}
|
395
|
+
})
|
396
|
+
elseif "comprehension" == _exp_0 or "tblcomprehension" == _exp_0 or "foreach" == _exp_0 or "for" == _exp_0 or "while" == _exp_0 then
|
397
|
+
return build.assign_one(first_name, Value:transform_once(self, first_value))
|
398
|
+
end
|
399
|
+
end
|
380
400
|
local transformed
|
381
|
-
if
|
401
|
+
if num_values == 1 then
|
382
402
|
local value = values[1]
|
383
403
|
local t = ntype(value)
|
384
404
|
if t == "decorated" then
|
@@ -411,7 +431,7 @@ local Statement = Transformer({
|
|
411
431
|
end
|
412
432
|
node = transformed or node
|
413
433
|
if destructure.has_destructure(names) then
|
414
|
-
return destructure.split_assign(node)
|
434
|
+
return destructure.split_assign(self, node)
|
415
435
|
end
|
416
436
|
return node
|
417
437
|
end,
|
@@ -442,7 +462,10 @@ local Statement = Transformer({
|
|
442
462
|
})
|
443
463
|
else
|
444
464
|
return build.group({
|
445
|
-
|
465
|
+
{
|
466
|
+
"export",
|
467
|
+
node[2]
|
468
|
+
},
|
446
469
|
build.assign({
|
447
470
|
names = node[2],
|
448
471
|
values = node[3]
|
@@ -474,82 +497,44 @@ local Statement = Transformer({
|
|
474
497
|
end,
|
475
498
|
import = function(self, node)
|
476
499
|
local _, names, source = unpack(node)
|
477
|
-
local
|
500
|
+
local table_values
|
501
|
+
do
|
478
502
|
local _accum_0 = { }
|
479
503
|
local _len_0 = 1
|
480
|
-
|
481
|
-
|
482
|
-
local
|
483
|
-
if
|
484
|
-
|
504
|
+
for _index_0 = 1, #names do
|
505
|
+
local name = names[_index_0]
|
506
|
+
local dest_val
|
507
|
+
if ntype(name) == "colon_stub" then
|
508
|
+
dest_val = name[2]
|
485
509
|
else
|
486
|
-
|
487
|
-
"dot",
|
488
|
-
name
|
489
|
-
}
|
510
|
+
dest_val = name
|
490
511
|
end
|
512
|
+
local _value_0 = {
|
513
|
+
{
|
514
|
+
"key_literal",
|
515
|
+
name
|
516
|
+
},
|
517
|
+
dest_val
|
518
|
+
}
|
519
|
+
_accum_0[_len_0] = _value_0
|
491
520
|
_len_0 = _len_0 + 1
|
492
521
|
end
|
493
|
-
|
494
|
-
end)()
|
495
|
-
local real_names = (function()
|
496
|
-
local _accum_0 = { }
|
497
|
-
local _len_0 = 1
|
498
|
-
local _list_0 = names
|
499
|
-
for _index_0 = 1, #_list_0 do
|
500
|
-
local name = _list_0[_index_0]
|
501
|
-
_accum_0[_len_0] = type(name) == "table" and name[2] or name
|
502
|
-
_len_0 = _len_0 + 1
|
503
|
-
end
|
504
|
-
return _accum_0
|
505
|
-
end)()
|
506
|
-
if type(source) == "string" then
|
507
|
-
return build.assign({
|
508
|
-
names = real_names,
|
509
|
-
values = (function()
|
510
|
-
local _accum_0 = { }
|
511
|
-
local _len_0 = 1
|
512
|
-
local _list_0 = stubs
|
513
|
-
for _index_0 = 1, #_list_0 do
|
514
|
-
local stub = _list_0[_index_0]
|
515
|
-
_accum_0[_len_0] = build.chain({
|
516
|
-
base = source,
|
517
|
-
stub
|
518
|
-
})
|
519
|
-
_len_0 = _len_0 + 1
|
520
|
-
end
|
521
|
-
return _accum_0
|
522
|
-
end)()
|
523
|
-
})
|
524
|
-
else
|
525
|
-
local source_name = NameProxy("table")
|
526
|
-
return build.group({
|
527
|
-
{
|
528
|
-
"declare",
|
529
|
-
real_names
|
530
|
-
},
|
531
|
-
build["do"]({
|
532
|
-
build.assign_one(source_name, source),
|
533
|
-
build.assign({
|
534
|
-
names = real_names,
|
535
|
-
values = (function()
|
536
|
-
local _accum_0 = { }
|
537
|
-
local _len_0 = 1
|
538
|
-
local _list_0 = stubs
|
539
|
-
for _index_0 = 1, #_list_0 do
|
540
|
-
local stub = _list_0[_index_0]
|
541
|
-
_accum_0[_len_0] = build.chain({
|
542
|
-
base = source_name,
|
543
|
-
stub
|
544
|
-
})
|
545
|
-
_len_0 = _len_0 + 1
|
546
|
-
end
|
547
|
-
return _accum_0
|
548
|
-
end)()
|
549
|
-
})
|
550
|
-
})
|
551
|
-
})
|
522
|
+
table_values = _accum_0
|
552
523
|
end
|
524
|
+
local dest = {
|
525
|
+
"table",
|
526
|
+
table_values
|
527
|
+
}
|
528
|
+
return {
|
529
|
+
"assign",
|
530
|
+
{
|
531
|
+
dest
|
532
|
+
},
|
533
|
+
{
|
534
|
+
source
|
535
|
+
},
|
536
|
+
[-1] = node[-1]
|
537
|
+
}
|
553
538
|
end,
|
554
539
|
comprehension = function(self, node, action)
|
555
540
|
local _, exp, clauses = unpack(node)
|
@@ -646,7 +631,7 @@ local Statement = Transformer({
|
|
646
631
|
if destructure.has_destructure(assign[2]) then
|
647
632
|
local name = NameProxy("des")
|
648
633
|
body = {
|
649
|
-
destructure.build_assign(assign[2][1], name),
|
634
|
+
destructure.build_assign(self, assign[2][1], name),
|
650
635
|
build.group(node[3])
|
651
636
|
}
|
652
637
|
return build["do"]({
|
@@ -683,28 +668,38 @@ local Statement = Transformer({
|
|
683
668
|
return node
|
684
669
|
end,
|
685
670
|
with = function(self, node, ret)
|
686
|
-
local
|
687
|
-
local
|
688
|
-
local named_assign
|
671
|
+
local exp, block = unpack(node, 2)
|
672
|
+
local copy_scope = true
|
673
|
+
local scope_name, named_assign
|
689
674
|
if ntype(exp) == "assign" then
|
690
675
|
local names, values = unpack(exp, 2)
|
691
|
-
local
|
692
|
-
|
693
|
-
|
694
|
-
|
695
|
-
|
696
|
-
|
697
|
-
|
698
|
-
|
676
|
+
local first_name = names[1]
|
677
|
+
if ntype(first_name) == "value" then
|
678
|
+
scope_name = first_name
|
679
|
+
named_assign = exp
|
680
|
+
exp = values[1]
|
681
|
+
copy_scope = false
|
682
|
+
else
|
683
|
+
scope_name = NameProxy("with")
|
684
|
+
exp = values[1]
|
685
|
+
values[1] = scope_name
|
686
|
+
named_assign = {
|
687
|
+
"assign",
|
688
|
+
names,
|
689
|
+
values
|
690
|
+
}
|
691
|
+
end
|
692
|
+
elseif self:is_local(exp) then
|
693
|
+
scope_name = exp
|
694
|
+
copy_scope = false
|
699
695
|
end
|
696
|
+
scope_name = scope_name or NameProxy("with")
|
700
697
|
return build["do"]({
|
701
698
|
Run(function(self)
|
702
699
|
return self:set("scope_var", scope_name)
|
703
700
|
end),
|
704
|
-
build.assign_one(scope_name, exp),
|
705
|
-
|
706
|
-
named_assign
|
707
|
-
}),
|
701
|
+
copy_scope and build.assign_one(scope_name, exp) or NOOP,
|
702
|
+
named_assign or NOOP,
|
708
703
|
build.group(block),
|
709
704
|
(function()
|
710
705
|
if ret then
|
@@ -713,28 +708,27 @@ local Statement = Transformer({
|
|
713
708
|
end)()
|
714
709
|
})
|
715
710
|
end,
|
716
|
-
foreach = function(self, node)
|
711
|
+
foreach = function(self, node, _)
|
717
712
|
smart_node(node)
|
718
713
|
local source = unpack(node.iter)
|
719
714
|
local destructures = { }
|
720
|
-
|
715
|
+
do
|
721
716
|
local _accum_0 = { }
|
722
717
|
local _len_0 = 1
|
723
718
|
for i, name in ipairs(node.names) do
|
724
719
|
if ntype(name) == "table" then
|
725
720
|
do
|
726
|
-
local
|
727
|
-
|
728
|
-
|
729
|
-
_accum_0[_len_0] = _with_0
|
721
|
+
local proxy = NameProxy("des")
|
722
|
+
insert(destructures, destructure.build_assign(self, name, proxy))
|
723
|
+
_accum_0[_len_0] = proxy
|
730
724
|
end
|
731
725
|
else
|
732
726
|
_accum_0[_len_0] = name
|
733
727
|
end
|
734
728
|
_len_0 = _len_0 + 1
|
735
729
|
end
|
736
|
-
|
737
|
-
end
|
730
|
+
node.names = _accum_0
|
731
|
+
end
|
738
732
|
if next(destructures) then
|
739
733
|
insert(destructures, build.group(node.body))
|
740
734
|
node.body = destructures
|
@@ -742,13 +736,16 @@ local Statement = Transformer({
|
|
742
736
|
if ntype(source) == "unpack" then
|
743
737
|
local list = source[2]
|
744
738
|
local index_name = NameProxy("index")
|
745
|
-
local list_name = NameProxy("list")
|
739
|
+
local list_name = self:is_local(list) and list or NameProxy("list")
|
746
740
|
local slice_var = nil
|
747
741
|
local bounds
|
748
742
|
if is_slice(list) then
|
749
743
|
local slice = list[#list]
|
750
744
|
table.remove(list)
|
751
745
|
table.remove(slice, 1)
|
746
|
+
if self:is_local(list) then
|
747
|
+
list_name = list
|
748
|
+
end
|
752
749
|
if slice[2] and slice[2] ~= "" then
|
753
750
|
local max_tmp_name = NameProxy("max")
|
754
751
|
slice_var = build.assign_one(max_tmp_name, slice[2])
|
@@ -784,8 +781,8 @@ local Statement = Transformer({
|
|
784
781
|
}
|
785
782
|
end
|
786
783
|
return build.group({
|
787
|
-
build.assign_one(list_name, list),
|
788
|
-
slice_var,
|
784
|
+
list_name ~= list and build.assign_one(list_name, list) or NOOP,
|
785
|
+
slice_var or NOOP,
|
789
786
|
build["for"]({
|
790
787
|
name = index_name,
|
791
788
|
bounds = bounds,
|
@@ -794,7 +791,7 @@ local Statement = Transformer({
|
|
794
791
|
"assign",
|
795
792
|
node.names,
|
796
793
|
{
|
797
|
-
|
794
|
+
NameProxy.index(list_name, index_name)
|
798
795
|
}
|
799
796
|
},
|
800
797
|
build.group(node.body)
|
@@ -855,9 +852,8 @@ local Statement = Transformer({
|
|
855
852
|
local if_stm = {
|
856
853
|
"if"
|
857
854
|
}
|
858
|
-
|
859
|
-
|
860
|
-
local cond = _list_0[_index_0]
|
855
|
+
for _index_0 = 1, #conds do
|
856
|
+
local cond = conds[_index_0]
|
861
857
|
local if_cond = convert_cond(cond)
|
862
858
|
if first then
|
863
859
|
first = false
|
@@ -874,18 +870,19 @@ local Statement = Transformer({
|
|
874
870
|
end,
|
875
871
|
class = function(self, node, ret, parent_assign)
|
876
872
|
local _, name, parent_val, body = unpack(node)
|
873
|
+
if parent_val == "" then
|
874
|
+
parent_val = nil
|
875
|
+
end
|
877
876
|
local statements = { }
|
878
877
|
local properties = { }
|
879
|
-
|
880
|
-
|
881
|
-
local item = _list_0[_index_0]
|
878
|
+
for _index_0 = 1, #body do
|
879
|
+
local item = body[_index_0]
|
882
880
|
local _exp_0 = item[1]
|
883
881
|
if "stm" == _exp_0 then
|
884
882
|
insert(statements, item[2])
|
885
883
|
elseif "props" == _exp_0 then
|
886
|
-
|
887
|
-
|
888
|
-
local tuple = _list_1[_index_1]
|
884
|
+
for _index_1 = 2, #item do
|
885
|
+
local tuple = item[_index_1]
|
889
886
|
if ntype(tuple[1]) == "self" then
|
890
887
|
insert(statements, build.assign_one(unpack(tuple)))
|
891
888
|
else
|
@@ -895,14 +892,13 @@ local Statement = Transformer({
|
|
895
892
|
end
|
896
893
|
end
|
897
894
|
local constructor
|
898
|
-
|
895
|
+
do
|
899
896
|
local _accum_0 = { }
|
900
897
|
local _len_0 = 1
|
901
|
-
|
902
|
-
for _index_0 = 1, #_list_1 do
|
898
|
+
for _index_0 = 1, #properties do
|
903
899
|
local _continue_0 = false
|
904
900
|
repeat
|
905
|
-
local tuple =
|
901
|
+
local tuple = properties[_index_0]
|
906
902
|
local key = tuple[1]
|
907
903
|
local _value_0
|
908
904
|
if key[1] == "key_literal" and key[2] == constructor_name then
|
@@ -920,37 +916,36 @@ local Statement = Transformer({
|
|
920
916
|
break
|
921
917
|
end
|
922
918
|
end
|
923
|
-
|
924
|
-
end
|
919
|
+
properties = _accum_0
|
920
|
+
end
|
925
921
|
local parent_cls_name = NameProxy("parent")
|
926
922
|
local base_name = NameProxy("base")
|
927
923
|
local self_name = NameProxy("self")
|
928
924
|
local cls_name = NameProxy("class")
|
929
925
|
if not (constructor) then
|
930
|
-
|
931
|
-
|
932
|
-
{
|
933
|
-
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
938
|
-
|
939
|
-
|
940
|
-
|
941
|
-
|
942
|
-
|
926
|
+
if parent_val then
|
927
|
+
constructor = build.fndef({
|
928
|
+
args = {
|
929
|
+
{
|
930
|
+
"..."
|
931
|
+
}
|
932
|
+
},
|
933
|
+
arrow = "fat",
|
934
|
+
body = {
|
935
|
+
build.chain({
|
936
|
+
base = "super",
|
937
|
+
{
|
938
|
+
"call",
|
943
939
|
{
|
944
|
-
"
|
945
|
-
{
|
946
|
-
"..."
|
947
|
-
}
|
940
|
+
"..."
|
948
941
|
}
|
949
|
-
}
|
950
|
-
}
|
951
|
-
}
|
952
|
-
}
|
953
|
-
|
942
|
+
}
|
943
|
+
})
|
944
|
+
}
|
945
|
+
})
|
946
|
+
else
|
947
|
+
constructor = build.fndef()
|
948
|
+
end
|
954
949
|
end
|
955
950
|
local real_name = name or parent_assign and parent_assign[2][1]
|
956
951
|
local _exp_0 = ntype(real_name)
|
@@ -990,56 +985,60 @@ local Statement = Transformer({
|
|
990
985
|
"__name",
|
991
986
|
real_name
|
992
987
|
},
|
993
|
-
{
|
988
|
+
parent_val and {
|
994
989
|
"__parent",
|
995
990
|
parent_cls_name
|
996
|
-
}
|
997
|
-
})
|
998
|
-
local class_lookup = build["if"]({
|
999
|
-
cond = {
|
1000
|
-
"exp",
|
1001
|
-
"val",
|
1002
|
-
"==",
|
1003
|
-
"nil",
|
1004
|
-
"and",
|
1005
|
-
parent_cls_name
|
1006
|
-
},
|
1007
|
-
["then"] = {
|
1008
|
-
parent_cls_name:index("name")
|
1009
|
-
}
|
991
|
+
} or nil
|
1010
992
|
})
|
1011
|
-
|
1012
|
-
|
1013
|
-
{
|
1014
|
-
|
1015
|
-
|
1016
|
-
|
1017
|
-
|
1018
|
-
|
1019
|
-
|
1020
|
-
|
1021
|
-
|
1022
|
-
|
1023
|
-
|
1024
|
-
|
1025
|
-
|
1026
|
-
|
1027
|
-
|
993
|
+
local class_index
|
994
|
+
if parent_val then
|
995
|
+
local class_lookup = build["if"]({
|
996
|
+
cond = {
|
997
|
+
"exp",
|
998
|
+
"val",
|
999
|
+
"==",
|
1000
|
+
"nil"
|
1001
|
+
},
|
1002
|
+
["then"] = {
|
1003
|
+
parent_cls_name:index("name")
|
1004
|
+
}
|
1005
|
+
})
|
1006
|
+
insert(class_lookup, {
|
1007
|
+
"else",
|
1008
|
+
{
|
1009
|
+
"val"
|
1010
|
+
}
|
1011
|
+
})
|
1012
|
+
class_index = build.fndef({
|
1013
|
+
args = {
|
1014
|
+
{
|
1015
|
+
"cls"
|
1028
1016
|
},
|
1029
|
-
|
1030
|
-
|
1031
|
-
|
1017
|
+
{
|
1018
|
+
"name"
|
1019
|
+
}
|
1020
|
+
},
|
1021
|
+
body = {
|
1022
|
+
build.assign_one(LocalName("val"), build.chain({
|
1023
|
+
base = "rawget",
|
1024
|
+
{
|
1025
|
+
"call",
|
1032
1026
|
{
|
1033
|
-
|
1034
|
-
|
1035
|
-
base_name,
|
1036
|
-
"name"
|
1037
|
-
}
|
1027
|
+
base_name,
|
1028
|
+
"name"
|
1038
1029
|
}
|
1039
|
-
}
|
1040
|
-
|
1041
|
-
|
1042
|
-
}
|
1030
|
+
}
|
1031
|
+
})),
|
1032
|
+
class_lookup
|
1033
|
+
}
|
1034
|
+
})
|
1035
|
+
else
|
1036
|
+
class_index = base_name
|
1037
|
+
end
|
1038
|
+
local cls_mt = build.table({
|
1039
|
+
{
|
1040
|
+
"__index",
|
1041
|
+
class_index
|
1043
1042
|
},
|
1044
1043
|
{
|
1045
1044
|
"__call",
|
@@ -1090,7 +1089,6 @@ local Statement = Transformer({
|
|
1090
1089
|
})
|
1091
1090
|
local value = nil
|
1092
1091
|
do
|
1093
|
-
local _with_0 = build
|
1094
1092
|
local out_body = {
|
1095
1093
|
Run(function(self)
|
1096
1094
|
if name then
|
@@ -1098,17 +1096,17 @@ local Statement = Transformer({
|
|
1098
1096
|
end
|
1099
1097
|
return self:set("super", function(block, chain)
|
1100
1098
|
if chain then
|
1101
|
-
local slice
|
1099
|
+
local slice
|
1100
|
+
do
|
1102
1101
|
local _accum_0 = { }
|
1103
1102
|
local _len_0 = 1
|
1104
|
-
|
1105
|
-
|
1106
|
-
local item = _list_1[_index_0]
|
1103
|
+
for _index_0 = 3, #chain do
|
1104
|
+
local item = chain[_index_0]
|
1107
1105
|
_accum_0[_len_0] = item
|
1108
1106
|
_len_0 = _len_0 + 1
|
1109
1107
|
end
|
1110
|
-
|
1111
|
-
end
|
1108
|
+
slice = _accum_0
|
1109
|
+
end
|
1112
1110
|
local new_chain = {
|
1113
1111
|
"chain",
|
1114
1112
|
parent_cls_name
|
@@ -1152,9 +1150,8 @@ local Statement = Transformer({
|
|
1152
1150
|
}
|
1153
1151
|
}
|
1154
1152
|
end
|
1155
|
-
|
1156
|
-
|
1157
|
-
local item = _list_1[_index_0]
|
1153
|
+
for _index_0 = 1, #slice do
|
1154
|
+
local item = slice[_index_0]
|
1158
1155
|
insert(new_chain, item)
|
1159
1156
|
end
|
1160
1157
|
return new_chain
|
@@ -1167,48 +1164,41 @@ local Statement = Transformer({
|
|
1167
1164
|
"declare_glob",
|
1168
1165
|
"*"
|
1169
1166
|
},
|
1170
|
-
|
1171
|
-
|
1167
|
+
parent_val and build.assign_one(parent_cls_name, parent_val) or NOOP,
|
1168
|
+
build.assign_one(base_name, {
|
1172
1169
|
"table",
|
1173
1170
|
properties
|
1174
1171
|
}),
|
1175
|
-
|
1176
|
-
|
1177
|
-
|
1178
|
-
|
1179
|
-
|
1180
|
-
|
1181
|
-
|
1182
|
-
|
1172
|
+
build.assign_one(base_name:chain("__index"), base_name),
|
1173
|
+
parent_val and build.chain({
|
1174
|
+
base = "setmetatable",
|
1175
|
+
{
|
1176
|
+
"call",
|
1177
|
+
{
|
1178
|
+
base_name,
|
1179
|
+
build.chain({
|
1180
|
+
base = parent_cls_name,
|
1183
1181
|
{
|
1184
|
-
|
1185
|
-
|
1186
|
-
base = parent_cls_name,
|
1187
|
-
{
|
1188
|
-
"dot",
|
1189
|
-
"__base"
|
1190
|
-
}
|
1191
|
-
})
|
1182
|
+
"dot",
|
1183
|
+
"__base"
|
1192
1184
|
}
|
1193
|
-
}
|
1194
|
-
}
|
1185
|
+
})
|
1186
|
+
}
|
1195
1187
|
}
|
1196
|
-
}),
|
1197
|
-
|
1198
|
-
|
1199
|
-
|
1188
|
+
}) or NOOP,
|
1189
|
+
build.assign_one(cls_name, cls),
|
1190
|
+
build.assign_one(base_name:chain("__class"), cls_name),
|
1191
|
+
build.group((function()
|
1200
1192
|
if #statements > 0 then
|
1201
1193
|
return {
|
1202
|
-
|
1203
|
-
|
1194
|
+
build.assign_one(LocalName("self"), cls_name),
|
1195
|
+
build.group(statements)
|
1204
1196
|
}
|
1205
1197
|
end
|
1206
1198
|
end)()),
|
1207
|
-
|
1199
|
+
parent_val and build["if"]({
|
1208
1200
|
cond = {
|
1209
1201
|
"exp",
|
1210
|
-
parent_cls_name,
|
1211
|
-
"and",
|
1212
1202
|
parent_cls_name:chain("__inherited")
|
1213
1203
|
},
|
1214
1204
|
["then"] = {
|
@@ -1220,11 +1210,11 @@ local Statement = Transformer({
|
|
1220
1210
|
}
|
1221
1211
|
})
|
1222
1212
|
}
|
1223
|
-
}),
|
1224
|
-
|
1213
|
+
}) or NOOP,
|
1214
|
+
build.group((function()
|
1225
1215
|
if name then
|
1226
1216
|
return {
|
1227
|
-
|
1217
|
+
build.assign_one(name, cls_name)
|
1228
1218
|
}
|
1229
1219
|
end
|
1230
1220
|
end)()),
|
@@ -1234,11 +1224,11 @@ local Statement = Transformer({
|
|
1234
1224
|
end
|
1235
1225
|
end)()
|
1236
1226
|
}
|
1237
|
-
value =
|
1238
|
-
|
1227
|
+
value = build.group({
|
1228
|
+
build.group((function()
|
1239
1229
|
if ntype(name) == "value" then
|
1240
1230
|
return {
|
1241
|
-
|
1231
|
+
build.declare({
|
1242
1232
|
names = {
|
1243
1233
|
name
|
1244
1234
|
}
|
@@ -1246,15 +1236,13 @@ local Statement = Transformer({
|
|
1246
1236
|
}
|
1247
1237
|
end
|
1248
1238
|
end)()),
|
1249
|
-
|
1239
|
+
build["do"](out_body)
|
1250
1240
|
})
|
1251
1241
|
end
|
1252
1242
|
return value
|
1253
1243
|
end
|
1254
1244
|
})
|
1255
|
-
local Accumulator
|
1256
1245
|
do
|
1257
|
-
local _parent_0 = nil
|
1258
1246
|
local _base_0 = {
|
1259
1247
|
body_idx = {
|
1260
1248
|
["for"] = 4,
|
@@ -1266,12 +1254,15 @@ do
|
|
1266
1254
|
node[index] = self:mutate_body(node[index])
|
1267
1255
|
return self:wrap(node)
|
1268
1256
|
end,
|
1269
|
-
wrap = function(self, node)
|
1270
|
-
|
1257
|
+
wrap = function(self, node, group_type)
|
1258
|
+
if group_type == nil then
|
1259
|
+
group_type = "block_exp"
|
1260
|
+
end
|
1261
|
+
return build[group_type]({
|
1271
1262
|
build.assign_one(self.accum_name, build.table()),
|
1272
1263
|
build.assign_one(self.len_name, 1),
|
1273
1264
|
node,
|
1274
|
-
self.accum_name
|
1265
|
+
group_type == "block_exp" and self.accum_name or NOOP
|
1275
1266
|
})
|
1276
1267
|
end,
|
1277
1268
|
mutate_body = function(self, body)
|
@@ -1299,7 +1290,7 @@ do
|
|
1299
1290
|
val = self.value_name
|
1300
1291
|
end
|
1301
1292
|
local update = {
|
1302
|
-
build.assign_one(
|
1293
|
+
build.assign_one(NameProxy.index(self.accum_name, self.len_name), val),
|
1303
1294
|
{
|
1304
1295
|
"update",
|
1305
1296
|
self.len_name,
|
@@ -1312,27 +1303,16 @@ do
|
|
1312
1303
|
end
|
1313
1304
|
}
|
1314
1305
|
_base_0.__index = _base_0
|
1315
|
-
if _parent_0 then
|
1316
|
-
setmetatable(_base_0, _parent_0.__base)
|
1317
|
-
end
|
1318
1306
|
local _class_0 = setmetatable({
|
1319
|
-
__init = function(self)
|
1307
|
+
__init = function(self, accum_name)
|
1320
1308
|
self.accum_name = NameProxy("accum")
|
1321
1309
|
self.value_name = NameProxy("value")
|
1322
1310
|
self.len_name = NameProxy("len")
|
1323
1311
|
end,
|
1324
1312
|
__base = _base_0,
|
1325
|
-
__name = "Accumulator"
|
1326
|
-
__parent = _parent_0
|
1313
|
+
__name = "Accumulator"
|
1327
1314
|
}, {
|
1328
|
-
__index =
|
1329
|
-
local val = rawget(_base_0, name)
|
1330
|
-
if val == nil and _parent_0 then
|
1331
|
-
return _parent_0[name]
|
1332
|
-
else
|
1333
|
-
return val
|
1334
|
-
end
|
1335
|
-
end,
|
1315
|
+
__index = _base_0,
|
1336
1316
|
__call = function(cls, ...)
|
1337
1317
|
local _self_0 = setmetatable({}, _base_0)
|
1338
1318
|
cls.__init(_self_0, ...)
|
@@ -1340,12 +1320,8 @@ do
|
|
1340
1320
|
end
|
1341
1321
|
})
|
1342
1322
|
_base_0.__class = _class_0
|
1343
|
-
if _parent_0 and _parent_0.__inherited then
|
1344
|
-
_parent_0.__inherited(_parent_0, _class_0)
|
1345
|
-
end
|
1346
1323
|
Accumulator = _class_0
|
1347
1324
|
end
|
1348
|
-
local default_accumulator
|
1349
1325
|
default_accumulator = function(self, node)
|
1350
1326
|
return Accumulator():convert(node)
|
1351
1327
|
end
|
@@ -1363,7 +1339,7 @@ implicitly_return = function(scope)
|
|
1363
1339
|
return scope.transform.statement(stm, fn)
|
1364
1340
|
elseif types.manual_return[t] or not types.is_value(stm) then
|
1365
1341
|
if is_top and t == "return" and stm[2] == "" then
|
1366
|
-
return
|
1342
|
+
return NOOP
|
1367
1343
|
else
|
1368
1344
|
return stm
|
1369
1345
|
end
|
@@ -1380,7 +1356,7 @@ implicitly_return = function(scope)
|
|
1380
1356
|
end
|
1381
1357
|
return fn
|
1382
1358
|
end
|
1383
|
-
|
1359
|
+
Value = Transformer({
|
1384
1360
|
["for"] = default_accumulator,
|
1385
1361
|
["while"] = default_accumulator,
|
1386
1362
|
foreach = default_accumulator,
|