LunarVim/lua/lvim/utils/reload.lua

81 lines
1.8 KiB
Lua
Raw Normal View History

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