rufus-lua-moon 0.3.2 → 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- 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,115 @@
|
|
1
|
+
local types = require("moonscript.types")
|
2
|
+
local ntype, mtype, is_value, NOOP
|
3
|
+
ntype, mtype, is_value, NOOP = types.ntype, types.mtype, types.is_value, types.NOOP
|
4
|
+
local comprehension_has_value
|
5
|
+
comprehension_has_value = require("moonscript.transform.comprehension").comprehension_has_value
|
6
|
+
local Run
|
7
|
+
do
|
8
|
+
local _class_0
|
9
|
+
local _base_0 = {
|
10
|
+
call = function(self, state)
|
11
|
+
return self.fn(state)
|
12
|
+
end
|
13
|
+
}
|
14
|
+
_base_0.__index = _base_0
|
15
|
+
_class_0 = setmetatable({
|
16
|
+
__init = function(self, fn)
|
17
|
+
self.fn = fn
|
18
|
+
self[1] = "run"
|
19
|
+
end,
|
20
|
+
__base = _base_0,
|
21
|
+
__name = "Run"
|
22
|
+
}, {
|
23
|
+
__index = _base_0,
|
24
|
+
__call = function(cls, ...)
|
25
|
+
local _self_0 = setmetatable({}, _base_0)
|
26
|
+
cls.__init(_self_0, ...)
|
27
|
+
return _self_0
|
28
|
+
end
|
29
|
+
})
|
30
|
+
_base_0.__class = _class_0
|
31
|
+
Run = _class_0
|
32
|
+
end
|
33
|
+
local last_stm
|
34
|
+
last_stm = function(stms)
|
35
|
+
local last_exp_id = 0
|
36
|
+
for i = #stms, 1, -1 do
|
37
|
+
local stm = stms[i]
|
38
|
+
if stm and mtype(stm) ~= Run then
|
39
|
+
if ntype(stm) == "group" then
|
40
|
+
return last_stm(stm[2])
|
41
|
+
end
|
42
|
+
last_exp_id = i
|
43
|
+
break
|
44
|
+
end
|
45
|
+
end
|
46
|
+
return stms[last_exp_id], last_exp_id, stms
|
47
|
+
end
|
48
|
+
local transform_last_stm
|
49
|
+
transform_last_stm = function(stms, fn)
|
50
|
+
local _, last_idx, _stms = last_stm(stms)
|
51
|
+
if _stms ~= stms then
|
52
|
+
error("cannot transform last node in group")
|
53
|
+
end
|
54
|
+
return (function()
|
55
|
+
local _accum_0 = { }
|
56
|
+
local _len_0 = 1
|
57
|
+
for i, stm in ipairs(stms) do
|
58
|
+
if i == last_idx then
|
59
|
+
_accum_0[_len_0] = {
|
60
|
+
"transform",
|
61
|
+
stm,
|
62
|
+
fn
|
63
|
+
}
|
64
|
+
else
|
65
|
+
_accum_0[_len_0] = stm
|
66
|
+
end
|
67
|
+
_len_0 = _len_0 + 1
|
68
|
+
end
|
69
|
+
return _accum_0
|
70
|
+
end)()
|
71
|
+
end
|
72
|
+
local chain_is_stub
|
73
|
+
chain_is_stub = function(chain)
|
74
|
+
local stub = chain[#chain]
|
75
|
+
return stub and ntype(stub) == "colon"
|
76
|
+
end
|
77
|
+
local implicitly_return
|
78
|
+
implicitly_return = function(scope)
|
79
|
+
local is_top = true
|
80
|
+
local fn
|
81
|
+
fn = function(stm)
|
82
|
+
local t = ntype(stm)
|
83
|
+
if t == "decorated" then
|
84
|
+
stm = scope.transform.statement(stm)
|
85
|
+
t = ntype(stm)
|
86
|
+
end
|
87
|
+
if types.cascading[t] then
|
88
|
+
is_top = false
|
89
|
+
return scope.transform.statement(stm, fn)
|
90
|
+
elseif types.manual_return[t] or not is_value(stm) then
|
91
|
+
if is_top and t == "return" and stm[2] == "" then
|
92
|
+
return NOOP
|
93
|
+
else
|
94
|
+
return stm
|
95
|
+
end
|
96
|
+
else
|
97
|
+
if t == "comprehension" and not comprehension_has_value(stm) then
|
98
|
+
return stm
|
99
|
+
else
|
100
|
+
return {
|
101
|
+
"return",
|
102
|
+
stm
|
103
|
+
}
|
104
|
+
end
|
105
|
+
end
|
106
|
+
end
|
107
|
+
return fn
|
108
|
+
end
|
109
|
+
return {
|
110
|
+
Run = Run,
|
111
|
+
last_stm = last_stm,
|
112
|
+
transform_last_stm = transform_last_stm,
|
113
|
+
chain_is_stub = chain_is_stub,
|
114
|
+
implicitly_return = implicitly_return
|
115
|
+
}
|
@@ -0,0 +1,74 @@
|
|
1
|
+
local ntype
|
2
|
+
ntype = require("moonscript.types").ntype
|
3
|
+
local Transformer
|
4
|
+
do
|
5
|
+
local _class_0
|
6
|
+
local _base_0 = {
|
7
|
+
transform_once = function(self, scope, node, ...)
|
8
|
+
if self.seen_nodes[node] then
|
9
|
+
return node
|
10
|
+
end
|
11
|
+
self.seen_nodes[node] = true
|
12
|
+
local transformer = self.transformers[ntype(node)]
|
13
|
+
if transformer then
|
14
|
+
return transformer(scope, node, ...) or node
|
15
|
+
else
|
16
|
+
return node
|
17
|
+
end
|
18
|
+
end,
|
19
|
+
transform = function(self, scope, node, ...)
|
20
|
+
if self.seen_nodes[node] then
|
21
|
+
return node
|
22
|
+
end
|
23
|
+
self.seen_nodes[node] = true
|
24
|
+
while true do
|
25
|
+
local transformer = self.transformers[ntype(node)]
|
26
|
+
local res
|
27
|
+
if transformer then
|
28
|
+
res = transformer(scope, node, ...) or node
|
29
|
+
else
|
30
|
+
res = node
|
31
|
+
end
|
32
|
+
if res == node then
|
33
|
+
return node
|
34
|
+
end
|
35
|
+
node = res
|
36
|
+
end
|
37
|
+
return node
|
38
|
+
end,
|
39
|
+
bind = function(self, scope)
|
40
|
+
return function(...)
|
41
|
+
return self:transform(scope, ...)
|
42
|
+
end
|
43
|
+
end,
|
44
|
+
__call = function(self, ...)
|
45
|
+
return self:transform(...)
|
46
|
+
end,
|
47
|
+
can_transform = function(self, node)
|
48
|
+
return self.transformers[ntype(node)] ~= nil
|
49
|
+
end
|
50
|
+
}
|
51
|
+
_base_0.__index = _base_0
|
52
|
+
_class_0 = setmetatable({
|
53
|
+
__init = function(self, transformers)
|
54
|
+
self.transformers = transformers
|
55
|
+
self.seen_nodes = setmetatable({ }, {
|
56
|
+
__mode = "k"
|
57
|
+
})
|
58
|
+
end,
|
59
|
+
__base = _base_0,
|
60
|
+
__name = "Transformer"
|
61
|
+
}, {
|
62
|
+
__index = _base_0,
|
63
|
+
__call = function(cls, ...)
|
64
|
+
local _self_0 = setmetatable({}, _base_0)
|
65
|
+
cls.__init(_self_0, ...)
|
66
|
+
return _self_0
|
67
|
+
end
|
68
|
+
})
|
69
|
+
_base_0.__class = _class_0
|
70
|
+
Transformer = _class_0
|
71
|
+
end
|
72
|
+
return {
|
73
|
+
Transformer = Transformer
|
74
|
+
}
|
@@ -0,0 +1,265 @@
|
|
1
|
+
local Transformer
|
2
|
+
Transformer = require("moonscript.transform.transformer").Transformer
|
3
|
+
local build, ntype, smart_node
|
4
|
+
do
|
5
|
+
local _obj_0 = require("moonscript.types")
|
6
|
+
build, ntype, smart_node = _obj_0.build, _obj_0.ntype, _obj_0.smart_node
|
7
|
+
end
|
8
|
+
local NameProxy
|
9
|
+
NameProxy = require("moonscript.transform.names").NameProxy
|
10
|
+
local Accumulator, default_accumulator
|
11
|
+
do
|
12
|
+
local _obj_0 = require("moonscript.transform.accumulator")
|
13
|
+
Accumulator, default_accumulator = _obj_0.Accumulator, _obj_0.default_accumulator
|
14
|
+
end
|
15
|
+
local lua_keywords
|
16
|
+
lua_keywords = require("moonscript.data").lua_keywords
|
17
|
+
local Run, transform_last_stm, implicitly_return, chain_is_stub
|
18
|
+
do
|
19
|
+
local _obj_0 = require("moonscript.transform.statements")
|
20
|
+
Run, transform_last_stm, implicitly_return, chain_is_stub = _obj_0.Run, _obj_0.transform_last_stm, _obj_0.implicitly_return, _obj_0.chain_is_stub
|
21
|
+
end
|
22
|
+
local construct_comprehension
|
23
|
+
construct_comprehension = require("moonscript.transform.comprehension").construct_comprehension
|
24
|
+
local insert
|
25
|
+
insert = table.insert
|
26
|
+
local unpack
|
27
|
+
unpack = require("moonscript.util").unpack
|
28
|
+
return Transformer({
|
29
|
+
["for"] = default_accumulator,
|
30
|
+
["while"] = default_accumulator,
|
31
|
+
foreach = default_accumulator,
|
32
|
+
["do"] = function(self, node)
|
33
|
+
return build.block_exp(node[2])
|
34
|
+
end,
|
35
|
+
decorated = function(self, node)
|
36
|
+
return self.transform.statement(node)
|
37
|
+
end,
|
38
|
+
class = function(self, node)
|
39
|
+
return build.block_exp({
|
40
|
+
node
|
41
|
+
})
|
42
|
+
end,
|
43
|
+
string = function(self, node)
|
44
|
+
local delim = node[2]
|
45
|
+
local convert_part
|
46
|
+
convert_part = function(part)
|
47
|
+
if type(part) == "string" or part == nil then
|
48
|
+
return {
|
49
|
+
"string",
|
50
|
+
delim,
|
51
|
+
part or ""
|
52
|
+
}
|
53
|
+
else
|
54
|
+
return build.chain({
|
55
|
+
base = "tostring",
|
56
|
+
{
|
57
|
+
"call",
|
58
|
+
{
|
59
|
+
part[2]
|
60
|
+
}
|
61
|
+
}
|
62
|
+
})
|
63
|
+
end
|
64
|
+
end
|
65
|
+
if #node <= 3 then
|
66
|
+
if type(node[3]) == "string" then
|
67
|
+
return node
|
68
|
+
else
|
69
|
+
return convert_part(node[3])
|
70
|
+
end
|
71
|
+
end
|
72
|
+
local e = {
|
73
|
+
"exp",
|
74
|
+
convert_part(node[3])
|
75
|
+
}
|
76
|
+
for i = 4, #node do
|
77
|
+
insert(e, "..")
|
78
|
+
insert(e, convert_part(node[i]))
|
79
|
+
end
|
80
|
+
return e
|
81
|
+
end,
|
82
|
+
comprehension = function(self, node)
|
83
|
+
local a = Accumulator()
|
84
|
+
node = self.transform.statement(node, function(exp)
|
85
|
+
return a:mutate_body({
|
86
|
+
exp
|
87
|
+
})
|
88
|
+
end)
|
89
|
+
return a:wrap(node)
|
90
|
+
end,
|
91
|
+
tblcomprehension = function(self, node)
|
92
|
+
local _, explist, clauses = unpack(node)
|
93
|
+
local key_exp, value_exp = unpack(explist)
|
94
|
+
local accum = NameProxy("tbl")
|
95
|
+
local inner
|
96
|
+
if value_exp then
|
97
|
+
local dest = build.chain({
|
98
|
+
base = accum,
|
99
|
+
{
|
100
|
+
"index",
|
101
|
+
key_exp
|
102
|
+
}
|
103
|
+
})
|
104
|
+
inner = {
|
105
|
+
build.assign_one(dest, value_exp)
|
106
|
+
}
|
107
|
+
else
|
108
|
+
local key_name, val_name = NameProxy("key"), NameProxy("val")
|
109
|
+
local dest = build.chain({
|
110
|
+
base = accum,
|
111
|
+
{
|
112
|
+
"index",
|
113
|
+
key_name
|
114
|
+
}
|
115
|
+
})
|
116
|
+
inner = {
|
117
|
+
build.assign({
|
118
|
+
names = {
|
119
|
+
key_name,
|
120
|
+
val_name
|
121
|
+
},
|
122
|
+
values = {
|
123
|
+
key_exp
|
124
|
+
}
|
125
|
+
}),
|
126
|
+
build.assign_one(dest, val_name)
|
127
|
+
}
|
128
|
+
end
|
129
|
+
return build.block_exp({
|
130
|
+
build.assign_one(accum, build.table()),
|
131
|
+
construct_comprehension(inner, clauses),
|
132
|
+
accum
|
133
|
+
})
|
134
|
+
end,
|
135
|
+
fndef = function(self, node)
|
136
|
+
smart_node(node)
|
137
|
+
node.body = transform_last_stm(node.body, implicitly_return(self))
|
138
|
+
node.body = {
|
139
|
+
Run(function(self)
|
140
|
+
return self:listen("varargs", function() end)
|
141
|
+
end),
|
142
|
+
unpack(node.body)
|
143
|
+
}
|
144
|
+
return node
|
145
|
+
end,
|
146
|
+
["if"] = function(self, node)
|
147
|
+
return build.block_exp({
|
148
|
+
node
|
149
|
+
})
|
150
|
+
end,
|
151
|
+
unless = function(self, node)
|
152
|
+
return build.block_exp({
|
153
|
+
node
|
154
|
+
})
|
155
|
+
end,
|
156
|
+
with = function(self, node)
|
157
|
+
return build.block_exp({
|
158
|
+
node
|
159
|
+
})
|
160
|
+
end,
|
161
|
+
switch = function(self, node)
|
162
|
+
return build.block_exp({
|
163
|
+
node
|
164
|
+
})
|
165
|
+
end,
|
166
|
+
chain = function(self, node)
|
167
|
+
for i = 2, #node do
|
168
|
+
local part = node[i]
|
169
|
+
if ntype(part) == "dot" and lua_keywords[part[2]] then
|
170
|
+
node[i] = {
|
171
|
+
"index",
|
172
|
+
{
|
173
|
+
"string",
|
174
|
+
'"',
|
175
|
+
part[2]
|
176
|
+
}
|
177
|
+
}
|
178
|
+
end
|
179
|
+
end
|
180
|
+
if ntype(node[2]) == "string" then
|
181
|
+
node[2] = {
|
182
|
+
"parens",
|
183
|
+
node[2]
|
184
|
+
}
|
185
|
+
end
|
186
|
+
if chain_is_stub(node) then
|
187
|
+
local base_name = NameProxy("base")
|
188
|
+
local fn_name = NameProxy("fn")
|
189
|
+
local colon = table.remove(node)
|
190
|
+
local is_super = ntype(node[2]) == "ref" and node[2][2] == "super"
|
191
|
+
return build.block_exp({
|
192
|
+
build.assign({
|
193
|
+
names = {
|
194
|
+
base_name
|
195
|
+
},
|
196
|
+
values = {
|
197
|
+
node
|
198
|
+
}
|
199
|
+
}),
|
200
|
+
build.assign({
|
201
|
+
names = {
|
202
|
+
fn_name
|
203
|
+
},
|
204
|
+
values = {
|
205
|
+
build.chain({
|
206
|
+
base = base_name,
|
207
|
+
{
|
208
|
+
"dot",
|
209
|
+
colon[2]
|
210
|
+
}
|
211
|
+
})
|
212
|
+
}
|
213
|
+
}),
|
214
|
+
build.fndef({
|
215
|
+
args = {
|
216
|
+
{
|
217
|
+
"..."
|
218
|
+
}
|
219
|
+
},
|
220
|
+
body = {
|
221
|
+
build.chain({
|
222
|
+
base = fn_name,
|
223
|
+
{
|
224
|
+
"call",
|
225
|
+
{
|
226
|
+
is_super and "self" or base_name,
|
227
|
+
"..."
|
228
|
+
}
|
229
|
+
}
|
230
|
+
})
|
231
|
+
}
|
232
|
+
})
|
233
|
+
})
|
234
|
+
end
|
235
|
+
end,
|
236
|
+
block_exp = function(self, node)
|
237
|
+
local _, body = unpack(node)
|
238
|
+
local fn = nil
|
239
|
+
local arg_list = { }
|
240
|
+
fn = smart_node(build.fndef({
|
241
|
+
body = {
|
242
|
+
Run(function(self)
|
243
|
+
return self:listen("varargs", function()
|
244
|
+
insert(arg_list, "...")
|
245
|
+
insert(fn.args, {
|
246
|
+
"..."
|
247
|
+
})
|
248
|
+
return self:unlisten("varargs")
|
249
|
+
end)
|
250
|
+
end),
|
251
|
+
unpack(body)
|
252
|
+
}
|
253
|
+
}))
|
254
|
+
return build.chain({
|
255
|
+
base = {
|
256
|
+
"parens",
|
257
|
+
fn
|
258
|
+
},
|
259
|
+
{
|
260
|
+
"call",
|
261
|
+
arg_list
|
262
|
+
}
|
263
|
+
})
|
264
|
+
end
|
265
|
+
})
|