diff --git a/moonscript/compile/value.lua b/moonscript/compile/value.lua index ce20dadd..fa4f21ae 100644 --- a/moonscript/compile/value.lua +++ b/moonscript/compile/value.lua @@ -296,15 +296,32 @@ return { return self:line("not ", self:value(node[2])) end, self = function(self, node) - return "self." .. self:name(node[2]) + if data.lua_keywords[self:name(node[2])] then + return "self[\"" .. tostring(self:name(node[2])) .. "\"]" + else + return "self." .. self:name(node[2]) + end end, self_class = function(self, node) - return "self.__class." .. self:name(node[2]) + if data.lua_keywords[self:name(node[2])] then + return "self.__class[\"" .. tostring(self:name(node[2])) .. "\"]" + else + return "self.__class." .. self:name(node[2]) + end end, self_colon = function(self, node) - return "self:" .. self:name(node[2]) + if data.lua_keywords[self:name(node[2])] then + return "(function(...) return self[\"" .. tostring(self:name(node[2])) .. "\"](self, ...) end)" + else + return "self:" .. self:name(node[2]) + end end, self_class_colon = function(self, node) + if data.lua_keywords[self:name(node[2])] then + return "(function(...) return self.__class[\"" .. tostring(self:name(node[2])) .. "\"](self.__class, ...) end)" + else + return "self.__class:" .. self:name(node[2]) + end return "self.__class:" .. self:name(node[2]) end, ref = function(self, value) diff --git a/moonscript/compile/value.moon b/moonscript/compile/value.moon index 7cfdda4e..d76a12a8 100644 --- a/moonscript/compile/value.moon +++ b/moonscript/compile/value.moon @@ -183,15 +183,28 @@ string_chars = { @line "not ", @value node[2] self: (node) => - "self."..@name node[2] + return if data.lua_keywords[@name node[2]] + "self[\"#{@name node[2]}\"]" + else + "self."..@name node[2] self_class: (node) => - "self.__class."..@name node[2] + return if data.lua_keywords[@name node[2]] + "self.__class[\"#{@name node[2]}\"]" + else + "self.__class."..@name node[2] self_colon: (node) => - "self:"..@name node[2] + return if data.lua_keywords[@name node[2]] + "(function(...) return self[\"#{@name node[2]}\"](self, ...) end)" + else + "self:"..@name node[2] self_class_colon: (node) => + return if data.lua_keywords[@name node[2]] + "(function(...) return self.__class[\"#{@name node[2]}\"](self.__class, ...) end)" + else + "self.__class:"..@name node[2] "self.__class:"..@name node[2] -- a variable reference diff --git a/spec/keyword_support_spec.moon b/spec/keyword_support_spec.moon new file mode 100644 index 00000000..9c423b20 --- /dev/null +++ b/spec/keyword_support_spec.moon @@ -0,0 +1,25 @@ + +import with_dev from require "spec.helpers" + +describe "keyword support", -> + + local moonscript + + with_dev -> + moonscript = require "moonscript.base" + + it "should accept keywords with @", -> + moon_src="class Test\n\tnew: => @if=true\n\tdo: => 1\n\ttest: => @if and @do!\ntest=Test!\ntest\\test!" + lua_src=moonscript.to_lua moon_src + assert.is_not_nil lua_src + fn=(loadstring or load) lua_src + assert.is_not_nil fn + assert.same fn!, 1 + + it "should accept keywords with @@", -> + moon_src="class Test\n\tnew: => @@if=true\n\t@do: => 1\n\ttest: => @@if and @@do!\ntest=Test!\ntest\\test!" + lua_src=moonscript.to_lua moon_src + assert.is_not_nil lua_src + fn=(loadstring or load) lua_src + assert.is_not_nil fn + assert.same fn!, 1