summaryrefslogtreecommitdiff
path: root/script/vm/getGlobals.lua
diff options
context:
space:
mode:
Diffstat (limited to 'script/vm/getGlobals.lua')
-rw-r--r--script/vm/getGlobals.lua270
1 files changed, 19 insertions, 251 deletions
diff --git a/script/vm/getGlobals.lua b/script/vm/getGlobals.lua
index e5bcafc0..51cfe1ac 100644
--- a/script/vm/getGlobals.lua
+++ b/script/vm/getGlobals.lua
@@ -1,262 +1,30 @@
-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 collector = require 'core.collector'
+local vm = require 'vm.vm'
-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
+function vm.hasGlobalSets(name)
+ local id = ('def:g:%q'):format(name)
+ return collector.has(id)
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
+function vm.getGlobalSets(name)
+ local cache = vm.getCache 'getGlobalSets'
+ if cache[name] then
+ return cache[name]
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
+ cache[name] = results
+ local id
+ if name == '*' then
+ id = 'def:g:'
+ else
+ id = ('def:g:%q'):format(name)
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
- }
+ for node in collector.each(id) do
+ if node.sources then
+ for _, source in ipairs(node.sources) do
+ results[#results+1] = source
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)