diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2021-06-11 15:29:11 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2021-06-11 15:29:11 +0800 |
commit | d93c5645334b392284a7a171e66d1b82a997a841 (patch) | |
tree | 3f6e184c6b947b785af6da29338bb3273be45052 /script | |
parent | e6f1dd06dbe5c70a8f8b239b73bb3e4a8caf7554 (diff) | |
download | lua-language-server-d93c5645334b392284a7a171e66d1b82a997a841.zip |
docs cache
Diffstat (limited to 'script')
-rw-r--r-- | script/core/searcher.lua | 7 | ||||
-rw-r--r-- | script/vm/docs.lua | 52 |
2 files changed, 58 insertions, 1 deletions
diff --git a/script/core/searcher.lua b/script/core/searcher.lua index 095ff782..f1dd9508 100644 --- a/script/core/searcher.lua +++ b/script/core/searcher.lua @@ -6,6 +6,7 @@ local ws = require 'workspace' local vm = require 'vm.vm' local await = require 'await' local globals = require 'vm.globals' +local docs = require 'vm.docs' local NONE = {'NONE'} local LAST = {'LAST'} @@ -446,8 +447,12 @@ function m.searchRefsByID(status, uri, expect, mode) return end status.crossed[firstID] = true + local uris = docs.getUrisByID(firstID) + if not uris then + return + end local tid = id .. (field or '') - for guri in files.eachFile() do + for guri in pairs(uris) do if not files.eq(uri, guri) then crossSearch(status, guri, tid, mode) end diff --git a/script/vm/docs.lua b/script/vm/docs.lua new file mode 100644 index 00000000..632c8c85 --- /dev/null +++ b/script/vm/docs.lua @@ -0,0 +1,52 @@ +local files = require 'files' +local await = require 'await' +local noder = require 'core.noder' + +local docsMap = {} +local subscribeMap = {} + +local function popDocs(uri) + if not subscribeMap[uri] then + return + end + for id in pairs(subscribeMap[uri]) do + if docsMap[id] then + docsMap[id][uri] = nil + end + end + subscribeMap[uri] = nil +end + +local function pushDocs(uri) + subscribeMap[uri] = {} + local state = files.getState(uri) + if not state then + return + end + local nodes = noder.compileNodes(state.ast) + for id in pairs(nodes) do + if id:sub(1, 3) == 'dn:' then + if not docsMap[id] then + docsMap[id] = {} + end + docsMap[id][uri] = true + subscribeMap[uri][id] = true + end + end +end + +files.watch(function (ev, uri) + if ev == 'update' then + popDocs(uri) + await.delay() + pushDocs(uri) + end +end) + +local m = {} + +function m.getUrisByID(id) + return docsMap[id] +end + +return m |