From 67c952bc21473474ee82383e75c6a42f077c0c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C3=89tienne=20Reuh=20Fildadut?= Date: Sun, 7 Jan 2024 18:22:55 +0100 Subject: [PATCH] Allow adding overload to overload --- anselme/ast/Definition.lua | 6 +++--- anselme/ast/Environment.lua | 2 +- anselme/ast/Overload.lua | 14 ++++++++++---- 3 files changed, 14 insertions(+), 8 deletions(-) diff --git a/anselme/ast/Definition.lua b/anselme/ast/Definition.lua index 593d420..626457f 100644 --- a/anselme/ast/Definition.lua +++ b/anselme/ast/Definition.lua @@ -1,5 +1,5 @@ local ast = require("anselme.ast") -local Nil, Overloadable +local Nil, Overloadable, Overload local operator_priority = require("anselme.common").operator_priority @@ -30,7 +30,7 @@ local Definition = ast.abstract.Node { local symbol = self.symbol:eval(state) local val = self.expression:eval(state) - if Overloadable:issub(val) then + if Overloadable:issub(val) or Overload:is(val) then state.scope:define_overloadable(symbol, val) else state.scope:define(symbol, val) @@ -41,6 +41,6 @@ local Definition = ast.abstract.Node { } package.loaded[...] = Definition -Nil, Overloadable = ast.Nil, ast.abstract.Overloadable +Nil, Overloadable, Overload = ast.Nil, ast.abstract.Overloadable, ast.Overload return Definition diff --git a/anselme/ast/Environment.lua b/anselme/ast/Environment.lua index 1a2b31f..27c3f65 100644 --- a/anselme/ast/Environment.lua +++ b/anselme/ast/Environment.lua @@ -123,7 +123,7 @@ local Environment = ast.abstract.Runtime { end, -- define or redefine new overloadable variable in current environment, inheriting existing overload variants from (parent) scopes define_overloadable = function(self, state, symbol, exp) - assert(Overloadable:issub(exp), "trying to add an non-overloadable value to an overload") + assert(Overloadable:issub(exp) or Overload:is(exp), "trying to add an non-overloadable value to an overload") local identifier = symbol:to_identifier() diff --git a/anselme/ast/Overload.lua b/anselme/ast/Overload.lua index 400cd50..41721b6 100644 --- a/anselme/ast/Overload.lua +++ b/anselme/ast/Overload.lua @@ -17,9 +17,15 @@ Overload = ast.abstract.Node { end end, insert = function(self, val) -- only for construction - assert0(not self._signatures[val:hash_signature()], ("a function with parameters %s is already defined in the overload"):format(val:format_signature())) - table.insert(self.list, val) - self._signatures[val:hash_signature()] = true + if Overload:is(val) then + for _, overloadable in ipairs(val.list) do + self:insert(overloadable) + end + else + assert0(not self._signatures[val:hash_signature()], ("a function with parameters %s is already defined in the overload"):format(val:format_signature())) + table.insert(self.list, val) + self._signatures[val:hash_signature()] = true + end end, _format = function(self, ...) @@ -61,7 +67,7 @@ Overload = ast.abstract.Node { if success then return success, args else - return nil, ("no function match arguments %s, possible functions were:\n\t• %s"):format(args:format(state), table.concat(failure, "\n\t• ")) + return nil, ("no function match arguments %s, possible functions were:\n\t• %s"):format(args:format_short(state), table.concat(failure, "\n\t• ")) end end }