mirror of
https://github.com/leafo/moonscript.git
synced 2024-11-22 02:44:23 +00:00
hoist name declarations from statements inside of a class to the top of the class body
This commit is contained in:
parent
290b73f92b
commit
a750523d10
@ -205,6 +205,42 @@ is_singular = function(body)
|
|||||||
return true
|
return true
|
||||||
end
|
end
|
||||||
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, rules)
|
||||||
|
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_0 = 1, #_list_1 do
|
||||||
|
local name = _list_1[_index_0]
|
||||||
|
if type(name) == "string" then
|
||||||
|
table.insert(assigns, name)
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return table.insert(body, 1, {
|
||||||
|
"declare",
|
||||||
|
assigns
|
||||||
|
})
|
||||||
|
end
|
||||||
local constructor_name = "new"
|
local constructor_name = "new"
|
||||||
local Transformer
|
local Transformer
|
||||||
Transformer = (function()
|
Transformer = (function()
|
||||||
@ -806,7 +842,7 @@ Statement = Transformer({
|
|||||||
local value = nil
|
local value = nil
|
||||||
do
|
do
|
||||||
local _with_0 = build
|
local _with_0 = build
|
||||||
value = _with_0.block_exp({
|
local out_body = {
|
||||||
Run(function(self)
|
Run(function(self)
|
||||||
return self:set("super", function(block, chain)
|
return self:set("super", function(block, chain)
|
||||||
if chain then
|
if chain then
|
||||||
@ -915,7 +951,8 @@ Statement = Transformer({
|
|||||||
end
|
end
|
||||||
end)()),
|
end)()),
|
||||||
cls_name
|
cls_name
|
||||||
})
|
}
|
||||||
|
hoist_declarations(out_body)
|
||||||
value = _with_0.group({
|
value = _with_0.group({
|
||||||
_with_0.declare({
|
_with_0.declare({
|
||||||
names = {
|
names = {
|
||||||
@ -927,7 +964,7 @@ Statement = Transformer({
|
|||||||
name
|
name
|
||||||
},
|
},
|
||||||
values = {
|
values = {
|
||||||
value
|
_with_0.block_exp(out_body)
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
@ -81,6 +81,25 @@ is_singular = (body) ->
|
|||||||
else
|
else
|
||||||
true
|
true
|
||||||
|
|
||||||
|
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, rules) ->
|
||||||
|
assigns = {}
|
||||||
|
|
||||||
|
-- hoist the plain old assigns
|
||||||
|
for names in *find_assigns body
|
||||||
|
for name in *names
|
||||||
|
table.insert assigns, name if type(name) == "string"
|
||||||
|
|
||||||
|
table.insert body, 1, {"declare", assigns}
|
||||||
|
|
||||||
constructor_name = "new"
|
constructor_name = "new"
|
||||||
|
|
||||||
class Transformer
|
class Transformer
|
||||||
@ -407,7 +426,7 @@ Statement = Transformer {
|
|||||||
|
|
||||||
value = nil
|
value = nil
|
||||||
with build
|
with build
|
||||||
value = .block_exp {
|
out_body = {
|
||||||
Run =>
|
Run =>
|
||||||
@set "super", (block, chain) ->
|
@set "super", (block, chain) ->
|
||||||
if chain
|
if chain
|
||||||
@ -470,11 +489,13 @@ Statement = Transformer {
|
|||||||
cls_name
|
cls_name
|
||||||
}
|
}
|
||||||
|
|
||||||
|
hoist_declarations out_body
|
||||||
|
|
||||||
value = .group {
|
value = .group {
|
||||||
.declare names: {name}
|
.declare names: {name}
|
||||||
.assign {
|
.assign {
|
||||||
names: {name}
|
names: {name}
|
||||||
values: {value}
|
values: {.block_exp out_body}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -507,6 +507,7 @@ local _ = hello[self].world
|
|||||||
if something then
|
if something then
|
||||||
local Whacko
|
local Whacko
|
||||||
Whacko = (function()
|
Whacko = (function()
|
||||||
|
local hello
|
||||||
local _parent_0 = nil
|
local _parent_0 = nil
|
||||||
local _base_0 = { }
|
local _base_0 = { }
|
||||||
_base_0.__index = _base_0
|
_base_0.__index = _base_0
|
||||||
@ -543,7 +544,7 @@ if something then
|
|||||||
if something then
|
if something then
|
||||||
print("hello world")
|
print("hello world")
|
||||||
end
|
end
|
||||||
local hello = "world"
|
hello = "world"
|
||||||
self.another = "day"
|
self.another = "day"
|
||||||
print("yeah")
|
print("yeah")
|
||||||
return _class_0
|
return _class_0
|
||||||
|
Loading…
Reference in New Issue
Block a user