summaryrefslogtreecommitdiff
path: root/script-beta/vm/getValue.lua
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2020-01-09 15:46:27 +0800
committer最萌小汐 <sumneko@hotmail.com>2020-01-09 15:46:27 +0800
commitf0e32be57a1a86ccec057febacfdf40a39ff165c (patch)
treea7c8a81e650485024e42ebc6b897f7ca4ed19a19 /script-beta/vm/getValue.lua
parentc305b20e2f3b9ea9add39a2f1064ed41a257f6e0 (diff)
downloadlua-language-server-f0e32be57a1a86ccec057febacfdf40a39ff165c.zip
getValue穿透函数调用返回值
Diffstat (limited to 'script-beta/vm/getValue.lua')
-rw-r--r--script-beta/vm/getValue.lua36
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