summaryrefslogtreecommitdiff
path: root/lua/lsp/null-ls.lua
diff options
context:
space:
mode:
Diffstat (limited to 'lua/lsp/null-ls.lua')
-rw-r--r--lua/lsp/null-ls.lua83
1 files changed, 83 insertions, 0 deletions
diff --git a/lua/lsp/null-ls.lua b/lua/lsp/null-ls.lua
new file mode 100644
index 00000000..48924be5
--- /dev/null
+++ b/lua/lsp/null-ls.lua
@@ -0,0 +1,83 @@
+local M = {}
+
+local null_ls = require "null-ls"
+local sources = {}
+
+local local_executables = { "prettier", "prettierd", "prettier_d_slim", "eslint_d", "eslint" }
+
+local function is_table(t)
+ return type(t) == "table"
+end
+
+local function is_string(t)
+ return type(t) == "string"
+end
+
+local function has_value(tab, val)
+ for _, value in ipairs(tab) do
+ if value == val then
+ return true
+ end
+ end
+
+ return false
+end
+
+local find_local_exe = function(exe)
+ vim.cmd "let root_dir = FindRootDirectory()"
+ local root_dir = vim.api.nvim_get_var "root_dir"
+ local local_exe = root_dir .. "/node_modules/.bin/" .. exe
+ return local_exe
+end
+
+local function setup_ls(exe, type)
+ if has_value(local_executables, exe) then
+ local smart_executable = null_ls.builtins[type][exe]
+ local local_executable = find_local_exe(exe)
+ if vim.fn.executable(local_executable) == 1 then
+ smart_executable._opts.command = local_executable
+ table.insert(sources, smart_executable)
+ else
+ if vim.fn.executable(exe) == 1 then
+ table.insert(sources, smart_executable)
+ end
+ end
+ else
+ if vim.fn.executable(exe) == 1 then
+ table.insert(sources, null_ls.builtins[type][exe])
+ end
+ end
+ null_ls.register { sources = sources }
+end
+
+-- TODO: for linters and formatters with spaces and '-' replace with '_'
+local function setup(filetype, type)
+ local executables = nil
+ if type == "diagnostics" then
+ executables = lvim.lang[filetype].linters
+ end
+ if type == "formatting" then
+ executables = lvim.lang[filetype].formatter.exe
+ end
+
+ if is_table(executables) then
+ for _, exe in pairs(executables) do
+ if exe ~= "" then
+ setup_ls(exe, type)
+ end
+ end
+ end
+ if is_string(executables) and executables ~= "" then
+ setup_ls(executables, type)
+ end
+end
+
+-- TODO: return the formatter if one was registered, then turn off the builtin formatter
+function M.setup(filetype)
+ setup(filetype, "formatting")
+ setup(filetype, "diagnostics")
+ lvim.sources = sources
+ return sources
+end
+
+return M