diff options
Diffstat (limited to 'script/vm/getGlobals.lua')
-rw-r--r-- | script/vm/getGlobals.lua | 270 |
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) |