summaryrefslogtreecommitdiff
path: root/script/method/textDocument/documentSymbol.lua
diff options
context:
space:
mode:
author最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
committer最萌小汐 <sumneko@hotmail.com>2019-11-23 00:05:30 +0800
commit6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444 (patch)
treefdc22d78150fd1c5edc46732c8b151ccfefb519f /script/method/textDocument/documentSymbol.lua
parentd0ff66c9abe9d6abbca12fd811e0c3cb69c1033a (diff)
downloadlua-language-server-6da2b175e20ed3c03b0dfcfc9046de1e0e5d4444.zip
正路目录
Diffstat (limited to 'script/method/textDocument/documentSymbol.lua')
-rw-r--r--script/method/textDocument/documentSymbol.lua72
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