diff options
-rw-r--r-- | changelog.md | 3 | ||||
-rw-r--r-- | script/core/diagnostics/unused-function.lua | 30 | ||||
-rw-r--r-- | test/diagnostics/init.lua | 15 |
3 files changed, 40 insertions, 8 deletions
diff --git a/changelog.md b/changelog.md index 42435361..cb26ebd6 100644 --- a/changelog.md +++ b/changelog.md @@ -3,11 +3,12 @@ ## 1.10.0 * `NEW` workspace: supports `.dll`(`.so`) in `require` * `NEW` folding: `---@class`, `--#region` and docs of function -* `NEW` dianostic: `count-down-loop` +* `NEW` diagnostic: `count-down-loop` * `CHG` supports `~` in command line * `CHG` completion: improve workspace words * `CHG` completion: show words in string * `CHG` completion: split `for .. in` to `for .. ipairs` and `for ..pairs` +* `CHG` diagnostic: `unused-function` checks recursive * `FIX` [#339](https://github.com/sumneko/lua-language-server/issues/339) ## 1.9.0 diff --git a/script/core/diagnostics/unused-function.lua b/script/core/diagnostics/unused-function.lua index e6ae9386..41c239f9 100644 --- a/script/core/diagnostics/unused-function.lua +++ b/script/core/diagnostics/unused-function.lua @@ -23,25 +23,33 @@ return function (uri, callback) if not ast then return end - -- 只检查局部函数 - guide.eachSourceType(ast.ast, 'function', function (source) + + local cache = {} + local function checkFunction(source) + if cache[source] ~= nil then + return cache[source] + end + cache[source] = false local parent = source.parent if not parent then - return + return false end if parent.type ~= 'local' and parent.type ~= 'setlocal' then - return + return false end if isToBeClosed(parent) then - return + return false end local hasGet local refs = vm.getRefs(source) for _, src in ipairs(refs) do if vm.isGet(src) then - hasGet = true - break + local func = guide.getParentFunction(src) + if not checkFunction(func) then + hasGet = true + break + end end end if not hasGet then @@ -60,6 +68,14 @@ return function (uri, callback) message = lang.script.DIAG_UNUSED_FUNCTION, } end + cache[source] = true + return true end + return false + end + + -- 只检查局部函数 + guide.eachSourceType(ast.ast, 'function', function (source) + checkFunction(source) end) end diff --git a/test/diagnostics/init.lua b/test/diagnostics/init.lua index 4ec93acf..8a89179f 100644 --- a/test/diagnostics/init.lua +++ b/test/diagnostics/init.lua @@ -115,6 +115,21 @@ local <!x!> <!x!> = <!function () end!> ]] +TEST([[ +<!local function x() +end!> +<!local function y() + x() +end!> +]], +[[ +local function x() +end +local function <!y!>() + x() +end +]] +) TEST [[ print(<!x!>) |