Skip to content

Commit 0ccf364

Browse files
committed
resolve performance issue by cache require-path
fix #1595
1 parent ea27955 commit 0ccf364

File tree

2 files changed

+35
-7
lines changed

2 files changed

+35
-7
lines changed

changelog.md

+2
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ server will generate `doc.json` and `doc.md` in `LOGPATH`.
3131
```
3232
* `FIX` [#1567]
3333
* `FIX` [#1593]
34+
* `FIX` [#1595]
3435
* `FIX` [#1606]
3536
* `FIX` [#1608]
3637

@@ -41,6 +42,7 @@ server will generate `doc.json` and `doc.md` in `LOGPATH`.
4142
[#1561]: https://github.com/sumneko/lua-language-server/issues/1561
4243
[#1567]: https://github.com/sumneko/lua-language-server/issues/1567
4344
[#1593]: https://github.com/sumneko/lua-language-server/issues/1593
45+
[#1595]: https://github.com/sumneko/lua-language-server/issues/1595
4446
[#1606]: https://github.com/sumneko/lua-language-server/issues/1606
4547
[#1608]: https://github.com/sumneko/lua-language-server/issues/1608
4648

script/workspace/require-path.lua

+33-7
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ local m = {}
1313
---@field scp scope
1414
---@field nameMap table<string, string>
1515
---@field visibleCache table<string, require-manager.visibleResult[]>
16+
---@field requireCache table<string, table>
1617
local mt = {}
1718
mt.__index = mt
1819

@@ -25,6 +26,7 @@ local function createRequireManager(scp)
2526
scp = scp,
2627
nameMap = {},
2728
visibleCache = {},
29+
requireCache = {},
2830
}, mt)
2931
end
3032

@@ -153,14 +155,10 @@ function mt:getVisiblePath(path)
153155
end
154156

155157
--- 查找符合指定require name的所有uri
156-
---@param suri uri
157158
---@param name string
158159
---@return uri[]
159-
---@return table<uri, string>?
160-
function mt:findUrisByRequireName(suri, name)
161-
if type(name) ~= 'string' then
162-
return {}
163-
end
160+
---@return table<uri, string>
161+
function mt:searchUrisByRequireName(name)
164162
local searchers = config.get(self.scp.uri, 'Lua.runtime.path')
165163
local strict = config.get(self.scp.uri, 'Lua.runtime.pathStrict')
166164
local separator = config.get(self.scp.uri, 'Lua.completion.requireSeparator')
@@ -174,7 +172,6 @@ function mt:findUrisByRequireName(suri, name)
174172
local tail = '/' .. furi.encode(fspath):gsub('^file:[/]*', '')
175173
for uri in files.eachFile(self.scp.uri) do
176174
if not searcherMap[uri]
177-
and suri ~= uri
178175
and util.stringEndWith(uri, tail) then
179176
local parentUri = files.getLibraryUri(self.scp.uri, uri) or self.scp.uri
180177
if parentUri == nil or parentUri == '' then
@@ -203,6 +200,35 @@ function mt:findUrisByRequireName(suri, name)
203200
return results, searcherMap
204201
end
205202

203+
--- 查找符合指定require name的所有uri,并排除当前文件
204+
---@param suri uri
205+
---@param name string
206+
---@return uri[]
207+
---@return table<uri, string>?
208+
function mt:findUrisByRequireName(suri, name)
209+
if type(name) ~= 'string' then
210+
return {}
211+
end
212+
local cache = self.requireCache[name]
213+
if not cache then
214+
local results, searcherMap = self:searchUrisByRequireName(name)
215+
cache = {
216+
results = results,
217+
searcherMap = searcherMap,
218+
}
219+
self.requireCache[name] = cache
220+
end
221+
local results = {}
222+
local searcherMap = {}
223+
for _, uri in ipairs(cache.results) do
224+
if uri ~= suri then
225+
results[#results+1] = uri
226+
searcherMap[uri] = cache.searcherMap[uri]
227+
end
228+
end
229+
return results, searcherMap
230+
end
231+
206232
---@param uri uri
207233
---@param path string
208234
---@return require-manager.visibleResult[]

0 commit comments

Comments
 (0)