From bdc34b18b2ff113734372b7932cfed62dfded0ee Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Fri, 18 Jun 2021 16:46:14 +0800 Subject: cleanup --- script/core/reference.lua | 2 +- script/core/searcher.lua | 24 ++++- script/vm/eachRef.lua | 4 + test/references/all.lua | 112 ++++++++-------------- test/references/common.lua | 210 +++++++++++++++++++++++++++++++++++++++++ test/references/init.lua | 230 +-------------------------------------------- 6 files changed, 275 insertions(+), 307 deletions(-) create mode 100644 test/references/common.lua 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:() end ]] -TEST [[ ----@class Dog -local mt = {} -function mt:() -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:() -end -function mt2:doSomething() -end -]] +--TEST [[ +-----@class Dog +--local mt = {} +--function mt:() +--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:() +--end +--function mt2:doSomething() +--end +--]] -- 泛型的反向搜索 TEST [[ @@ -229,3 +175,21 @@ end local _, = f() ]] + +TEST [[ +local +local function f() + return +end +local = f() +]] + +TEST [[ +local +local function f() + return function () + return + end +end +local = 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 = 1 + = +]] + +TEST [[ + = 1 + = +]] + +TEST [[ +local t +t. = 1 +t. = t. +]] + +TEST [[ +t. = 1 +t. = t. +]] + +TEST [[ +:: :: +goto +if true then + goto +end +]] + +TEST [[ +:: :: +goto +if true then + goto +end +]] + +TEST [[ +local a = 1 +local = 1 + = +]] + +TEST [[ +local +local = +]] + +TEST [[ +local +local = +]] + +TEST [[ +local t = { + = 1 +} +print(t.) +]] + +TEST [[ +local t = { + = 1 +} +print(t.) +]] + +TEST [[ +t[] = 1 +print(t.) +]] + +TEST [[ +local t = { + [] = 1 +} +print(t.) +]] + +TEST [[ +table.() +function table.() +end +]] + +TEST [[ +local t = {} +t. = 1 +t[a.b.c] = 1 +]] + +TEST [[ +local t = {} +t.x = 1 +t[a.b.] = 1 +]] + +TEST [[ +local t +local = t. + +() + +return { + = , +} +]] + +TEST [[ +self = { + results = { + = {}, + } +} +self[self.results.] = lbl +]] + +TEST [[ +a.b. = 1 +print(a.b.) +]] + +TEST [[ +local = {} +function :x() + :x() +end +]] + +TEST [[ +local mt = {} +function mt:() + self:() +end +]] + +TEST [[ +a..c = 1 +print(a..c) +]] + +TEST [[ +local +local t = { + = +} +print(t.) +]] + +TEST [[ +local +local = +]] + +TEST [[ +local +a. = +]] + +TEST [[ +. = +]] + +TEST [[ +local +local = +]] + +TEST [[ +local +. = +]] + +TEST [[ +_G. = 1 + +print() +]] + +TEST [[ +---@class +---@type +---@type +]] + +TEST [[ +---@class +---@type +---@type +]] + +TEST [[ +---@class Class +local +---@type Class +local +]] + +TEST [[ +---@class Class +local +---@type Class +local +]] + +-- BUG +TEST [[ +---@return +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 = 1 - = -]] - -TEST [[ - = 1 - = -]] - -TEST [[ -local t -t. = 1 -t. = t. -]] - -TEST [[ -t. = 1 -t. = t. -]] - -TEST [[ -:: :: -goto -if true then - goto -end -]] - -TEST [[ -:: :: -goto -if true then - goto -end -]] - -TEST [[ -local a = 1 -local = 1 - = -]] - -TEST [[ -local -local = -]] - -TEST [[ -local -local = -]] - -TEST [[ -local t = { - = 1 -} -print(t.) -]] - -TEST [[ -local t = { - = 1 -} -print(t.) -]] - -TEST [[ -t[] = 1 -print(t.) -]] - -TEST [[ -local t = { - [] = 1 -} -print(t.) -]] - -TEST [[ -table.() -function table.() -end -]] - -TEST [[ -local -local function f() - return -end -local y = f() -]] - -TEST [[ -local -local function f() - return function () - return - end -end -local y = f()() -]] - -TEST [[ -local t = {} -t. = 1 -t[a.b.c] = 1 -]] - -TEST [[ -local t = {} -t.x = 1 -t[a.b.] = 1 -]] - -TEST [[ -local t -local = t. - -() - -return { - = , -} -]] - -TEST [[ -self = { - results = { - = {}, - } -} -self[self.results.] = lbl -]] - -TEST [[ -a.b. = 1 -print(a.b.) -]] - -TEST [[ -local = {} -function :x() - :x() -end -]] - -TEST [[ -local mt = {} -function mt:() - self:() -end -]] - -TEST [[ -a..c = 1 -print(a..c) -]] - -TEST [[ -local -local t = { - = -} -print(t.) -]] - -TEST [[ -local -local = -]] - -TEST [[ -local -a. = -]] - -TEST [[ -. = -]] - -TEST [[ -local -local = -]] - -TEST [[ -local -. = -]] - -TEST [[ -_G. = 1 - -print() -]] - -TEST [[ ----@class ----@type ----@type -]] - -TEST [[ ----@class ----@type ----@type -]] - -TEST [[ ----@class Class -local ----@type Class -local -]] - -TEST [[ ----@class Class -local ----@type Class -local -]] - --- BUG -TEST [[ ----@return -function f() end -]] +require 'references.common' +require 'references.all' -- cgit v1.2.3