Преглед на файлове

fix(lsp): update format filter for nightly (#2773)

kylo252 преди 3 години
родител
ревизия
efe7eea195
променени са 1 файла, в които са добавени 23 реда и са изтрити 25 реда
  1. 23 25
      lua/lvim/lsp/utils.lua

+ 23 - 25
lua/lvim/lsp/utils.lua

@@ -130,45 +130,43 @@ function M.setup_codelens_refresh(client, bufnr)
 end
 
 ---filter passed to vim.lsp.buf.format
----gives higher priority to null-ls
----@param clients table clients attached to a buffer
+---always selects null-ls if it's available and caches the value per buffer
+---@param client table client attached to a buffer
 ---@return table chosen clients
-function M.format_filter(clients)
-  return vim.tbl_filter(function(client)
-    local status_ok, formatting_supported = pcall(function()
-      return client.supports_method "textDocument/formatting"
-    end)
-    -- give higher prio to null-ls
-    if status_ok and formatting_supported and client.name == "null-ls" then
-      return "null-ls"
-    else
-      return status_ok and formatting_supported and client.name
-    end
-  end, clients)
+function M.format_filter(client)
+  local filetype = vim.bo.filetype
+  local n = require "null-ls"
+  local s = require "null-ls.sources"
+  local method = n.methods.FORMATTING
+  local avalable_sources = s.get_available(filetype, method)
+
+  if #avalable_sources > 0 then
+    return client.name == "null-ls"
+  else
+    return true
+  end
 end
 
 ---Provide vim.lsp.buf.format for nvim <0.8
 ---@param opts table
 function M.format(opts)
-  opts = opts or { filter = M.format_filter }
+  opts = opts or {}
+  opts.filter = opts.filter or M.format_filter
 
   if vim.lsp.buf.format then
     return vim.lsp.buf.format(opts)
   end
 
   local bufnr = opts.bufnr or vim.api.nvim_get_current_buf()
-  local clients = vim.lsp.buf_get_clients(bufnr)
+
+  local clients = vim.lsp.get_active_clients {
+    id = opts.id,
+    bufnr = bufnr,
+    name = opts.name,
+  }
 
   if opts.filter then
-    clients = opts.filter(clients)
-  elseif opts.id then
-    clients = vim.tbl_filter(function(client)
-      return client.id == opts.id
-    end, clients)
-  elseif opts.name then
-    clients = vim.tbl_filter(function(client)
-      return client.name == opts.name
-    end, clients)
+    clients = vim.tbl_filter(opts.filter, clients)
   end
 
   clients = vim.tbl_filter(function(client)