rufus-lua-moon 0.2.2 → 0.2.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
 - data/vendor/lua/moon/init.moon +1 -1
 - data/vendor/lua/moonscript/compile/statement.lua +26 -26
 - data/vendor/lua/moonscript/compile/value.lua +24 -22
 - data/vendor/lua/moonscript/compile.lua +165 -68
 - data/vendor/lua/moonscript/data.lua +11 -6
 - data/vendor/lua/moonscript/dump.lua +8 -3
 - data/vendor/lua/moonscript/errors.lua +18 -6
 - data/vendor/lua/moonscript/init.lua +37 -21
 - data/vendor/lua/moonscript/line_tables.lua +1 -0
 - data/vendor/lua/moonscript/parse.lua +34 -20
 - data/vendor/lua/moonscript/transform/destructure.lua +234 -0
 - data/vendor/lua/moonscript/transform/names.lua +144 -0
 - data/vendor/lua/moonscript/transform.lua +230 -263
 - data/vendor/lua/moonscript/types.lua +75 -31
 - data/vendor/lua/moonscript/util.lua +102 -28
 - data/vendor/lua/moonscript/version.lua +1 -1
 - metadata +4 -2
 - data/vendor/lua/moonscript/compile/format.lua +0 -49
 
| 
         @@ -1,142 +1,17 @@ 
     | 
|
| 
       1 
     | 
    
         
            -
            module("moonscript.transform", package.seeall)
         
     | 
| 
       2 
1 
     | 
    
         
             
            local types = require("moonscript.types")
         
     | 
| 
       3 
2 
     | 
    
         
             
            local util = require("moonscript.util")
         
     | 
| 
       4 
3 
     | 
    
         
             
            local data = require("moonscript.data")
         
     | 
| 
       5 
     | 
    
         
            -
            local reversed = util.reversed
         
     | 
| 
       6 
     | 
    
         
            -
            local ntype, build, smart_node, is_slice, value_is_singular = types.ntype, types.build, types.smart_node, types.is_slice, types.value_is_singular
         
     | 
| 
      
 4 
     | 
    
         
            +
            local reversed, unpack = util.reversed, util.unpack
         
     | 
| 
      
 5 
     | 
    
         
            +
            local ntype, mtype, build, smart_node, is_slice, value_is_singular = types.ntype, types.mtype, types.build, types.smart_node, types.is_slice, types.value_is_singular
         
     | 
| 
       7 
6 
     | 
    
         
             
            local insert = table.insert
         
     | 
| 
       8 
     | 
    
         
            -
            local  
     | 
| 
       9 
     | 
    
         
            -
            local implicitly_return
         
     | 
| 
      
 7 
     | 
    
         
            +
            local NameProxy, LocalName
         
     | 
| 
       10 
8 
     | 
    
         
             
            do
         
     | 
| 
       11 
     | 
    
         
            -
              local  
     | 
| 
       12 
     | 
    
         
            -
               
     | 
| 
       13 
     | 
    
         
            -
                get_name = function(self)
         
     | 
| 
       14 
     | 
    
         
            -
                  return self.name
         
     | 
| 
       15 
     | 
    
         
            -
                end
         
     | 
| 
       16 
     | 
    
         
            -
              }
         
     | 
| 
       17 
     | 
    
         
            -
              _base_0.__index = _base_0
         
     | 
| 
       18 
     | 
    
         
            -
              if _parent_0 then
         
     | 
| 
       19 
     | 
    
         
            -
                setmetatable(_base_0, _parent_0.__base)
         
     | 
| 
       20 
     | 
    
         
            -
              end
         
     | 
| 
       21 
     | 
    
         
            -
              local _class_0 = setmetatable({
         
     | 
| 
       22 
     | 
    
         
            -
                __init = function(self, name)
         
     | 
| 
       23 
     | 
    
         
            -
                  self.name = name
         
     | 
| 
       24 
     | 
    
         
            -
                  self[1] = "temp_name"
         
     | 
| 
       25 
     | 
    
         
            -
                end,
         
     | 
| 
       26 
     | 
    
         
            -
                __base = _base_0,
         
     | 
| 
       27 
     | 
    
         
            -
                __name = "LocalName",
         
     | 
| 
       28 
     | 
    
         
            -
                __parent = _parent_0
         
     | 
| 
       29 
     | 
    
         
            -
              }, {
         
     | 
| 
       30 
     | 
    
         
            -
                __index = function(cls, name)
         
     | 
| 
       31 
     | 
    
         
            -
                  local val = rawget(_base_0, name)
         
     | 
| 
       32 
     | 
    
         
            -
                  if val == nil and _parent_0 then
         
     | 
| 
       33 
     | 
    
         
            -
                    return _parent_0[name]
         
     | 
| 
       34 
     | 
    
         
            -
                  else
         
     | 
| 
       35 
     | 
    
         
            -
                    return val
         
     | 
| 
       36 
     | 
    
         
            -
                  end
         
     | 
| 
       37 
     | 
    
         
            -
                end,
         
     | 
| 
       38 
     | 
    
         
            -
                __call = function(cls, ...)
         
     | 
| 
       39 
     | 
    
         
            -
                  local _self_0 = setmetatable({}, _base_0)
         
     | 
| 
       40 
     | 
    
         
            -
                  cls.__init(_self_0, ...)
         
     | 
| 
       41 
     | 
    
         
            -
                  return _self_0
         
     | 
| 
       42 
     | 
    
         
            -
                end
         
     | 
| 
       43 
     | 
    
         
            -
              })
         
     | 
| 
       44 
     | 
    
         
            -
              _base_0.__class = _class_0
         
     | 
| 
       45 
     | 
    
         
            -
              if _parent_0 and _parent_0.__inherited then
         
     | 
| 
       46 
     | 
    
         
            -
                _parent_0.__inherited(_parent_0, _class_0)
         
     | 
| 
       47 
     | 
    
         
            -
              end
         
     | 
| 
       48 
     | 
    
         
            -
              LocalName = _class_0
         
     | 
| 
       49 
     | 
    
         
            -
            end
         
     | 
| 
       50 
     | 
    
         
            -
            do
         
     | 
| 
       51 
     | 
    
         
            -
              local _parent_0 = nil
         
     | 
| 
       52 
     | 
    
         
            -
              local _base_0 = {
         
     | 
| 
       53 
     | 
    
         
            -
                get_name = function(self, scope)
         
     | 
| 
       54 
     | 
    
         
            -
                  if not self.name then
         
     | 
| 
       55 
     | 
    
         
            -
                    self.name = scope:free_name(self.prefix, true)
         
     | 
| 
       56 
     | 
    
         
            -
                  end
         
     | 
| 
       57 
     | 
    
         
            -
                  return self.name
         
     | 
| 
       58 
     | 
    
         
            -
                end,
         
     | 
| 
       59 
     | 
    
         
            -
                chain = function(self, ...)
         
     | 
| 
       60 
     | 
    
         
            -
                  local items = {
         
     | 
| 
       61 
     | 
    
         
            -
                    ...
         
     | 
| 
       62 
     | 
    
         
            -
                  }
         
     | 
| 
       63 
     | 
    
         
            -
                  items = (function()
         
     | 
| 
       64 
     | 
    
         
            -
                    local _accum_0 = { }
         
     | 
| 
       65 
     | 
    
         
            -
                    local _len_0 = 0
         
     | 
| 
       66 
     | 
    
         
            -
                    local _list_0 = items
         
     | 
| 
       67 
     | 
    
         
            -
                    for _index_0 = 1, #_list_0 do
         
     | 
| 
       68 
     | 
    
         
            -
                      local i = _list_0[_index_0]
         
     | 
| 
       69 
     | 
    
         
            -
                      local _value_0
         
     | 
| 
       70 
     | 
    
         
            -
                      if type(i) == "string" then
         
     | 
| 
       71 
     | 
    
         
            -
                        _value_0 = {
         
     | 
| 
       72 
     | 
    
         
            -
                          "dot",
         
     | 
| 
       73 
     | 
    
         
            -
                          i
         
     | 
| 
       74 
     | 
    
         
            -
                        }
         
     | 
| 
       75 
     | 
    
         
            -
                      else
         
     | 
| 
       76 
     | 
    
         
            -
                        _value_0 = i
         
     | 
| 
       77 
     | 
    
         
            -
                      end
         
     | 
| 
       78 
     | 
    
         
            -
                      if _value_0 ~= nil then
         
     | 
| 
       79 
     | 
    
         
            -
                        _len_0 = _len_0 + 1
         
     | 
| 
       80 
     | 
    
         
            -
                        _accum_0[_len_0] = _value_0
         
     | 
| 
       81 
     | 
    
         
            -
                      end
         
     | 
| 
       82 
     | 
    
         
            -
                    end
         
     | 
| 
       83 
     | 
    
         
            -
                    return _accum_0
         
     | 
| 
       84 
     | 
    
         
            -
                  end)()
         
     | 
| 
       85 
     | 
    
         
            -
                  return build.chain({
         
     | 
| 
       86 
     | 
    
         
            -
                    base = self,
         
     | 
| 
       87 
     | 
    
         
            -
                    unpack(items)
         
     | 
| 
       88 
     | 
    
         
            -
                  })
         
     | 
| 
       89 
     | 
    
         
            -
                end,
         
     | 
| 
       90 
     | 
    
         
            -
                index = function(self, key)
         
     | 
| 
       91 
     | 
    
         
            -
                  return build.chain({
         
     | 
| 
       92 
     | 
    
         
            -
                    base = self,
         
     | 
| 
       93 
     | 
    
         
            -
                    {
         
     | 
| 
       94 
     | 
    
         
            -
                      "index",
         
     | 
| 
       95 
     | 
    
         
            -
                      key
         
     | 
| 
       96 
     | 
    
         
            -
                    }
         
     | 
| 
       97 
     | 
    
         
            -
                  })
         
     | 
| 
       98 
     | 
    
         
            -
                end,
         
     | 
| 
       99 
     | 
    
         
            -
                __tostring = function(self)
         
     | 
| 
       100 
     | 
    
         
            -
                  if self.name then
         
     | 
| 
       101 
     | 
    
         
            -
                    return ("name<%s>"):format(self.name)
         
     | 
| 
       102 
     | 
    
         
            -
                  else
         
     | 
| 
       103 
     | 
    
         
            -
                    return ("name<prefix(%s)>"):format(self.prefix)
         
     | 
| 
       104 
     | 
    
         
            -
                  end
         
     | 
| 
       105 
     | 
    
         
            -
                end
         
     | 
| 
       106 
     | 
    
         
            -
              }
         
     | 
| 
       107 
     | 
    
         
            -
              _base_0.__index = _base_0
         
     | 
| 
       108 
     | 
    
         
            -
              if _parent_0 then
         
     | 
| 
       109 
     | 
    
         
            -
                setmetatable(_base_0, _parent_0.__base)
         
     | 
| 
       110 
     | 
    
         
            -
              end
         
     | 
| 
       111 
     | 
    
         
            -
              local _class_0 = setmetatable({
         
     | 
| 
       112 
     | 
    
         
            -
                __init = function(self, prefix)
         
     | 
| 
       113 
     | 
    
         
            -
                  self.prefix = prefix
         
     | 
| 
       114 
     | 
    
         
            -
                  self[1] = "temp_name"
         
     | 
| 
       115 
     | 
    
         
            -
                end,
         
     | 
| 
       116 
     | 
    
         
            -
                __base = _base_0,
         
     | 
| 
       117 
     | 
    
         
            -
                __name = "NameProxy",
         
     | 
| 
       118 
     | 
    
         
            -
                __parent = _parent_0
         
     | 
| 
       119 
     | 
    
         
            -
              }, {
         
     | 
| 
       120 
     | 
    
         
            -
                __index = function(cls, name)
         
     | 
| 
       121 
     | 
    
         
            -
                  local val = rawget(_base_0, name)
         
     | 
| 
       122 
     | 
    
         
            -
                  if val == nil and _parent_0 then
         
     | 
| 
       123 
     | 
    
         
            -
                    return _parent_0[name]
         
     | 
| 
       124 
     | 
    
         
            -
                  else
         
     | 
| 
       125 
     | 
    
         
            -
                    return val
         
     | 
| 
       126 
     | 
    
         
            -
                  end
         
     | 
| 
       127 
     | 
    
         
            -
                end,
         
     | 
| 
       128 
     | 
    
         
            -
                __call = function(cls, ...)
         
     | 
| 
       129 
     | 
    
         
            -
                  local _self_0 = setmetatable({}, _base_0)
         
     | 
| 
       130 
     | 
    
         
            -
                  cls.__init(_self_0, ...)
         
     | 
| 
       131 
     | 
    
         
            -
                  return _self_0
         
     | 
| 
       132 
     | 
    
         
            -
                end
         
     | 
| 
       133 
     | 
    
         
            -
              })
         
     | 
| 
       134 
     | 
    
         
            -
              _base_0.__class = _class_0
         
     | 
| 
       135 
     | 
    
         
            -
              if _parent_0 and _parent_0.__inherited then
         
     | 
| 
       136 
     | 
    
         
            -
                _parent_0.__inherited(_parent_0, _class_0)
         
     | 
| 
       137 
     | 
    
         
            -
              end
         
     | 
| 
       138 
     | 
    
         
            -
              NameProxy = _class_0
         
     | 
| 
      
 9 
     | 
    
         
            +
              local _table_0 = require("moonscript.transform.names")
         
     | 
| 
      
 10 
     | 
    
         
            +
              NameProxy, LocalName = _table_0.NameProxy, _table_0.LocalName
         
     | 
| 
       139 
11 
     | 
    
         
             
            end
         
     | 
| 
      
 12 
     | 
    
         
            +
            local destructure = require("moonscript.transform.destructure")
         
     | 
| 
      
 13 
     | 
    
         
            +
            local implicitly_return
         
     | 
| 
      
 14 
     | 
    
         
            +
            local Run
         
     | 
| 
       140 
15 
     | 
    
         
             
            do
         
     | 
| 
       141 
16 
     | 
    
         
             
              local _parent_0 = nil
         
     | 
| 
       142 
17 
     | 
    
         
             
              local _base_0 = {
         
     | 
| 
         @@ -182,25 +57,21 @@ apply_to_last = function(stms, fn) 
     | 
|
| 
       182 
57 
     | 
    
         
             
              local last_exp_id = 0
         
     | 
| 
       183 
58 
     | 
    
         
             
              for i = #stms, 1, -1 do
         
     | 
| 
       184 
59 
     | 
    
         
             
                local stm = stms[i]
         
     | 
| 
       185 
     | 
    
         
            -
                if stm and  
     | 
| 
      
 60 
     | 
    
         
            +
                if stm and mtype(stm) ~= Run then
         
     | 
| 
       186 
61 
     | 
    
         
             
                  last_exp_id = i
         
     | 
| 
       187 
62 
     | 
    
         
             
                  break
         
     | 
| 
       188 
63 
     | 
    
         
             
                end
         
     | 
| 
       189 
64 
     | 
    
         
             
              end
         
     | 
| 
       190 
65 
     | 
    
         
             
              return (function()
         
     | 
| 
       191 
66 
     | 
    
         
             
                local _accum_0 = { }
         
     | 
| 
       192 
     | 
    
         
            -
                local _len_0 =  
     | 
| 
      
 67 
     | 
    
         
            +
                local _len_0 = 1
         
     | 
| 
       193 
68 
     | 
    
         
             
                for i, stm in ipairs(stms) do
         
     | 
| 
       194 
     | 
    
         
            -
                  local _value_0
         
     | 
| 
       195 
69 
     | 
    
         
             
                  if i == last_exp_id then
         
     | 
| 
       196 
     | 
    
         
            -
                     
     | 
| 
      
 70 
     | 
    
         
            +
                    _accum_0[_len_0] = fn(stm)
         
     | 
| 
       197 
71 
     | 
    
         
             
                  else
         
     | 
| 
       198 
     | 
    
         
            -
                     
     | 
| 
       199 
     | 
    
         
            -
                  end
         
     | 
| 
       200 
     | 
    
         
            -
                  if _value_0 ~= nil then
         
     | 
| 
       201 
     | 
    
         
            -
                    _len_0 = _len_0 + 1
         
     | 
| 
       202 
     | 
    
         
            -
                    _accum_0[_len_0] = _value_0
         
     | 
| 
      
 72 
     | 
    
         
            +
                    _accum_0[_len_0] = stm
         
     | 
| 
       203 
73 
     | 
    
         
             
                  end
         
     | 
| 
      
 74 
     | 
    
         
            +
                  _len_0 = _len_0 + 1
         
     | 
| 
       204 
75 
     | 
    
         
             
                end
         
     | 
| 
       205 
76 
     | 
    
         
             
                return _accum_0
         
     | 
| 
       206 
77 
     | 
    
         
             
              end)()
         
     | 
| 
         @@ -213,48 +84,49 @@ is_singular = function(body) 
     | 
|
| 
       213 
84 
     | 
    
         
             
              if "group" == ntype(body) then
         
     | 
| 
       214 
85 
     | 
    
         
             
                return is_singular(body[2])
         
     | 
| 
       215 
86 
     | 
    
         
             
              else
         
     | 
| 
       216 
     | 
    
         
            -
                return  
     | 
| 
      
 87 
     | 
    
         
            +
                return body[1]
         
     | 
| 
       217 
88 
     | 
    
         
             
              end
         
     | 
| 
       218 
89 
     | 
    
         
             
            end
         
     | 
| 
       219 
     | 
    
         
            -
            local  
     | 
| 
       220 
     | 
    
         
            -
             
     | 
| 
      
 90 
     | 
    
         
            +
            local extract_declarations
         
     | 
| 
      
 91 
     | 
    
         
            +
            extract_declarations = function(self, body, start, out)
         
     | 
| 
      
 92 
     | 
    
         
            +
              if body == nil then
         
     | 
| 
      
 93 
     | 
    
         
            +
                body = self.current_stms
         
     | 
| 
      
 94 
     | 
    
         
            +
              end
         
     | 
| 
      
 95 
     | 
    
         
            +
              if start == nil then
         
     | 
| 
      
 96 
     | 
    
         
            +
                start = self.current_stm_i + 1
         
     | 
| 
      
 97 
     | 
    
         
            +
              end
         
     | 
| 
       221 
98 
     | 
    
         
             
              if out == nil then
         
     | 
| 
       222 
99 
     | 
    
         
             
                out = { }
         
     | 
| 
       223 
100 
     | 
    
         
             
              end
         
     | 
| 
       224 
     | 
    
         
            -
               
     | 
| 
       225 
     | 
    
         
            -
             
     | 
| 
       226 
     | 
    
         
            -
                 
     | 
| 
       227 
     | 
    
         
            -
             
     | 
| 
       228 
     | 
    
         
            -
             
     | 
| 
       229 
     | 
    
         
            -
             
     | 
| 
       230 
     | 
    
         
            -
             
     | 
| 
       231 
     | 
    
         
            -
                   
     | 
| 
       232 
     | 
    
         
            -
             
     | 
| 
       233 
     | 
    
         
            -
             
     | 
| 
       234 
     | 
    
         
            -
             
     | 
| 
       235 
     | 
    
         
            -
             
     | 
| 
       236 
     | 
    
         
            -
            local  
     | 
| 
       237 
     | 
    
         
            -
             
     | 
| 
       238 
     | 
    
         
            -
             
     | 
| 
       239 
     | 
    
         
            -
             
     | 
| 
       240 
     | 
    
         
            -
             
     | 
| 
       241 
     | 
    
         
            -
             
     | 
| 
       242 
     | 
    
         
            -
             
     | 
| 
       243 
     | 
    
         
            -
             
     | 
| 
       244 
     | 
    
         
            -
             
     | 
| 
       245 
     | 
    
         
            -
                  if type(name) == "string" then
         
     | 
| 
       246 
     | 
    
         
            -
                    table.insert(assigns, name)
         
     | 
| 
      
 101 
     | 
    
         
            +
              for i = start, #body do
         
     | 
| 
      
 102 
     | 
    
         
            +
                local _continue_0 = false
         
     | 
| 
      
 103 
     | 
    
         
            +
                repeat
         
     | 
| 
      
 104 
     | 
    
         
            +
                  local stm = body[i]
         
     | 
| 
      
 105 
     | 
    
         
            +
                  if stm == nil then
         
     | 
| 
      
 106 
     | 
    
         
            +
                    _continue_0 = true
         
     | 
| 
      
 107 
     | 
    
         
            +
                    break
         
     | 
| 
      
 108 
     | 
    
         
            +
                  end
         
     | 
| 
      
 109 
     | 
    
         
            +
                  stm = self.transform.statement(stm)
         
     | 
| 
      
 110 
     | 
    
         
            +
                  body[i] = stm
         
     | 
| 
      
 111 
     | 
    
         
            +
                  local _exp_0 = stm[1]
         
     | 
| 
      
 112 
     | 
    
         
            +
                  if "assign" == _exp_0 or "declare" == _exp_0 then
         
     | 
| 
      
 113 
     | 
    
         
            +
                    local _list_0 = stm[2]
         
     | 
| 
      
 114 
     | 
    
         
            +
                    for _index_0 = 1, #_list_0 do
         
     | 
| 
      
 115 
     | 
    
         
            +
                      local name = _list_0[_index_0]
         
     | 
| 
      
 116 
     | 
    
         
            +
                      if type(name) == "string" then
         
     | 
| 
      
 117 
     | 
    
         
            +
                        insert(out, name)
         
     | 
| 
      
 118 
     | 
    
         
            +
                      end
         
     | 
| 
      
 119 
     | 
    
         
            +
                    end
         
     | 
| 
      
 120 
     | 
    
         
            +
                  elseif "group" == _exp_0 then
         
     | 
| 
      
 121 
     | 
    
         
            +
                    extract_declarations(self, stm[2], 1, out)
         
     | 
| 
       247 
122 
     | 
    
         
             
                  end
         
     | 
| 
      
 123 
     | 
    
         
            +
                  _continue_0 = true
         
     | 
| 
      
 124 
     | 
    
         
            +
                until true
         
     | 
| 
      
 125 
     | 
    
         
            +
                if not _continue_0 then
         
     | 
| 
      
 126 
     | 
    
         
            +
                  break
         
     | 
| 
       248 
127 
     | 
    
         
             
                end
         
     | 
| 
       249 
128 
     | 
    
         
             
              end
         
     | 
| 
       250 
     | 
    
         
            -
               
     | 
| 
       251 
     | 
    
         
            -
              while mtype(body[idx]) == Run do
         
     | 
| 
       252 
     | 
    
         
            -
                idx = idx + 1
         
     | 
| 
       253 
     | 
    
         
            -
              end
         
     | 
| 
       254 
     | 
    
         
            -
              return table.insert(body, idx, {
         
     | 
| 
       255 
     | 
    
         
            -
                "declare",
         
     | 
| 
       256 
     | 
    
         
            -
                assigns
         
     | 
| 
       257 
     | 
    
         
            -
              })
         
     | 
| 
      
 129 
     | 
    
         
            +
              return out
         
     | 
| 
       258 
130 
     | 
    
         
             
            end
         
     | 
| 
       259 
131 
     | 
    
         
             
            local expand_elseif_assign
         
     | 
| 
       260 
132 
     | 
    
         
             
            expand_elseif_assign = function(ifstm)
         
     | 
| 
         @@ -420,9 +292,25 @@ construct_comprehension = function(inner, clauses) 
     | 
|
| 
       420 
292 
     | 
    
         
             
              local current_stms = inner
         
     | 
| 
       421 
293 
     | 
    
         
             
              for _, clause in reversed(clauses) do
         
     | 
| 
       422 
294 
     | 
    
         
             
                local t = clause[1]
         
     | 
| 
       423 
     | 
    
         
            -
                 
     | 
| 
      
 295 
     | 
    
         
            +
                local _exp_0 = t
         
     | 
| 
      
 296 
     | 
    
         
            +
                if "for" == _exp_0 then
         
     | 
| 
      
 297 
     | 
    
         
            +
                  local name, bounds
         
     | 
| 
      
 298 
     | 
    
         
            +
                  do
         
     | 
| 
      
 299 
     | 
    
         
            +
                    local _obj_0 = clause
         
     | 
| 
      
 300 
     | 
    
         
            +
                    _, name, bounds = _obj_0[1], _obj_0[2], _obj_0[3]
         
     | 
| 
      
 301 
     | 
    
         
            +
                  end
         
     | 
| 
      
 302 
     | 
    
         
            +
                  current_stms = {
         
     | 
| 
      
 303 
     | 
    
         
            +
                    "for",
         
     | 
| 
      
 304 
     | 
    
         
            +
                    name,
         
     | 
| 
      
 305 
     | 
    
         
            +
                    bounds,
         
     | 
| 
      
 306 
     | 
    
         
            +
                    current_stms
         
     | 
| 
      
 307 
     | 
    
         
            +
                  }
         
     | 
| 
      
 308 
     | 
    
         
            +
                elseif "foreach" == _exp_0 then
         
     | 
| 
       424 
309 
     | 
    
         
             
                  local names, iter
         
     | 
| 
       425 
     | 
    
         
            -
                   
     | 
| 
      
 310 
     | 
    
         
            +
                  do
         
     | 
| 
      
 311 
     | 
    
         
            +
                    local _obj_0 = clause
         
     | 
| 
      
 312 
     | 
    
         
            +
                    _, names, iter = _obj_0[1], _obj_0[2], _obj_0[3]
         
     | 
| 
      
 313 
     | 
    
         
            +
                  end
         
     | 
| 
       426 
314 
     | 
    
         
             
                  current_stms = {
         
     | 
| 
       427 
315 
     | 
    
         
             
                    "foreach",
         
     | 
| 
       428 
316 
     | 
    
         
             
                    names,
         
     | 
| 
         @@ -431,9 +319,12 @@ construct_comprehension = function(inner, clauses) 
     | 
|
| 
       431 
319 
     | 
    
         
             
                    },
         
     | 
| 
       432 
320 
     | 
    
         
             
                    current_stms
         
     | 
| 
       433 
321 
     | 
    
         
             
                  }
         
     | 
| 
       434 
     | 
    
         
            -
                elseif  
     | 
| 
      
 322 
     | 
    
         
            +
                elseif "when" == _exp_0 then
         
     | 
| 
       435 
323 
     | 
    
         
             
                  local cond
         
     | 
| 
       436 
     | 
    
         
            -
                   
     | 
| 
      
 324 
     | 
    
         
            +
                  do
         
     | 
| 
      
 325 
     | 
    
         
            +
                    local _obj_0 = clause
         
     | 
| 
      
 326 
     | 
    
         
            +
                    _, cond = _obj_0[1], _obj_0[2]
         
     | 
| 
      
 327 
     | 
    
         
            +
                  end
         
     | 
| 
       437 
328 
     | 
    
         
             
                  current_stms = {
         
     | 
| 
       438 
329 
     | 
    
         
             
                    "if",
         
     | 
| 
       439 
330 
     | 
    
         
             
                    cond,
         
     | 
| 
         @@ -448,10 +339,42 @@ construct_comprehension = function(inner, clauses) 
     | 
|
| 
       448 
339 
     | 
    
         
             
              end
         
     | 
| 
       449 
340 
     | 
    
         
             
              return current_stms[1]
         
     | 
| 
       450 
341 
     | 
    
         
             
            end
         
     | 
| 
       451 
     | 
    
         
            -
            Statement = Transformer({
         
     | 
| 
      
 342 
     | 
    
         
            +
            local Statement = Transformer({
         
     | 
| 
       452 
343 
     | 
    
         
             
              root_stms = function(self, body)
         
     | 
| 
       453 
344 
     | 
    
         
             
                return apply_to_last(body, implicitly_return(self))
         
     | 
| 
       454 
345 
     | 
    
         
             
              end,
         
     | 
| 
      
 346 
     | 
    
         
            +
              declare_glob = function(self, node)
         
     | 
| 
      
 347 
     | 
    
         
            +
                local names = extract_declarations(self)
         
     | 
| 
      
 348 
     | 
    
         
            +
                if node[2] == "^" then
         
     | 
| 
      
 349 
     | 
    
         
            +
                  names = (function()
         
     | 
| 
      
 350 
     | 
    
         
            +
                    local _accum_0 = { }
         
     | 
| 
      
 351 
     | 
    
         
            +
                    local _len_0 = 1
         
     | 
| 
      
 352 
     | 
    
         
            +
                    local _list_0 = names
         
     | 
| 
      
 353 
     | 
    
         
            +
                    for _index_0 = 1, #_list_0 do
         
     | 
| 
      
 354 
     | 
    
         
            +
                      local _continue_0 = false
         
     | 
| 
      
 355 
     | 
    
         
            +
                      repeat
         
     | 
| 
      
 356 
     | 
    
         
            +
                        local name = _list_0[_index_0]
         
     | 
| 
      
 357 
     | 
    
         
            +
                        if not (name:match("^%u")) then
         
     | 
| 
      
 358 
     | 
    
         
            +
                          _continue_0 = true
         
     | 
| 
      
 359 
     | 
    
         
            +
                          break
         
     | 
| 
      
 360 
     | 
    
         
            +
                        end
         
     | 
| 
      
 361 
     | 
    
         
            +
                        local _value_0 = name
         
     | 
| 
      
 362 
     | 
    
         
            +
                        _accum_0[_len_0] = _value_0
         
     | 
| 
      
 363 
     | 
    
         
            +
                        _len_0 = _len_0 + 1
         
     | 
| 
      
 364 
     | 
    
         
            +
                        _continue_0 = true
         
     | 
| 
      
 365 
     | 
    
         
            +
                      until true
         
     | 
| 
      
 366 
     | 
    
         
            +
                      if not _continue_0 then
         
     | 
| 
      
 367 
     | 
    
         
            +
                        break
         
     | 
| 
      
 368 
     | 
    
         
            +
                      end
         
     | 
| 
      
 369 
     | 
    
         
            +
                    end
         
     | 
| 
      
 370 
     | 
    
         
            +
                    return _accum_0
         
     | 
| 
      
 371 
     | 
    
         
            +
                  end)()
         
     | 
| 
      
 372 
     | 
    
         
            +
                end
         
     | 
| 
      
 373 
     | 
    
         
            +
                return {
         
     | 
| 
      
 374 
     | 
    
         
            +
                  "declare",
         
     | 
| 
      
 375 
     | 
    
         
            +
                  names
         
     | 
| 
      
 376 
     | 
    
         
            +
                }
         
     | 
| 
      
 377 
     | 
    
         
            +
              end,
         
     | 
| 
       455 
378 
     | 
    
         
             
              assign = function(self, node)
         
     | 
| 
       456 
379 
     | 
    
         
             
                local names, values = unpack(node, 2)
         
     | 
| 
       457 
380 
     | 
    
         
             
                local transformed
         
     | 
| 
         @@ -486,7 +409,11 @@ Statement = Transformer({ 
     | 
|
| 
       486 
409 
     | 
    
         
             
                    })
         
     | 
| 
       487 
410 
     | 
    
         
             
                  end
         
     | 
| 
       488 
411 
     | 
    
         
             
                end
         
     | 
| 
       489 
     | 
    
         
            -
                 
     | 
| 
      
 412 
     | 
    
         
            +
                node = transformed or node
         
     | 
| 
      
 413 
     | 
    
         
            +
                if destructure.has_destructure(names) then
         
     | 
| 
      
 414 
     | 
    
         
            +
                  return destructure.split_assign(node)
         
     | 
| 
      
 415 
     | 
    
         
            +
                end
         
     | 
| 
      
 416 
     | 
    
         
            +
                return node
         
     | 
| 
       490 
417 
     | 
    
         
             
              end,
         
     | 
| 
       491 
418 
     | 
    
         
             
              continue = function(self, node)
         
     | 
| 
       492 
419 
     | 
    
         
             
                local continue_name = self:send("continue")
         
     | 
| 
         @@ -549,37 +476,30 @@ Statement = Transformer({ 
     | 
|
| 
       549 
476 
     | 
    
         
             
                local _, names, source = unpack(node)
         
     | 
| 
       550 
477 
     | 
    
         
             
                local stubs = (function()
         
     | 
| 
       551 
478 
     | 
    
         
             
                  local _accum_0 = { }
         
     | 
| 
       552 
     | 
    
         
            -
                  local _len_0 =  
     | 
| 
      
 479 
     | 
    
         
            +
                  local _len_0 = 1
         
     | 
| 
       553 
480 
     | 
    
         
             
                  local _list_0 = names
         
     | 
| 
       554 
481 
     | 
    
         
             
                  for _index_0 = 1, #_list_0 do
         
     | 
| 
       555 
482 
     | 
    
         
             
                    local name = _list_0[_index_0]
         
     | 
| 
       556 
     | 
    
         
            -
                    local _value_0
         
     | 
| 
       557 
483 
     | 
    
         
             
                    if type(name) == "table" then
         
     | 
| 
       558 
     | 
    
         
            -
                       
     | 
| 
      
 484 
     | 
    
         
            +
                      _accum_0[_len_0] = name
         
     | 
| 
       559 
485 
     | 
    
         
             
                    else
         
     | 
| 
       560 
     | 
    
         
            -
                       
     | 
| 
      
 486 
     | 
    
         
            +
                      _accum_0[_len_0] = {
         
     | 
| 
       561 
487 
     | 
    
         
             
                        "dot",
         
     | 
| 
       562 
488 
     | 
    
         
             
                        name
         
     | 
| 
       563 
489 
     | 
    
         
             
                      }
         
     | 
| 
       564 
490 
     | 
    
         
             
                    end
         
     | 
| 
       565 
     | 
    
         
            -
                     
     | 
| 
       566 
     | 
    
         
            -
                      _len_0 = _len_0 + 1
         
     | 
| 
       567 
     | 
    
         
            -
                      _accum_0[_len_0] = _value_0
         
     | 
| 
       568 
     | 
    
         
            -
                    end
         
     | 
| 
      
 491 
     | 
    
         
            +
                    _len_0 = _len_0 + 1
         
     | 
| 
       569 
492 
     | 
    
         
             
                  end
         
     | 
| 
       570 
493 
     | 
    
         
             
                  return _accum_0
         
     | 
| 
       571 
494 
     | 
    
         
             
                end)()
         
     | 
| 
       572 
495 
     | 
    
         
             
                local real_names = (function()
         
     | 
| 
       573 
496 
     | 
    
         
             
                  local _accum_0 = { }
         
     | 
| 
       574 
     | 
    
         
            -
                  local _len_0 =  
     | 
| 
      
 497 
     | 
    
         
            +
                  local _len_0 = 1
         
     | 
| 
       575 
498 
     | 
    
         
             
                  local _list_0 = names
         
     | 
| 
       576 
499 
     | 
    
         
             
                  for _index_0 = 1, #_list_0 do
         
     | 
| 
       577 
500 
     | 
    
         
             
                    local name = _list_0[_index_0]
         
     | 
| 
       578 
     | 
    
         
            -
                     
     | 
| 
       579 
     | 
    
         
            -
                     
     | 
| 
       580 
     | 
    
         
            -
                      _len_0 = _len_0 + 1
         
     | 
| 
       581 
     | 
    
         
            -
                      _accum_0[_len_0] = _value_0
         
     | 
| 
       582 
     | 
    
         
            -
                    end
         
     | 
| 
      
 501 
     | 
    
         
            +
                    _accum_0[_len_0] = type(name) == "table" and name[2] or name
         
     | 
| 
      
 502 
     | 
    
         
            +
                    _len_0 = _len_0 + 1
         
     | 
| 
       583 
503 
     | 
    
         
             
                  end
         
     | 
| 
       584 
504 
     | 
    
         
             
                  return _accum_0
         
     | 
| 
       585 
505 
     | 
    
         
             
                end)()
         
     | 
| 
         @@ -588,15 +508,15 @@ Statement = Transformer({ 
     | 
|
| 
       588 
508 
     | 
    
         
             
                    names = real_names,
         
     | 
| 
       589 
509 
     | 
    
         
             
                    values = (function()
         
     | 
| 
       590 
510 
     | 
    
         
             
                      local _accum_0 = { }
         
     | 
| 
       591 
     | 
    
         
            -
                      local _len_0 =  
     | 
| 
      
 511 
     | 
    
         
            +
                      local _len_0 = 1
         
     | 
| 
       592 
512 
     | 
    
         
             
                      local _list_0 = stubs
         
     | 
| 
       593 
513 
     | 
    
         
             
                      for _index_0 = 1, #_list_0 do
         
     | 
| 
       594 
514 
     | 
    
         
             
                        local stub = _list_0[_index_0]
         
     | 
| 
       595 
     | 
    
         
            -
                        _len_0 = _len_0 + 1
         
     | 
| 
       596 
515 
     | 
    
         
             
                        _accum_0[_len_0] = build.chain({
         
     | 
| 
       597 
516 
     | 
    
         
             
                          base = source,
         
     | 
| 
       598 
517 
     | 
    
         
             
                          stub
         
     | 
| 
       599 
518 
     | 
    
         
             
                        })
         
     | 
| 
      
 519 
     | 
    
         
            +
                        _len_0 = _len_0 + 1
         
     | 
| 
       600 
520 
     | 
    
         
             
                      end
         
     | 
| 
       601 
521 
     | 
    
         
             
                      return _accum_0
         
     | 
| 
       602 
522 
     | 
    
         
             
                    end)()
         
     | 
| 
         @@ -614,15 +534,15 @@ Statement = Transformer({ 
     | 
|
| 
       614 
534 
     | 
    
         
             
                        names = real_names,
         
     | 
| 
       615 
535 
     | 
    
         
             
                        values = (function()
         
     | 
| 
       616 
536 
     | 
    
         
             
                          local _accum_0 = { }
         
     | 
| 
       617 
     | 
    
         
            -
                          local _len_0 =  
     | 
| 
      
 537 
     | 
    
         
            +
                          local _len_0 = 1
         
     | 
| 
       618 
538 
     | 
    
         
             
                          local _list_0 = stubs
         
     | 
| 
       619 
539 
     | 
    
         
             
                          for _index_0 = 1, #_list_0 do
         
     | 
| 
       620 
540 
     | 
    
         
             
                            local stub = _list_0[_index_0]
         
     | 
| 
       621 
     | 
    
         
            -
                            _len_0 = _len_0 + 1
         
     | 
| 
       622 
541 
     | 
    
         
             
                            _accum_0[_len_0] = build.chain({
         
     | 
| 
       623 
542 
     | 
    
         
             
                              base = source_name,
         
     | 
| 
       624 
543 
     | 
    
         
             
                              stub
         
     | 
| 
       625 
544 
     | 
    
         
             
                            })
         
     | 
| 
      
 545 
     | 
    
         
            +
                            _len_0 = _len_0 + 1
         
     | 
| 
       626 
546 
     | 
    
         
             
                          end
         
     | 
| 
       627 
547 
     | 
    
         
             
                          return _accum_0
         
     | 
| 
       628 
548 
     | 
    
         
             
                        end)()
         
     | 
| 
         @@ -690,13 +610,13 @@ Statement = Transformer({ 
     | 
|
| 
       690 
610 
     | 
    
         
             
                    build.declare({
         
     | 
| 
       691 
611 
     | 
    
         
             
                      names = (function()
         
     | 
| 
       692 
612 
     | 
    
         
             
                        local _accum_0 = { }
         
     | 
| 
       693 
     | 
    
         
            -
                        local _len_0 =  
     | 
| 
      
 613 
     | 
    
         
            +
                        local _len_0 = 1
         
     | 
| 
       694 
614 
     | 
    
         
             
                        local _list_0 = stm[2]
         
     | 
| 
       695 
615 
     | 
    
         
             
                        for _index_0 = 1, #_list_0 do
         
     | 
| 
       696 
616 
     | 
    
         
             
                          local name = _list_0[_index_0]
         
     | 
| 
       697 
617 
     | 
    
         
             
                          if type(name) == "string" then
         
     | 
| 
       698 
     | 
    
         
            -
                            _len_0 = _len_0 + 1
         
     | 
| 
       699 
618 
     | 
    
         
             
                            _accum_0[_len_0] = name
         
     | 
| 
      
 619 
     | 
    
         
            +
                            _len_0 = _len_0 + 1
         
     | 
| 
       700 
620 
     | 
    
         
             
                          end
         
     | 
| 
       701 
621 
     | 
    
         
             
                        end
         
     | 
| 
       702 
622 
     | 
    
         
             
                        return _accum_0
         
     | 
| 
         @@ -723,15 +643,32 @@ Statement = Transformer({ 
     | 
|
| 
       723 
643 
     | 
    
         
             
              ["if"] = function(self, node, ret)
         
     | 
| 
       724 
644 
     | 
    
         
             
                if ntype(node[2]) == "assign" then
         
     | 
| 
       725 
645 
     | 
    
         
             
                  local _, assign, body = unpack(node)
         
     | 
| 
       726 
     | 
    
         
            -
                   
     | 
| 
       727 
     | 
    
         
            -
             
     | 
| 
       728 
     | 
    
         
            -
                     
     | 
| 
       729 
     | 
    
         
            -
             
     | 
| 
       730 
     | 
    
         
            -
                       
     | 
| 
       731 
     | 
    
         
            -
                      name,
         
     | 
| 
       732 
     | 
    
         
            -
                      unpack(node, 3)
         
     | 
| 
      
 646 
     | 
    
         
            +
                  if destructure.has_destructure(assign[2]) then
         
     | 
| 
      
 647 
     | 
    
         
            +
                    local name = NameProxy("des")
         
     | 
| 
      
 648 
     | 
    
         
            +
                    body = {
         
     | 
| 
      
 649 
     | 
    
         
            +
                      destructure.build_assign(assign[2][1], name),
         
     | 
| 
      
 650 
     | 
    
         
            +
                      build.group(node[3])
         
     | 
| 
       733 
651 
     | 
    
         
             
                    }
         
     | 
| 
       734 
     | 
    
         
            -
             
     | 
| 
      
 652 
     | 
    
         
            +
                    return build["do"]({
         
     | 
| 
      
 653 
     | 
    
         
            +
                      build.assign_one(name, assign[3][1]),
         
     | 
| 
      
 654 
     | 
    
         
            +
                      {
         
     | 
| 
      
 655 
     | 
    
         
            +
                        "if",
         
     | 
| 
      
 656 
     | 
    
         
            +
                        name,
         
     | 
| 
      
 657 
     | 
    
         
            +
                        body,
         
     | 
| 
      
 658 
     | 
    
         
            +
                        unpack(node, 4)
         
     | 
| 
      
 659 
     | 
    
         
            +
                      }
         
     | 
| 
      
 660 
     | 
    
         
            +
                    })
         
     | 
| 
      
 661 
     | 
    
         
            +
                  else
         
     | 
| 
      
 662 
     | 
    
         
            +
                    local name = assign[2][1]
         
     | 
| 
      
 663 
     | 
    
         
            +
                    return build["do"]({
         
     | 
| 
      
 664 
     | 
    
         
            +
                      assign,
         
     | 
| 
      
 665 
     | 
    
         
            +
                      {
         
     | 
| 
      
 666 
     | 
    
         
            +
                        "if",
         
     | 
| 
      
 667 
     | 
    
         
            +
                        name,
         
     | 
| 
      
 668 
     | 
    
         
            +
                        unpack(node, 3)
         
     | 
| 
      
 669 
     | 
    
         
            +
                      }
         
     | 
| 
      
 670 
     | 
    
         
            +
                    })
         
     | 
| 
      
 671 
     | 
    
         
            +
                  end
         
     | 
| 
       735 
672 
     | 
    
         
             
                end
         
     | 
| 
       736 
673 
     | 
    
         
             
                node = expand_elseif_assign(node)
         
     | 
| 
       737 
674 
     | 
    
         
             
                if ret then
         
     | 
| 
         @@ -779,6 +716,29 @@ Statement = Transformer({ 
     | 
|
| 
       779 
716 
     | 
    
         
             
              foreach = function(self, node)
         
     | 
| 
       780 
717 
     | 
    
         
             
                smart_node(node)
         
     | 
| 
       781 
718 
     | 
    
         
             
                local source = unpack(node.iter)
         
     | 
| 
      
 719 
     | 
    
         
            +
                local destructures = { }
         
     | 
| 
      
 720 
     | 
    
         
            +
                node.names = (function()
         
     | 
| 
      
 721 
     | 
    
         
            +
                  local _accum_0 = { }
         
     | 
| 
      
 722 
     | 
    
         
            +
                  local _len_0 = 1
         
     | 
| 
      
 723 
     | 
    
         
            +
                  for i, name in ipairs(node.names) do
         
     | 
| 
      
 724 
     | 
    
         
            +
                    if ntype(name) == "table" then
         
     | 
| 
      
 725 
     | 
    
         
            +
                      do
         
     | 
| 
      
 726 
     | 
    
         
            +
                        local _with_0 = NameProxy("des")
         
     | 
| 
      
 727 
     | 
    
         
            +
                        local proxy = _with_0
         
     | 
| 
      
 728 
     | 
    
         
            +
                        insert(destructures, destructure.build_assign(name, proxy))
         
     | 
| 
      
 729 
     | 
    
         
            +
                        _accum_0[_len_0] = _with_0
         
     | 
| 
      
 730 
     | 
    
         
            +
                      end
         
     | 
| 
      
 731 
     | 
    
         
            +
                    else
         
     | 
| 
      
 732 
     | 
    
         
            +
                      _accum_0[_len_0] = name
         
     | 
| 
      
 733 
     | 
    
         
            +
                    end
         
     | 
| 
      
 734 
     | 
    
         
            +
                    _len_0 = _len_0 + 1
         
     | 
| 
      
 735 
     | 
    
         
            +
                  end
         
     | 
| 
      
 736 
     | 
    
         
            +
                  return _accum_0
         
     | 
| 
      
 737 
     | 
    
         
            +
                end)()
         
     | 
| 
      
 738 
     | 
    
         
            +
                if next(destructures) then
         
     | 
| 
      
 739 
     | 
    
         
            +
                  insert(destructures, build.group(node.body))
         
     | 
| 
      
 740 
     | 
    
         
            +
                  node.body = destructures
         
     | 
| 
      
 741 
     | 
    
         
            +
                end
         
     | 
| 
       782 
742 
     | 
    
         
             
                if ntype(source) == "unpack" then
         
     | 
| 
       783 
743 
     | 
    
         
             
                  local list = source[2]
         
     | 
| 
       784 
744 
     | 
    
         
             
                  local index_name = NameProxy("index")
         
     | 
| 
         @@ -857,20 +817,33 @@ Statement = Transformer({ 
     | 
|
| 
       857 
817 
     | 
    
         
             
                local exp_name = NameProxy("exp")
         
     | 
| 
       858 
818 
     | 
    
         
             
                local convert_cond
         
     | 
| 
       859 
819 
     | 
    
         
             
                convert_cond = function(cond)
         
     | 
| 
       860 
     | 
    
         
            -
                  local t,  
     | 
| 
      
 820 
     | 
    
         
            +
                  local t, case_exps, body = unpack(cond)
         
     | 
| 
       861 
821 
     | 
    
         
             
                  local out = { }
         
     | 
| 
       862 
822 
     | 
    
         
             
                  insert(out, t == "case" and "elseif" or "else")
         
     | 
| 
       863 
823 
     | 
    
         
             
                  if t ~= "else" then
         
     | 
| 
       864 
     | 
    
         
            -
                     
     | 
| 
       865 
     | 
    
         
            -
             
     | 
| 
      
 824 
     | 
    
         
            +
                    local cond_exp = { }
         
     | 
| 
      
 825 
     | 
    
         
            +
                    for i, case in ipairs(case_exps) do
         
     | 
| 
      
 826 
     | 
    
         
            +
                      if i == 1 then
         
     | 
| 
      
 827 
     | 
    
         
            +
                        insert(cond_exp, "exp")
         
     | 
| 
      
 828 
     | 
    
         
            +
                      else
         
     | 
| 
      
 829 
     | 
    
         
            +
                        insert(cond_exp, "or")
         
     | 
| 
      
 830 
     | 
    
         
            +
                      end
         
     | 
| 
      
 831 
     | 
    
         
            +
                      if not (value_is_singular(case)) then
         
     | 
| 
      
 832 
     | 
    
         
            +
                        case = {
         
     | 
| 
      
 833 
     | 
    
         
            +
                          "parens",
         
     | 
| 
      
 834 
     | 
    
         
            +
                          case
         
     | 
| 
      
 835 
     | 
    
         
            +
                        }
         
     | 
| 
      
 836 
     | 
    
         
            +
                      end
         
     | 
| 
      
 837 
     | 
    
         
            +
                      insert(cond_exp, {
         
     | 
| 
       866 
838 
     | 
    
         
             
                        "exp",
         
     | 
| 
       867 
     | 
    
         
            -
                         
     | 
| 
      
 839 
     | 
    
         
            +
                        case,
         
     | 
| 
       868 
840 
     | 
    
         
             
                        "==",
         
     | 
| 
       869 
841 
     | 
    
         
             
                        exp_name
         
     | 
| 
       870 
842 
     | 
    
         
             
                      })
         
     | 
| 
       871 
843 
     | 
    
         
             
                    end
         
     | 
| 
      
 844 
     | 
    
         
            +
                    insert(out, cond_exp)
         
     | 
| 
       872 
845 
     | 
    
         
             
                  else
         
     | 
| 
       873 
     | 
    
         
            -
                    body =  
     | 
| 
      
 846 
     | 
    
         
            +
                    body = case_exps
         
     | 
| 
       874 
847 
     | 
    
         
             
                  end
         
     | 
| 
       875 
848 
     | 
    
         
             
                  if ret then
         
     | 
| 
       876 
849 
     | 
    
         
             
                    body = apply_to_last(body, ret)
         
     | 
| 
         @@ -921,24 +894,30 @@ Statement = Transformer({ 
     | 
|
| 
       921 
894 
     | 
    
         
             
                    end
         
     | 
| 
       922 
895 
     | 
    
         
             
                  end
         
     | 
| 
       923 
896 
     | 
    
         
             
                end
         
     | 
| 
       924 
     | 
    
         
            -
                local constructor 
     | 
| 
      
 897 
     | 
    
         
            +
                local constructor
         
     | 
| 
       925 
898 
     | 
    
         
             
                properties = (function()
         
     | 
| 
       926 
899 
     | 
    
         
             
                  local _accum_0 = { }
         
     | 
| 
       927 
     | 
    
         
            -
                  local _len_0 =  
     | 
| 
      
 900 
     | 
    
         
            +
                  local _len_0 = 1
         
     | 
| 
       928 
901 
     | 
    
         
             
                  local _list_1 = properties
         
     | 
| 
       929 
902 
     | 
    
         
             
                  for _index_0 = 1, #_list_1 do
         
     | 
| 
       930 
     | 
    
         
            -
                    local  
     | 
| 
       931 
     | 
    
         
            -
                     
     | 
| 
       932 
     | 
    
         
            -
             
     | 
| 
       933 
     | 
    
         
            -
             
     | 
| 
       934 
     | 
    
         
            -
                       
     | 
| 
       935 
     | 
    
         
            -
                       
     | 
| 
       936 
     | 
    
         
            -
             
     | 
| 
       937 
     | 
    
         
            -
             
     | 
| 
       938 
     | 
    
         
            -
             
     | 
| 
       939 
     | 
    
         
            -
             
     | 
| 
       940 
     | 
    
         
            -
             
     | 
| 
      
 903 
     | 
    
         
            +
                    local _continue_0 = false
         
     | 
| 
      
 904 
     | 
    
         
            +
                    repeat
         
     | 
| 
      
 905 
     | 
    
         
            +
                      local tuple = _list_1[_index_0]
         
     | 
| 
      
 906 
     | 
    
         
            +
                      local key = tuple[1]
         
     | 
| 
      
 907 
     | 
    
         
            +
                      local _value_0
         
     | 
| 
      
 908 
     | 
    
         
            +
                      if key[1] == "key_literal" and key[2] == constructor_name then
         
     | 
| 
      
 909 
     | 
    
         
            +
                        constructor = tuple[2]
         
     | 
| 
      
 910 
     | 
    
         
            +
                        _continue_0 = true
         
     | 
| 
      
 911 
     | 
    
         
            +
                        break
         
     | 
| 
      
 912 
     | 
    
         
            +
                      else
         
     | 
| 
      
 913 
     | 
    
         
            +
                        _value_0 = tuple
         
     | 
| 
      
 914 
     | 
    
         
            +
                      end
         
     | 
| 
       941 
915 
     | 
    
         
             
                      _accum_0[_len_0] = _value_0
         
     | 
| 
      
 916 
     | 
    
         
            +
                      _len_0 = _len_0 + 1
         
     | 
| 
      
 917 
     | 
    
         
            +
                      _continue_0 = true
         
     | 
| 
      
 918 
     | 
    
         
            +
                    until true
         
     | 
| 
      
 919 
     | 
    
         
            +
                    if not _continue_0 then
         
     | 
| 
      
 920 
     | 
    
         
            +
                      break
         
     | 
| 
       942 
921 
     | 
    
         
             
                    end
         
     | 
| 
       943 
922 
     | 
    
         
             
                  end
         
     | 
| 
       944 
923 
     | 
    
         
             
                  return _accum_0
         
     | 
| 
         @@ -947,7 +926,7 @@ Statement = Transformer({ 
     | 
|
| 
       947 
926 
     | 
    
         
             
                local base_name = NameProxy("base")
         
     | 
| 
       948 
927 
     | 
    
         
             
                local self_name = NameProxy("self")
         
     | 
| 
       949 
928 
     | 
    
         
             
                local cls_name = NameProxy("class")
         
     | 
| 
       950 
     | 
    
         
            -
                if not constructor then
         
     | 
| 
      
 929 
     | 
    
         
            +
                if not (constructor) then
         
     | 
| 
       951 
930 
     | 
    
         
             
                  constructor = build.fndef({
         
     | 
| 
       952 
931 
     | 
    
         
             
                    args = {
         
     | 
| 
       953 
932 
     | 
    
         
             
                      {
         
     | 
| 
         @@ -972,9 +951,6 @@ Statement = Transformer({ 
     | 
|
| 
       972 
951 
     | 
    
         
             
                      })
         
     | 
| 
       973 
952 
     | 
    
         
             
                    }
         
     | 
| 
       974 
953 
     | 
    
         
             
                  })
         
     | 
| 
       975 
     | 
    
         
            -
                else
         
     | 
| 
       976 
     | 
    
         
            -
                  smart_node(constructor)
         
     | 
| 
       977 
     | 
    
         
            -
                  constructor.arrow = "fat"
         
     | 
| 
       978 
954 
     | 
    
         
             
                end
         
     | 
| 
       979 
955 
     | 
    
         
             
                local real_name = name or parent_assign and parent_assign[2][1]
         
     | 
| 
       980 
956 
     | 
    
         
             
                local _exp_0 = ntype(real_name)
         
     | 
| 
         @@ -1124,12 +1100,12 @@ Statement = Transformer({ 
     | 
|
| 
       1124 
1100 
     | 
    
         
             
                        if chain then
         
     | 
| 
       1125 
1101 
     | 
    
         
             
                          local slice = (function()
         
     | 
| 
       1126 
1102 
     | 
    
         
             
                            local _accum_0 = { }
         
     | 
| 
       1127 
     | 
    
         
            -
                            local _len_0 =  
     | 
| 
      
 1103 
     | 
    
         
            +
                            local _len_0 = 1
         
     | 
| 
       1128 
1104 
     | 
    
         
             
                            local _list_1 = chain
         
     | 
| 
       1129 
1105 
     | 
    
         
             
                            for _index_0 = 3, #_list_1 do
         
     | 
| 
       1130 
1106 
     | 
    
         
             
                              local item = _list_1[_index_0]
         
     | 
| 
       1131 
     | 
    
         
            -
                              _len_0 = _len_0 + 1
         
     | 
| 
       1132 
1107 
     | 
    
         
             
                              _accum_0[_len_0] = item
         
     | 
| 
      
 1108 
     | 
    
         
            +
                              _len_0 = _len_0 + 1
         
     | 
| 
       1133 
1109 
     | 
    
         
             
                            end
         
     | 
| 
       1134 
1110 
     | 
    
         
             
                            return _accum_0
         
     | 
| 
       1135 
1111 
     | 
    
         
             
                          end)()
         
     | 
| 
         @@ -1187,6 +1163,10 @@ Statement = Transformer({ 
     | 
|
| 
       1187 
1163 
     | 
    
         
             
                        end
         
     | 
| 
       1188 
1164 
     | 
    
         
             
                      end)
         
     | 
| 
       1189 
1165 
     | 
    
         
             
                    end),
         
     | 
| 
      
 1166 
     | 
    
         
            +
                    {
         
     | 
| 
      
 1167 
     | 
    
         
            +
                      "declare_glob",
         
     | 
| 
      
 1168 
     | 
    
         
            +
                      "*"
         
     | 
| 
      
 1169 
     | 
    
         
            +
                    },
         
     | 
| 
       1190 
1170 
     | 
    
         
             
                    _with_0.assign_one(parent_cls_name, parent_val == "" and "nil" or parent_val),
         
     | 
| 
       1191 
1171 
     | 
    
         
             
                    _with_0.assign_one(base_name, {
         
     | 
| 
       1192 
1172 
     | 
    
         
             
                      "table",
         
     | 
| 
         @@ -1254,7 +1234,6 @@ Statement = Transformer({ 
     | 
|
| 
       1254 
1234 
     | 
    
         
             
                      end
         
     | 
| 
       1255 
1235 
     | 
    
         
             
                    end)()
         
     | 
| 
       1256 
1236 
     | 
    
         
             
                  }
         
     | 
| 
       1257 
     | 
    
         
            -
                  hoist_declarations(out_body)
         
     | 
| 
       1258 
1237 
     | 
    
         
             
                  value = _with_0.group({
         
     | 
| 
       1259 
1238 
     | 
    
         
             
                    _with_0.group((function()
         
     | 
| 
       1260 
1239 
     | 
    
         
             
                      if ntype(name) == "value" then
         
     | 
| 
         @@ -1290,22 +1269,17 @@ do 
     | 
|
| 
       1290 
1269 
     | 
    
         
             
                wrap = function(self, node)
         
     | 
| 
       1291 
1270 
     | 
    
         
             
                  return build.block_exp({
         
     | 
| 
       1292 
1271 
     | 
    
         
             
                    build.assign_one(self.accum_name, build.table()),
         
     | 
| 
       1293 
     | 
    
         
            -
                    build.assign_one(self.len_name,  
     | 
| 
      
 1272 
     | 
    
         
            +
                    build.assign_one(self.len_name, 1),
         
     | 
| 
       1294 
1273 
     | 
    
         
             
                    node,
         
     | 
| 
       1295 
1274 
     | 
    
         
             
                    self.accum_name
         
     | 
| 
       1296 
1275 
     | 
    
         
             
                  })
         
     | 
| 
       1297 
1276 
     | 
    
         
             
                end,
         
     | 
| 
       1298 
     | 
    
         
            -
                mutate_body = function(self, body 
     | 
| 
       1299 
     | 
    
         
            -
                   
     | 
| 
       1300 
     | 
    
         
            -
                    skip_nil = true
         
     | 
| 
       1301 
     | 
    
         
            -
                  end
         
     | 
| 
      
 1277 
     | 
    
         
            +
                mutate_body = function(self, body)
         
     | 
| 
      
 1278 
     | 
    
         
            +
                  local single_stm = is_singular(body)
         
     | 
| 
       1302 
1279 
     | 
    
         
             
                  local val
         
     | 
| 
       1303 
     | 
    
         
            -
                  if  
     | 
| 
       1304 
     | 
    
         
            -
                     
     | 
| 
       1305 
     | 
    
         
            -
             
     | 
| 
       1306 
     | 
    
         
            -
                      body = { }
         
     | 
| 
       1307 
     | 
    
         
            -
                      val = _with_0
         
     | 
| 
       1308 
     | 
    
         
            -
                    end
         
     | 
| 
      
 1280 
     | 
    
         
            +
                  if single_stm and types.is_value(single_stm) then
         
     | 
| 
      
 1281 
     | 
    
         
            +
                    body = { }
         
     | 
| 
      
 1282 
     | 
    
         
            +
                    val = single_stm
         
     | 
| 
       1309 
1283 
     | 
    
         
             
                  else
         
     | 
| 
       1310 
1284 
     | 
    
         
             
                    body = apply_to_last(body, function(n)
         
     | 
| 
       1311 
1285 
     | 
    
         
             
                      if types.is_value(n) then
         
     | 
| 
         @@ -1325,27 +1299,15 @@ do 
     | 
|
| 
       1325 
1299 
     | 
    
         
             
                    val = self.value_name
         
     | 
| 
       1326 
1300 
     | 
    
         
             
                  end
         
     | 
| 
       1327 
1301 
     | 
    
         
             
                  local update = {
         
     | 
| 
      
 1302 
     | 
    
         
            +
                    build.assign_one(self.accum_name:index(self.len_name), val),
         
     | 
| 
       1328 
1303 
     | 
    
         
             
                    {
         
     | 
| 
       1329 
1304 
     | 
    
         
             
                      "update",
         
     | 
| 
       1330 
1305 
     | 
    
         
             
                      self.len_name,
         
     | 
| 
       1331 
1306 
     | 
    
         
             
                      "+=",
         
     | 
| 
       1332 
1307 
     | 
    
         
             
                      1
         
     | 
| 
       1333 
     | 
    
         
            -
                    } 
     | 
| 
       1334 
     | 
    
         
            -
                    build.assign_one(self.accum_name:index(self.len_name), val)
         
     | 
| 
      
 1308 
     | 
    
         
            +
                    }
         
     | 
| 
       1335 
1309 
     | 
    
         
             
                  }
         
     | 
| 
       1336 
     | 
    
         
            -
                   
     | 
| 
       1337 
     | 
    
         
            -
                    table.insert(body, build["if"]({
         
     | 
| 
       1338 
     | 
    
         
            -
                      cond = {
         
     | 
| 
       1339 
     | 
    
         
            -
                        "exp",
         
     | 
| 
       1340 
     | 
    
         
            -
                        self.value_name,
         
     | 
| 
       1341 
     | 
    
         
            -
                        "!=",
         
     | 
| 
       1342 
     | 
    
         
            -
                        "nil"
         
     | 
| 
       1343 
     | 
    
         
            -
                      },
         
     | 
| 
       1344 
     | 
    
         
            -
                      ["then"] = update
         
     | 
| 
       1345 
     | 
    
         
            -
                    }))
         
     | 
| 
       1346 
     | 
    
         
            -
                  else
         
     | 
| 
       1347 
     | 
    
         
            -
                    table.insert(body, build.group(update))
         
     | 
| 
       1348 
     | 
    
         
            -
                  end
         
     | 
| 
      
 1310 
     | 
    
         
            +
                  insert(body, build.group(update))
         
     | 
| 
       1349 
1311 
     | 
    
         
             
                  return body
         
     | 
| 
       1350 
1312 
     | 
    
         
             
                end
         
     | 
| 
       1351 
1313 
     | 
    
         
             
              }
         
     | 
| 
         @@ -1418,7 +1380,7 @@ implicitly_return = function(scope) 
     | 
|
| 
       1418 
1380 
     | 
    
         
             
              end
         
     | 
| 
       1419 
1381 
     | 
    
         
             
              return fn
         
     | 
| 
       1420 
1382 
     | 
    
         
             
            end
         
     | 
| 
       1421 
     | 
    
         
            -
            Value = Transformer({
         
     | 
| 
      
 1383 
     | 
    
         
            +
            local Value = Transformer({
         
     | 
| 
       1422 
1384 
     | 
    
         
             
              ["for"] = default_accumulator,
         
     | 
| 
       1423 
1385 
     | 
    
         
             
              ["while"] = default_accumulator,
         
     | 
| 
       1424 
1386 
     | 
    
         
             
              foreach = default_accumulator,
         
     | 
| 
         @@ -1479,7 +1441,7 @@ Value = Transformer({ 
     | 
|
| 
       1479 
1441 
     | 
    
         
             
                node = self.transform.statement(node, function(exp)
         
     | 
| 
       1480 
1442 
     | 
    
         
             
                  return a:mutate_body({
         
     | 
| 
       1481 
1443 
     | 
    
         
             
                    exp
         
     | 
| 
       1482 
     | 
    
         
            -
                  } 
     | 
| 
      
 1444 
     | 
    
         
            +
                  })
         
     | 
| 
       1483 
1445 
     | 
    
         
             
                end)
         
     | 
| 
       1484 
1446 
     | 
    
         
             
                return a:wrap(node)
         
     | 
| 
       1485 
1447 
     | 
    
         
             
              end,
         
     | 
| 
         @@ -1658,3 +1620,8 @@ Value = Transformer({ 
     | 
|
| 
       1658 
1620 
     | 
    
         
             
                })
         
     | 
| 
       1659 
1621 
     | 
    
         
             
              end
         
     | 
| 
       1660 
1622 
     | 
    
         
             
            })
         
     | 
| 
      
 1623 
     | 
    
         
            +
            return {
         
     | 
| 
      
 1624 
     | 
    
         
            +
              Statement = Statement,
         
     | 
| 
      
 1625 
     | 
    
         
            +
              Value = Value,
         
     | 
| 
      
 1626 
     | 
    
         
            +
              Run = Run
         
     | 
| 
      
 1627 
     | 
    
         
            +
            }
         
     |