diff options
| author | Bruce Hill <bitbucket@bruce-hill.com> | 2018-04-17 14:18:23 -0700 |
|---|---|---|
| committer | Bruce Hill <bitbucket@bruce-hill.com> | 2018-04-17 14:19:07 -0700 |
| commit | 54fc7fc4404c02df2c38a7ae121e61e9b8bca78c (patch) | |
| tree | 15142e627201978116985f56d05ab88bf237c59b /lua_obj.moon | |
| parent | 25e06d1fce660e7c8144425b440f7b1c698e2fb7 (diff) | |
Moving tree_to_lua into each of the Nomsu tree types, which are now in
their own file.
Diffstat (limited to 'lua_obj.moon')
| -rw-r--r-- | lua_obj.moon | 87 |
1 files changed, 42 insertions, 45 deletions
diff --git a/lua_obj.moon b/lua_obj.moon index 21017d7..ab5b5a3 100644 --- a/lua_obj.moon +++ b/lua_obj.moon @@ -1,12 +1,12 @@ {:insert, :remove, :concat} = table immutable = require 'immutable' -local Lua, LuaValue, Location +local Lua, Location export LINE_STARTS Location = immutable {"filename","start","stop"}, { name:"Location" __new: (filename, start, stop)=> - assert(type(filename) == 'string' and type(start) == 'number' and type(stop) == 'number') + --assert(type(filename) == 'string' and type(start) == 'number' and type(stop) == 'number') return filename, start, stop or start __tostring: => "Location(\"#{@filename}\", #{@start}, #{@stop})" __lt: (other)=> @@ -22,12 +22,13 @@ Location = immutable {"filename","start","stop"}, { get_text: => FILE_CACHE[@filename]\sub(@start,@stop) get_line_number: => -- TODO: do a binary search if this is actually slow, which I doubt - line_starts = LINE_STARTS[FILE_CACHE[@filename]] + src = FILE_CACHE[@filename] + line_starts = LINE_STARTS[src] start_line = 1 - while (line_starts[start_line+1] or (#src+1)) <= @start + while (line_starts[start_line+1] or math.huge) <= @start start_line += 1 stop_line = start_line - while (line_starts[stop_line+1] or (#src+1)) <= @stop + while (line_starts[stop_line+1] or math.huge) <= @stop stop_line += 1 return start_line, stop_line get_line: => "#{@filename}:#{@get_line_number!}" @@ -39,27 +40,41 @@ Location = immutable {"filename","start","stop"}, { } class Lua - is_statement: true - is_value: false - new: (@source, ...)=> if type(@source) == 'string' filename,start,stop = @source\match("^(.-)[(%d+):(%d+)]$") @source = Location(filename, tonumber(start), tonumber(stop)) - for i=1,select("#",...) - x = select(i,...) - assert(type(x) != 'table' or getmetatable(x)) @bits = {...} @free_vars = {} + @is_value = false - add_free_vars: (free_vars)=> + @Value = (...)-> + lua = Lua(...) + lua.is_value = true + return lua + + clone: => + copy = Lua(@source, {unpack(@bits)}) + copy.is_value = @is_value + for k,v in pairs @free_vars + copy.free_vars[k] = v + return copy + + add_free_vars: (...)=> seen = {[v]:true for v in *@free_vars} - for var in *free_vars + for i=1,select("#",...) + var = select(i, ...) unless seen[var] @free_vars[#@free_vars+1] = var seen[var] = true - as_statements: => self + convert_to_statements: (prefix="", suffix=";")=> + unless @is_value + return + if prefix != "" + @prepend prefix + if suffix != "" + @append suffix declare_locals: (skip={})=> if next(skip) == 1 @@ -75,10 +90,9 @@ class Lua buff = {} for i,b in ipairs @bits buff[#buff+1] = tostring(b) - if i < #@bits and type(b) != 'string' and b.is_statement + if i < #@bits and type(b) != 'string' and not b.is_value buff[#buff+1] = "\n" ret = concat(buff, "") - assert(not ret\match(".*table: 0x.*")) return ret __len: => @@ -87,24 +101,24 @@ class Lua len += #b return len + __add: (other)=> + Lua(nil, self, other) + + __concat: (other)=> + Lua(nil, self, other) + append: (...)=> n = select("#",...) bits = @bits for i=1,n - x = select(i,...) - assert(type(x) != 'table' or getmetatable(x)) bits[#bits+1] = select(i, ...) prepend: (...)=> n = select("#",...) bits = @bits for i=#bits+n,n+1,-1 - x = select(i,...) - assert(type(x) != 'table' or getmetatable(x)) bits[i] = bits[i-n] for i=1,n - x = select(i,...) - assert(type(x) != 'table' or getmetatable(x)) bits[i] = select(i, ...) make_offset_table: (lua_chunkname)=> @@ -130,28 +144,11 @@ class Lua walk self return lua_str, metadata -class LuaValue extends Lua - is_statement: false - is_value: true - - new: (@source, ...)=> - @bits = {...} - - __tostring: => - buff = {} - for b in *@bits - buff[#buff+1] = tostring(b) - ret = concat(buff, "") - assert(not ret\match(".*table: 0x.*")) - return ret - - as_statements: (prefix="", suffix=";")=> - bits = {prefix, unpack @bits} - bits[#bits+1] = suffix - return Lua(@source, unpack(bits)) - parenthesize: => - @prepend "(" - @append ")" + if @is_value + @prepend "(" + @append ")" + else + error "Cannot parenthesize lua statements" -return {:Lua, :LuaValue, :Location} +return {:Lua, :Location} |
