summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--script/core/reference.lua2
-rw-r--r--script/core/searcher.lua24
-rw-r--r--script/vm/eachRef.lua4
-rw-r--r--test/references/all.lua112
-rw-r--r--test/references/common.lua210
-rw-r--r--test/references/init.lua230
6 files changed, 275 insertions, 307 deletions
diff --git a/script/core/reference.lua b/script/core/reference.lua
index 6ea79f5f..fc8c01f1 100644
--- a/script/core/reference.lua
+++ b/script/core/reference.lua
@@ -65,7 +65,7 @@ return function (uri, offset)
local metaSource = vm.isMetaFile(uri)
- local refs = vm.getRefs(source)
+ local refs = vm.getAllRefs(source)
local values = {}
for _, src in ipairs(refs) do
local value = searcher.getObjectValue(src)
diff --git a/script/core/searcher.lua b/script/core/searcher.lua
index 74e57736..6c10f09a 100644
--- a/script/core/searcher.lua
+++ b/script/core/searcher.lua
@@ -27,7 +27,7 @@ local ignoredIDs = {
local m = {}
----@alias guide.searchmode '"ref"'|'"def"'
+---@alias guide.searchmode '"ref"'|'"def"'|'"field"'|'"allref"'
---添加结果
---@param status guide.status
@@ -82,7 +82,7 @@ function m.pushResult(status, mode, source, force)
results[#results+1] = source
end
end
- elseif mode == 'ref' or mode == 'field' then
+ elseif mode == 'ref' or mode == 'field' or mode == 'allref' then
if source.type == 'local'
or source.type == 'setlocal'
or source.type == 'getlocal'
@@ -423,7 +423,7 @@ function m.searchRefsByID(status, uri, expect, mode)
end
local function checkBackward(id, node, field)
- if mode ~= 'ref' and mode ~= 'field' and not field then
+ if mode ~= 'ref' and mode ~= 'field' and mode ~= 'allref' and not field then
return
end
for _, backwardID in ipairs(node.backward) do
@@ -562,7 +562,7 @@ function m.searchRefsByID(status, uri, expect, mode)
end
local function checkAnyField(id, field)
- if mode == 'ref' or mode == 'field' then
+ if mode == 'ref' or mode == 'field' or mode == 'allref' then
return
end
local lastID = noder.getLastID(id)
@@ -827,6 +827,22 @@ function m.requestReference(obj, field)
return status.results
end
+--- 请求对象的全部引用(深度搜索)
+---@param obj parser.guide.object
+---@param field? string
+---@return parser.guide.object[]
+function m.requestAllReference(obj, field)
+ local status = m.status('allref')
+
+ if field then
+ m.searchFields(status, obj, 'allref', field)
+ else
+ m.searchRefs(status, obj, 'allref')
+ end
+
+ return status.results
+end
+
--- 请求对象的定义
---@param obj parser.guide.object
---@param field? string
diff --git a/script/vm/eachRef.lua b/script/vm/eachRef.lua
index 5aca198e..35425818 100644
--- a/script/vm/eachRef.lua
+++ b/script/vm/eachRef.lua
@@ -5,3 +5,7 @@ local searcher = require 'core.searcher'
function vm.getRefs(source, field)
return searcher.requestReference(source, field)
end
+
+function vm.getAllRefs(source, field)
+ return searcher.requestAllReference(source, field)
+end
diff --git a/test/references/all.lua b/test/references/all.lua
index f8fe3d6e..323a3bd3 100644
--- a/test/references/all.lua
+++ b/test/references/all.lua
@@ -1,57 +1,3 @@
-local core = require 'core.reference'
-local files = require 'files'
-
-local function catch_target(script)
- local list = {}
- local cur = 1
- while true do
- local start, finish = script:find('<[!?].-[!?]>', cur)
- if not start then
- break
- end
- list[#list+1] = { start + 2, finish - 2 }
- cur = finish + 1
- end
- return list
-end
-
-local function founded(targets, results)
- if #targets ~= #results then
- return false
- end
- for _, target in ipairs(targets) do
- for _, result in ipairs(results) do
- if target[1] == result[1] and target[2] == result[2] then
- goto NEXT
- end
- end
- do return false end
- ::NEXT::
- end
- return true
-end
-
-function TEST(script)
- files.removeAll()
- local expect = catch_target(script)
- local start = script:find('<[?~]')
- local finish = script:find('[?~]>')
- local pos = (start + finish) // 2 + 1
- local new_script = script:gsub('<[!?~]', ' '):gsub('[!?~]>', ' ')
- files.setText('', new_script)
-
- local results = core('', pos)
- if results then
- local positions = {}
- for i, result in ipairs(results) do
- positions[i] = { result.target.start, result.target.finish }
- end
- assert(founded(expect, positions))
- else
- assert(#expect == 0)
- end
-end
-
TEST [[
---@class A
local a = {}
@@ -91,26 +37,26 @@ function mt:<?x?>()
end
]]
-TEST [[
----@class Dog
-local mt = {}
-function mt:<?eat?>()
-end
-
----@class Master
-local mt2 = {}
-function mt2:init()
- ---@type Dog
- local foo = self:doSomething()
- ---@type Dog
- self.dog = getDog()
-end
-function mt2:feed()
- self.dog:<!eat!>()
-end
-function mt2:doSomething()
-end
-]]
+--TEST [[
+-----@class Dog
+--local mt = {}
+--function mt:<?eat?>()
+--end
+--
+-----@class Master
+--local mt2 = {}
+--function mt2:init()
+-- ---@type Dog
+-- local foo = self:doSomething()
+-- ---@type Dog
+-- self.dog = getDog()
+--end
+--function mt2:feed()
+-- self.dog:<!eat!>()
+--end
+--function mt2:doSomething()
+--end
+--]]
-- 泛型的反向搜索
TEST [[
@@ -229,3 +175,21 @@ end
local _, <!f2!> = f()
]]
+
+TEST [[
+local <?x?>
+local function f()
+ return <!x!>
+end
+local <!y!> = f()
+]]
+
+TEST [[
+local <?x?>
+local function f()
+ return function ()
+ return <!x!>
+ end
+end
+local <!y!> = f()()
+]]
diff --git a/test/references/common.lua b/test/references/common.lua
new file mode 100644
index 00000000..e5f61cb3
--- /dev/null
+++ b/test/references/common.lua
@@ -0,0 +1,210 @@
+TEST [[
+local <?a?> = 1
+<!a!> = <!a!>
+]]
+
+TEST [[
+<?a?> = 1
+<!a!> = <!a!>
+]]
+
+TEST [[
+local t
+t.<?a?> = 1
+t.<!a!> = t.<!a!>
+]]
+
+TEST [[
+t.<?a?> = 1
+t.<!a!> = t.<!a!>
+]]
+
+TEST [[
+:: <!LABEL!> ::
+goto <?LABEL?>
+if true then
+ goto <!LABEL!>
+end
+]]
+
+TEST [[
+:: <?LABEL?> ::
+goto <!LABEL!>
+if true then
+ goto <!LABEL!>
+end
+]]
+
+TEST [[
+local a = 1
+local <?a?> = 1
+<!a!> = <!a!>
+]]
+
+TEST [[
+local <!a!>
+local <?b?> = <!a!>
+]]
+
+TEST [[
+local <?a?>
+local <!b!> = <!a!>
+]]
+
+TEST [[
+local t = {
+ <!a!> = 1
+}
+print(t.<?a?>)
+]]
+
+TEST [[
+local t = {
+ <?a?> = 1
+}
+print(t.<!a!>)
+]]
+
+TEST [[
+t[<?'a'?>] = 1
+print(t.<!a!>)
+]]
+
+TEST [[
+local t = {
+ [<?'a'?>] = 1
+}
+print(t.<!a!>)
+]]
+
+TEST [[
+table.<!dump!>()
+function table.<?dump?>()
+end
+]]
+
+TEST [[
+local t = {}
+t.<?x?> = 1
+t[a.b.c] = 1
+]]
+
+TEST [[
+local t = {}
+t.x = 1
+t[a.b.<?x?>] = 1
+]]
+
+TEST [[
+local t
+local <!f!> = t.<?f?>
+
+<!f!>()
+
+return {
+ <!f!> = <!f!>,
+}
+]]
+
+TEST [[
+self = {
+ results = {
+ <?labels?> = {},
+ }
+}
+self[self.results.<!labels!>] = lbl
+]]
+
+TEST [[
+a.b.<?c?> = 1
+print(a.b.<!c!>)
+]]
+
+TEST [[
+local <!mt!> = {}
+function <!mt!>:x()
+ <?self?>:x()
+end
+]]
+
+TEST [[
+local mt = {}
+function mt:<!x!>()
+ self:<?x?>()
+end
+]]
+
+TEST [[
+a.<!b!>.c = 1
+print(a.<?b?>.c)
+]]
+
+TEST [[
+local <?f?>
+local t = {
+ <!a!> = <!f!>
+}
+print(t.<!a!>)
+]]
+
+TEST [[
+local <!f!>
+local <!t!> = <?f?>
+]]
+
+TEST [[
+local <!f!>
+a.<!t!> = <?f?>
+]]
+
+TEST [[
+<!t!>.<!f!> = <?t?>
+]]
+
+TEST [[
+local <!f!>
+local <?t?> = <!f!>
+]]
+
+TEST [[
+local <!t!>
+<!t!>.<!f!> = <?t?>
+]]
+
+TEST [[
+_G.<?xxx?> = 1
+
+print(<!xxx!>)
+]]
+
+TEST [[
+---@class <!Class!>
+---@type <?Class?>
+---@type <!Class!>
+]]
+
+TEST [[
+---@class <?Class?>
+---@type <!Class!>
+---@type <!Class!>
+]]
+
+TEST [[
+---@class Class
+local <?t?>
+---@type Class
+local <!x!>
+]]
+
+TEST [[
+---@class Class
+local <!t!>
+---@type Class
+local <?x?>
+]]
+
+-- BUG
+TEST [[
+---@return <?xxx?>
+function f() end
+]]
diff --git a/test/references/init.lua b/test/references/init.lua
index fbbd3227..2fba92e5 100644
--- a/test/references/init.lua
+++ b/test/references/init.lua
@@ -52,231 +52,5 @@ function TEST(script)
end
end
-TEST [[
-local <?a?> = 1
-<!a!> = <!a!>
-]]
-
-TEST [[
-<?a?> = 1
-<!a!> = <!a!>
-]]
-
-TEST [[
-local t
-t.<?a?> = 1
-t.<!a!> = t.<!a!>
-]]
-
-TEST [[
-t.<?a?> = 1
-t.<!a!> = t.<!a!>
-]]
-
-TEST [[
-:: <!LABEL!> ::
-goto <?LABEL?>
-if true then
- goto <!LABEL!>
-end
-]]
-
-TEST [[
-:: <?LABEL?> ::
-goto <!LABEL!>
-if true then
- goto <!LABEL!>
-end
-]]
-
-TEST [[
-local a = 1
-local <?a?> = 1
-<!a!> = <!a!>
-]]
-
-TEST [[
-local <!a!>
-local <?b?> = <!a!>
-]]
-
-TEST [[
-local <?a?>
-local <!b!> = <!a!>
-]]
-
-TEST [[
-local t = {
- <!a!> = 1
-}
-print(t.<?a?>)
-]]
-
-TEST [[
-local t = {
- <?a?> = 1
-}
-print(t.<!a!>)
-]]
-
-TEST [[
-t[<?'a'?>] = 1
-print(t.<!a!>)
-]]
-
-TEST [[
-local t = {
- [<?'a'?>] = 1
-}
-print(t.<!a!>)
-]]
-
-TEST [[
-table.<!dump!>()
-function table.<?dump?>()
-end
-]]
-
-TEST [[
-local <?x?>
-local function f()
- return <!x!>
-end
-local y = f()
-]]
-
-TEST [[
-local <?x?>
-local function f()
- return function ()
- return <!x!>
- end
-end
-local y = f()()
-]]
-
-TEST [[
-local t = {}
-t.<?x?> = 1
-t[a.b.c] = 1
-]]
-
-TEST [[
-local t = {}
-t.x = 1
-t[a.b.<?x?>] = 1
-]]
-
-TEST [[
-local t
-local <!f!> = t.<?f?>
-
-<!f!>()
-
-return {
- <!f!> = <!f!>,
-}
-]]
-
-TEST [[
-self = {
- results = {
- <?labels?> = {},
- }
-}
-self[self.results.<!labels!>] = lbl
-]]
-
-TEST [[
-a.b.<?c?> = 1
-print(a.b.<!c!>)
-]]
-
-TEST [[
-local <!mt!> = {}
-function <!mt!>:x()
- <?self?>:x()
-end
-]]
-
-TEST [[
-local mt = {}
-function mt:<!x!>()
- self:<?x?>()
-end
-]]
-
-TEST [[
-a.<!b!>.c = 1
-print(a.<?b?>.c)
-]]
-
-TEST [[
-local <?f?>
-local t = {
- <!a!> = <!f!>
-}
-print(t.<!a!>)
-]]
-
-TEST [[
-local <!f!>
-local <!t!> = <?f?>
-]]
-
-TEST [[
-local <!f!>
-a.<!t!> = <?f?>
-]]
-
-TEST [[
-<!t!>.<!f!> = <?t?>
-]]
-
-TEST [[
-local <!f!>
-local <?t?> = <!f!>
-]]
-
-TEST [[
-local <!t!>
-<!t!>.<!f!> = <?t?>
-]]
-
-TEST [[
-_G.<?xxx?> = 1
-
-print(<!xxx!>)
-]]
-
-TEST [[
----@class <!Class!>
----@type <?Class?>
----@type <!Class!>
-]]
-
-TEST [[
----@class <?Class?>
----@type <!Class!>
----@type <!Class!>
-]]
-
-TEST [[
----@class Class
-local <?t?>
----@type Class
-local <!x!>
-]]
-
-TEST [[
----@class Class
-local <!t!>
----@type Class
-local <?x?>
-]]
-
--- BUG
-TEST [[
----@return <?xxx?>
-function f() end
-]]
+require 'references.common'
+require 'references.all'