267267--- @return integer def
268268function vm .countReturnsOfCall (func , args , mark )
269269 local funcs = vm .getMatchedFunctions (func , args , mark )
270+ if not funcs then
271+ return 0 , math.huge , 0
272+ end
270273 --- @type integer ?, number ?, integer ?
271274 local min , max , def
272275 for _ , f in ipairs (funcs ) do
@@ -329,10 +332,52 @@ function vm.countList(list, mark)
329332 return min , max , def
330333end
331334
335+ --- @param uri uri
336+ --- @param args parser.object[]
337+ --- @return boolean
338+ local function isAllParamMatched (uri , args , params )
339+ if not params then
340+ return false
341+ end
342+ for i = 1 , # args do
343+ if not params [i ] then
344+ break
345+ end
346+ local argNode = vm .compileNode (args [i ])
347+ local defNode = vm .compileNode (params [i ])
348+ if not vm .canCastType (uri , defNode , argNode ) then
349+ return false
350+ end
351+ end
352+ return true
353+ end
354+
332355--- @param func parser.object
333- --- @param args parser.object[] ?
356+ --- @param args ? parser.object[]
357+ --- @return parser.object[] ?
358+ function vm .getExactMatchedFunctions (func , args )
359+ local funcs = vm .getMatchedFunctions (func , args )
360+ if not args or not funcs then
361+ return funcs
362+ end
363+ local uri = guide .getUri (func )
364+ local result = {}
365+ for _ , n in ipairs (funcs ) do
366+ if not vm .isVarargFunctionWithOverloads (n )
367+ and isAllParamMatched (uri , args , n .args ) then
368+ result [# result + 1 ] = n
369+ end
370+ end
371+ if # result == 0 then
372+ return nil
373+ end
374+ return result
375+ end
376+
377+ --- @param func parser.object
378+ --- @param args ? parser.object[]
334379--- @param mark ? table
335- --- @return parser.object[]
380+ --- @return parser.object[] ?
336381function vm .getMatchedFunctions (func , args , mark )
337382 local funcs = {}
338383 local node = vm .compileNode (func )
@@ -342,9 +387,6 @@ function vm.getMatchedFunctions(func, args, mark)
342387 funcs [# funcs + 1 ] = n
343388 end
344389 end
345- if # funcs <= 1 then
346- return funcs
347- end
348390
349391 local amin , amax = vm .countList (args , mark )
350392
@@ -357,7 +399,7 @@ function vm.getMatchedFunctions(func, args, mark)
357399 end
358400
359401 if # matched == 0 then
360- return funcs
402+ return nil
361403 else
362404 return matched
363405 end
0 commit comments