summaryrefslogtreecommitdiff
path: root/start/lspconfig-0.1.8/lua/lspconfig/async.lua
diff options
context:
space:
mode:
Diffstat (limited to 'start/lspconfig-0.1.8/lua/lspconfig/async.lua')
-rw-r--r--start/lspconfig-0.1.8/lua/lspconfig/async.lua70
1 files changed, 70 insertions, 0 deletions
diff --git a/start/lspconfig-0.1.8/lua/lspconfig/async.lua b/start/lspconfig-0.1.8/lua/lspconfig/async.lua
new file mode 100644
index 0000000..eb82b30
--- /dev/null
+++ b/start/lspconfig-0.1.8/lua/lspconfig/async.lua
@@ -0,0 +1,70 @@
+local M = {}
+
+function M.run(func)
+ coroutine.resume(coroutine.create(function()
+ local status, err = pcall(func)
+ if not status then
+ vim.notify(('[lspconfig] unhandled error: %s'):format(tostring(err)), vim.log.levels.WARN)
+ end
+ end))
+end
+
+--- @param cmd string|string[]
+--- @return string[]?
+function M.run_command(cmd)
+ local co = assert(coroutine.running())
+
+ local stdout = {}
+ local stderr = {}
+ local exit_code = nil
+
+ local jobid = vim.fn.jobstart(cmd, {
+ on_stdout = function(_, data, _)
+ data = table.concat(data, '\n')
+ if #data > 0 then
+ stdout[#stdout + 1] = data
+ end
+ end,
+ on_stderr = function(_, data, _)
+ stderr[#stderr + 1] = table.concat(data, '\n')
+ end,
+ on_exit = function(_, code, _)
+ exit_code = code
+ coroutine.resume(co)
+ end,
+ stdout_buffered = true,
+ stderr_buffered = true,
+ })
+
+ if jobid <= 0 then
+ vim.notify(('[lspconfig] unable to run cmd: %s'):format(cmd), vim.log.levels.WARN)
+ return nil
+ end
+
+ coroutine.yield()
+
+ if exit_code ~= 0 then
+ vim.notify(
+ ('[lspconfig] cmd failed with code %d: %s\n%s'):format(exit_code, cmd, table.concat(stderr, '')),
+ vim.log.levels.WARN
+ )
+ return nil
+ end
+
+ if next(stdout) == nil then
+ return nil
+ end
+ return stdout and stdout or nil
+end
+
+function M.reenter()
+ if vim.in_fast_event() then
+ local co = assert(coroutine.running())
+ vim.schedule(function()
+ coroutine.resume(co)
+ end)
+ coroutine.yield()
+ end
+end
+
+return M