Skip to content

Commit 3778e5e

Browse files
committed
Avoid O(n^2) require computations
1 parent 021ceef commit 3778e5e

File tree

4 files changed

+39
-17
lines changed

4 files changed

+39
-17
lines changed

changelog.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
+ `Lua.diagnostics.workspaceDelay`: `0` sec -> `3` sec
66
+ `Lua.workspace.maxPreload`: `1000` -> `5000`
77
+ `Lua.workspace.preloadFileSize`: `100` KB -> `500` KB
8+
* `CHG` improve performance
89
* `FIX` modify luarc failed
910
* `FIX` library files not recognized correctly
1011
* `FIX` [#906](https://github.com/sumneko/lua-language-server/issues/906)

script/core/collector.lua

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,9 @@ function mt:dropUri(uri)
4242
self.subscribed[uri] = nil
4343
for name in pairs(uriSubscribed) do
4444
self.collect[name][uri] = nil
45+
if not next(self.collect[name]) then
46+
self.collect[name] = nil
47+
end
4548
end
4649
end
4750

script/core/completion/completion.lua

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -884,7 +884,7 @@ local function collectRequireNames(mode, myUri, literal, source, smark, position
884884
if myUri == uri then
885885
goto CONTINUE
886886
end
887-
local path = workspace.getRelativePath(uri)
887+
local path = furi.decode(uri)
888888
local infos = rpath.getVisiblePath(uri, path)
889889
for _, info in ipairs(infos) do
890890
if matchKey(literal, info.expect) then

script/workspace/require-path.lua

Lines changed: 34 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,15 +3,18 @@ local files = require 'files'
33
local furi = require 'file-uri'
44
local workspace = require "workspace"
55
local config = require 'config'
6-
local collector = require 'core.collector' 'require-path'
6+
local collector = require 'core.collector'
77

88
---@class require-path
99
local m = {}
1010

1111
local function addRequireName(suri, uri, name)
1212
local separator = config.get(uri, 'Lua.completion.requireSeparator')
1313
local fsname = name:gsub('%' .. separator, '/')
14-
collector:subscribe(suri, fsname, uri)
14+
local scp = workspace.getScope(suri)
15+
---@type collector
16+
local clt = scp:get('requireName') or scp:set('requireName', collector())
17+
clt:subscribe(uri, fsname, name)
1518
end
1619

1720
--- `aaa/bbb/ccc.lua` 与 `?.lua` 将返回 `aaa.bbb.cccc`
@@ -110,13 +113,17 @@ function m.findUrisByRequirePath(suri, path)
110113
end
111114
end
112115

113-
for uri in collector:each(suri, fspath) do
114-
local infos = m.getVisiblePath(suri, furi.decode(uri))
115-
for _, info in ipairs(infos) do
116-
local fsexpect = info.expect:gsub('%' .. separator, '/')
117-
if fsexpect == fspath then
118-
results[#results+1] = uri
119-
searchers[uri] = info.searcher
116+
---@type collector
117+
local clt = workspace.getScope(suri):get('requireName')
118+
if clt then
119+
for _, uri in clt:each(suri, fspath) do
120+
local infos = m.getVisiblePath(suri, furi.decode(uri))
121+
for _, info in ipairs(infos) do
122+
local fsexpect = info.expect:gsub('%' .. separator, '/')
123+
if fsexpect == fspath then
124+
results[#results+1] = uri
125+
searchers[uri] = info.searcher
126+
end
120127
end
121128
end
122129
end
@@ -132,12 +139,27 @@ local function createVisiblePath(uri)
132139
m.getVisiblePath(nil, furi.decode(uri))
133140
end
134141

142+
local function removeVisiblePath(uri)
143+
local path = furi.decode(uri)
144+
path = workspace.normalize(path)
145+
for _, scp in ipairs(workspace.folders) do
146+
scp:get('visiblePath')[path] = nil
147+
scp:get('requireName'):dropUri(uri)
148+
end
149+
workspace.getScope(nil):get('visiblePath')[path] = nil
150+
workspace.getScope(nil):get('requireName'):dropUri(uri)
151+
end
152+
135153
function m.flush(suri)
136154
local scp = workspace.getScope(suri)
137155
scp:set('visiblePath', {})
138-
collector:dropAll()
156+
---@type collector
157+
local clt = scp:get('requireName')
158+
if clt then
159+
clt:dropAll()
160+
end
139161
for uri in files.eachFile() do
140-
createVisiblePath(uri)
162+
m.getVisiblePath(scp.uri, furi.decode(uri))
141163
end
142164
end
143165

@@ -148,11 +170,7 @@ files.watch(function (ev, uri)
148170
createVisiblePath(uri)
149171
end
150172
if ev == 'remove' then
151-
for _, scp in ipairs(workspace.folders) do
152-
scp:get('visiblePath')[uri] = nil
153-
end
154-
workspace.getScope(nil):get('visiblePath')[uri] = nil
155-
collector:dropUri(uri)
173+
removeVisiblePath(uri)
156174
end
157175
end)
158176

0 commit comments

Comments
 (0)