From 7b3e7f4b0a62b7c9c3b895e89b4fe79bb8f350ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9C=80=E8=90=8C=E5=B0=8F=E6=B1=90?= Date: Wed, 22 Jun 2022 01:41:16 +0800 Subject: fix --- script/core/diagnostics/missing-parameter.lua | 122 +----------------------- script/core/diagnostics/redundant-parameter.lua | 63 +++--------- 2 files changed, 18 insertions(+), 167 deletions(-) (limited to 'script/core/diagnostics') diff --git a/script/core/diagnostics/missing-parameter.lua b/script/core/diagnostics/missing-parameter.lua index 9844046f..b6067175 100644 --- a/script/core/diagnostics/missing-parameter.lua +++ b/script/core/diagnostics/missing-parameter.lua @@ -3,116 +3,6 @@ local guide = require 'parser.guide' local vm = require 'vm' local lang = require 'language' ----@param source parser.object ----@return integer -local function countReturnsOfFunction(source) - local n = 0 - - local docs = source.bindDocs - if docs then - for _, doc in ipairs(docs) do - if doc.type == 'doc.return' then - for _, rtn in ipairs(doc.returns) do - if rtn.returnIndex and rtn.returnIndex > n then - n = rtn.returnIndex - end - end - end - end - end - - local returns = source.returns - if returns then - for _, rtn in ipairs(returns) do - if #rtn > n then - n = #rtn - end - end - end - - return n -end - ----@param source parser.object ----@return integer -local function countReturnsOfDocFunction(source) - return #source.returns -end - -local function countMaxReturns(source) - local hasFounded - local n = 0 - for _, def in ipairs(vm.getDefs(source)) do - if def.type == 'function' then - hasFounded = true - local rets = countReturnsOfFunction(def) - if rets > n then - n = rets - end - elseif def.type == 'doc.type.function' then - hasFounded = true - local rets = countReturnsOfDocFunction(def) - if rets > n then - n = rets - end - end - end - - if hasFounded then - return n - else - return math.huge - end -end - -local function countCallArgs(source) - local result = 0 - if not source.args then - return 0 - end - local lastArg = source.args[#source.args] - if lastArg.type == 'varargs' then - return math.huge - end - if lastArg.type == 'call' then - result = result + countMaxReturns(lastArg.node) - 1 - end - result = result + #source.args - return result -end - ----@return integer -local function countFuncArgs(source) - if not source.args or #source.args == 0 then - return 0 - end - local count = 0 - for i = #source.args, 1, -1 do - local arg = source.args[i] - if arg.type ~= '...' - and not (arg.name and arg.name[1] =='...') - and not vm.compileNode(arg):isNullable() then - return i - end - end - return count -end - -local function getFuncArgs(func) - local funcArgs - local defs = vm.getDefs(func) - for _, def in ipairs(defs) do - if def.type == 'function' - or def.type == 'doc.type.function' then - local args = countFuncArgs(def) - if not funcArgs or args < funcArgs then - funcArgs = args - end - end - end - return funcArgs -end - return function (uri, callback) local state = files.getState(uri) if not state then @@ -120,19 +10,15 @@ return function (uri, callback) end guide.eachSourceType(state.ast, 'call', function (source) - local callArgs = countCallArgs(source) + local _, callArgs = vm.countList(source.args) - local func = source.node - local funcArgs = getFuncArgs(func) + local funcNode = vm.compileNode(source.node) + local funcArgs = vm.countParamsOfNode(funcNode) - if not funcArgs then + if callArgs >= funcArgs then return end - local delta = callArgs - funcArgs - if delta >= 0 then - return - end callback { start = source.start, finish = source.finish, diff --git a/script/core/diagnostics/redundant-parameter.lua b/script/core/diagnostics/redundant-parameter.lua index 41781df8..2b7f1230 100644 --- a/script/core/diagnostics/redundant-parameter.lua +++ b/script/core/diagnostics/redundant-parameter.lua @@ -3,43 +3,6 @@ local guide = require 'parser.guide' local vm = require 'vm' local lang = require 'language' -local function countCallArgs(source) - local result = 0 - if not source.args then - return 0 - end - result = result + #source.args - return result -end - -local function countFuncArgs(source) - if not source.args or #source.args == 0 then - return 0 - end - local lastArg = source.args[#source.args] - if lastArg.type == '...' - or (lastArg.name and lastArg.name[1] == '...') then - return math.maxinteger - else - return #source.args - end -end - -local function getFuncArgs(func) - local funcArgs - local defs = vm.getDefs(func) - for _, def in ipairs(defs) do - if def.type == 'function' - or def.type == 'doc.type.function' then - local args = countFuncArgs(def) - if not funcArgs or args > funcArgs then - funcArgs = args - end - end - end - return funcArgs -end - return function (uri, callback) local state = files.getState(uri) if not state then @@ -47,28 +10,30 @@ return function (uri, callback) end guide.eachSourceType(state.ast, 'call', function (source) - local callArgs = countCallArgs(source) + local callArgs = vm.countList(source.args) if callArgs == 0 then return end - local func = source.node - local funcArgs = getFuncArgs(func) - - if not funcArgs then - return - end + local funcNode = vm.compileNode(source.node) + local _, funcArgs = vm.countParamsOfNode(funcNode) - local delta = callArgs - funcArgs - if delta <= 0 then + if callArgs <= funcArgs then return end if callArgs == 1 and source.node.type == 'getmethod' then return end - for i = #source.args - delta + 1, #source.args do - local arg = source.args[i] - if arg then + if funcArgs + 1 > #source.args then + local lastArg = source.args[#source.args] + callback { + start = lastArg.start, + finish = lastArg.finish, + message = lang.script('DIAG_OVER_MAX_ARGS', funcArgs, callArgs) + } + else + for i = funcArgs + 1, #source.args do + local arg = source.args[i] callback { start = arg.start, finish = arg.finish, -- cgit v1.2.3