lift expressions from chain indexes on update operator, fixes #185

This commit is contained in:
leaf corcoran 2017-10-16 17:13:55 -07:00
parent fcc937ad39
commit 9e36baa435
4 changed files with 107 additions and 2 deletions

View File

@ -353,18 +353,85 @@ return Transformer({
if not op_final then
error("Unknown op: " .. op)
end
local lifted
if ntype(name) == "chain" then
lifted = { }
local new_chain
do
local _accum_0 = { }
local _len_0 = 1
for _index_0 = 3, #name do
local part = name[_index_0]
if ntype(part) == "index" then
local proxy = NameProxy("update")
table.insert(lifted, {
proxy,
part[2]
})
_accum_0[_len_0] = {
"index",
proxy
}
else
_accum_0[_len_0] = part
end
_len_0 = _len_0 + 1
end
new_chain = _accum_0
end
if next(lifted) then
name = {
name[1],
name[2],
unpack(new_chain)
}
end
end
if not (value_is_singular(exp)) then
exp = {
"parens",
exp
}
end
return build.assign_one(name, {
local out = build.assign_one(name, {
"exp",
name,
op_final,
exp
})
if lifted and next(lifted) then
local names
do
local _accum_0 = { }
local _len_0 = 1
for _index_0 = 1, #lifted do
local l = lifted[_index_0]
_accum_0[_len_0] = l[1]
_len_0 = _len_0 + 1
end
names = _accum_0
end
local values
do
local _accum_0 = { }
local _len_0 = 1
for _index_0 = 1, #lifted do
local l = lifted[_index_0]
_accum_0[_len_0] = l[2]
_len_0 = _len_0 + 1
end
values = _accum_0
end
out = build.group({
{
"assign",
names,
values
},
out
})
end
return out
end,
import = function(self, node)
local names, source = unpack(node, 2)

View File

@ -229,9 +229,37 @@ Transformer {
update: (node) =>
name, op, exp = unpack node, 2
op_final = op\match "^(.+)=$"
error "Unknown op: "..op if not op_final
local lifted
if ntype(name) == "chain"
lifted = {}
new_chain = for part in *name[3,]
if ntype(part) == "index"
proxy = NameProxy "update"
table.insert lifted, { proxy, part[2] }
{ "index", proxy }
else
part
if next lifted
name = {name[1], name[2], unpack new_chain}
exp = {"parens", exp} unless value_is_singular exp
build.assign_one name, {"exp", name, op_final, exp}
out = build.assign_one name, {"exp", name, op_final, exp}
if lifted and next lifted
names = [l[1] for l in *lifted]
values = [l[2] for l in *lifted]
out = build.group {
{"assign", names, values}
out
}
out
import: (node) =>
names, source = unpack node, 2

View File

@ -158,6 +158,10 @@ hello ..= "world"
@@something += 10
@something += 10
a["hello"] += 10
a["hello#{tostring ff}"] += 10
a[four].x += 10
x = 0
(if ntype(v) == "fndef" then x += 1) for v in *values

View File

@ -162,6 +162,12 @@ local m = m % 2
local hello = hello .. "world"
self.__class.something = self.__class.something + 10
self.something = self.something + 10
local _update_0 = "hello"
a[_update_0] = a[_update_0] + 10
local _update_1 = "hello" .. tostring(tostring(ff))
a[_update_1] = a[_update_1] + 10
local _update_2 = four
a[_update_2].x = a[_update_2].x + 10
x = 0
local _list_0 = values
for _index_0 = 1, #_list_0 do