summaryrefslogtreecommitdiff
path: root/lua/lsp/null-ls/linters.lua
diff options
context:
space:
mode:
authorLuc Sinet <[email protected]>2021-08-13 22:32:56 +0200
committerGitHub <[email protected]>2021-08-14 01:02:56 +0430
commit70d139ac2771fac9b072aaebe505f9ac77480b2a (patch)
treef914460477982486f20bb00676f8a36c89618635 /lua/lsp/null-ls/linters.lua
parent53869f00be7eda020088342e6e1a160ef5fc2a53 (diff)
[Refactor/Bugfix] Improve null ls handler (#1277)
Diffstat (limited to 'lua/lsp/null-ls/linters.lua')
-rw-r--r--lua/lsp/null-ls/linters.lua79
1 files changed, 79 insertions, 0 deletions
diff --git a/lua/lsp/null-ls/linters.lua b/lua/lsp/null-ls/linters.lua
new file mode 100644
index 00000000..780a9c4d
--- /dev/null
+++ b/lua/lsp/null-ls/linters.lua
@@ -0,0 +1,79 @@
+local M = {}
+local linters_by_ft = {}
+
+local null_ls = require "null-ls"
+local services = require "lsp.null-ls.services"
+local logger = require("core.log"):get_default()
+
+local function list_names(linters, options)
+ options = options or {}
+ local names = {}
+
+ local filter = options.filter or "supported"
+ for name, _ in pairs(linters[filter]) do
+ table.insert(names, name)
+ end
+
+ return names
+end
+
+function M.list_supported_names(filetype)
+ if not linters_by_ft[filetype] then
+ return {}
+ end
+ return list_names(linters_by_ft[filetype], { filter = "supported" })
+end
+
+function M.list_unsupported_names(filetype)
+ if not linters_by_ft[filetype] then
+ return {}
+ end
+ return list_names(linters_by_ft[filetype], { filter = "unsupported" })
+end
+
+function M.list_available(filetype)
+ local linters = {}
+ for _, provider in pairs(null_ls.builtins.diagnostics) do
+ -- TODO: Add support for wildcard filetypes
+ if vim.tbl_contains(provider.filetypes or {}, filetype) then
+ table.insert(linters, provider.name)
+ end
+ end
+
+ return linters
+end
+
+function M.list_configured(linter_configs)
+ local linters, errors = {}, {}
+
+ for _, lnt_config in pairs(linter_configs) do
+ local linter = null_ls.builtins.diagnostics[lnt_config.exe]
+
+ if not linter then
+ logger.error("Not a valid linter:", lnt_config.exe)
+ errors[lnt_config.exe] = {} -- Add data here when necessary
+ else
+ local linter_cmd = services.find_command(linter._opts.command)
+ if not linter_cmd then
+ logger.warn("Not found:", linter._opts.command)
+ errors[lnt_config.exe] = {} -- Add data here when necessary
+ else
+ logger.info("Using linter:", linter_cmd)
+ linters[lnt_config.exe] = linter.with { command = linter_cmd, args = lnt_config.args }
+ end
+ end
+ end
+
+ return { supported = linters, unsupported = errors }
+end
+
+function M.setup(filetype, options)
+ if linters_by_ft[filetype] and not options.force_reload then
+ return
+ end
+
+ linters_by_ft[filetype] = M.list_configured(lvim.lang[filetype].linters)
+ null_ls.register { sources = linters_by_ft[filetype].supported }
+end
+
+return M