diff options
-rw-r--r-- | script-beta/parser/guide.lua | 40 | ||||
-rw-r--r-- | test-beta/crossfile/references.lua | 35 | ||||
-rw-r--r-- | test-beta/references/init.lua | 8 |
3 files changed, 67 insertions, 16 deletions
diff --git a/script-beta/parser/guide.lua b/script-beta/parser/guide.lua index 1c3d0460..b8d2fe67 100644 --- a/script-beta/parser/guide.lua +++ b/script-beta/parser/guide.lua @@ -1230,18 +1230,17 @@ function m.checkSameSimpleInCallInSameFile(status, func, args, index) end function m.checkSameSimpleInCall(status, ref, start, queue, mode) - if not status.interface.call then - return - end local func, args, index = m.getCallValue(ref) if not func then return end local objs = m.checkSameSimpleInCallInSameFile(status, func, args, index) - local cobjs = status.interface.call(func, args, index) - if cobjs then - for _, obj in ipairs(cobjs) do - objs[#objs+1] = obj + if status.interface.call then + local cobjs = status.interface.call(func, args, index) + if cobjs then + for _, obj in ipairs(cobjs) do + objs[#objs+1] = obj + end end end local newStatus = m.status(status) @@ -1299,6 +1298,22 @@ function m.searchSameFieldsInValue(status, ref, start, queue) end end +function m.checkSameSimpleAsTableField(status, ref, start, queue) + local parent = ref.parent + if parent.type ~= 'tablefield' then + return + end + local newStatus = m.status(status) + m.searchRefs(newStatus, parent.field, 'ref') + for _, res in ipairs(newStatus.results) do + queue[#queue+1] = { + obj = res, + start = start, + force = true, + } + end +end + function m.checkSameSimple(status, simple, data, mode, results, queue) local ref = data.obj local start = data.start @@ -1315,6 +1330,10 @@ function m.checkSameSimple(status, simple, data, mode, results, queue) m.searchSameFieldsInValue(status, ref, i, queue) -- 检查形如 a = f() 的分支情况,需要业务层传入 interface.call m.checkSameSimpleInCall(status, ref, i, queue, mode) + if i < #simple or mode ~= 'def' then + -- 检查形如 { a = f } 的情况 + m.checkSameSimpleAsTableField(status, ref, i, queue) + end if i == #simple then break end @@ -1417,11 +1436,8 @@ function m.searchSameFields(status, simple, mode) end -- 防止无限递归 local mark = {} - for i = 1, #queue do - local data = queue[i] - if status.lock[data.obj] then - mark[data.obj] = true - end + for obj in pairs(status.lock) do + mark[obj] = true end for i = 1, #queue do local data = queue[i] diff --git a/test-beta/crossfile/references.lua b/test-beta/crossfile/references.lua index ffada8f5..e797b48c 100644 --- a/test-beta/crossfile/references.lua +++ b/test-beta/crossfile/references.lua @@ -250,11 +250,38 @@ TEST { { path = 'a.lua', content = [[ + local function <?f?>() + end + + return { + f = <!f!>, + } + ]] + }, + { + path = 'b.lua', + content = [[ + local t = require 'a' + local <!f!> = t.f + + <!f!>() + + return { + f = <!f!>, + } + ]] + } +} + +TEST { + { + path = 'a.lua', + content = [[ local function <!f!>() end return { - <!f!> = <!f!>, + f = <!f!>, } ]] }, @@ -267,7 +294,7 @@ TEST { <!f!>() return { - <!f!> = <!f!>, + f = <!f!>, } ]] }, @@ -275,12 +302,12 @@ TEST { path = 'b.lua', content = [[ local t = require 'a' - local <!f!> = t.<!f!> + local <!f!> = t.f <?f?>() return { - <!f!> = <!f!>, + f = <!f!>, } ]] } diff --git a/test-beta/references/init.lua b/test-beta/references/init.lua index 6204553a..540e9fb4 100644 --- a/test-beta/references/init.lua +++ b/test-beta/references/init.lua @@ -233,6 +233,14 @@ a.<!b!>.c = 1 print(a.<?b?>.c) ]] +TEST [[ +local <?f?> +local t = { + <!a!> = <!f!> +} +print(t.<!a!>) +]] + --TEST [[ -----@class <!Class!> -----@type <?Class?> |