summaryrefslogtreecommitdiff
path: root/lua/lvim/utils/reload.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lvim/utils/reload.lua')
-rw-r--r--lua/lvim/utils/reload.lua80
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