summaryrefslogtreecommitdiff
path: root/script/vm/getGlobals.lua.txt
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2021-06-11 14:52:40 +0800
committer最萌小汐 <sumneko@hotmail.com>2021-06-11 14:52:40 +0800
commit50e6cd02d535e12e085eab7d8bdcb4757be857f2 (patch)
tree5811e18bf8ce45ce243c388f296aebd60523e2ba /script/vm/getGlobals.lua.txt
parent997f15620b6e4dfe6a21ed52b17ac15c4e6b9a93 (diff)
downloadlua-language-server-50e6cd02d535e12e085eab7d8bdcb4757be857f2.zip
rename getAst -> getState
Diffstat (limited to 'script/vm/getGlobals.lua.txt')
-rw-r--r--script/vm/getGlobals.lua.txt262
1 files changed, 262 insertions, 0 deletions
diff --git a/script/vm/getGlobals.lua.txt b/script/vm/getGlobals.lua.txt
new file mode 100644
index 00000000..e5bcafc0
--- /dev/null
+++ b/script/vm/getGlobals.lua.txt
@@ -0,0 +1,262 @@
+local guide = require 'parser.guide'
+local await = require "await"
+local searcher = require "core.searcher"
+---@type vm
+local vm = require 'vm.vm'
+local files = require 'files'
+local util = require 'utility'
+local config = require 'config'
+local ws = require 'workspace'
+
+local function getGlobalsOfFile(uri)
+ if not files.exists(uri) then
+ return {}
+ end
+ local cache = files.getCache(uri)
+ if cache.globals then
+ return cache.globals
+ end
+ local globals = {}
+ cache.globals = globals
+ tracy.ZoneBeginN 'getGlobalsOfFile'
+ local results = searcher.findGlobals(uri, 'ref')
+ local subscribe = ws.getCache 'globalSubscribe'
+ subscribe[uri] = {}
+ local mark = {}
+ if not globals['*'] then
+ globals['*'] = {}
+ end
+ for _, res in ipairs(results) do
+ if mark[res] then
+ goto CONTINUE
+ end
+ mark[res] = true
+ local name = guide.getKeyName(res)
+ if name then
+ if not globals[name] then
+ globals[name] = {}
+ subscribe[uri][#subscribe[uri]+1] = name
+ end
+ globals[name][#globals[name]+1] = res
+ globals['*'][#globals['*']+1] = res
+ end
+ ::CONTINUE::
+ end
+ tracy.ZoneEnd()
+ return globals
+end
+
+local function getGlobalSetsOfFile(uri)
+ if not files.exists(uri) then
+ return {}
+ end
+ local cache = files.getCache(uri)
+ if cache.globalSets then
+ return cache.globalSets
+ end
+ local globals = {}
+ cache.globalSets = globals
+ tracy.ZoneBeginN 'getGlobalSetsOfFile'
+ local results = searcher.findGlobals(uri, 'def')
+ local subscribe = ws.getCache 'globalSetsSubscribe'
+ subscribe[uri] = {}
+ local mark = {}
+ if not globals['*'] then
+ globals['*'] = {}
+ end
+ for _, res in ipairs(results) do
+ if mark[res] then
+ goto CONTINUE
+ end
+ mark[res] = true
+ local name = guide.getKeyName(res)
+ if name then
+ if not globals[name] then
+ globals[name] = {}
+ subscribe[uri][#subscribe[uri]+1] = name
+ end
+ globals[name][#globals[name]+1] = res
+ globals['*'][#globals['*']+1] = res
+ end
+ ::CONTINUE::
+ end
+ tracy.ZoneEnd()
+ return globals
+end
+
+local function getGlobals(name)
+ tracy.ZoneBeginN 'getGlobals #2'
+ local results = {}
+ local n = 0
+ local uris = files.getAllUris()
+ for i = 1, #uris do
+ local globals = getGlobalsOfFile(uris[i])[name]
+ if globals then
+ for j = 1, #globals do
+ n = n + 1
+ results[n] = globals[j]
+ end
+ end
+ end
+ local dummyCache = vm.getCache 'globalDummy'
+ for key in pairs(config.config.diagnostics.globals) do
+ if name == '*' or name == key then
+ if not dummyCache[key] then
+ dummyCache[key] = {
+ type = 'dummy',
+ start = 0,
+ finish = 0,
+ [1] = key
+ }
+ end
+ n = n + 1
+ results[n] = dummyCache[key]
+ end
+ end
+ tracy.ZoneEnd()
+ return results
+end
+
+local function getGlobalSets(name)
+ tracy.ZoneBeginN 'getGlobalSets #2'
+ local results = {}
+ local n = 0
+ local uris = files.getAllUris()
+ for i = 1, #uris do
+ local globals = getGlobalSetsOfFile(uris[i])[name]
+ if globals then
+ for j = 1, #globals do
+ n = n + 1
+ results[n] = globals[j]
+ end
+ end
+ end
+ local dummyCache = vm.getCache 'globalDummy'
+ for key in pairs(config.config.diagnostics.globals) do
+ if name == '*' or name == key then
+ if not dummyCache[key] then
+ dummyCache[key] = {
+ type = 'dummy',
+ start = 0,
+ finish = 0,
+ [1] = key
+ }
+ end
+ n = n + 1
+ results[n] = dummyCache[key]
+ end
+ end
+ tracy.ZoneEnd()
+ return results
+end
+
+local function fastGetAnyGlobals()
+ local results = {}
+ local mark = {}
+ for uri in files.eachFile() do
+ --local globalSets = getGlobalsOfFile(uri)
+ --for destName, sources in util.sortPairs(globalSets) do
+ -- if not mark[destName] then
+ -- mark[destName] = true
+ -- results[#results+1] = sources[1]
+ -- end
+ --end
+ local globals = getGlobalsOfFile(uri)
+ for destName, sources in util.sortPairs(globals) do
+ if not mark[destName] then
+ mark[destName] = true
+ results[#results+1] = sources[1]
+ end
+ end
+ end
+ return results
+end
+
+local function fastGetAnyGlobalSets()
+ local results = {}
+ local mark = {}
+ for uri in files.eachFile() do
+ local globals = getGlobalSetsOfFile(uri)
+ for destName, sources in util.sortPairs(globals) do
+ if not mark[destName] then
+ mark[destName] = true
+ results[#results+1] = sources[1]
+ end
+ end
+ end
+ return results
+end
+
+local function checkNeedUpdate()
+ local getGlobalCache = ws.getCache 'getGlobals'
+ local getGlobalSetsCache = ws.getCache 'getGlobalSets'
+ local needUpdateGlobals = ws.getCache 'needUpdateGlobals'
+ local uris = {}
+ for uri in pairs(needUpdateGlobals) do
+ uris[#uris+1] = uri
+ end
+ for _, uri in ipairs(uris) do
+ if needUpdateGlobals[uri] then
+ needUpdateGlobals[uri] = nil
+ if files.exists(uri) then
+ for name in pairs(getGlobalsOfFile(uri)) do
+ getGlobalCache[name] = nil
+ end
+ for name in pairs(getGlobalSetsOfFile(uri)) do
+ getGlobalSetsCache[name] = nil
+ end
+ end
+ end
+ end
+end
+
+function vm.getGlobals(key)
+ checkNeedUpdate()
+ local cache = ws.getCache('getGlobals')[key]
+ if cache ~= nil then
+ return cache
+ end
+ cache = getGlobals(key)
+ ws.getCache('getGlobals')[key] = cache
+ return cache
+end
+
+function vm.getGlobalSets(key)
+ checkNeedUpdate()
+ local cache = ws.getCache('getGlobalSets')[key]
+ if cache ~= nil then
+ return cache
+ end
+ tracy.ZoneBeginN('getGlobalSets')
+ cache = getGlobalSets(key)
+ ws.getCache('getGlobalSets')[key] = cache
+ tracy.ZoneEnd()
+ return cache
+end
+
+files.watch(function (ev, uri)
+ if ev == 'update' then
+ local globalSubscribe = ws.getCache 'globalSubscribe'
+ local globalSetsSubscribe = ws.getCache 'globalSetsSubscribe'
+ local getGlobalCache = ws.getCache 'getGlobals'
+ local getGlobalSetsCache = ws.getCache 'getGlobalSets'
+ local needUpdateGlobals = ws.getCache 'needUpdateGlobals'
+ uri = files.asKey(uri)
+ if globalSubscribe[uri] then
+ for _, name in ipairs(globalSubscribe[uri]) do
+ getGlobalCache[name] = nil
+ getGlobalCache['*'] = nil
+ end
+ end
+ if globalSetsSubscribe[uri] then
+ for _, name in ipairs(globalSetsSubscribe[uri]) do
+ getGlobalSetsCache[name] = nil
+ getGlobalSetsCache['*'] = nil
+ end
+ end
+ needUpdateGlobals[uri] = true
+ elseif ev == 'create' then
+ --getGlobalsOfFile(uri)
+ --getGlobalSetsOfFile(uri)
+ end
+end)