replace hoist_declarations with declare_glob in classes, fixes #65

This commit is contained in:
leaf corcoran 2013-01-13 14:10:21 -08:00
parent f56095256b
commit 1e84b5d9ff
4 changed files with 61 additions and 69 deletions

View File

@ -87,46 +87,6 @@ is_singular = function(body)
return body[1]
end
end
local find_assigns
find_assigns = function(body, out)
if out == nil then
out = { }
end
local _list_0 = body
for _index_0 = 1, #_list_0 do
local thing = _list_0[_index_0]
local _exp_0 = thing[1]
if "group" == _exp_0 then
find_assigns(thing[2], out)
elseif "assign" == _exp_0 then
table.insert(out, thing[2])
end
end
return out
end
local hoist_declarations
hoist_declarations = function(body)
local assigns = { }
local _list_0 = find_assigns(body)
for _index_0 = 1, #_list_0 do
local names = _list_0[_index_0]
local _list_1 = names
for _index_1 = 1, #_list_1 do
local name = _list_1[_index_1]
if type(name) == "string" then
table.insert(assigns, name)
end
end
end
local idx = 1
while mtype(body[idx]) == Run do
idx = idx + 1
end
return table.insert(body, idx, {
"declare",
assigns
})
end
local extract_declarations
extract_declarations = function(self, body, start, out)
if body == nil then
@ -1194,6 +1154,10 @@ local Statement = Transformer({
end
end)
end),
{
"declare_glob",
"*"
},
_with_0.assign_one(parent_cls_name, parent_val == "" and "nil" or parent_val),
_with_0.assign_one(base_name, {
"table",
@ -1261,7 +1225,6 @@ local Statement = Transformer({
end
end)()
}
hoist_declarations(out_body)
value = _with_0.group({
_with_0.group((function()
if ntype(name) == "value" then

View File

@ -44,30 +44,6 @@ is_singular = (body) ->
else
body[1]
find_assigns = (body, out={}) ->
for thing in *body
switch thing[1]
when "group"
find_assigns thing[2], out
when "assign"
table.insert out, thing[2] -- extract names
out
hoist_declarations = (body) ->
assigns = {}
-- hoist the plain old assigns
for names in *find_assigns body
for name in *names
table.insert assigns, name if type(name) == "string"
-- insert after runs
idx = 1
while mtype(body[idx]) == Run do idx += 1
table.insert body, idx, {"declare", assigns}
-- this mutates body searching for assigns
extract_declarations = (body=@current_stms, start=@current_stm_i + 1, out={}) =>
for i=start,#body
@ -640,6 +616,8 @@ Statement = Transformer {
else
parent_cls_name
{"declare_glob", "*"}
.assign_one parent_cls_name, parent_val == "" and "nil" or parent_val
.assign_one base_name, {"table", properties}
.assign_one base_name\chain"__index", base_name
@ -685,8 +663,6 @@ Statement = Transformer {
ret cls_name
}
hoist_declarations out_body
value = .group {
.group if ntype(name) == "value" then {
.declare names: {name}

View File

@ -162,3 +162,14 @@ class Something
nil
--
-- hoisting
class Something
val = 23
{:insert} = table
new: => print insert, val -- prints nil 23
--
nil

View File

@ -987,5 +987,47 @@ do
_parent_0.__inherited(_parent_0, _class_0)
end
Something = _class_0
return _class_0
end
end
do
local val, insert
local _parent_0 = nil
local _base_0 = { }
_base_0.__index = _base_0
if _parent_0 then
setmetatable(_base_0, _parent_0.__base)
end
local _class_0 = setmetatable({
__init = function(self)
return print(insert, val)
end,
__base = _base_0,
__name = "Something",
__parent = _parent_0
}, {
__index = function(cls, name)
local val = rawget(_base_0, name)
if val == nil and _parent_0 then
return _parent_0[name]
else
return val
end
end,
__call = function(cls, ...)
local _self_0 = setmetatable({}, _base_0)
cls.__init(_self_0, ...)
return _self_0
end
})
_base_0.__class = _class_0
local self = _class_0
val = 23
do
local _obj_0 = table
insert = _obj_0.insert
end
if _parent_0 and _parent_0.__inherited then
_parent_0.__inherited(_parent_0, _class_0)
end
Something = _class_0
end
return nil