diff options
Diffstat (limited to 'lua/lvim/utils/reload.lua')
-rw-r--r-- | lua/lvim/utils/reload.lua | 80 |
1 files changed, 80 insertions, 0 deletions
diff --git a/lua/lvim/utils/reload.lua b/lua/lvim/utils/reload.lua new file mode 100644 index 00000000..46392349 --- /dev/null +++ b/lua/lvim/utils/reload.lua @@ -0,0 +1,80 @@ +local M = {} + +-- revisit this +-- function prequire(package) +-- local status, lib = pcall(require, package) +-- if status then +-- return lib +-- else +-- vim.notify("Failed to require '" .. package .. "' from " .. debug.getinfo(2).source) +-- return nil +-- end +-- end + +local function _assign(old, new, k) + local otype = type(old[k]) + local ntype = type(new[k]) + -- print("hi") + if (otype == "thread" or otype == "userdata") or (ntype == "thread" or ntype == "userdata") then + vim.notify(string.format("warning: old or new attr %s type be thread or userdata", k)) + end + old[k] = new[k] +end + +local function _replace(old, new, repeat_tbl) + if repeat_tbl[old] then + return + end + repeat_tbl[old] = true + + local dellist = {} + for k, _ in pairs(old) do + if not new[k] then + table.insert(dellist, k) + end + end + for _, v in ipairs(dellist) do + old[v] = nil + end + + for k, _ in pairs(new) do + if not old[k] then + old[k] = new[k] + else + if type(old[k]) ~= type(new[k]) then + vim.notify(string.format("warning: attr %s old type no equal new type!!!", k)) + _assign(old, new, k) + else + if type(old[k]) == "table" then + _replace(old[k], new[k], repeat_tbl) + else + _assign(old, new, k) + end + end + end + end +end + +M.reload = function(mod) + if not package.loaded[mod] then + local m = require(mod) + return m + end + -- vim.notify "begin reload!!!" + + local old = package.loaded[mod] + package.loaded[mod] = nil + local new = require(mod) + + if type(old) == "table" and type(new) == "table" then + -- vim.notify "pick object in new module to old module!!!" + local repeat_tbl = {} + _replace(old, new, repeat_tbl) + end + + package.loaded[mod] = old + -- vim.notify "finish reload!!!" + return old +end + +return M |