Skip to content

Commit 99e1c9d

Browse files
committed
move line decorator transformation out of the parser
1 parent 2134a33 commit 99e1c9d

File tree

3 files changed

+55
-19
lines changed

3 files changed

+55
-19
lines changed

moonscript/parse.lua

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -254,25 +254,7 @@ end
254254
-- transforms a statement that has a line decorator
255255
local function wrap_decorator(stm, dec)
256256
if not dec then return stm end
257-
258-
local arg = {stm, dec}
259-
260-
if dec[1] == "if" then
261-
local _, cond, fail = unpack(dec)
262-
if fail then fail = {"else", {fail}} end
263-
stm = {"if", cond, {stm}, fail}
264-
elseif dec[1] == "unless" then
265-
stm = {
266-
"if",
267-
{"not", {"parens", dec[2]}},
268-
{stm}
269-
}
270-
elseif dec[1] == "comprehension" then
271-
local _, clauses = unpack(dec)
272-
stm = {"comprehension", stm, clauses}
273-
end
274-
275-
return stm
257+
return { "decorated", stm, dec }
276258
end
277259

278260
-- wrap if statement if there is a conditional decorator

moonscript/transform.lua

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -549,6 +549,45 @@ Statement = Transformer({
549549
end
550550
return node
551551
end,
552+
decorated = function(self, node)
553+
local stm, dec = unpack(node, 2)
554+
local _exp_0 = dec[1]
555+
if "if" == _exp_0 then
556+
local cond, fail = unpack(dec, 2)
557+
if fail then
558+
fail = {
559+
"else",
560+
{
561+
fail
562+
}
563+
}
564+
end
565+
return {
566+
"if",
567+
cond,
568+
{
569+
stm
570+
},
571+
fail
572+
}
573+
elseif "unless" == _exp_0 then
574+
return {
575+
"unless",
576+
dec[2],
577+
{
578+
stm
579+
}
580+
}
581+
elseif "comprehension" == _exp_0 then
582+
return {
583+
"comprehension",
584+
stm,
585+
dec[2]
586+
}
587+
else
588+
return error("Unknown decorator " .. dec[1])
589+
end
590+
end,
552591
unless = function(self, node)
553592
return {
554593
"if",

moonscript/transform.moon

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,21 @@ Statement = Transformer {
244244
node[2] = apply_to_last node[2], ret if ret
245245
node
246246

247+
decorated: (node) =>
248+
stm, dec = unpack node, 2
249+
250+
switch dec[1]
251+
when "if"
252+
cond, fail = unpack dec, 2
253+
fail = { "else", { fail } } if fail
254+
{ "if", cond, { stm }, fail }
255+
when "unless"
256+
{ "unless", dec[2], { stm } }
257+
when "comprehension"
258+
{ "comprehension", stm, dec[2] }
259+
else
260+
error "Unknown decorator " .. dec[1]
261+
247262
unless: (node) =>
248263
{ "if", {"not", {"parens", node[2]}}, unpack node, 3 }
249264

0 commit comments

Comments
 (0)