1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
|
local M = {}
local Log = require "lvim.core.log"
-- 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
Log:debug(
string.format("Reloader: mismatch between old [%s] and new [%s] type for [%s]", type(old[k]), type(new[k]), 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.require_clean = function(m)
package.loaded[m] = nil
_G[m] = nil
local _, module = pcall(require, m)
return module
end
M.require_safe = function(mod)
local status_ok, module = pcall(require, mod)
if not status_ok then
local trace = debug.getinfo(2, "SL")
local shorter_src = trace.short_src
local lineinfo = shorter_src .. ":" .. (trace.currentline or trace.linedefined)
local msg = string.format("%s : skipped loading [%s]", lineinfo, mod)
Log:debug(msg)
end
return module
end
M.reload = function(mod)
if not package.loaded[mod] then
return M.require_safe(mod)
end
local old = package.loaded[mod]
package.loaded[mod] = nil
local new = M.require_safe(mod)
if type(old) == "table" and type(new) == "table" then
local repeat_tbl = {}
_replace(old, new, repeat_tbl)
end
package.loaded[mod] = old
return old
end
-- code from <https://github.com/tjdevries/lazy-require.nvim/blob/bb626818ebc175b8c595846925fd96902b1ce02b/lua/lazy-require.lua#L25>
function M.require_on_index(require_path)
return setmetatable({}, {
__index = function(_, key)
return require(require_path)[key]
end,
__newindex = function(_, key, value)
require(require_path)[key] = value
end,
})
end
-- code from <https://github.com/tjdevries/lazy-require.nvim/blob/bb626818ebc175b8c595846925fd96902b1ce02b/lua/lazy-require.lua#L25>
function M.require_on_exported_call(require_path)
return setmetatable({}, {
__index = function(_, k)
return function(...)
return require(require_path)[k](...)
end
end,
})
end
function M.lazy_set(require_path, fn_name)
local function poputale_table(table)
setmetatable(table, {})
local source = require(require_path)[fn_name]()
for k, v in pairs(source) do
table[k] = v
end
end
return setmetatable({}, {
__index = function(me, index)
poputale_table(me)
return me[index]
end,
__newindex = function(me, key, value)
poputale_table(me)
me[key] = value
end,
__pairs = function(me)
poputale_table(me)
return pairs(me)
end,
__ipairs = function(me)
poputale_table(me)
return pairs(me)
end,
})
end
return M
|