rufus-lua-moon 0.2.2 → 0.2.3
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/lua/moon/init.moon +1 -1
- data/vendor/lua/moonscript/compile/statement.lua +26 -26
- data/vendor/lua/moonscript/compile/value.lua +24 -22
- data/vendor/lua/moonscript/compile.lua +165 -68
- data/vendor/lua/moonscript/data.lua +11 -6
- data/vendor/lua/moonscript/dump.lua +8 -3
- data/vendor/lua/moonscript/errors.lua +18 -6
- data/vendor/lua/moonscript/init.lua +37 -21
- data/vendor/lua/moonscript/line_tables.lua +1 -0
- data/vendor/lua/moonscript/parse.lua +34 -20
- data/vendor/lua/moonscript/transform/destructure.lua +234 -0
- data/vendor/lua/moonscript/transform/names.lua +144 -0
- data/vendor/lua/moonscript/transform.lua +230 -263
- data/vendor/lua/moonscript/types.lua +75 -31
- data/vendor/lua/moonscript/util.lua +102 -28
- data/vendor/lua/moonscript/version.lua +1 -1
- metadata +4 -2
- data/vendor/lua/moonscript/compile/format.lua +0 -49
@@ -1,5 +1,5 @@
|
|
1
|
-
|
2
|
-
local
|
1
|
+
local concat, remove, insert = table.concat, table.remove, table.insert
|
2
|
+
local Set
|
3
3
|
Set = function(items)
|
4
4
|
local self = { }
|
5
5
|
local _list_0 = items
|
@@ -9,6 +9,7 @@ Set = function(items)
|
|
9
9
|
end
|
10
10
|
return self
|
11
11
|
end
|
12
|
+
local Stack
|
12
13
|
do
|
13
14
|
local _parent_0 = nil
|
14
15
|
local _base_0 = {
|
@@ -16,10 +17,10 @@ do
|
|
16
17
|
return "<Stack {" .. concat(self, ", ") .. "}>"
|
17
18
|
end,
|
18
19
|
pop = function(self)
|
19
|
-
return
|
20
|
+
return remove(self)
|
20
21
|
end,
|
21
22
|
push = function(self, value)
|
22
|
-
|
23
|
+
insert(self, value)
|
23
24
|
return value
|
24
25
|
end,
|
25
26
|
top = function(self)
|
@@ -65,7 +66,7 @@ do
|
|
65
66
|
end
|
66
67
|
Stack = _class_0
|
67
68
|
end
|
68
|
-
lua_keywords = Set({
|
69
|
+
local lua_keywords = Set({
|
69
70
|
'and',
|
70
71
|
'break',
|
71
72
|
'do',
|
@@ -88,4 +89,8 @@ lua_keywords = Set({
|
|
88
89
|
'until',
|
89
90
|
'while'
|
90
91
|
})
|
91
|
-
return
|
92
|
+
return {
|
93
|
+
Set = Set,
|
94
|
+
Stack = Stack,
|
95
|
+
lua_keywords = lua_keywords
|
96
|
+
}
|
@@ -1,4 +1,3 @@
|
|
1
|
-
module("moonscript.dump", package.seeall)
|
2
1
|
local flat_value
|
3
2
|
flat_value = function(op, depth)
|
4
3
|
if depth == nil then
|
@@ -12,21 +11,23 @@ flat_value = function(op, depth)
|
|
12
11
|
end
|
13
12
|
local items = (function()
|
14
13
|
local _accum_0 = { }
|
15
|
-
local _len_0 =
|
14
|
+
local _len_0 = 1
|
16
15
|
local _list_0 = op
|
17
16
|
for _index_0 = 1, #_list_0 do
|
18
17
|
local item = _list_0[_index_0]
|
19
|
-
_len_0 = _len_0 + 1
|
20
18
|
_accum_0[_len_0] = flat_value(item, depth + 1)
|
19
|
+
_len_0 = _len_0 + 1
|
21
20
|
end
|
22
21
|
return _accum_0
|
23
22
|
end)()
|
24
23
|
local pos = op[-1]
|
25
24
|
return "{" .. (pos and "[" .. pos .. "] " or "") .. table.concat(items, ", ") .. "}"
|
26
25
|
end
|
26
|
+
local value
|
27
27
|
value = function(op)
|
28
28
|
return flat_value(op)
|
29
29
|
end
|
30
|
+
local tree
|
30
31
|
tree = function(block)
|
31
32
|
local _list_0 = block
|
32
33
|
for _index_0 = 1, #_list_0 do
|
@@ -34,3 +35,7 @@ tree = function(block)
|
|
34
35
|
print(flat_value(value))
|
35
36
|
end
|
36
37
|
end
|
38
|
+
return {
|
39
|
+
value = value,
|
40
|
+
tree = tree
|
41
|
+
}
|
@@ -1,9 +1,14 @@
|
|
1
|
-
module("moonscript.errors", package.seeall)
|
2
|
-
local moon = require("moonscript")
|
3
1
|
local util = require("moonscript.util")
|
4
|
-
require("lpeg")
|
2
|
+
local lpeg = require("lpeg")
|
5
3
|
local concat, insert = table.concat, table.insert
|
6
4
|
local split, pos_to_line = util.split, util.pos_to_line
|
5
|
+
local user_error
|
6
|
+
user_error = function(...)
|
7
|
+
return error({
|
8
|
+
"user-error",
|
9
|
+
...
|
10
|
+
})
|
11
|
+
end
|
7
12
|
local lookup_line
|
8
13
|
lookup_line = function(fname, pos, cache)
|
9
14
|
if not cache[fname] then
|
@@ -24,6 +29,7 @@ reverse_line_number = function(fname, line_table, line_num, cache)
|
|
24
29
|
end
|
25
30
|
return "unknown"
|
26
31
|
end
|
32
|
+
local truncate_traceback
|
27
33
|
truncate_traceback = function(traceback, chunk_func)
|
28
34
|
if chunk_func == nil then
|
29
35
|
chunk_func = "moonscript_chunk"
|
@@ -38,13 +44,13 @@ truncate_traceback = function(traceback, chunk_func)
|
|
38
44
|
end
|
39
45
|
traceback = (function()
|
40
46
|
local _accum_0 = { }
|
41
|
-
local _len_0 =
|
47
|
+
local _len_0 = 1
|
42
48
|
local _list_0 = traceback
|
43
49
|
local _max_0 = stop
|
44
50
|
for _index_0 = 1, _max_0 < 0 and #_list_0 + _max_0 or _max_0 do
|
45
51
|
local t = _list_0[_index_0]
|
46
|
-
_len_0 = _len_0 + 1
|
47
52
|
_accum_0[_len_0] = t
|
53
|
+
_len_0 = _len_0 + 1
|
48
54
|
end
|
49
55
|
return _accum_0
|
50
56
|
end)()
|
@@ -52,8 +58,9 @@ truncate_traceback = function(traceback, chunk_func)
|
|
52
58
|
traceback[#traceback] = traceback[#traceback]:gsub(rep, "main chunk")
|
53
59
|
return concat(traceback, "\n")
|
54
60
|
end
|
61
|
+
local rewrite_traceback
|
55
62
|
rewrite_traceback = function(text, err)
|
56
|
-
local line_tables =
|
63
|
+
local line_tables = require("moonscript.line_tables")
|
57
64
|
local V, S, Ct, C = lpeg.V, lpeg.S, lpeg.Ct, lpeg.C
|
58
65
|
local header_text = "stack traceback:"
|
59
66
|
local Header, Line = V("Header"), V("Line")
|
@@ -97,3 +104,8 @@ rewrite_traceback = function(text, err)
|
|
97
104
|
"\t" .. concat(match, "\n\t")
|
98
105
|
}, "\n")
|
99
106
|
end
|
107
|
+
return {
|
108
|
+
rewrite_traceback = rewrite_traceback,
|
109
|
+
truncate_traceback = truncate_traceback,
|
110
|
+
user_error = user_error
|
111
|
+
}
|
@@ -1,14 +1,16 @@
|
|
1
|
-
|
2
|
-
require("moonscript.
|
3
|
-
require("moonscript.parse")
|
4
|
-
require("moonscript.util")
|
1
|
+
local compile = require("moonscript.compile")
|
2
|
+
local parse = require("moonscript.parse")
|
5
3
|
local concat, insert = table.concat, table.insert
|
6
|
-
local split, dump
|
4
|
+
local split, dump, get_options, unpack
|
5
|
+
do
|
6
|
+
local _table_0 = require("moonscript.util")
|
7
|
+
split, dump, get_options, unpack = _table_0.split, _table_0.dump, _table_0.get_options, _table_0.unpack
|
8
|
+
end
|
7
9
|
local lua = {
|
8
10
|
loadstring = loadstring
|
9
11
|
}
|
10
|
-
dirsep = "/"
|
11
|
-
line_tables =
|
12
|
+
local dirsep = "/"
|
13
|
+
local line_tables = require("moonscript.line_tables")
|
12
14
|
local create_moonpath
|
13
15
|
create_moonpath = function(package_path)
|
14
16
|
local paths = split(package_path, ";")
|
@@ -20,6 +22,7 @@ create_moonpath = function(package_path)
|
|
20
22
|
end
|
21
23
|
return concat(paths, ";")
|
22
24
|
end
|
25
|
+
local to_lua
|
23
26
|
to_lua = function(text, options)
|
24
27
|
if options == nil then
|
25
28
|
options = { }
|
@@ -38,6 +41,7 @@ to_lua = function(text, options)
|
|
38
41
|
end
|
39
42
|
return code, ltable
|
40
43
|
end
|
44
|
+
local moon_loader
|
41
45
|
moon_loader = function(name)
|
42
46
|
local name_path = name:gsub("%.", dirsep)
|
43
47
|
local file, file_path = nil, nil
|
@@ -63,15 +67,15 @@ if not package.moonpath then
|
|
63
67
|
end
|
64
68
|
local init_loader
|
65
69
|
init_loader = function()
|
66
|
-
return insert(package.loaders, 2, moon_loader)
|
70
|
+
return insert(package.loaders or package.searchers, 2, moon_loader)
|
67
71
|
end
|
68
|
-
if not _G.moon_no_loader then
|
72
|
+
if not (_G.moon_no_loader) then
|
69
73
|
init_loader()
|
70
74
|
end
|
71
|
-
loadstring
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
+
local loadstring
|
76
|
+
loadstring = function(...)
|
77
|
+
local options, str, chunk_name, mode, env = get_options(...)
|
78
|
+
chunk_name = chunk_name or "=(moonscript.loadstring)"
|
75
79
|
local passed, code, ltable = pcall(function()
|
76
80
|
return to_lua(str, options)
|
77
81
|
end)
|
@@ -81,21 +85,33 @@ loadstring = function(str, chunk_name, options)
|
|
81
85
|
if chunk_name then
|
82
86
|
line_tables[chunk_name] = ltable
|
83
87
|
end
|
84
|
-
return lua.loadstring(code, chunk_name
|
88
|
+
return (lua.loadstring or lua.load)(code, chunk_name, unpack({
|
89
|
+
mode,
|
90
|
+
env
|
91
|
+
}))
|
85
92
|
end
|
86
|
-
loadfile
|
87
|
-
|
88
|
-
options = nil
|
89
|
-
end
|
93
|
+
local loadfile
|
94
|
+
loadfile = function(fname, ...)
|
90
95
|
local file, err = io.open(fname)
|
91
96
|
if not file then
|
92
97
|
return nil, err
|
93
98
|
end
|
94
99
|
local text = assert(file:read("*a"))
|
95
100
|
file:close()
|
96
|
-
return loadstring(text, fname,
|
101
|
+
return loadstring(text, fname, ...)
|
97
102
|
end
|
98
|
-
dofile
|
99
|
-
|
103
|
+
local dofile
|
104
|
+
dofile = function(...)
|
105
|
+
local f = assert(loadfile(...))
|
100
106
|
return f()
|
101
107
|
end
|
108
|
+
return {
|
109
|
+
_NAME = "moonscript",
|
110
|
+
to_lua = to_lua,
|
111
|
+
moon_chunk = moon_chunk,
|
112
|
+
moon_loader = moon_loader,
|
113
|
+
dirsep = dirsep,
|
114
|
+
dofile = dofile,
|
115
|
+
loadfile = loadfile,
|
116
|
+
loadstring = loadstring
|
117
|
+
}
|
@@ -0,0 +1 @@
|
|
1
|
+
return { }
|
@@ -1,8 +1,7 @@
|
|
1
|
-
module("moonscript.parse", package.seeall)
|
2
1
|
|
3
2
|
local util = require"moonscript.util"
|
4
3
|
|
5
|
-
require"lpeg"
|
4
|
+
local lpeg = require"lpeg"
|
6
5
|
|
7
6
|
local debug_grammar = false
|
8
7
|
|
@@ -14,6 +13,10 @@ local ntype = types.ntype
|
|
14
13
|
local dump = util.dump
|
15
14
|
local trim = util.trim
|
16
15
|
|
16
|
+
local getfenv = util.getfenv
|
17
|
+
local setfenv = util.setfenv
|
18
|
+
local unpack = util.unpack
|
19
|
+
|
17
20
|
local Stack = data.Stack
|
18
21
|
|
19
22
|
local function count_indent(str)
|
@@ -49,7 +52,10 @@ local _Name = C(R("az", "AZ", "__") * AlphaNum^0)
|
|
49
52
|
local Name = Space * _Name
|
50
53
|
|
51
54
|
local Num = P"0x" * R("09", "af", "AF")^1 +
|
52
|
-
|
55
|
+
(
|
56
|
+
R"09"^1 * (P"." * R"09"^1)^-1 +
|
57
|
+
P"." * R"09"^1
|
58
|
+
) * (S"eE" * P"-"^-1 * R"09"^1)^-1
|
53
59
|
|
54
60
|
Num = Space * (Num / function(value) return {"number", value} end)
|
55
61
|
|
@@ -117,7 +123,7 @@ local function wrap_env(fn)
|
|
117
123
|
}))
|
118
124
|
end
|
119
125
|
|
120
|
-
function extract_line(str, start_pos)
|
126
|
+
local function extract_line(str, start_pos)
|
121
127
|
str = str:sub(start_pos)
|
122
128
|
m = str:match"^(.-)\n"
|
123
129
|
if m then return m end
|
@@ -170,7 +176,8 @@ local _chain_assignable = { index = true, dot = true, slice = true }
|
|
170
176
|
local function is_assignable(node)
|
171
177
|
local t = ntype(node)
|
172
178
|
return t == "self" or t == "value" or t == "self_class" or
|
173
|
-
t == "chain" and _chain_assignable[ntype(node[#node])]
|
179
|
+
t == "chain" and _chain_assignable[ntype(node[#node])] or
|
180
|
+
t == "table"
|
174
181
|
end
|
175
182
|
|
176
183
|
local function check_assignable(str, pos, value)
|
@@ -400,7 +407,7 @@ local build_grammar = wrap_env(function()
|
|
400
407
|
PopIndent = Cmt("", pop_indent),
|
401
408
|
InBlock = Advance * Block * PopIndent,
|
402
409
|
|
403
|
-
Local = key"local" * Ct(NameList) / mark"declare_with_shadows",
|
410
|
+
Local = key"local" * ((op"*" + op"^") / mark"declare_glob" + Ct(NameList) / mark"declare_with_shadows"),
|
404
411
|
|
405
412
|
Import = key"import" * Ct(ImportNameList) * key"from" * Exp / mark"import",
|
406
413
|
ImportName = (sym"\\" * Ct(Cc"colon_stub" * Name) + Name),
|
@@ -418,7 +425,7 @@ local build_grammar = wrap_env(function()
|
|
418
425
|
Switch = key"switch" * DisableDo * ensure(Exp, PopDo) * key"do"^-1 * Space^-1 * Break * SwitchBlock / mark"switch",
|
419
426
|
|
420
427
|
SwitchBlock = EmptyLine^0 * Advance * Ct(SwitchCase * (Break^1 * SwitchCase)^0 * (Break^1 * SwitchElse)^-1) * PopIndent,
|
421
|
-
SwitchCase = key"when" *
|
428
|
+
SwitchCase = key"when" * Ct(ExpList) * key"then"^-1 * Body / mark"case",
|
422
429
|
SwitchElse = key"else" * Body / mark"else",
|
423
430
|
|
424
431
|
IfCond = Exp * Assign^-1 / format_single_assign,
|
@@ -435,7 +442,7 @@ local build_grammar = wrap_env(function()
|
|
435
442
|
For = key"for" * DisableDo * ensure(Name * sym"=" * Ct(Exp * sym"," * Exp * (sym"," * Exp)^-1), PopDo) *
|
436
443
|
key"do"^-1 * Body / mark"for",
|
437
444
|
|
438
|
-
ForEach = key"for" * Ct(
|
445
|
+
ForEach = key"for" * Ct(AssignableNameList) * key"in" * DisableDo * ensure(Ct(sym"*" * Exp / mark"unpack" + ExpList), PopDo) * key"do"^-1 * Body / mark"foreach",
|
439
446
|
|
440
447
|
Do = key"do" * Body / mark"do",
|
441
448
|
|
@@ -443,9 +450,10 @@ local build_grammar = wrap_env(function()
|
|
443
450
|
|
444
451
|
TblComprehension = sym"{" * Ct(Exp * (sym"," * Exp)^-1) * CompInner * sym"}" / mark"tblcomprehension",
|
445
452
|
|
446
|
-
CompInner = Ct(CompFor * CompClause^0),
|
447
|
-
|
448
|
-
|
453
|
+
CompInner = Ct((CompForEach + CompFor) * CompClause^0),
|
454
|
+
CompForEach = key"for" * Ct(NameList) * key"in" * (sym"*" * Exp / mark"unpack" + Exp) / mark"foreach",
|
455
|
+
CompFor = key "for" * Name * sym"=" * Ct(Exp * sym"," * Exp * (sym"," * Exp)^-1) / mark"for",
|
456
|
+
CompClause = CompFor + CompForEach + key"when" * Exp / mark"when",
|
449
457
|
|
450
458
|
Assign = sym"=" * (Ct(With + If + Switch) + Ct(TableBlock + ExpListLow)) / mark"assign",
|
451
459
|
Update = ((sym"..=" + sym"+=" + sym"-=" + sym"*=" + sym"/=" + sym"%=" + sym"or=" + sym"and=") / trim) * Exp / mark"update",
|
@@ -552,7 +560,7 @@ local build_grammar = wrap_env(function()
|
|
552
560
|
TableBlockInner = Ct(KeyValueLine * (SpaceBreak^1 * KeyValueLine)^0),
|
553
561
|
TableBlock = SpaceBreak^1 * Advance * ensure(TableBlockInner, PopIndent) / mark"table",
|
554
562
|
|
555
|
-
ClassDecl = key"class" * (Assignable + Cc(nil)) * (key"extends" * PreventIndent * ensure(Exp, PopIndent) + C"")^-1 * (ClassBlock + Ct("")) / mark"class",
|
563
|
+
ClassDecl = key"class" * -P":" * (Assignable + Cc(nil)) * (key"extends" * PreventIndent * ensure(Exp, PopIndent) + C"")^-1 * (ClassBlock + Ct("")) / mark"class",
|
556
564
|
|
557
565
|
ClassBlock = SpaceBreak^1 * Advance *
|
558
566
|
Ct(ClassLine * (SpaceBreak^1 * ClassLine)^0) * PopIndent,
|
@@ -575,7 +583,7 @@ local build_grammar = wrap_env(function()
|
|
575
583
|
(key"using" * Ct(NameList + Space * "nil") + Ct"") *
|
576
584
|
sym")" + Ct"" * Ct"",
|
577
585
|
|
578
|
-
FnArgDefList =
|
586
|
+
FnArgDefList = FnArgDef * (sym"," * FnArgDef)^0,
|
579
587
|
FnArgDef = Ct(Name * (sym"=" * Exp)^-1),
|
580
588
|
|
581
589
|
FunLit = FnArgsDef *
|
@@ -583,6 +591,9 @@ local build_grammar = wrap_env(function()
|
|
583
591
|
(Body + Ct"") / mark"fndef",
|
584
592
|
|
585
593
|
NameList = Name * (sym"," * Name)^0,
|
594
|
+
NameOrDestructure = Name + TableLit,
|
595
|
+
AssignableNameList = NameOrDestructure * (sym"," * NameOrDestructure)^0,
|
596
|
+
|
586
597
|
ExpList = Exp * (sym"," * Exp)^0,
|
587
598
|
ExpListLow = Exp * ((sym"," + sym";") * Exp)^0,
|
588
599
|
|
@@ -632,13 +643,16 @@ local build_grammar = wrap_env(function()
|
|
632
643
|
return tree
|
633
644
|
end
|
634
645
|
}
|
635
|
-
|
636
646
|
end)
|
637
647
|
|
638
|
-
|
639
|
-
|
640
|
-
|
641
|
-
|
642
|
-
|
643
|
-
|
648
|
+
return {
|
649
|
+
extract_line = extract_line,
|
650
|
+
|
651
|
+
-- parse a string
|
652
|
+
-- returns tree, or nil and error message
|
653
|
+
string = function (str)
|
654
|
+
local g = build_grammar()
|
655
|
+
return g:match(str)
|
656
|
+
end
|
657
|
+
}
|
644
658
|
|
@@ -0,0 +1,234 @@
|
|
1
|
+
local ntype, mtype, build
|
2
|
+
do
|
3
|
+
local _table_0 = require("moonscript.types")
|
4
|
+
ntype, mtype, build = _table_0.ntype, _table_0.mtype, _table_0.build
|
5
|
+
end
|
6
|
+
local NameProxy
|
7
|
+
do
|
8
|
+
local _table_0 = require("moonscript.transform.names")
|
9
|
+
NameProxy = _table_0.NameProxy
|
10
|
+
end
|
11
|
+
local insert = table.insert
|
12
|
+
local unpack
|
13
|
+
do
|
14
|
+
local _table_0 = require("moonscript.util")
|
15
|
+
unpack = _table_0.unpack
|
16
|
+
end
|
17
|
+
local user_error
|
18
|
+
do
|
19
|
+
local _table_0 = require("moonscript.errors")
|
20
|
+
user_error = _table_0.user_error
|
21
|
+
end
|
22
|
+
local join
|
23
|
+
join = function(...)
|
24
|
+
do
|
25
|
+
local _with_0 = { }
|
26
|
+
local out = _with_0
|
27
|
+
local i = 1
|
28
|
+
local _list_0 = {
|
29
|
+
...
|
30
|
+
}
|
31
|
+
for _index_0 = 1, #_list_0 do
|
32
|
+
local tbl = _list_0[_index_0]
|
33
|
+
local _list_1 = tbl
|
34
|
+
for _index_1 = 1, #_list_1 do
|
35
|
+
local v = _list_1[_index_1]
|
36
|
+
out[i] = v
|
37
|
+
i = i + 1
|
38
|
+
end
|
39
|
+
end
|
40
|
+
return _with_0
|
41
|
+
end
|
42
|
+
end
|
43
|
+
local has_destructure
|
44
|
+
has_destructure = function(names)
|
45
|
+
local _list_0 = names
|
46
|
+
for _index_0 = 1, #_list_0 do
|
47
|
+
local n = _list_0[_index_0]
|
48
|
+
if ntype(n) == "table" then
|
49
|
+
return true
|
50
|
+
end
|
51
|
+
end
|
52
|
+
return false
|
53
|
+
end
|
54
|
+
local extract_assign_names
|
55
|
+
extract_assign_names = function(name, accum, prefix)
|
56
|
+
if accum == nil then
|
57
|
+
accum = { }
|
58
|
+
end
|
59
|
+
if prefix == nil then
|
60
|
+
prefix = { }
|
61
|
+
end
|
62
|
+
local i = 1
|
63
|
+
local _list_0 = name[2]
|
64
|
+
for _index_0 = 1, #_list_0 do
|
65
|
+
local tuple = _list_0[_index_0]
|
66
|
+
local value, suffix
|
67
|
+
if #tuple == 1 then
|
68
|
+
local s = {
|
69
|
+
"index",
|
70
|
+
{
|
71
|
+
"number",
|
72
|
+
i
|
73
|
+
}
|
74
|
+
}
|
75
|
+
i = i + 1
|
76
|
+
value, suffix = tuple[1], s
|
77
|
+
else
|
78
|
+
local key = tuple[1]
|
79
|
+
local s
|
80
|
+
if ntype(key) == "key_literal" then
|
81
|
+
s = {
|
82
|
+
"dot",
|
83
|
+
key[2]
|
84
|
+
}
|
85
|
+
else
|
86
|
+
s = {
|
87
|
+
"index",
|
88
|
+
key
|
89
|
+
}
|
90
|
+
end
|
91
|
+
value, suffix = tuple[2], s
|
92
|
+
end
|
93
|
+
suffix = join(prefix, {
|
94
|
+
suffix
|
95
|
+
})
|
96
|
+
local t = ntype(value)
|
97
|
+
if t == "value" or t == "chain" or t == "self" then
|
98
|
+
insert(accum, {
|
99
|
+
value,
|
100
|
+
suffix
|
101
|
+
})
|
102
|
+
elseif t == "table" then
|
103
|
+
extract_assign_names(value, accum, suffix)
|
104
|
+
else
|
105
|
+
user_error("Can't destructure value of type: " .. tostring(ntype(value)))
|
106
|
+
end
|
107
|
+
end
|
108
|
+
return accum
|
109
|
+
end
|
110
|
+
local build_assign
|
111
|
+
build_assign = function(destruct_literal, receiver)
|
112
|
+
local extracted_names = extract_assign_names(destruct_literal)
|
113
|
+
local names = { }
|
114
|
+
local values = { }
|
115
|
+
local inner = {
|
116
|
+
"assign",
|
117
|
+
names,
|
118
|
+
values
|
119
|
+
}
|
120
|
+
local obj
|
121
|
+
if mtype(receiver) == NameProxy then
|
122
|
+
obj = receiver
|
123
|
+
else
|
124
|
+
do
|
125
|
+
local _with_0 = NameProxy("obj")
|
126
|
+
obj = _with_0
|
127
|
+
inner = build["do"]({
|
128
|
+
build.assign_one(obj, receiver),
|
129
|
+
{
|
130
|
+
"assign",
|
131
|
+
names,
|
132
|
+
values
|
133
|
+
}
|
134
|
+
})
|
135
|
+
obj = _with_0
|
136
|
+
end
|
137
|
+
end
|
138
|
+
local _list_0 = extracted_names
|
139
|
+
for _index_0 = 1, #_list_0 do
|
140
|
+
local tuple = _list_0[_index_0]
|
141
|
+
insert(names, tuple[1])
|
142
|
+
insert(values, obj:chain(unpack(tuple[2])))
|
143
|
+
end
|
144
|
+
return build.group({
|
145
|
+
{
|
146
|
+
"declare",
|
147
|
+
names
|
148
|
+
},
|
149
|
+
inner
|
150
|
+
})
|
151
|
+
end
|
152
|
+
local split_assign
|
153
|
+
split_assign = function(assign)
|
154
|
+
local names, values = unpack(assign, 2)
|
155
|
+
local g = { }
|
156
|
+
local total_names = #names
|
157
|
+
local total_values = #values
|
158
|
+
local start = 1
|
159
|
+
for i, n in ipairs(names) do
|
160
|
+
if ntype(n) == "table" then
|
161
|
+
if i > start then
|
162
|
+
local stop = i - 1
|
163
|
+
insert(g, {
|
164
|
+
"assign",
|
165
|
+
(function()
|
166
|
+
local _accum_0 = { }
|
167
|
+
local _len_0 = 1
|
168
|
+
for i = start, stop do
|
169
|
+
_accum_0[_len_0] = names[i]
|
170
|
+
_len_0 = _len_0 + 1
|
171
|
+
end
|
172
|
+
return _accum_0
|
173
|
+
end)(),
|
174
|
+
(function()
|
175
|
+
local _accum_0 = { }
|
176
|
+
local _len_0 = 1
|
177
|
+
for i = start, stop do
|
178
|
+
_accum_0[_len_0] = values[i]
|
179
|
+
_len_0 = _len_0 + 1
|
180
|
+
end
|
181
|
+
return _accum_0
|
182
|
+
end)()
|
183
|
+
})
|
184
|
+
end
|
185
|
+
insert(g, build_assign(n, values[i]))
|
186
|
+
start = i + 1
|
187
|
+
end
|
188
|
+
end
|
189
|
+
if total_names >= start or total_values >= start then
|
190
|
+
local name_slice
|
191
|
+
if total_names < start then
|
192
|
+
name_slice = {
|
193
|
+
"_"
|
194
|
+
}
|
195
|
+
else
|
196
|
+
name_slice = (function()
|
197
|
+
local _accum_0 = { }
|
198
|
+
local _len_0 = 1
|
199
|
+
for i = start, total_names do
|
200
|
+
_accum_0[_len_0] = names[i]
|
201
|
+
_len_0 = _len_0 + 1
|
202
|
+
end
|
203
|
+
return _accum_0
|
204
|
+
end)()
|
205
|
+
end
|
206
|
+
local value_slice
|
207
|
+
if total_values < start then
|
208
|
+
value_slice = {
|
209
|
+
"nil"
|
210
|
+
}
|
211
|
+
else
|
212
|
+
value_slice = (function()
|
213
|
+
local _accum_0 = { }
|
214
|
+
local _len_0 = 1
|
215
|
+
for i = start, total_values do
|
216
|
+
_accum_0[_len_0] = values[i]
|
217
|
+
_len_0 = _len_0 + 1
|
218
|
+
end
|
219
|
+
return _accum_0
|
220
|
+
end)()
|
221
|
+
end
|
222
|
+
insert(g, {
|
223
|
+
"assign",
|
224
|
+
name_slice,
|
225
|
+
value_slice
|
226
|
+
})
|
227
|
+
end
|
228
|
+
return build.group(g)
|
229
|
+
end
|
230
|
+
return {
|
231
|
+
has_destructure = has_destructure,
|
232
|
+
split_assign = split_assign,
|
233
|
+
build_assign = build_assign
|
234
|
+
}
|