diff options
-rw-r--r-- | script/core/reference.lua | 2 | ||||
-rw-r--r-- | script/core/searcher.lua | 24 | ||||
-rw-r--r-- | script/vm/eachRef.lua | 4 | ||||
-rw-r--r-- | test/references/all.lua | 112 | ||||
-rw-r--r-- | test/references/common.lua | 210 | ||||
-rw-r--r-- | test/references/init.lua | 230 |
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' |