Revert "fix: action mt so we can again concat actions from two different tables (#1143)" (#1486)

This reverts commit 6daf35c88c.
This commit is contained in:
Simon Hauser
2021-11-23 23:51:25 +01:00
committed by GitHub
parent 7695d224c8
commit 1c57cc6140
4 changed files with 26 additions and 179 deletions

View File

@@ -14,28 +14,7 @@ local run_replace_or_original = function(replacements, original_func, ...)
return original_func(...)
end
local append_action_copy = function(new, v, old)
table.insert(new, v)
new._func[v] = old._func[v]
new._static_pre[v] = old._static_pre[v]
new._pre[v] = old._pre[v]
new._replacements[v] = old._replacements[v]
new._static_post[v] = old._static_post[v]
new._post[v] = old._post[v]
end
--TODO(conni2461): Not a fan of this solution/hack. Needs to be addressed
local all_mts = {}
--- an action is metatable which allows replacement(prepend or append) of the function
---@class Action
---@field _func table<string, function>: the original action function
---@field _static_pre table<string, function>: will allways run before the function even if its replaced
---@field _pre table<string, function>: the functions that will run before the action
---@field _replacements table<string, function>: the function that replaces this action
---@field _static_post table<string, function>: will allways run after the function even if its replaced
---@field _post table<string, function>: the functions that will run after the action
action_mt.create = function()
action_mt.create = function(mod)
local mt = {
__call = function(t, ...)
local values = {}
@@ -48,7 +27,7 @@ action_mt.create = function()
end
local result = {
run_replace_or_original(t._replacements[action_name], t._func[action_name], ...),
run_replace_or_original(t._replacements[action_name], mod[action_name], ...),
}
for _, res in ipairs(result) do
table.insert(values, res)
@@ -66,23 +45,18 @@ action_mt.create = function()
end,
__add = function(lhs, rhs)
local new_action = setmetatable({}, action_mt.create())
local new_actions = {}
for _, v in ipairs(lhs) do
append_action_copy(new_action, v, lhs)
table.insert(new_actions, v)
end
for _, v in ipairs(rhs) do
append_action_copy(new_action, v, rhs)
end
new_action.clear = function()
lhs.clear()
rhs.clear()
table.insert(new_actions, v)
end
return new_action
return setmetatable(new_actions, getmetatable(lhs))
end,
_func = {},
_static_pre = {},
_pre = {},
_replacements = {},
@@ -146,47 +120,33 @@ action_mt.create = function()
return self
end
table.insert(all_mts, mt)
return mt
end
action_mt.transform = function(k, mt, _, v)
action_mt.transform = function(k, mt, mod, v)
local res = setmetatable({ k }, mt)
if type(v) == "table" then
res._static_pre[k] = v.pre
res._static_post[k] = v.post
res._func[k] = v.action
else
res._func[k] = v
mod[k] = v.action
end
return res
end
action_mt.transform_mod = function(mod)
local mt = action_mt.create(mod)
-- Pass the metatable of the module if applicable.
-- This allows for custom errors, lookups, etc.
local redirect = setmetatable({}, getmetatable(mod) or {})
for k, v in pairs(mod) do
local mt = action_mt.create()
redirect[k] = action_mt.transform(k, mt, _, v)
redirect[k] = action_mt.transform(k, mt, mod, v)
end
redirect._clear = function()
for k, v in pairs(redirect) do
if k ~= "_clear" then
pcall(v.clear)
end
end
end
redirect._clear = mt.clear
return redirect
end
action_mt.clear_all = function()
for _, v in ipairs(all_mts) do
pcall(v.clear)
end
end
return action_mt