diff options
-rw-r--r-- | script-beta/vm/eachDef.lua | 1 | ||||
-rw-r--r-- | script-beta/vm/eachField.lua | 27 | ||||
-rw-r--r-- | script-beta/vm/eachRef.lua | 1 | ||||
-rw-r--r-- | script-beta/vm/getValue.lua | 3 | ||||
-rw-r--r-- | test-beta/hover/init.lua | 52 |
5 files changed, 52 insertions, 32 deletions
diff --git a/script-beta/vm/eachDef.lua b/script-beta/vm/eachDef.lua index 87cbef70..8bb9c0e7 100644 --- a/script-beta/vm/eachDef.lua +++ b/script-beta/vm/eachDef.lua @@ -203,6 +203,7 @@ local function eachDef(source, callback) end --- 获取所有的定义 +--- 只检查语法上的定义,不穿透函数调用 function vm.eachDef(source, callback, max) local mark = {} eachDef(source, function (src) diff --git a/script-beta/vm/eachField.lua b/script-beta/vm/eachField.lua index dce5eec4..8c3a26cb 100644 --- a/script-beta/vm/eachField.lua +++ b/script-beta/vm/eachField.lua @@ -34,8 +34,7 @@ local function ofENV(source, callback) or ref.type == 'setglobal' then callback(ref) if guide.getName(ref) == '_G' then - checkNext(ref, callback) - vm.eachMetaValue(ref, callback) + vm.ofField(ref, callback) local call, index = vm.getArgInfo(ref) local special = vm.getSpecial(call) if (special == 'rawset' or special == 'rawget') @@ -44,8 +43,7 @@ local function ofENV(source, callback) end end elseif ref.type == 'getlocal' then - checkNext(ref, callback) - vm.eachMetaValue(ref, callback) + vm.ofField(ref, callback) end vm.eachFieldInTable(ref.value, callback) end @@ -56,26 +54,20 @@ local function ofLocal(source, callback) ofENV(source, callback) else vm.eachRef(source, function (src) - checkNext(src, callback) - vm.eachMetaValue(src, callback) - vm.eachFieldInTable(src.value, callback) + vm.ofField(src, callback) end) end end local function ofGlobal(source, callback) vm.eachRef(source, function (src) - checkNext(src, callback) - vm.eachMetaValue(src, callback) - vm.eachFieldInTable(src.value, callback) + vm.ofField(src, callback) end) end local function ofGetField(source, callback) vm.eachRef(source, function (src) - checkNext(src, callback) - vm.eachMetaValue(src, callback) - vm.eachFieldInTable(src.value, callback) + vm.ofField(src, callback) end) end @@ -90,11 +82,16 @@ end local function ofTableField(source, callback) vm.eachRef(source, function (src) - checkNext(src, callback) - vm.eachMetaValue(src, callback) + vm.ofField(src, callback) end) end +function vm.ofField(source, callback) + checkNext(source, callback) + vm.eachMetaValue(source, callback) + vm.eachFieldInTable(source.value, callback) +end + function vm.eachFieldInTable(value, callback) if not value then return diff --git a/script-beta/vm/eachRef.lua b/script-beta/vm/eachRef.lua index b8a2bce5..6d34d28b 100644 --- a/script-beta/vm/eachRef.lua +++ b/script-beta/vm/eachRef.lua @@ -190,6 +190,7 @@ local function eachRef(source, callback) end --- 获取所有的引用 +--- 可以穿透函数返回值 function vm.eachRef(source, callback, max) local mark = {} eachRef(source, function (src) diff --git a/script-beta/vm/getValue.lua b/script-beta/vm/getValue.lua index c03c7437..fc4ba64b 100644 --- a/script-beta/vm/getValue.lua +++ b/script-beta/vm/getValue.lua @@ -1,5 +1,6 @@ local vm = require 'vm.vm' local util = require 'utility' +local guide = require 'parser.guide' local typeSort = { ['boolean'] = 1, @@ -935,6 +936,8 @@ function vm.getType(source) return vm.viewType(values) end +--- 获取对象的值 +--- 会尝试穿透函数调用 function vm.getValue(source) if not source then return diff --git a/test-beta/hover/init.lua b/test-beta/hover/init.lua index 3919ca80..68bf3e3b 100644 --- a/test-beta/hover/init.lua +++ b/test-beta/hover/init.lua @@ -296,23 +296,41 @@ function x() -> any ]] -TEST [[ -local mt = {} -mt.__index = mt - -function mt:add(a, b) -end - -local function init() - return setmetatable({}, mt) -end - -local t = init() -t:<?add?>() -]] -[[ -function mt:add(a: any, b: any) -]] +-- TODO 暂不支持跨越函数调用的函数field +--TEST [[ +--local mt = {} +-- +--function mt:add(a, b) +--end +-- +--local function init() +-- return mt +--end +-- +--local t = init() +--t:<?add?>() +--]] +--[[ +--function mt:add(a: any, b: any) +--]] +-- +--TEST [[ +--local mt = {} +--mt.__index = mt +-- +--function mt:add(a, b) +--end +-- +--local function init() +-- return setmetatable({}, mt) +--end +-- +--local t = init() +--t:<?add?>() +--]] +--[[ +--function mt:add(a: any, b: any) +--]] TEST [[ local <?t?> = - 1000 |