summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--script/vm/function.lua33
1 files changed, 26 insertions, 7 deletions
diff --git a/script/vm/function.lua b/script/vm/function.lua
index 1a916a1c..1e308317 100644
--- a/script/vm/function.lua
+++ b/script/vm/function.lua
@@ -1,6 +1,7 @@
---@class vm
local vm = require 'vm.vm'
local guide = require 'parser.guide'
+local util = require 'utility'
---@param arg parser.object
---@return parser.object?
@@ -360,18 +361,28 @@ function vm.getExactMatchedFunctions(func, args)
if not args or not funcs then
return funcs
end
+ if #funcs == 1 then
+ return funcs
+ end
local uri = guide.getUri(func)
- local result = {}
- for _, n in ipairs(funcs) do
- if not vm.isVarargFunctionWithOverloads(n)
- and isAllParamMatched(uri, args, n.args) then
- result[#result+1] = n
+ local needRemove
+ for i, n in ipairs(funcs) do
+ if vm.isVarargFunctionWithOverloads(n)
+ or not isAllParamMatched(uri, args, n.args) then
+ if not needRemove then
+ needRemove = {}
+ end
+ needRemove[#needRemove+1] = i
end
end
- if #result == 0 then
+ if not needRemove then
+ return funcs
+ end
+ if #needRemove == #funcs then
return nil
end
- return result
+ util.tableMultiRemove(funcs, needRemove)
+ return funcs
end
---@param func parser.object
@@ -414,23 +425,31 @@ function vm.isVarargFunctionWithOverloads(func)
if not func.args then
return false
end
+ if func._varargFunction ~= nil then
+ return func._varargFunction
+ end
if func.args[1] and func.args[1].type == 'self' then
if not func.args[2] or func.args[2].type ~= '...' then
+ func._varargFunction = false
return false
end
else
if not func.args[1] or func.args[1].type ~= '...' then
+ func._varargFunction = false
return false
end
end
if not func.bindDocs then
+ func._varargFunction = false
return false
end
for _, doc in ipairs(func.bindDocs) do
if doc.type == 'doc.overload' then
+ func._varargFunction = true
return true
end
end
+ func._varargFunction = false
return false
end