Skip to content

Commit fc72baf

Browse files
committed
calling function of super with \ uses self instead of class as first arg
1 parent 6a07d50 commit fc72baf

File tree

6 files changed

+67
-10
lines changed

6 files changed

+67
-10
lines changed

moonscript/compile/value.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ value_compile = {
109109
elseif t == "index" then
110110
return "[", self:value(arg), "]"
111111
elseif t == "dot" then
112-
return ".", arg
112+
return ".", self:value(arg)
113113
elseif t == "colon" then
114114
return ":", arg, chain_item(node[3])
115115
elseif t == "colon_stub" then

moonscript/compile/value.moon

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ value_compile =
6666
elseif t == "index"
6767
"[", @value(arg), "]"
6868
elseif t == "dot"
69-
".", arg
69+
".", @value arg
7070
elseif t == "colon"
7171
":", arg, chain_item(node[3])
7272
elseif t == "colon_stub"

moonscript/transform.lua

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -672,13 +672,15 @@ Statement = Transformer({
672672
"chain",
673673
parent_cls_name
674674
}
675-
if slice[1][1] == "call" then
675+
local head = slice[1]
676+
local _exp_0 = head[1]
677+
if "call" == _exp_0 then
676678
local calling_name = block:get("current_block")
677679
slice[1] = {
678680
"call",
679681
{
680682
"self",
681-
unpack(slice[1][2])
683+
unpack(head[2])
682684
}
683685
}
684686
local act
@@ -691,6 +693,19 @@ Statement = Transformer({
691693
act,
692694
calling_name
693695
})
696+
elseif "colon" == _exp_0 then
697+
local call = head[3]
698+
insert(new_chain, {
699+
"dot",
700+
head[2]
701+
})
702+
slice[1] = {
703+
"call",
704+
{
705+
"self",
706+
unpack(call[2])
707+
}
708+
}
694709
end
695710
local _list_0 = slice
696711
for _index_0 = 1, #_list_0 do

moonscript/transform.moon

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -372,12 +372,20 @@ Statement = Transformer {
372372
slice = [item for item in *chain[3,]]
373373
new_chain = {"chain", parent_cls_name}
374374

375-
-- calling super, inject calling name and self into chain
376-
if slice[1][1] == "call"
377-
calling_name = block\get"current_block"
378-
slice[1] = {"call", {"self", unpack slice[1][2]}}
379-
act = if ntype(calling_name) != "value" then "index" else "dot"
380-
insert new_chain, {act, calling_name}
375+
head = slice[1]
376+
switch head[1]
377+
-- calling super, inject calling name and self into chain
378+
when "call"
379+
calling_name = block\get"current_block"
380+
slice[1] = {"call", {"self", unpack head[2]}}
381+
act = if ntype(calling_name) != "value" then "index" else "dot"
382+
insert new_chain, {act, calling_name}
383+
384+
-- colon call on super, replace class with self as first arg
385+
when "colon"
386+
call = head[3]
387+
insert new_chain, {"dot", head[2]}
388+
slice[1] = { "call", { "self", unpack call[2] } }
381389

382390
insert new_chain, item for item in *slice
383391

tests/inputs/class.moon

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,8 @@ class Biggie extends Okay
5151
super.something another_self, 1,2,3,4
5252
assert super == Okay
5353

54+
55+
class Yeah
56+
okay: =>
57+
super\something 1,2,3,4
58+

tests/outputs/class.lua

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -199,4 +199,33 @@ Biggie = (function()
199199
})
200200
_base_0.__class = _class_0
201201
return _class_0
202+
end)()
203+
local Yeah
204+
Yeah = (function()
205+
local _parent_0 = nil
206+
local _base_0 = {
207+
okay = function(self)
208+
return _parent_0.something(self, 1, 2, 3, 4)
209+
end
210+
}
211+
_base_0.__index = _base_0
212+
if _parent_0 then
213+
setmetatable(_base_0, getmetatable(_parent_0).__index)
214+
end
215+
local _class_0 = setmetatable({
216+
__init = function(self, ...)
217+
if _parent_0 then
218+
return _parent_0.__init(self, ...)
219+
end
220+
end
221+
}, {
222+
__index = _base_0,
223+
__call = function(cls, ...)
224+
local _self_0 = setmetatable({}, _base_0)
225+
cls.__init(_self_0, ...)
226+
return _self_0
227+
end
228+
})
229+
_base_0.__class = _class_0
230+
return _class_0
202231
end)()

0 commit comments

Comments
 (0)