diff options
author | 最萌小汐 <sumneko@hotmail.com> | 2019-11-23 00:05:30 +0800 |
---|---|---|
committer | 最萌小汐 <sumneko@hotmail.com> | 2019-11-23 00:05:30 +0800 |
commit | 6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 (patch) | |
tree | fdc22d78150fd1c5edc46732c8b151ccfefb519f /script/method/textDocument/documentSymbol.lua | |
parent | d0ff66c9abe9d6abbca12fd811e0c3cb69c1033a (diff) | |
download | lua-language-server-6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444.zip |
正路目录
Diffstat (limited to 'script/method/textDocument/documentSymbol.lua')
-rw-r--r-- | script/method/textDocument/documentSymbol.lua | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/script/method/textDocument/documentSymbol.lua b/script/method/textDocument/documentSymbol.lua new file mode 100644 index 00000000..a4b0c3b7 --- /dev/null +++ b/script/method/textDocument/documentSymbol.lua @@ -0,0 +1,72 @@ +local core = require 'core' +local lang = require 'language' + +local timerCache = {} + +local function posToRange(lines, start, finish) + local start_row, start_col = lines:rowcol(start) + local finish_row, finish_col = lines:rowcol(finish) + return { + start = { + line = start_row - 1, + character = start_col - 1, + }, + ['end'] = { + line = finish_row - 1, + character = finish_col, + }, + } +end + +local function convertRange(lines, symbol) + symbol.range = posToRange(lines, symbol.range[1], symbol.range[2]) + symbol.selectionRange = posToRange(lines, symbol.selectionRange[1], symbol.selectionRange[2]) + if symbol.name == '' then + symbol.name = lang.script.SYMBOL_ANONYMOUS + end + + if symbol.children then + for _, child in ipairs(symbol.children) do + convertRange(lines, child) + end + end +end + +return function (lsp, params) + local uri = params.textDocument.uri + + if timerCache[uri] then + timerCache[uri]:remove() + timerCache[uri] = nil + end + + return function (response) + local clock = os.clock() + timerCache[uri] = ac.loop(0.1, function (t) + local vm, lines = lsp:getVM(uri) + if not vm then + if os.clock() - clock > 10 then + t:remove() + timerCache[uri] = nil + response(nil) + end + return + end + + t:remove() + timerCache[uri] = nil + + local symbols = core.documentSymbol(vm) + if not symbols then + response(nil) + return + end + + for _, symbol in ipairs(symbols) do + convertRange(lines, symbol) + end + + response(symbols) + end) + end +end |