rufus-lua-moon 0.2.4.0 → 0.2.5.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/vendor/lua/moonscript/base.lua +137 -2
- data/vendor/lua/moonscript/cmd/coverage.lua +142 -0
- data/vendor/lua/moonscript/cmd/lint.lua +214 -0
- data/vendor/lua/moonscript/compile.lua +45 -33
- data/vendor/lua/moonscript/compile/statement.lua +1 -4
- data/vendor/lua/moonscript/compile/value.lua +29 -20
- data/vendor/lua/moonscript/data.lua +11 -13
- data/vendor/lua/moonscript/init.lua +3 -112
- data/vendor/lua/moonscript/parse.lua +20 -15
- data/vendor/lua/moonscript/transform.lua +59 -25
- data/vendor/lua/moonscript/transform/destructure.lua +3 -3
- data/vendor/lua/moonscript/transform/names.lua +19 -23
- data/vendor/lua/moonscript/types.lua +6 -0
- data/vendor/lua/moonscript/version.lua +1 -1
- metadata +3 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a7190b583c1d9cf355c5ce5f685513fc19111d18
|
4
|
+
data.tar.gz: 3abbedc70d9db04e7b0b7f5f018d09651d147e48
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e70ba8a5a494e8ee3ff55dc5cf46570b3dd80b91a0261a45525ab9b9dde0730e457454e1381508155ec5a88fffe3acea110051d761b3ff0aef646580b3a6f6a0
|
7
|
+
data.tar.gz: b465395ebe85e03185b25c7d1e50178f8cb2b3d1552c9716f939d30262e7ea16f0c268e1dadcfa03e8906465c4358cb1ec9475c2775eb4c39fc372d5b55c6607
|
@@ -1,2 +1,137 @@
|
|
1
|
-
|
2
|
-
|
1
|
+
local compile = require("moonscript.compile")
|
2
|
+
local parse = require("moonscript.parse")
|
3
|
+
local concat, insert, remove
|
4
|
+
do
|
5
|
+
local _obj_0 = table
|
6
|
+
concat, insert, remove = _obj_0.concat, _obj_0.insert, _obj_0.remove
|
7
|
+
end
|
8
|
+
local split, dump, get_options, unpack
|
9
|
+
do
|
10
|
+
local _obj_0 = require("moonscript.util")
|
11
|
+
split, dump, get_options, unpack = _obj_0.split, _obj_0.dump, _obj_0.get_options, _obj_0.unpack
|
12
|
+
end
|
13
|
+
local lua = {
|
14
|
+
loadstring = loadstring,
|
15
|
+
load = load
|
16
|
+
}
|
17
|
+
local dirsep, line_tables, create_moonpath, to_lua, moon_loader, loadstring, loadfile, dofile, insert_loader, remove_loader
|
18
|
+
dirsep = "/"
|
19
|
+
line_tables = require("moonscript.line_tables")
|
20
|
+
create_moonpath = function(package_path)
|
21
|
+
local paths = split(package_path, ";")
|
22
|
+
for i, path in ipairs(paths) do
|
23
|
+
local p = path:match("^(.-)%.lua$")
|
24
|
+
if p then
|
25
|
+
paths[i] = p .. ".moon"
|
26
|
+
end
|
27
|
+
end
|
28
|
+
return concat(paths, ";")
|
29
|
+
end
|
30
|
+
to_lua = function(text, options)
|
31
|
+
if options == nil then
|
32
|
+
options = { }
|
33
|
+
end
|
34
|
+
if "string" ~= type(text) then
|
35
|
+
local t = type(text)
|
36
|
+
return nil, "expecting string (got " .. t .. ")", 2
|
37
|
+
end
|
38
|
+
local tree, err = parse.string(text)
|
39
|
+
if not tree then
|
40
|
+
return nil, err
|
41
|
+
end
|
42
|
+
local code, ltable, pos = compile.tree(tree, options)
|
43
|
+
if not code then
|
44
|
+
return nil, compile.format_error(ltable, pos, text), 2
|
45
|
+
end
|
46
|
+
return code, ltable
|
47
|
+
end
|
48
|
+
moon_loader = function(name)
|
49
|
+
local name_path = name:gsub("%.", dirsep)
|
50
|
+
local file, file_path
|
51
|
+
local _list_0 = split(package.moonpath, ";")
|
52
|
+
for _index_0 = 1, #_list_0 do
|
53
|
+
local path = _list_0[_index_0]
|
54
|
+
file_path = path:gsub("?", name_path)
|
55
|
+
file = io.open(file_path)
|
56
|
+
if file then
|
57
|
+
break
|
58
|
+
end
|
59
|
+
end
|
60
|
+
if file then
|
61
|
+
local text = file:read("*a")
|
62
|
+
file:close()
|
63
|
+
local res, err = loadstring(text, file_path)
|
64
|
+
if not res then
|
65
|
+
error(file_path .. ": " .. err)
|
66
|
+
end
|
67
|
+
return res
|
68
|
+
end
|
69
|
+
return nil, "Could not find moon file"
|
70
|
+
end
|
71
|
+
loadstring = function(...)
|
72
|
+
local options, str, chunk_name, mode, env = get_options(...)
|
73
|
+
chunk_name = chunk_name or "=(moonscript.loadstring)"
|
74
|
+
local code, ltable_or_err = to_lua(str, options)
|
75
|
+
if not (code) then
|
76
|
+
return nil, ltable_or_err
|
77
|
+
end
|
78
|
+
if chunk_name then
|
79
|
+
line_tables[chunk_name] = ltable_or_err
|
80
|
+
end
|
81
|
+
return (lua.loadstring or lua.load)(code, chunk_name, unpack({
|
82
|
+
mode,
|
83
|
+
env
|
84
|
+
}))
|
85
|
+
end
|
86
|
+
loadfile = function(fname, ...)
|
87
|
+
local file, err = io.open(fname)
|
88
|
+
if not (file) then
|
89
|
+
return nil, err
|
90
|
+
end
|
91
|
+
local text = assert(file:read("*a"))
|
92
|
+
file:close()
|
93
|
+
return loadstring(text, fname, ...)
|
94
|
+
end
|
95
|
+
dofile = function(...)
|
96
|
+
local f = assert(loadfile(...))
|
97
|
+
return f()
|
98
|
+
end
|
99
|
+
insert_loader = function(pos)
|
100
|
+
if pos == nil then
|
101
|
+
pos = 2
|
102
|
+
end
|
103
|
+
if not package.moonpath then
|
104
|
+
package.moonpath = create_moonpath(package.path)
|
105
|
+
end
|
106
|
+
local loaders = package.loaders or package.searchers
|
107
|
+
for _index_0 = 1, #loaders do
|
108
|
+
local loader = loaders[_index_0]
|
109
|
+
if loader == moon_loader then
|
110
|
+
return false
|
111
|
+
end
|
112
|
+
end
|
113
|
+
insert(loaders, pos, moon_loader)
|
114
|
+
return true
|
115
|
+
end
|
116
|
+
remove_loader = function()
|
117
|
+
local loaders = package.loaders or package.searchers
|
118
|
+
for i, loader in ipairs(loaders) do
|
119
|
+
if loader == moon_loader then
|
120
|
+
remove(loaders, i)
|
121
|
+
return true
|
122
|
+
end
|
123
|
+
end
|
124
|
+
return false
|
125
|
+
end
|
126
|
+
return {
|
127
|
+
_NAME = "moonscript",
|
128
|
+
insert_loader = insert_loader,
|
129
|
+
remove_loader = remove_loader,
|
130
|
+
to_lua = to_lua,
|
131
|
+
moon_chunk = moon_chunk,
|
132
|
+
moon_loader = moon_loader,
|
133
|
+
dirsep = dirsep,
|
134
|
+
dofile = dofile,
|
135
|
+
loadfile = loadfile,
|
136
|
+
loadstring = loadstring
|
137
|
+
}
|
@@ -0,0 +1,142 @@
|
|
1
|
+
local log
|
2
|
+
log = function(str)
|
3
|
+
if str == nil then
|
4
|
+
str = ""
|
5
|
+
end
|
6
|
+
return io.stderr:write(str .. "\n")
|
7
|
+
end
|
8
|
+
local create_counter
|
9
|
+
create_counter = function()
|
10
|
+
return setmetatable({ }, {
|
11
|
+
__index = function(self, name)
|
12
|
+
do
|
13
|
+
local tbl = setmetatable({ }, {
|
14
|
+
__index = function(self)
|
15
|
+
return 0
|
16
|
+
end
|
17
|
+
})
|
18
|
+
self[name] = tbl
|
19
|
+
return tbl
|
20
|
+
end
|
21
|
+
end
|
22
|
+
})
|
23
|
+
end
|
24
|
+
local position_to_lines
|
25
|
+
position_to_lines = function(file_content, positions)
|
26
|
+
local lines = { }
|
27
|
+
local current_pos = 0
|
28
|
+
local line_no = 1
|
29
|
+
for char in file_content:gmatch(".") do
|
30
|
+
do
|
31
|
+
local count = rawget(positions, current_pos)
|
32
|
+
if count then
|
33
|
+
lines[line_no] = count
|
34
|
+
end
|
35
|
+
end
|
36
|
+
if char == "\n" then
|
37
|
+
line_no = line_no + 1
|
38
|
+
end
|
39
|
+
current_pos = current_pos + 1
|
40
|
+
end
|
41
|
+
return lines
|
42
|
+
end
|
43
|
+
local format_file
|
44
|
+
format_file = function(fname, positions)
|
45
|
+
local file = assert(io.open(fname))
|
46
|
+
local content = file:read("*a")
|
47
|
+
file:close()
|
48
|
+
local lines = position_to_lines(content, positions)
|
49
|
+
log("------| @" .. tostring(fname))
|
50
|
+
local line_no = 1
|
51
|
+
for line in (content .. "\n"):gmatch("(.-)\n") do
|
52
|
+
local foramtted_no = ("% 5d"):format(line_no)
|
53
|
+
local sym = lines[line_no] and "*" or " "
|
54
|
+
log(tostring(sym) .. tostring(foramtted_no) .. "| " .. tostring(line))
|
55
|
+
line_no = line_no + 1
|
56
|
+
end
|
57
|
+
return log()
|
58
|
+
end
|
59
|
+
local CodeCoverage
|
60
|
+
do
|
61
|
+
local _base_0 = {
|
62
|
+
reset = function(self)
|
63
|
+
self.line_counts = create_counter()
|
64
|
+
end,
|
65
|
+
start = function(self)
|
66
|
+
return debug.sethook((function()
|
67
|
+
local _base_1 = self
|
68
|
+
local _fn_0 = _base_1.process_line
|
69
|
+
return function(...)
|
70
|
+
return _fn_0(_base_1, ...)
|
71
|
+
end
|
72
|
+
end)(), "l")
|
73
|
+
end,
|
74
|
+
stop = function(self)
|
75
|
+
return debug.sethook()
|
76
|
+
end,
|
77
|
+
print_results = function(self)
|
78
|
+
return self:format_results()
|
79
|
+
end,
|
80
|
+
process_line = function(self, _, line_no)
|
81
|
+
local debug_data = debug.getinfo(2, "S")
|
82
|
+
local source = debug_data.source
|
83
|
+
self.line_counts[source][line_no] = self.line_counts[source][line_no] + 1
|
84
|
+
end,
|
85
|
+
format_results = function(self)
|
86
|
+
local line_table = require("moonscript.line_tables")
|
87
|
+
local positions = create_counter()
|
88
|
+
for file, lines in pairs(self.line_counts) do
|
89
|
+
local _continue_0 = false
|
90
|
+
repeat
|
91
|
+
local file_table = line_table[file]
|
92
|
+
if not (file_table) then
|
93
|
+
_continue_0 = true
|
94
|
+
break
|
95
|
+
end
|
96
|
+
for line, count in pairs(lines) do
|
97
|
+
local _continue_1 = false
|
98
|
+
repeat
|
99
|
+
local position = file_table[line]
|
100
|
+
if not (position) then
|
101
|
+
_continue_1 = true
|
102
|
+
break
|
103
|
+
end
|
104
|
+
positions[file][position] = positions[file][position] + count
|
105
|
+
_continue_1 = true
|
106
|
+
until true
|
107
|
+
if not _continue_1 then
|
108
|
+
break
|
109
|
+
end
|
110
|
+
end
|
111
|
+
_continue_0 = true
|
112
|
+
until true
|
113
|
+
if not _continue_0 then
|
114
|
+
break
|
115
|
+
end
|
116
|
+
end
|
117
|
+
for file, ps in pairs(positions) do
|
118
|
+
format_file(file, ps)
|
119
|
+
end
|
120
|
+
end
|
121
|
+
}
|
122
|
+
_base_0.__index = _base_0
|
123
|
+
local _class_0 = setmetatable({
|
124
|
+
__init = function(self)
|
125
|
+
return self:reset()
|
126
|
+
end,
|
127
|
+
__base = _base_0,
|
128
|
+
__name = "CodeCoverage"
|
129
|
+
}, {
|
130
|
+
__index = _base_0,
|
131
|
+
__call = function(cls, ...)
|
132
|
+
local _self_0 = setmetatable({}, _base_0)
|
133
|
+
cls.__init(_self_0, ...)
|
134
|
+
return _self_0
|
135
|
+
end
|
136
|
+
})
|
137
|
+
_base_0.__class = _class_0
|
138
|
+
CodeCoverage = _class_0
|
139
|
+
end
|
140
|
+
return {
|
141
|
+
CodeCoverage = CodeCoverage
|
142
|
+
}
|
@@ -0,0 +1,214 @@
|
|
1
|
+
local insert
|
2
|
+
do
|
3
|
+
local _obj_0 = table
|
4
|
+
insert = _obj_0.insert
|
5
|
+
end
|
6
|
+
local Set
|
7
|
+
do
|
8
|
+
local _obj_0 = require("moonscript.data")
|
9
|
+
Set = _obj_0.Set
|
10
|
+
end
|
11
|
+
local Block
|
12
|
+
do
|
13
|
+
local _obj_0 = require("moonscript.compile")
|
14
|
+
Block = _obj_0.Block
|
15
|
+
end
|
16
|
+
local default_whitelist = Set({
|
17
|
+
'_G',
|
18
|
+
'_VERSION',
|
19
|
+
'assert',
|
20
|
+
'bit32',
|
21
|
+
'collectgarbage',
|
22
|
+
'coroutine',
|
23
|
+
'debug',
|
24
|
+
'dofile',
|
25
|
+
'error',
|
26
|
+
'getfenv',
|
27
|
+
'getmetatable',
|
28
|
+
'io',
|
29
|
+
'ipairs',
|
30
|
+
'load',
|
31
|
+
'loadfile',
|
32
|
+
'loadstring',
|
33
|
+
'math',
|
34
|
+
'module',
|
35
|
+
'next',
|
36
|
+
'os',
|
37
|
+
'package',
|
38
|
+
'pairs',
|
39
|
+
'pcall',
|
40
|
+
'print',
|
41
|
+
'rawequal',
|
42
|
+
'rawget',
|
43
|
+
'rawlen',
|
44
|
+
'rawset',
|
45
|
+
'require',
|
46
|
+
'select',
|
47
|
+
'setfenv',
|
48
|
+
'setmetatable',
|
49
|
+
'string',
|
50
|
+
'table',
|
51
|
+
'tonumber',
|
52
|
+
'tostring',
|
53
|
+
'type',
|
54
|
+
'unpack',
|
55
|
+
'xpcall',
|
56
|
+
"nil",
|
57
|
+
"true",
|
58
|
+
"false"
|
59
|
+
})
|
60
|
+
local LinterBlock
|
61
|
+
do
|
62
|
+
local _parent_0 = Block
|
63
|
+
local _base_0 = {
|
64
|
+
block = function(self, ...)
|
65
|
+
do
|
66
|
+
local _with_0 = _parent_0.block(self, ...)
|
67
|
+
_with_0.block = self.block
|
68
|
+
_with_0.value_compilers = self.value_compilers
|
69
|
+
return _with_0
|
70
|
+
end
|
71
|
+
end
|
72
|
+
}
|
73
|
+
_base_0.__index = _base_0
|
74
|
+
setmetatable(_base_0, _parent_0.__base)
|
75
|
+
local _class_0 = setmetatable({
|
76
|
+
__init = function(self, whitelist_globals, ...)
|
77
|
+
if whitelist_globals == nil then
|
78
|
+
whitelist_globals = default_whitelist
|
79
|
+
end
|
80
|
+
_parent_0.__init(self, ...)
|
81
|
+
self.lint_errors = { }
|
82
|
+
local vc = self.value_compilers
|
83
|
+
self.value_compilers = setmetatable({
|
84
|
+
ref = function(block, val)
|
85
|
+
local name = val[2]
|
86
|
+
if not (block:has_name(name) or whitelist_globals[name] or name:match("%.")) then
|
87
|
+
insert(self.lint_errors, {
|
88
|
+
"accessing global " .. tostring(name),
|
89
|
+
val[-1]
|
90
|
+
})
|
91
|
+
end
|
92
|
+
return vc.ref(block, val)
|
93
|
+
end
|
94
|
+
}, {
|
95
|
+
__index = vc
|
96
|
+
})
|
97
|
+
end,
|
98
|
+
__base = _base_0,
|
99
|
+
__name = "LinterBlock",
|
100
|
+
__parent = _parent_0
|
101
|
+
}, {
|
102
|
+
__index = function(cls, name)
|
103
|
+
local val = rawget(_base_0, name)
|
104
|
+
if val == nil then
|
105
|
+
return _parent_0[name]
|
106
|
+
else
|
107
|
+
return val
|
108
|
+
end
|
109
|
+
end,
|
110
|
+
__call = function(cls, ...)
|
111
|
+
local _self_0 = setmetatable({}, _base_0)
|
112
|
+
cls.__init(_self_0, ...)
|
113
|
+
return _self_0
|
114
|
+
end
|
115
|
+
})
|
116
|
+
_base_0.__class = _class_0
|
117
|
+
if _parent_0.__inherited then
|
118
|
+
_parent_0.__inherited(_parent_0, _class_0)
|
119
|
+
end
|
120
|
+
LinterBlock = _class_0
|
121
|
+
end
|
122
|
+
local format_lint
|
123
|
+
format_lint = function(errors, code, header)
|
124
|
+
if not (next(errors)) then
|
125
|
+
return
|
126
|
+
end
|
127
|
+
local pos_to_line, get_line
|
128
|
+
do
|
129
|
+
local _obj_0 = require("moonscript.util")
|
130
|
+
pos_to_line, get_line = _obj_0.pos_to_line, _obj_0.get_line
|
131
|
+
end
|
132
|
+
local formatted
|
133
|
+
do
|
134
|
+
local _accum_0 = { }
|
135
|
+
local _len_0 = 1
|
136
|
+
for _index_0 = 1, #errors do
|
137
|
+
local _des_0 = errors[_index_0]
|
138
|
+
local msg, pos
|
139
|
+
msg, pos = _des_0[1], _des_0[2]
|
140
|
+
if pos then
|
141
|
+
local line = pos_to_line(code, pos)
|
142
|
+
msg = "line " .. tostring(line) .. ": " .. tostring(msg)
|
143
|
+
local line_text = "> " .. get_line(code, line)
|
144
|
+
local sep_len = math.max(#msg, #line_text)
|
145
|
+
_accum_0[_len_0] = table.concat({
|
146
|
+
msg,
|
147
|
+
("="):rep(sep_len),
|
148
|
+
line_text
|
149
|
+
}, "\n")
|
150
|
+
else
|
151
|
+
_accum_0[_len_0] = msg
|
152
|
+
end
|
153
|
+
_len_0 = _len_0 + 1
|
154
|
+
end
|
155
|
+
formatted = _accum_0
|
156
|
+
end
|
157
|
+
if header then
|
158
|
+
table.insert(formatted, 1, header)
|
159
|
+
end
|
160
|
+
return table.concat(formatted, "\n\n")
|
161
|
+
end
|
162
|
+
local whitelist_for_file
|
163
|
+
do
|
164
|
+
local lint_config
|
165
|
+
whitelist_for_file = function(fname)
|
166
|
+
if not (lint_config) then
|
167
|
+
lint_config = { }
|
168
|
+
pcall(function()
|
169
|
+
lint_config = require("lint_config")
|
170
|
+
end)
|
171
|
+
end
|
172
|
+
if not (lint_config.whitelist_globals) then
|
173
|
+
return default_whitelist
|
174
|
+
end
|
175
|
+
local final_list = { }
|
176
|
+
for pattern, list in pairs(lint_config.whitelist_globals) do
|
177
|
+
if fname:match(pattern) then
|
178
|
+
for _index_0 = 1, #list do
|
179
|
+
local item = list[_index_0]
|
180
|
+
insert(final_list, item)
|
181
|
+
end
|
182
|
+
end
|
183
|
+
end
|
184
|
+
return setmetatable(Set(final_list), {
|
185
|
+
__index = default_whitelist
|
186
|
+
})
|
187
|
+
end
|
188
|
+
end
|
189
|
+
local lint_code
|
190
|
+
lint_code = function(code, name, whitelist_globals)
|
191
|
+
if name == nil then
|
192
|
+
name = "string input"
|
193
|
+
end
|
194
|
+
local parse = require("moonscript.parse")
|
195
|
+
local tree, err = parse.string(code)
|
196
|
+
if not (tree) then
|
197
|
+
return nil, err
|
198
|
+
end
|
199
|
+
local scope = LinterBlock(whitelist_globals)
|
200
|
+
scope:stms(tree)
|
201
|
+
return format_lint(scope.lint_errors, code, name)
|
202
|
+
end
|
203
|
+
local lint_file
|
204
|
+
lint_file = function(fname)
|
205
|
+
local f, err = io.open(fname)
|
206
|
+
if not (f) then
|
207
|
+
return nil, err
|
208
|
+
end
|
209
|
+
return lint_code(f:read("*a"), fname, whitelist_for_file(fname))
|
210
|
+
end
|
211
|
+
return {
|
212
|
+
lint_code = lint_code,
|
213
|
+
lint_file = lint_file
|
214
|
+
}
|
@@ -16,16 +16,8 @@ do
|
|
16
16
|
local _obj_0 = require("moonscript.types")
|
17
17
|
ntype, has_value = _obj_0.ntype, _obj_0.has_value
|
18
18
|
end
|
19
|
-
local statement_compilers
|
20
|
-
|
21
|
-
local _obj_0 = require("moonscript.compile.statement")
|
22
|
-
statement_compilers = _obj_0.statement_compilers
|
23
|
-
end
|
24
|
-
local value_compilers
|
25
|
-
do
|
26
|
-
local _obj_0 = require("moonscript.compile.value")
|
27
|
-
value_compilers = _obj_0.value_compilers
|
28
|
-
end
|
19
|
+
local statement_compilers = require("moonscript.compile.statement")
|
20
|
+
local value_compilers = require("moonscript.compile.value")
|
29
21
|
local concat, insert
|
30
22
|
do
|
31
23
|
local _obj_0 = table
|
@@ -69,6 +61,9 @@ do
|
|
69
61
|
local _exp_0 = mtype(l)
|
70
62
|
if "string" == _exp_0 or DelayedLine == _exp_0 then
|
71
63
|
line_no = line_no + 1
|
64
|
+
for _ in l:gmatch("\n") do
|
65
|
+
line_no = line_no + 1
|
66
|
+
end
|
72
67
|
out[line_no] = posmap[i]
|
73
68
|
elseif Lines == _exp_0 then
|
74
69
|
local _
|
@@ -271,6 +266,7 @@ do
|
|
271
266
|
footer = "end",
|
272
267
|
export_all = false,
|
273
268
|
export_proper = false,
|
269
|
+
value_compilers = value_compilers,
|
274
270
|
__tostring = function(self)
|
275
271
|
local h
|
276
272
|
if "string" == type(self.header) then
|
@@ -320,6 +316,8 @@ do
|
|
320
316
|
real_name = name:get_name(self)
|
321
317
|
elseif NameProxy == _exp_0 then
|
322
318
|
real_name = name:get_name(self)
|
319
|
+
elseif "table" == _exp_0 then
|
320
|
+
real_name = name[1] == "ref" and name[2]
|
323
321
|
elseif "string" == _exp_0 then
|
324
322
|
real_name = name
|
325
323
|
end
|
@@ -387,8 +385,10 @@ do
|
|
387
385
|
if t == NameProxy or t == LocalName then
|
388
386
|
return true
|
389
387
|
end
|
390
|
-
if t == "table"
|
391
|
-
|
388
|
+
if t == "table" then
|
389
|
+
if node[1] == "ref" or (node[1] == "chain" and #node == 2) then
|
390
|
+
return self:is_local(node[2])
|
391
|
+
end
|
392
392
|
end
|
393
393
|
return false
|
394
394
|
end,
|
@@ -459,10 +459,14 @@ do
|
|
459
459
|
end,
|
460
460
|
is_value = function(self, node)
|
461
461
|
local t = ntype(node)
|
462
|
-
return value_compilers[t] ~= nil or t == "value"
|
462
|
+
return self.value_compilers[t] ~= nil or t == "value"
|
463
463
|
end,
|
464
464
|
name = function(self, node, ...)
|
465
|
-
|
465
|
+
if type(node) == "string" then
|
466
|
+
return node
|
467
|
+
else
|
468
|
+
return self:value(node, ...)
|
469
|
+
end
|
466
470
|
end,
|
467
471
|
value = function(self, node, ...)
|
468
472
|
node = self.transform.value(node)
|
@@ -472,9 +476,13 @@ do
|
|
472
476
|
else
|
473
477
|
action = node[1]
|
474
478
|
end
|
475
|
-
local fn = value_compilers[action]
|
476
|
-
if not fn then
|
477
|
-
error(
|
479
|
+
local fn = self.value_compilers[action]
|
480
|
+
if not (fn) then
|
481
|
+
error({
|
482
|
+
"compile-error",
|
483
|
+
"Failed to find value compiler for: " .. dump.value(node),
|
484
|
+
node[-1]
|
485
|
+
})
|
478
486
|
end
|
479
487
|
local out = fn(self, node, ...)
|
480
488
|
if type(node) == "table" and node[-1] then
|
@@ -658,13 +666,17 @@ do
|
|
658
666
|
end
|
659
667
|
local format_error
|
660
668
|
format_error = function(msg, pos, file_str)
|
661
|
-
local
|
662
|
-
|
663
|
-
|
664
|
-
|
669
|
+
local line_message
|
670
|
+
if pos then
|
671
|
+
local line = pos_to_line(file_str, pos)
|
672
|
+
local line_str
|
673
|
+
line_str, line = get_closest_line(file_str, line)
|
674
|
+
line_str = line_str or ""
|
675
|
+
line_message = (" [%d] >> %s"):format(line, trim(line_str))
|
676
|
+
end
|
665
677
|
return concat({
|
666
678
|
"Compile error: " .. msg,
|
667
|
-
|
679
|
+
line_message
|
668
680
|
}, "\n")
|
669
681
|
end
|
670
682
|
local value
|
@@ -688,27 +700,27 @@ tree = function(tree, options)
|
|
688
700
|
return scope:root_stms(tree)
|
689
701
|
end)
|
690
702
|
local success, err = coroutine.resume(runner)
|
691
|
-
if not success then
|
692
|
-
local error_msg
|
703
|
+
if not (success) then
|
704
|
+
local error_msg, error_pos
|
693
705
|
if type(err) == "table" then
|
694
706
|
local error_type = err[1]
|
695
|
-
|
696
|
-
|
707
|
+
local _exp_0 = err[1]
|
708
|
+
if "user-error" == _exp_0 or "compile-error" == _exp_0 then
|
709
|
+
error_msg, error_pos = unpack(err, 2)
|
697
710
|
else
|
698
|
-
error_msg = error("Unknown error thrown", util.dump(error_msg))
|
711
|
+
error_msg, error_pos = error("Unknown error thrown", util.dump(error_msg))
|
699
712
|
end
|
700
713
|
else
|
701
|
-
error_msg = concat({
|
714
|
+
error_msg, error_pos = concat({
|
702
715
|
err,
|
703
716
|
debug.traceback(runner)
|
704
717
|
}, "\n")
|
705
718
|
end
|
706
|
-
return nil, error_msg, scope.last_pos
|
707
|
-
else
|
708
|
-
local lua_code = scope:render()
|
709
|
-
local posmap = scope._lines:flatten_posmap()
|
710
|
-
return lua_code, posmap
|
719
|
+
return nil, error_msg, error_pos or scope.last_pos
|
711
720
|
end
|
721
|
+
local lua_code = scope:render()
|
722
|
+
local posmap = scope._lines:flatten_posmap()
|
723
|
+
return lua_code, posmap
|
712
724
|
end
|
713
725
|
do
|
714
726
|
local data = require("moonscript.data")
|
@@ -12,7 +12,7 @@ do
|
|
12
12
|
local _obj_0 = table
|
13
13
|
concat, insert = _obj_0.concat, _obj_0.insert
|
14
14
|
end
|
15
|
-
|
15
|
+
return {
|
16
16
|
raw = function(self, node)
|
17
17
|
return self:add(node[2])
|
18
18
|
end,
|
@@ -243,6 +243,3 @@ local statement_compilers = {
|
|
243
243
|
end,
|
244
244
|
noop = function(self) end
|
245
245
|
}
|
246
|
-
return {
|
247
|
-
statement_compilers = statement_compilers
|
248
|
-
}
|
@@ -22,7 +22,7 @@ local string_chars = {
|
|
22
22
|
["\r"] = "\\r",
|
23
23
|
["\n"] = "\\n"
|
24
24
|
}
|
25
|
-
|
25
|
+
return {
|
26
26
|
exp = function(self, node)
|
27
27
|
local _comp
|
28
28
|
_comp = function(i, value)
|
@@ -76,15 +76,20 @@ local value_compilers = {
|
|
76
76
|
end,
|
77
77
|
chain = function(self, node)
|
78
78
|
local callee = node[2]
|
79
|
+
local callee_type = ntype(callee)
|
79
80
|
if callee == -1 then
|
80
81
|
callee = self:get("scope_var")
|
81
82
|
if not callee then
|
82
83
|
user_error("Short-dot syntax must be called within a with block")
|
83
84
|
end
|
84
85
|
end
|
85
|
-
|
86
|
-
|
87
|
-
|
86
|
+
if callee_type == "ref" and callee[2] == "super" or callee == "super" then
|
87
|
+
do
|
88
|
+
local sup = self:get("super")
|
89
|
+
if sup then
|
90
|
+
return self:value(sup(self, node))
|
91
|
+
end
|
92
|
+
end
|
88
93
|
end
|
89
94
|
local chain_item
|
90
95
|
chain_item = function(node)
|
@@ -100,12 +105,11 @@ local value_compilers = {
|
|
100
105
|
elseif t == "colon_stub" then
|
101
106
|
return user_error("Uncalled colon stub")
|
102
107
|
else
|
103
|
-
return error("Unknown chain action: " .. t)
|
108
|
+
return error("Unknown chain action: " .. tostring(t))
|
104
109
|
end
|
105
110
|
end
|
106
|
-
|
107
|
-
|
108
|
-
callee[1] = t .. "_colon"
|
111
|
+
if (callee_type == "self" or callee_type == "self_class") and node[3] and ntype(node[3]) == "call" then
|
112
|
+
callee[1] = callee_type .. "_colon"
|
109
113
|
end
|
110
114
|
local callee_value = self:value(callee)
|
111
115
|
if ntype(callee) == "exp" then
|
@@ -172,7 +176,10 @@ local value_compilers = {
|
|
172
176
|
'if',
|
173
177
|
{
|
174
178
|
'exp',
|
175
|
-
|
179
|
+
{
|
180
|
+
"ref",
|
181
|
+
name
|
182
|
+
},
|
176
183
|
'==',
|
177
184
|
'nil'
|
178
185
|
},
|
@@ -282,28 +289,30 @@ local value_compilers = {
|
|
282
289
|
return self:line("not ", self:value(node[2]))
|
283
290
|
end,
|
284
291
|
self = function(self, node)
|
285
|
-
return "self." .. self:
|
292
|
+
return "self." .. self:name(node[2])
|
286
293
|
end,
|
287
294
|
self_class = function(self, node)
|
288
|
-
return "self.__class." .. self:
|
295
|
+
return "self.__class." .. self:name(node[2])
|
289
296
|
end,
|
290
297
|
self_colon = function(self, node)
|
291
|
-
return "self:" .. self:
|
298
|
+
return "self:" .. self:name(node[2])
|
292
299
|
end,
|
293
300
|
self_class_colon = function(self, node)
|
294
|
-
return "self.__class:" .. self:
|
301
|
+
return "self.__class:" .. self:name(node[2])
|
295
302
|
end,
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
303
|
+
ref = function(self, value)
|
304
|
+
do
|
305
|
+
local sup = value[2] == "super" and self:get("super")
|
306
|
+
if sup then
|
307
|
+
return self:value(sup(self))
|
308
|
+
end
|
300
309
|
end
|
310
|
+
return tostring(value[2])
|
311
|
+
end,
|
312
|
+
raw_value = function(self, value)
|
301
313
|
if value == "..." then
|
302
314
|
self:send("varargs")
|
303
315
|
end
|
304
316
|
return tostring(value)
|
305
317
|
end
|
306
318
|
}
|
307
|
-
return {
|
308
|
-
value_compilers = value_compilers
|
309
|
-
}
|
@@ -5,12 +5,12 @@ do
|
|
5
5
|
end
|
6
6
|
local Set
|
7
7
|
Set = function(items)
|
8
|
-
local
|
8
|
+
local _tbl_0 = { }
|
9
9
|
for _index_0 = 1, #items do
|
10
|
-
local
|
11
|
-
|
10
|
+
local k = items[_index_0]
|
11
|
+
_tbl_0[k] = true
|
12
12
|
end
|
13
|
-
return
|
13
|
+
return _tbl_0
|
14
14
|
end
|
15
15
|
local Stack
|
16
16
|
do
|
@@ -21,9 +21,13 @@ do
|
|
21
21
|
pop = function(self)
|
22
22
|
return remove(self)
|
23
23
|
end,
|
24
|
-
push = function(self, value)
|
24
|
+
push = function(self, value, ...)
|
25
25
|
insert(self, value)
|
26
|
-
|
26
|
+
if ... then
|
27
|
+
return self:push(...)
|
28
|
+
else
|
29
|
+
return value
|
30
|
+
end
|
27
31
|
end,
|
28
32
|
top = function(self)
|
29
33
|
return self[#self]
|
@@ -32,13 +36,7 @@ do
|
|
32
36
|
_base_0.__index = _base_0
|
33
37
|
local _class_0 = setmetatable({
|
34
38
|
__init = function(self, ...)
|
35
|
-
|
36
|
-
...
|
37
|
-
}
|
38
|
-
for _index_0 = 1, #_list_0 do
|
39
|
-
local v = _list_0[_index_0]
|
40
|
-
self:push(v)
|
41
|
-
end
|
39
|
+
self:push(...)
|
42
40
|
return nil
|
43
41
|
end,
|
44
42
|
__base = _base_0,
|
@@ -1,114 +1,5 @@
|
|
1
|
-
local compile = require("moonscript.compile")
|
2
|
-
local parse = require("moonscript.parse")
|
3
|
-
local concat, insert
|
4
1
|
do
|
5
|
-
local
|
6
|
-
|
2
|
+
local _with_0 = require("moonscript.base")
|
3
|
+
_with_0.insert_loader()
|
4
|
+
return _with_0
|
7
5
|
end
|
8
|
-
local split, dump, get_options, unpack
|
9
|
-
do
|
10
|
-
local _obj_0 = require("moonscript.util")
|
11
|
-
split, dump, get_options, unpack = _obj_0.split, _obj_0.dump, _obj_0.get_options, _obj_0.unpack
|
12
|
-
end
|
13
|
-
local lua = {
|
14
|
-
loadstring = loadstring,
|
15
|
-
load = load
|
16
|
-
}
|
17
|
-
local dirsep, line_tables, create_moonpath, to_lua, moon_loader, init_loader, loadstring, loadfile, dofile
|
18
|
-
dirsep = "/"
|
19
|
-
line_tables = require("moonscript.line_tables")
|
20
|
-
create_moonpath = function(package_path)
|
21
|
-
local paths = split(package_path, ";")
|
22
|
-
for i, path in ipairs(paths) do
|
23
|
-
local p = path:match("^(.-)%.lua$")
|
24
|
-
if p then
|
25
|
-
paths[i] = p .. ".moon"
|
26
|
-
end
|
27
|
-
end
|
28
|
-
return concat(paths, ";")
|
29
|
-
end
|
30
|
-
to_lua = function(text, options)
|
31
|
-
if options == nil then
|
32
|
-
options = { }
|
33
|
-
end
|
34
|
-
if "string" ~= type(text) then
|
35
|
-
local t = type(text)
|
36
|
-
return nil, "expecting string (got " .. t .. ")", 2
|
37
|
-
end
|
38
|
-
local tree, err = parse.string(text)
|
39
|
-
if not tree then
|
40
|
-
return nil, err
|
41
|
-
end
|
42
|
-
local code, ltable, pos = compile.tree(tree, options)
|
43
|
-
if not code then
|
44
|
-
return nil, compile.format_error(ltable, pos, text), 2
|
45
|
-
end
|
46
|
-
return code, ltable
|
47
|
-
end
|
48
|
-
moon_loader = function(name)
|
49
|
-
local name_path = name:gsub("%.", dirsep)
|
50
|
-
local file, file_path
|
51
|
-
local _list_0 = split(package.moonpath, ";")
|
52
|
-
for _index_0 = 1, #_list_0 do
|
53
|
-
local path = _list_0[_index_0]
|
54
|
-
file_path = path:gsub("?", name_path)
|
55
|
-
file = io.open(file_path)
|
56
|
-
if file then
|
57
|
-
break
|
58
|
-
end
|
59
|
-
end
|
60
|
-
if file then
|
61
|
-
local text = file:read("*a")
|
62
|
-
file:close()
|
63
|
-
return loadstring(text, file_path)
|
64
|
-
else
|
65
|
-
return nil, "Could not find moon file"
|
66
|
-
end
|
67
|
-
end
|
68
|
-
if not package.moonpath then
|
69
|
-
package.moonpath = create_moonpath(package.path)
|
70
|
-
end
|
71
|
-
init_loader = function()
|
72
|
-
return insert(package.loaders or package.searchers, 2, moon_loader)
|
73
|
-
end
|
74
|
-
if not (_G.moon_no_loader) then
|
75
|
-
init_loader()
|
76
|
-
end
|
77
|
-
loadstring = function(...)
|
78
|
-
local options, str, chunk_name, mode, env = get_options(...)
|
79
|
-
chunk_name = chunk_name or "=(moonscript.loadstring)"
|
80
|
-
local code, ltable_or_err = to_lua(str, options)
|
81
|
-
if not (code) then
|
82
|
-
return nil, ltable_or_err
|
83
|
-
end
|
84
|
-
if chunk_name then
|
85
|
-
line_tables[chunk_name] = ltable_or_err
|
86
|
-
end
|
87
|
-
return (lua.loadstring or lua.load)(code, chunk_name, unpack({
|
88
|
-
mode,
|
89
|
-
env
|
90
|
-
}))
|
91
|
-
end
|
92
|
-
loadfile = function(fname, ...)
|
93
|
-
local file, err = io.open(fname)
|
94
|
-
if not (file) then
|
95
|
-
return nil, err
|
96
|
-
end
|
97
|
-
local text = assert(file:read("*a"))
|
98
|
-
file:close()
|
99
|
-
return loadstring(text, fname, ...)
|
100
|
-
end
|
101
|
-
dofile = function(...)
|
102
|
-
local f = assert(loadfile(...))
|
103
|
-
return f()
|
104
|
-
end
|
105
|
-
return {
|
106
|
-
_NAME = "moonscript",
|
107
|
-
to_lua = to_lua,
|
108
|
-
moon_chunk = moon_chunk,
|
109
|
-
moon_loader = moon_loader,
|
110
|
-
dirsep = dirsep,
|
111
|
-
dofile = dofile,
|
112
|
-
loadfile = loadfile,
|
113
|
-
loadstring = loadstring
|
114
|
-
}
|
@@ -51,7 +51,8 @@ local AlphaNum = R("az", "AZ", "09", "__")
|
|
51
51
|
local _Name = C(R("az", "AZ", "__") * AlphaNum^0)
|
52
52
|
local Name = Space * _Name
|
53
53
|
|
54
|
-
local Num = P"0x" * R("09", "af", "AF")^1 +
|
54
|
+
local Num = P"0x" * R("09", "af", "AF")^1 * (S"uU"^-1 * S"lL"^2)^-1 +
|
55
|
+
R"09"^1 * (S"uU"^-1 * S"lL"^2) +
|
55
56
|
(
|
56
57
|
R"09"^1 * (P"." * R"09"^1)^-1 +
|
57
58
|
P"." * R"09"^1
|
@@ -174,8 +175,12 @@ end
|
|
174
175
|
local _chain_assignable = { index = true, dot = true, slice = true }
|
175
176
|
|
176
177
|
local function is_assignable(node)
|
178
|
+
if node == "..." then
|
179
|
+
return false
|
180
|
+
end
|
181
|
+
|
177
182
|
local t = ntype(node)
|
178
|
-
return t == "self" or t == "value" or t == "self_class" or
|
183
|
+
return t == "ref" or t == "self" or t == "value" or t == "self_class" or
|
179
184
|
t == "chain" and _chain_assignable[ntype(node[#node])] or
|
180
185
|
t == "table"
|
181
186
|
end
|
@@ -378,8 +383,7 @@ local build_grammar = wrap_env(function()
|
|
378
383
|
_Name / mark"self" + Cc"self")
|
379
384
|
|
380
385
|
local KeyName = SelfName + Space * _Name / mark"key_literal"
|
381
|
-
|
382
|
-
local Name = SelfName + Name + Space * "..." / trim
|
386
|
+
local VarArg = Space * P"..." / trim
|
383
387
|
|
384
388
|
local g = lpeg.P{
|
385
389
|
File,
|
@@ -413,8 +417,6 @@ local build_grammar = wrap_env(function()
|
|
413
417
|
ImportName = (sym"\\" * Ct(Cc"colon_stub" * Name) + Name),
|
414
418
|
ImportNameList = SpaceBreak^0 * ImportName * ((SpaceBreak^1 + sym"," * SpaceBreak^0) * ImportName)^0,
|
415
419
|
|
416
|
-
NameList = Name * (sym"," * Name)^0,
|
417
|
-
|
418
420
|
BreakLoop = Ct(key"break"/trim) + Ct(key"continue"/trim),
|
419
421
|
|
420
422
|
Return = key"return" * (ExpListLow/mark"explist" + C"") / mark"return",
|
@@ -461,8 +463,7 @@ local build_grammar = wrap_env(function()
|
|
461
463
|
-- we can ignore precedence for now
|
462
464
|
OtherOps = op"or" + op"and" + op"<=" + op">=" + op"~=" + op"!=" + op"==" + op".." + op"<" + op">",
|
463
465
|
|
464
|
-
Assignable = Cmt(DotChain + Chain, check_assignable) + Name,
|
465
|
-
AssignableList = Assignable * (sym"," * Assignable)^0,
|
466
|
+
Assignable = Cmt(DotChain + Chain, check_assignable) + Name + SelfName,
|
466
467
|
|
467
468
|
Exp = Ct(Value * ((OtherOps + FactorOp + TermOp) * Value)^0) / flatten_or_mark"exp",
|
468
469
|
|
@@ -511,7 +512,7 @@ local build_grammar = wrap_env(function()
|
|
511
512
|
LuaStringOpen = sym"[" * P"="^0 * "[" / trim,
|
512
513
|
LuaStringClose = "]" * P"="^0 * "]",
|
513
514
|
|
514
|
-
Callable = Name + Parens / mark"parens",
|
515
|
+
Callable = pos(Name / mark"ref") + SelfName + VarArg + Parens / mark"parens",
|
515
516
|
Parens = sym"(" * Exp * sym")",
|
516
517
|
|
517
518
|
FnArgs = symx"(" * Ct(ExpList^-1) * sym")" + sym"!" * -P"=" * Ct"",
|
@@ -583,8 +584,8 @@ local build_grammar = wrap_env(function()
|
|
583
584
|
(key"using" * Ct(NameList + Space * "nil") + Ct"") *
|
584
585
|
sym")" + Ct"" * Ct"",
|
585
586
|
|
586
|
-
FnArgDefList = FnArgDef * (sym"," * FnArgDef)^0,
|
587
|
-
FnArgDef = Ct(Name * (sym"=" * Exp)^-1),
|
587
|
+
FnArgDefList = FnArgDef * (sym"," * FnArgDef)^0 * (sym"," * Ct(VarArg))^0 + Ct(VarArg),
|
588
|
+
FnArgDef = Ct((Name + SelfName) * (sym"=" * Exp)^-1),
|
588
589
|
|
589
590
|
FunLit = FnArgsDef *
|
590
591
|
(sym"->" * Cc"slim" + sym"=>" * Cc"fat") *
|
@@ -615,13 +616,17 @@ local build_grammar = wrap_env(function()
|
|
615
616
|
end
|
616
617
|
|
617
618
|
local tree
|
618
|
-
local
|
619
|
-
|
620
|
-
|
619
|
+
local parse_args = {...}
|
620
|
+
|
621
|
+
local pass, err = xpcall(function()
|
622
|
+
tree = self._g:match(str, unpack(parse_args))
|
623
|
+
end, function(err)
|
624
|
+
return debug.traceback(err, 2)
|
625
|
+
end)
|
621
626
|
|
622
627
|
-- regular error, let it bubble up
|
623
628
|
if type(err) == "string" then
|
624
|
-
|
629
|
+
return nil, err
|
625
630
|
end
|
626
631
|
|
627
632
|
if not tree then
|
@@ -107,7 +107,9 @@ extract_declarations = function(self, body, start, out)
|
|
107
107
|
local _list_0 = stm[2]
|
108
108
|
for _index_0 = 1, #_list_0 do
|
109
109
|
local name = _list_0[_index_0]
|
110
|
-
if
|
110
|
+
if ntype(name) == "ref" then
|
111
|
+
insert(out, name)
|
112
|
+
elseif type(name) == "string" then
|
111
113
|
insert(out, name)
|
112
114
|
end
|
113
115
|
end
|
@@ -327,15 +329,27 @@ Statement = Transformer({
|
|
327
329
|
return apply_to_last(body, implicitly_return(self))
|
328
330
|
end,
|
329
331
|
["return"] = function(self, node)
|
330
|
-
|
331
|
-
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
|
336
|
-
|
337
|
-
return
|
332
|
+
local ret_val = node[2]
|
333
|
+
local ret_val_type = ntype(ret_val)
|
334
|
+
if ret_val_type == "explist" and #ret_val == 2 then
|
335
|
+
ret_val = ret_val[2]
|
336
|
+
ret_val_type = ntype(ret_val)
|
337
|
+
end
|
338
|
+
if types.cascading[ret_val_type] then
|
339
|
+
return implicitly_return(self)(ret_val)
|
340
|
+
end
|
341
|
+
if ret_val_type == "chain" or ret_val_type == "comprehension" or ret_val_type == "tblcomprehension" then
|
342
|
+
ret_val = Value:transform_once(self, ret_val)
|
343
|
+
if ntype(ret_val) == "block_exp" then
|
344
|
+
return build.group(apply_to_last(ret_val[2], function(stm)
|
345
|
+
return {
|
346
|
+
"return",
|
347
|
+
stm
|
348
|
+
}
|
349
|
+
end))
|
350
|
+
end
|
338
351
|
end
|
352
|
+
node[2] = ret_val
|
339
353
|
return node
|
340
354
|
end,
|
341
355
|
declare_glob = function(self, node)
|
@@ -348,7 +362,7 @@ Statement = Transformer({
|
|
348
362
|
local _continue_0 = false
|
349
363
|
repeat
|
350
364
|
local name = names[_index_0]
|
351
|
-
if not (name:match("^%u")) then
|
365
|
+
if not (name[2]:match("^%u")) then
|
352
366
|
_continue_0 = true
|
353
367
|
break
|
354
368
|
end
|
@@ -376,6 +390,11 @@ Statement = Transformer({
|
|
376
390
|
if num_names == 1 and num_values == 1 then
|
377
391
|
local first_value = values[1]
|
378
392
|
local first_name = names[1]
|
393
|
+
local first_type = ntype(first_value)
|
394
|
+
if first_type == "chain" then
|
395
|
+
first_value = Value:transform_once(self, first_value)
|
396
|
+
first_type = ntype(first_value)
|
397
|
+
end
|
379
398
|
local _exp_0 = ntype(first_value)
|
380
399
|
if "block_exp" == _exp_0 then
|
381
400
|
local block_body = first_value[2]
|
@@ -395,6 +414,8 @@ Statement = Transformer({
|
|
395
414
|
})
|
396
415
|
elseif "comprehension" == _exp_0 or "tblcomprehension" == _exp_0 or "foreach" == _exp_0 or "for" == _exp_0 or "while" == _exp_0 then
|
397
416
|
return build.assign_one(first_name, Value:transform_once(self, first_value))
|
417
|
+
else
|
418
|
+
values[1] = first_value
|
398
419
|
end
|
399
420
|
end
|
400
421
|
local transformed
|
@@ -599,7 +620,7 @@ Statement = Transformer({
|
|
599
620
|
local _list_0 = stm[2]
|
600
621
|
for _index_0 = 1, #_list_0 do
|
601
622
|
local name = _list_0[_index_0]
|
602
|
-
if
|
623
|
+
if ntype(name) == "ref" then
|
603
624
|
_accum_0[_len_0] = name
|
604
625
|
_len_0 = _len_0 + 1
|
605
626
|
end
|
@@ -674,7 +695,7 @@ Statement = Transformer({
|
|
674
695
|
if ntype(exp) == "assign" then
|
675
696
|
local names, values = unpack(exp, 2)
|
676
697
|
local first_name = names[1]
|
677
|
-
if ntype(first_name) == "
|
698
|
+
if ntype(first_name) == "ref" then
|
678
699
|
scope_name = first_name
|
679
700
|
named_assign = exp
|
680
701
|
exp = values[1]
|
@@ -966,10 +987,19 @@ Statement = Transformer({
|
|
966
987
|
elseif "nil" == _exp_0 then
|
967
988
|
real_name = "nil"
|
968
989
|
else
|
990
|
+
local name_t = type(real_name)
|
991
|
+
local flattened_name
|
992
|
+
if name_t == "string" then
|
993
|
+
flattened_name = real_name
|
994
|
+
elseif name_t == "table" and real_name[1] == "ref" then
|
995
|
+
flattened_name = real_name[2]
|
996
|
+
else
|
997
|
+
flattened_name = error("don't know how to extract name from " .. tostring(name_t))
|
998
|
+
end
|
969
999
|
real_name = {
|
970
1000
|
"string",
|
971
1001
|
'"',
|
972
|
-
|
1002
|
+
flattened_name
|
973
1003
|
}
|
974
1004
|
end
|
975
1005
|
local cls = build.table({
|
@@ -995,7 +1025,10 @@ Statement = Transformer({
|
|
995
1025
|
local class_lookup = build["if"]({
|
996
1026
|
cond = {
|
997
1027
|
"exp",
|
998
|
-
|
1028
|
+
{
|
1029
|
+
"ref",
|
1030
|
+
"val"
|
1031
|
+
},
|
999
1032
|
"==",
|
1000
1033
|
"nil"
|
1001
1034
|
},
|
@@ -1025,7 +1058,10 @@ Statement = Transformer({
|
|
1025
1058
|
"call",
|
1026
1059
|
{
|
1027
1060
|
base_name,
|
1028
|
-
|
1061
|
+
{
|
1062
|
+
"ref",
|
1063
|
+
"name"
|
1064
|
+
}
|
1029
1065
|
}
|
1030
1066
|
}
|
1031
1067
|
})),
|
@@ -1394,13 +1430,11 @@ Value = Transformer({
|
|
1394
1430
|
end
|
1395
1431
|
end
|
1396
1432
|
if #node <= 3 then
|
1397
|
-
|
1398
|
-
|
1399
|
-
|
1400
|
-
|
1401
|
-
|
1402
|
-
end
|
1403
|
-
end)()
|
1433
|
+
if type(node[3]) == "string" then
|
1434
|
+
return node
|
1435
|
+
else
|
1436
|
+
return convert_part(node[3])
|
1437
|
+
end
|
1404
1438
|
end
|
1405
1439
|
local e = {
|
1406
1440
|
"exp",
|
@@ -1520,8 +1554,8 @@ Value = Transformer({
|
|
1520
1554
|
table.remove(node, #node)
|
1521
1555
|
local base_name = NameProxy("base")
|
1522
1556
|
local fn_name = NameProxy("fn")
|
1523
|
-
local is_super = node[2] == "super"
|
1524
|
-
return
|
1557
|
+
local is_super = ntype(node[2]) == "ref" and node[2][2] == "super"
|
1558
|
+
return build.block_exp({
|
1525
1559
|
build.assign({
|
1526
1560
|
names = {
|
1527
1561
|
base_name
|
@@ -1563,7 +1597,7 @@ Value = Transformer({
|
|
1563
1597
|
})
|
1564
1598
|
}
|
1565
1599
|
})
|
1566
|
-
})
|
1600
|
+
})
|
1567
1601
|
end
|
1568
1602
|
end,
|
1569
1603
|
block_exp = function(self, node)
|
@@ -100,13 +100,13 @@ extract_assign_names = function(name, accum, prefix)
|
|
100
100
|
suffix = join(prefix, {
|
101
101
|
suffix
|
102
102
|
})
|
103
|
-
local
|
104
|
-
if
|
103
|
+
local _exp_0 = ntype(value)
|
104
|
+
if "value" == _exp_0 or "ref" == _exp_0 or "chain" == _exp_0 or "self" == _exp_0 then
|
105
105
|
insert(accum, {
|
106
106
|
value,
|
107
107
|
suffix
|
108
108
|
})
|
109
|
-
elseif
|
109
|
+
elseif "table" == _exp_0 then
|
110
110
|
extract_assign_names(value, accum, suffix)
|
111
111
|
else
|
112
112
|
user_error("Can't destructure value of type: " .. tostring(ntype(value)))
|
@@ -47,33 +47,29 @@ do
|
|
47
47
|
return self.name
|
48
48
|
end,
|
49
49
|
chain = function(self, ...)
|
50
|
-
local items
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
i
|
63
|
-
}
|
64
|
-
else
|
65
|
-
_accum_0[_len_0] = i
|
66
|
-
end
|
67
|
-
_len_0 = _len_0 + 1
|
50
|
+
local items = {
|
51
|
+
base = self,
|
52
|
+
...
|
53
|
+
}
|
54
|
+
for k, v in ipairs(items) do
|
55
|
+
if type(v) == "string" then
|
56
|
+
items[k] = {
|
57
|
+
"dot",
|
58
|
+
v
|
59
|
+
}
|
60
|
+
else
|
61
|
+
items[k] = v
|
68
62
|
end
|
69
|
-
items = _accum_0
|
70
63
|
end
|
71
|
-
return build.chain(
|
72
|
-
base = self,
|
73
|
-
unpack(items)
|
74
|
-
})
|
64
|
+
return build.chain(items)
|
75
65
|
end,
|
76
66
|
index = function(self, key)
|
67
|
+
if type(key) == "string" then
|
68
|
+
key = {
|
69
|
+
"ref",
|
70
|
+
key
|
71
|
+
}
|
72
|
+
end
|
77
73
|
return build.chain({
|
78
74
|
base = self,
|
79
75
|
{
|
@@ -263,6 +263,12 @@ build = setmetatable({
|
|
263
263
|
end,
|
264
264
|
chain = function(parts)
|
265
265
|
local base = parts.base or error("expecting base property for chain")
|
266
|
+
if type(base) == "string" then
|
267
|
+
base = {
|
268
|
+
"ref",
|
269
|
+
base
|
270
|
+
}
|
271
|
+
end
|
266
272
|
local node = {
|
267
273
|
"chain",
|
268
274
|
base
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: rufus-lua-moon
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.
|
4
|
+
version: 0.2.5.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Stas Ukolov
|
@@ -70,6 +70,8 @@ files:
|
|
70
70
|
- vendor/lua/moon/all.moon
|
71
71
|
- vendor/lua/moon/init.moon
|
72
72
|
- vendor/lua/moonscript/base.lua
|
73
|
+
- vendor/lua/moonscript/cmd/coverage.lua
|
74
|
+
- vendor/lua/moonscript/cmd/lint.lua
|
73
75
|
- vendor/lua/moonscript/compile.lua
|
74
76
|
- vendor/lua/moonscript/compile/statement.lua
|
75
77
|
- vendor/lua/moonscript/compile/value.lua
|