From 977990584331307dd5e71ebbbbd6b45b9c961996 Mon Sep 17 00:00:00 2001
From: Gustaf Rydholm <gustaf.rydholm@gmail.com>
Date: Sun, 15 Aug 2021 13:54:15 +0200
Subject: Updates to nvim lsp

---
 .config/nvim/lua/lsp/null-ls/formatters.lua | 77 +++++++++++++++++++++++++++++
 .config/nvim/lua/lsp/null-ls/init.lua       | 44 +++++++++++++++++
 .config/nvim/lua/lsp/null-ls/linters.lua    | 77 +++++++++++++++++++++++++++++
 .config/nvim/lua/lsp/null-ls/services.lua   | 55 +++++++++++++++++++++
 4 files changed, 253 insertions(+)
 create mode 100644 .config/nvim/lua/lsp/null-ls/formatters.lua
 create mode 100644 .config/nvim/lua/lsp/null-ls/init.lua
 create mode 100644 .config/nvim/lua/lsp/null-ls/linters.lua
 create mode 100644 .config/nvim/lua/lsp/null-ls/services.lua

(limited to '.config/nvim/lua/lsp/null-ls')

diff --git a/.config/nvim/lua/lsp/null-ls/formatters.lua b/.config/nvim/lua/lsp/null-ls/formatters.lua
new file mode 100644
index 0000000..e69c824
--- /dev/null
+++ b/.config/nvim/lua/lsp/null-ls/formatters.lua
@@ -0,0 +1,77 @@
+local M = {}
+local formatters_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(formatters, option)
+  option = option or {}
+  local filter = option.filter or "supported"
+
+  return vim.tbl_keys(formatters[filter])
+end
+
+function M.list_supported_names(filetype)
+  if not formatters_by_ft[filetype] then
+    return {}
+  end
+  return list_names(formatters_by_ft[filetype], { filter = "supported" })
+end
+
+function M.list_unsupported_names(filetype)
+  if not formatters_by_ft[filetype] then
+    return {}
+  end
+  return list_names(formatters_by_ft[filetype], { filter = "unsupported" })
+end
+
+function M.list_available(filetype)
+  local formatters = {}
+  for _, provider in pairs(null_ls.builtins.formatting) do
+    -- TODO: Add support for wildcard filetypes
+    if vim.tbl_contains(provider.filetypes or {}, filetype) then
+      table.insert(formatters, provider.name)
+    end
+  end
+
+  return formatters
+end
+
+function M.list_configured(formatter_configs)
+  local formatters, errors = {}, {}
+
+  for _, fmt_config in ipairs(formatter_configs) do
+    local formatter = null_ls.builtins.formatting[fmt_config.exe]
+
+    if not formatter then
+      logger.error("Not a valid formatter:", fmt_config.exe)
+      errors[fmt_config.exe] = {} -- Add data here when necessary
+    else
+      local formatter_cmd = services.find_command(formatter._opts.command)
+      if not formatter_cmd then
+        logger.warn("Not found:", formatter._opts.command)
+        errors[fmt_config.exe] = {} -- Add data here when necessary
+      else
+        logger.info("Using formatter:", formatter_cmd)
+        formatters[fmt_config.exe] = formatter.with {
+          command = formatter_cmd,
+          extra_args = fmt_config.args,
+        }
+      end
+    end
+  end
+
+  return { supported = formatters, unsupported = errors }
+end
+
+function M.setup(filetype, option)
+  if formatters_by_ft[filetype] and not option.force_reload then
+    return
+  end
+
+  formatters_by_ft[filetype] = M.list_configured(options.lang[filetype].formatters)
+  null_ls.register { sources = formatters_by_ft[filetype].supported }
+end
+
+return M
diff --git a/.config/nvim/lua/lsp/null-ls/init.lua b/.config/nvim/lua/lsp/null-ls/init.lua
new file mode 100644
index 0000000..f2b1042
--- /dev/null
+++ b/.config/nvim/lua/lsp/null-ls/init.lua
@@ -0,0 +1,44 @@
+local M = {}
+
+function M.list_supported_provider_names(filetype)
+  local names = {}
+
+  local formatters = require "lsp.null-ls.formatters"
+  local linters = require "lsp.null-ls.linters"
+
+  vim.list_extend(names, formatters.list_supported_names(filetype))
+  vim.list_extend(names, linters.list_supported_names(filetype))
+
+  return names
+end
+
+function M.list_unsupported_provider_names(filetype)
+  local names = {}
+
+  local formatters = require "lsp.null-ls.formatters"
+  local linters = require "lsp.null-ls.linters"
+
+  vim.list_extend(names, formatters.list_unsupported_names(filetype))
+  vim.list_extend(names, linters.list_unsupported_names(filetype))
+
+  return names
+end
+
+-- TODO: for linters and formatters with spaces and '-' replace with '_'
+function M.setup(filetype, option)
+  option = option or {}
+
+  local ok, _ = pcall(require, "null-ls")
+  if not ok then
+    require("core.log"):get_default().error "Missing null-ls dependency"
+    return
+  end
+
+  local formatters = require "lsp.null-ls.formatters"
+  local linters = require "lsp.null-ls.linters"
+
+  formatters.setup(filetype, option)
+  linters.setup(filetype, option)
+end
+
+return M
diff --git a/.config/nvim/lua/lsp/null-ls/linters.lua b/.config/nvim/lua/lsp/null-ls/linters.lua
new file mode 100644
index 0000000..a0675a7
--- /dev/null
+++ b/.config/nvim/lua/lsp/null-ls/linters.lua
@@ -0,0 +1,77 @@
+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, option)
+  option = option or {}
+  local filter = option.filter or "supported"
+
+  return vim.tbl_keys(linters[filter])
+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,
+          extra_args = lnt_config.args,
+        }
+      end
+    end
+  end
+
+  return { supported = linters, unsupported = errors }
+end
+
+function M.setup(filetype, option)
+  if linters_by_ft[filetype] and not option.force_reload then
+    return
+  end
+
+  linters_by_ft[filetype] = M.list_configured(options.lang[filetype].linters)
+  null_ls.register { sources = linters_by_ft[filetype].supported }
+end
+
+return M
diff --git a/.config/nvim/lua/lsp/null-ls/services.lua b/.config/nvim/lua/lsp/null-ls/services.lua
new file mode 100644
index 0000000..80bf66e
--- /dev/null
+++ b/.config/nvim/lua/lsp/null-ls/services.lua
@@ -0,0 +1,55 @@
+local M = {}
+
+local logger = require("core.log"):get_default()
+
+local function find_root_dir()
+  if options.builtin.rooter.active then
+    --- use vim-rooter to set root_dir
+    vim.cmd "let root_dir = FindRootDirectory()"
+    return vim.api.nvim_get_var "root_dir"
+  end
+
+  -- TODO: Rework this to not make it javascript specific
+  --- use LSP to set root_dir
+  local lsp_utils = require "lsp.utils"
+  local ts_client = lsp_utils.get_active_client_by_ft "typescript"
+  if ts_client == nil then
+    logger.error "Unable to determine root directory since tsserver didn't start correctly"
+    return nil
+  end
+
+  return ts_client.config.root_dir
+end
+
+local function from_node_modules(command)
+  local root_dir = find_root_dir()
+  if not root_dir then
+    return nil
+  end
+
+  return root_dir .. "/node_modules/.bin/" .. command
+end
+
+local local_providers = {
+  prettier = { find = from_node_modules },
+  prettierd = { find = from_node_modules },
+  prettier_d_slim = { find = from_node_modules },
+  eslint_d = { find = from_node_modules },
+  eslint = { find = from_node_modules },
+}
+
+function M.find_command(command)
+  if local_providers[command] then
+    local local_command = local_providers[command].find(command)
+    if local_command and vim.fn.executable(local_command) == 1 then
+      return local_command
+    end
+  end
+
+  if vim.fn.executable(command) == 1 then
+    return command
+  end
+  return nil
+end
+
+return M
-- 
cgit v1.2.3-70-g09d2