summaryrefslogtreecommitdiff
path: root/script/core
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2022-07-22 15:24:40 +0800
committer最萌小汐 <sumneko@hotmail.com>2022-07-22 15:24:40 +0800
commitd09c74c69306fa5b3deb0db68552c9223b6d76df (patch)
treecbb3df36e3fb9cd0a63b643a991a4976c22f9007 /script/core
parentb30e4ff8f33b504880066faea7143342e9aea4f2 (diff)
downloadlua-language-server-d09c74c69306fa5b3deb0db68552c9223b6d76df.zip
refactor `require-path`
Diffstat (limited to 'script/core')
-rw-r--r--script/core/collector.lua195
-rw-r--r--script/core/command/autoRequire.lua4
-rw-r--r--script/core/completion/completion.lua12
-rw-r--r--script/core/definition.lua2
-rw-r--r--script/core/diagnostics/different-requires.lua2
-rw-r--r--script/core/hover/description.lua2
-rw-r--r--script/core/type-definition.lua2
7 files changed, 12 insertions, 207 deletions
diff --git a/script/core/collector.lua b/script/core/collector.lua
deleted file mode 100644
index 368a04ec..00000000
--- a/script/core/collector.lua
+++ /dev/null
@@ -1,195 +0,0 @@
-local scope = require 'workspace.scope'
-
----@class collector
----@field subscribed table<uri, table<string, any>>
----@field collect table<string, table<uri, any>>
-local mt = {}
-mt.__index = mt
-
---- 订阅一个名字
----@param uri uri
----@param name string
----@param value any
-function mt:subscribe(uri, name, value)
- uri = uri or '<fallback>'
- -- 订阅部分
- local uriSubscribed = self.subscribed[uri]
- if not uriSubscribed then
- uriSubscribed = {}
- self.subscribed[uri] = uriSubscribed
- end
- uriSubscribed[name] = true
- -- 收集部分
- local nameCollect = self.collect[name]
- if not nameCollect then
- nameCollect = {}
- self.collect[name] = nameCollect
- end
- if value == nil then
- value = true
- end
- nameCollect[uri] = value
-end
-
---- 丢弃掉某个 uri 中收集的所有信息
----@param uri uri
-function mt:dropUri(uri)
- uri = uri or '<fallback>'
- local uriSubscribed = self.subscribed[uri]
- if not uriSubscribed then
- return
- end
- self.subscribed[uri] = nil
- for name in pairs(uriSubscribed) do
- self.collect[name][uri] = nil
- if not next(self.collect[name]) then
- self.collect[name] = nil
- end
- end
-end
-
-function mt:dropAll()
- self.subscribed = {}
- self.collect = {}
-end
-
---- 是否包含某个名字的订阅
----@param uri uri
----@param name string
----@return boolean
-function mt:has(uri, name)
- if self:each(uri, name)() then
- return true
- else
- return false
- end
-end
-
-local DUMMY_FUNCTION = function () end
-
----@param scp scope
-local function eachOfFolder(nameCollect, scp)
- local curi, value
-
- ---@return any
- ---@return uri
- local function getNext()
- curi, value = next(nameCollect, curi)
- if not curi then
- return nil, nil
- end
- if scp:isChildUri(curi)
- or scp:isLinkedUri(curi) then
- return value, curi
- end
- return getNext()
- end
-
- return getNext
-end
-
----@param scp scope
-local function eachOfLinked(nameCollect, scp)
- local curi, value
-
- ---@return any
- ---@return uri
- local function getNext()
- curi, value = next(nameCollect, curi)
- if not curi then
- return nil, nil
- end
- if scp:isChildUri(curi)
- and scp:isLinkedUri(curi) then
- return value, curi
- end
-
- local cscp = scope.getFolder(curi)
- or scope.getLinkedScope(curi)
- or scope.fallback
-
- if cscp == scp
- or cscp:isChildUri(scp.uri)
- or cscp:isLinkedUri(scp.uri) then
- return value, curi
- end
-
- return getNext()
- end
-
- return getNext
-end
-
----@param scp scope
-local function eachOfFallback(nameCollect, scp)
- local curi, value
-
- ---@return any
- ---@return uri
- local function getNext()
- curi, value = next(nameCollect, curi)
- if not curi then
- return nil, nil
- end
- if scp:isLinkedUri(curi) then
- return value, curi
- end
-
- local cscp = scope.getFolder(curi)
- or scope.getLinkedScope(curi)
- or scope.fallback
-
- if cscp == scp then
- return value, curi
- end
-
- return getNext()
- end
-
- return getNext
-end
-
---- 迭代某个名字的订阅
----@param uri uri
----@param name string
----@return fun():any, uri
-function mt:each(uri, name)
- uri = uri or '<fallback>'
- local nameCollect = self.collect[name]
- if not nameCollect then
- return DUMMY_FUNCTION
- end
-
- local scp = scope.getFolder(uri)
-
- if scp then
- return eachOfFolder(nameCollect, scp)
- end
-
- scp = scope.getLinkedScope(uri)
-
- if scp then
- return eachOfLinked(nameCollect, scp)
- end
-
- return eachOfFallback(nameCollect, scope.fallback)
-end
-
-local collectors = {}
-
-local function new()
- return setmetatable({
- collect = {},
- subscribed = {},
- }, mt)
-end
-
----@return collector
-return function (name)
- if name then
- collectors[name] = collectors[name] or new()
- return collectors[name]
- else
- return new()
- end
-end
diff --git a/script/core/command/autoRequire.lua b/script/core/command/autoRequire.lua
index 020cacae..32911d92 100644
--- a/script/core/command/autoRequire.lua
+++ b/script/core/command/autoRequire.lua
@@ -71,7 +71,7 @@ local function askAutoRequire(uri, visiblePaths)
local selects = {}
local nameMap = {}
for _, visible in ipairs(visiblePaths) do
- local expect = visible.expect
+ local expect = visible.name
local select = lang.script(expect)
if not nameMap[select] then
nameMap[select] = expect
@@ -146,7 +146,7 @@ return function (data)
return
end
table.sort(visiblePaths, function (a, b)
- return #a.expect < #b.expect
+ return #a.name < #b.name
end)
local result = askAutoRequire(uri, visiblePaths)
diff --git a/script/core/completion/completion.lua b/script/core/completion/completion.lua
index 2b806314..b2f74aa8 100644
--- a/script/core/completion/completion.lua
+++ b/script/core/completion/completion.lua
@@ -916,21 +916,21 @@ local function collectRequireNames(mode, myUri, literal, source, smark, position
local infos = rpath.getVisiblePath(uri, path)
local relative = workspace.getRelativePath(path)
for _, info in ipairs(infos) do
- if matchKey(literal, info.expect) then
- if not collect[info.expect] then
- collect[info.expect] = {
+ if matchKey(literal, info.name) then
+ if not collect[info.name] then
+ collect[info.name] = {
textEdit = {
start = smark and (source.start + #smark) or position,
finish = smark and (source.finish - #smark) or position,
- newText = smark and info.expect or util.viewString(info.expect),
+ newText = smark and info.name or util.viewString(info.name),
},
path = relative,
}
end
if vm.isMetaFile(uri) then
- collect[info.expect][#collect[info.expect]+1] = ('* [[meta]](%s)'):format(uri)
+ collect[info.name][#collect[info.name]+1] = ('* [[meta]](%s)'):format(uri)
else
- collect[info.expect][#collect[info.expect]+1] = ([=[* [%s](%s) %s]=]):format(
+ collect[info.name][#collect[info.name]+1] = ([=[* [%s](%s) %s]=]):format(
relative,
uri,
lang.script('HOVER_USE_LUA_PATH', info.searcher)
diff --git a/script/core/definition.lua b/script/core/definition.lua
index 09a5fcf1..866e8f84 100644
--- a/script/core/definition.lua
+++ b/script/core/definition.lua
@@ -77,7 +77,7 @@ local function checkRequire(source, offset)
return nil
end
if libName == 'require' then
- return rpath.findUrisByRequirePath(guide.getUri(source), literal)
+ return rpath.findUrisByRequireName(guide.getUri(source), literal)
elseif libName == 'dofile'
or libName == 'loadfile' then
return workspace.findUrisByFilePath(literal)
diff --git a/script/core/diagnostics/different-requires.lua b/script/core/diagnostics/different-requires.lua
index de063c9f..22e3e681 100644
--- a/script/core/diagnostics/different-requires.lua
+++ b/script/core/diagnostics/different-requires.lua
@@ -21,7 +21,7 @@ return function (uri, callback)
return
end
local literal = arg1[1]
- local results = rpath.findUrisByRequirePath(uri, literal)
+ local results = rpath.findUrisByRequireName(uri, literal)
if not results or #results ~= 1 then
return
end
diff --git a/script/core/hover/description.lua b/script/core/hover/description.lua
index 0bfe8cc8..2097e0a3 100644
--- a/script/core/hover/description.lua
+++ b/script/core/hover/description.lua
@@ -11,7 +11,7 @@ local furi = require 'file-uri'
local function collectRequire(mode, literal, uri)
local result, searchers
if mode == 'require' then
- result, searchers = rpath.findUrisByRequirePath(uri, literal)
+ result, searchers = rpath.findUrisByRequireName(uri, literal)
elseif mode == 'dofile'
or mode == 'loadfile' then
result = ws.findUrisByFilePath(literal)
diff --git a/script/core/type-definition.lua b/script/core/type-definition.lua
index 791dfa83..a1c2b29f 100644
--- a/script/core/type-definition.lua
+++ b/script/core/type-definition.lua
@@ -76,7 +76,7 @@ local function checkRequire(source, offset)
return nil
end
if libName == 'require' then
- return rpath.findUrisByRequirePath(guide.getUri(source), literal)
+ return rpath.findUrisByRequireName(guide.getUri(source), literal)
elseif libName == 'dofile'
or libName == 'loadfile' then
return workspace.findUrisByFilePath(literal)