diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2020-01-09 15:46:27 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2020-01-09 15:46:27 +0800 |
commit | f0e32be57a1a86ccec057febacfdf40a39ff165c (patch) | |
tree | a7c8a81e650485024e42ebc6b897f7ca4ed19a19 /script-beta/vm/getValue.lua | |
parent | c305b20e2f3b9ea9add39a2f1064ed41a257f6e0 (diff) | |
download | lua-language-server-f0e32be57a1a86ccec057febacfdf40a39ff165c.zip |
getValue穿透函数调用返回值
Diffstat (limited to 'script-beta/vm/getValue.lua')
-rw-r--r-- | script-beta/vm/getValue.lua | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/script-beta/vm/getValue.lua b/script-beta/vm/getValue.lua index fbc630f0..c03c7437 100644 --- a/script-beta/vm/getValue.lua +++ b/script-beta/vm/getValue.lua @@ -707,6 +707,41 @@ local function inferBySet(results, source) end end +local function mergeFunctionReturns(results, source, index) + local returns = source.returns + if not returns then + return + end + for i = 1, #returns do + local rtn = returns[i] + if rtn[index] then + merge(results, vm.getValue(rtn[index])) + end + end +end + +local function inferByCallReturn(results, source) + if source.type ~= 'select' then + return + end + if not source.vararg or source.vararg.type ~= 'call' then + return + end + local node = source.vararg.node + local nodeValues = vm.getValue(node) + if not nodeValues then + return + end + local index = source.index + for i = 1, #nodeValues do + local value = nodeValues[i] + local src = value.source + if src.type == 'function' then + mergeFunctionReturns(results, src, index) + end + end +end + local function getValue(source) local results = checkLiteral(source) or checkValue(source) @@ -727,6 +762,7 @@ local function getValue(source) inferByGetTable(results, source) inferByUnary(results, source) inferByBinary(results, source) + inferByCallReturn(results, source) if #results == 0 then return nil |