diff --git a/moonscript/transform/names.lua b/moonscript/transform/names.lua index b498036..f6af4c4 100644 --- a/moonscript/transform/names.lua +++ b/moonscript/transform/names.lua @@ -101,7 +101,18 @@ do _base_0.__class = _class_0 NameProxy = _class_0 end +local is_name_proxy +is_name_proxy = function(v) + if not (type(v) == "table") then + return false + end + local _exp_0 = v.__class + if LocalName == _exp_0 or NameProxy == _exp_0 then + return true + end +end return { NameProxy = NameProxy, - LocalName = LocalName + LocalName = LocalName, + is_name_proxy = is_name_proxy } diff --git a/moonscript/transform/names.moon b/moonscript/transform/names.moon index 220d862..4af6aa0 100644 --- a/moonscript/transform/names.moon +++ b/moonscript/transform/names.moon @@ -41,5 +41,11 @@ class NameProxy else ("name")\format @prefix +is_name_proxy = (v) -> + return false unless type(v) == "table" -{ :NameProxy, :LocalName } + switch v.__class + when LocalName, NameProxy + true + +{ :NameProxy, :LocalName, :is_name_proxy } diff --git a/moonscript/transform/statement.lua b/moonscript/transform/statement.lua index efc0e72..3e5986f 100644 --- a/moonscript/transform/statement.lua +++ b/moonscript/transform/statement.lua @@ -1,7 +1,10 @@ local Transformer Transformer = require("moonscript.transform.transformer").Transformer -local NameProxy -NameProxy = require("moonscript.transform.names").NameProxy +local NameProxy, LocalName, is_name_proxy +do + local _obj_0 = require("moonscript.transform.names") + NameProxy, LocalName, is_name_proxy = _obj_0.NameProxy, _obj_0.LocalName, _obj_0.is_name_proxy +end local Run, transform_last_stm, implicitly_return, last_stm do local _obj_0 = require("moonscript.transform.statements") @@ -649,6 +652,18 @@ return Transformer({ } } end + local names + do + local _accum_0 = { } + local _len_0 = 1 + local _list_0 = node.names + for _index_0 = 1, #_list_0 do + local n = _list_0[_index_0] + _accum_0[_len_0] = is_name_proxy(n) and n or LocalName(n) or n + _len_0 = _len_0 + 1 + end + names = _accum_0 + end return build.group({ list_name ~= list and build.assign_one(list_name, list) or NOOP, slice_var or NOOP, @@ -658,7 +673,7 @@ return Transformer({ body = { { "assign", - node.names, + names, { NameProxy.index(list_name, index_name) } diff --git a/moonscript/transform/statement.moon b/moonscript/transform/statement.moon index 1d11560..50de0e0 100644 --- a/moonscript/transform/statement.moon +++ b/moonscript/transform/statement.moon @@ -1,6 +1,6 @@ import Transformer from require "moonscript.transform.transformer" -import NameProxy from require "moonscript.transform.names" +import NameProxy, LocalName, is_name_proxy from require "moonscript.transform.names" import Run, transform_last_stm, implicitly_return, last_stm from require "moonscript.transform.statements" @@ -400,6 +400,8 @@ Transformer { else {1, {"length", list_name}} + names = [is_name_proxy(n) and n or LocalName(n) or n for n in *node.names] + return build.group { list_name != list and build.assign_one(list_name, list) or NOOP slice_var or NOOP @@ -407,7 +409,7 @@ Transformer { name: index_name bounds: bounds body: { - {"assign", node.names, { NameProxy.index list_name, index_name }} + {"assign", names, { NameProxy.index list_name, index_name }} build.group node.body } }