summaryrefslogtreecommitdiff
path: root/script/core/guide.lua
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2021-04-19 20:33:07 +0800
committer最萌小汐 <sumneko@hotmail.com>2021-04-19 20:33:07 +0800
commit6bee6ff2a79e665cb5dfa0b7263d00c67814efe2 (patch)
tree671cdcb047238469633722a6fbabc174d0a59eb9 /script/core/guide.lua
parentc0c9004319cfda87fefbb34cffa5207a3ed81ee0 (diff)
downloadlua-language-server-6bee6ff2a79e665cb5dfa0b7263d00c67814efe2.zip
stash
Diffstat (limited to 'script/core/guide.lua')
-rw-r--r--script/core/guide.lua46
1 files changed, 32 insertions, 14 deletions
diff --git a/script/core/guide.lua b/script/core/guide.lua
index 0ae4454e..ac8c5ef6 100644
--- a/script/core/guide.lua
+++ b/script/core/guide.lua
@@ -106,30 +106,33 @@ function m.searchRefs(status, source, mode)
local search
- local function seachSource(obj, expect, flag)
+ local function seachSource(obj, field, flag)
local link = linker.getLink(obj)
if not link then
return
end
- search(link.id, expect or link.id, flag)
+ local id = link.id
+ if field then
+ id = id .. field
+ end
+ search(id, nil, flag)
end
- local function checkForward(link, expect, flag)
+ local function checkForward(link, field, flag)
if not link.forward then
return
end
- local forwardID = linker.getForwardID(root, expect)
for _, forwardSources in ipairs(link.forward) do
- seachSource(forwardSources, expect, flag)
+ seachSource(forwardSources, field, flag)
end
end
- local function checkBackward(link, expect, flag)
+ local function checkBackward(link, field, flag)
if not link.backward then
return
end
for _, backSources in ipairs(link.backward) do
- seachSource(backSources, expect, flag)
+ seachSource(backSources, field, flag)
end
end
@@ -145,24 +148,39 @@ function m.searchRefs(status, source, mode)
end
local stackCount = 0
- search = function (expect, flag)
- local links = linker.getLinksByID(root, expect)
- if links then
+ local mark = {}
+ search = function (id, field, flag)
+ if mark[id] then
+ return
+ end
+ mark[id] = true
+ local links = linker.getLinksByID(root, id)
+ if not links then
return
end
stackCount = stackCount + 1
+ if stackCount >= 10 then
+ error('stack overflow')
+ end
flag = flag or 0
for _, eachLink in ipairs(links) do
- if expect == eachLink.id
- or expect == '' then
+ if field == nil then
m.pushResult(status, mode, eachLink.source)
end
if flag & SEARCH_FLAG.backward == 0 then
- checkForward(eachLink, expect, SEARCH_FLAG.forward)
+ checkForward(eachLink, field, flag | SEARCH_FLAG.forward)
end
if flag & SEARCH_FLAG.forward == 0 then
- checkBackward(eachLink, expect, SEARCH_FLAG.backward)
+ checkBackward(eachLink, field, flag | SEARCH_FLAG.backward)
+ end
+ end
+ local lastID = linker.getLastID(root, id)
+ if lastID then
+ local newField = id:sub(#lastID + 1)
+ if field then
+ newField = newField .. field
end
+ search(lastID, newField, flag)
end
--checkLastID(id, expect)
stackCount = stackCount - 1