diff --git a/anselme/ast/ArgumentTuple.lua b/anselme/ast/ArgumentTuple.lua index ca0274f..764c3dc 100644 --- a/anselme/ast/ArgumentTuple.lua +++ b/anselme/ast/ArgumentTuple.lua @@ -1,5 +1,5 @@ local ast = require("anselme.ast") -local Identifier, Number +local Number local operator_priority = require("anselme.common").operator_priority @@ -25,8 +25,7 @@ ArgumentTuple = ast.abstract.Node { self.arity = self.arity + 1 self.positional[self.arity] = val end, - add_named = function(self, identifier, val) -- only for construction - local name = identifier.name + add_named = function(self, name, val) -- only for construction assert(not (self.named[name] or self.assignment)) self.arity = self.arity + 1 self.named[name] = val @@ -82,7 +81,7 @@ ArgumentTuple = ast.abstract.Node { if self.positional[i] then r:add_positional(self.positional[i]:eval(state)) elseif self.named[i] then - r:add_named(Identifier:new(self.named[i]), self.named[self.named[i]]:eval(state)) + r:add_named(self.named[i], self.named[self.named[i]]:eval(state)) else r:add_assignment(self.assignment:eval(state)) end @@ -98,7 +97,7 @@ ArgumentTuple = ast.abstract.Node { if self.positional[i] then r:add_positional(self.positional[i]) elseif self.named[i] then - r:add_named(Identifier:new(self.named[i]), self.named[self.named[i]]) + r:add_named(self.named[i], self.named[self.named[i]]) else r:add_assignment(self.assignment) end @@ -112,7 +111,7 @@ ArgumentTuple = ast.abstract.Node { if self.positional[i] then r:add_positional(self.positional[i]) elseif self.named[i] then - r:add_named(Identifier:new(self.named[i]), self.named[self.named[i]]) + r:add_named(self.named[i], self.named[self.named[i]]) else r:add_assignment(self.assignment) -- welp it'll error below anyway end @@ -208,6 +207,6 @@ ArgumentTuple = ast.abstract.Node { } package.loaded[...] = ArgumentTuple -Identifier, Number = ast.Identifier, ast.Number +Number = ast.Number return ArgumentTuple diff --git a/anselme/ast/Tuple.lua b/anselme/ast/Tuple.lua index 2bca41b..e94ac99 100644 --- a/anselme/ast/Tuple.lua +++ b/anselme/ast/Tuple.lua @@ -1,5 +1,5 @@ local ast = require("anselme.ast") -local unpack = table.unpack or unpack +local ArgumentTuple, String, Pair local operator_priority = require("anselme.common").operator_priority @@ -58,7 +58,15 @@ Tuple = ast.abstract.Node { end, to_argument_tuple = function(self) - return ast.ArgumentTuple:new(unpack(self.list)) + local args = ArgumentTuple:new() + for _, v in self:iter() do + if Pair:is(v) and String:is(v.name) then + args:add_named(v.name.string, v.value) + else + args:add_positional(v) + end + end + return args end, get = function(self, index) @@ -87,4 +95,7 @@ Tuple = ast.abstract.Node { end } +package.loaded[...] = Tuple +ArgumentTuple, String, Pair = ast.ArgumentTuple, ast.String, ast.Pair + return Tuple diff --git a/anselme/parser/expression/secondary/suffix/call.lua b/anselme/parser/expression/secondary/suffix/call.lua index e3fac7e..d81677f 100644 --- a/anselme/parser/expression/secondary/suffix/call.lua +++ b/anselme/parser/expression/secondary/suffix/call.lua @@ -46,7 +46,7 @@ return secondary { for _, v in ipairs(exp.list) do if Call:is(v) and v:is_simple_assignment() then local pos = v.arguments.positional - args:add_named(pos[1].expression, pos[2]) + args:add_named(pos[1].expression.name, pos[2]) else args:add_positional(v) end