mirror of
https://github.com/leafo/moonscript.git
synced 2024-11-22 02:44:23 +00:00
new transform.statments module, last_stm function
This commit is contained in:
parent
5ae8ffaed7
commit
fb8bfb740c
50
moonscript/transform/statements.lua
Normal file
50
moonscript/transform/statements.lua
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
local ntype, mtype
|
||||||
|
do
|
||||||
|
local _obj_0 = require("moonscript.types")
|
||||||
|
ntype, mtype = _obj_0.ntype, _obj_0.mtype
|
||||||
|
end
|
||||||
|
local Run
|
||||||
|
do
|
||||||
|
local _base_0 = {
|
||||||
|
call = function(self, state)
|
||||||
|
return self.fn(state)
|
||||||
|
end
|
||||||
|
}
|
||||||
|
_base_0.__index = _base_0
|
||||||
|
local _class_0 = setmetatable({
|
||||||
|
__init = function(self, fn)
|
||||||
|
self.fn = fn
|
||||||
|
self[1] = "run"
|
||||||
|
end,
|
||||||
|
__base = _base_0,
|
||||||
|
__name = "Run"
|
||||||
|
}, {
|
||||||
|
__index = _base_0,
|
||||||
|
__call = function(cls, ...)
|
||||||
|
local _self_0 = setmetatable({}, _base_0)
|
||||||
|
cls.__init(_self_0, ...)
|
||||||
|
return _self_0
|
||||||
|
end
|
||||||
|
})
|
||||||
|
_base_0.__class = _class_0
|
||||||
|
Run = _class_0
|
||||||
|
end
|
||||||
|
local last_stm
|
||||||
|
last_stm = function(stms)
|
||||||
|
local last_exp_id = 0
|
||||||
|
for i = #stms, 1, -1 do
|
||||||
|
local stm = stms[i]
|
||||||
|
if stm and mtype(stm) ~= Run then
|
||||||
|
if ntype(stm) == "group" then
|
||||||
|
return last_stm(stm[2])
|
||||||
|
end
|
||||||
|
last_exp_id = i
|
||||||
|
break
|
||||||
|
end
|
||||||
|
end
|
||||||
|
return stms[last_exp_id], last_exp_id, stms
|
||||||
|
end
|
||||||
|
return {
|
||||||
|
last_stm = last_stm,
|
||||||
|
Run = Run
|
||||||
|
}
|
30
moonscript/transform/statements.moon
Normal file
30
moonscript/transform/statements.moon
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
|
||||||
|
import ntype, mtype from require "moonscript.types"
|
||||||
|
|
||||||
|
-- A Run is a special statement node that lets a function run and mutate the
|
||||||
|
-- state of the compiler
|
||||||
|
class Run
|
||||||
|
new: (@fn) =>
|
||||||
|
@[1] = "run"
|
||||||
|
|
||||||
|
call: (state) =>
|
||||||
|
@.fn state
|
||||||
|
|
||||||
|
-- extract the last statment from an array of statements
|
||||||
|
-- is group aware
|
||||||
|
-- returns: the last statement, the index, the table it was fetched from
|
||||||
|
last_stm = (stms) ->
|
||||||
|
last_exp_id = 0
|
||||||
|
for i = #stms, 1, -1
|
||||||
|
stm = stms[i]
|
||||||
|
if stm and mtype(stm) != Run
|
||||||
|
if ntype(stm) == "group"
|
||||||
|
return last_stm stm[2]
|
||||||
|
|
||||||
|
last_exp_id = i
|
||||||
|
break
|
||||||
|
|
||||||
|
stms[last_exp_id], last_exp_id, stms
|
||||||
|
|
||||||
|
{:last_stm, :Run}
|
||||||
|
|
@ -23,6 +23,7 @@ ntype = (node) ->
|
|||||||
else
|
else
|
||||||
"value"
|
"value"
|
||||||
|
|
||||||
|
-- gets the class of a type if possible
|
||||||
mtype = do
|
mtype = do
|
||||||
moon_type = util.moon.type
|
moon_type = util.moon.type
|
||||||
-- lets us check a smart node without throwing an error
|
-- lets us check a smart node without throwing an error
|
||||||
|
48
spec/transform_spec.moon
Normal file
48
spec/transform_spec.moon
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
describe "moonscript.transform.statements", ->
|
||||||
|
describe "last_stm", ->
|
||||||
|
import last_stm, Run from require "moonscript.transform.statements"
|
||||||
|
|
||||||
|
it "gets last statement from empty list", ->
|
||||||
|
assert.same nil, (last_stm {})
|
||||||
|
|
||||||
|
it "gets last statement", ->
|
||||||
|
stms = {
|
||||||
|
{"ref", "butt_world"}
|
||||||
|
{"ref", "hello_world"}
|
||||||
|
}
|
||||||
|
|
||||||
|
stm, idx, t = last_stm stms
|
||||||
|
assert stms[2] == stm
|
||||||
|
assert.same 2, idx
|
||||||
|
assert stms == t
|
||||||
|
|
||||||
|
it "gets last statement ignoring run", ->
|
||||||
|
stms = {
|
||||||
|
{"ref", "butt_world"}
|
||||||
|
{"ref", "hello_world"}
|
||||||
|
Run => print "hi"
|
||||||
|
}
|
||||||
|
|
||||||
|
stm, idx, t = last_stm stms
|
||||||
|
assert stms[2] == stm
|
||||||
|
assert.same 2, idx
|
||||||
|
assert stms == t
|
||||||
|
|
||||||
|
it "gets last from within group", ->
|
||||||
|
stms = {
|
||||||
|
{"ref", "butt_world"}
|
||||||
|
{"group", {
|
||||||
|
{"ref", "hello_world"}
|
||||||
|
{"ref", "cool_world"}
|
||||||
|
}}
|
||||||
|
}
|
||||||
|
|
||||||
|
last = stms[2][2][2]
|
||||||
|
|
||||||
|
stm, idx, t = last_stm stms
|
||||||
|
assert stm == last, "should get last"
|
||||||
|
assert.same 2, idx
|
||||||
|
assert t == stms[2][2], "should get correct table"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user