فهرست منبع

perf(lsp): use the new upstream API for filetypes (#1836)

kylo252 3 سال پیش
والد
کامیت
e8693406ba
7فایلهای تغییر یافته به همراه44 افزوده شده و 39 حذف شده
  1. 3 1
      lua/lvim/core/info.lua
  2. 5 0
      lua/lvim/lsp/config.lua
  3. 1 2
      lua/lvim/lsp/manager.lua
  4. 10 7
      lua/lvim/lsp/utils.lua
  5. 5 3
      tests/config_loader_spec.lua
  6. 13 23
      tests/lsp_spec.lua
  7. 7 3
      utils/bin/test_runner.sh

+ 3 - 1
lua/lvim/core/info.lua

@@ -61,11 +61,13 @@ local function make_client_info(client)
   local client_enabled_caps = lsp_utils.get_client_capabilities(client.id)
   local name = client.name
   local id = client.id
+  local filetypes = lsp_utils.get_supported_filetypes(name)
   local document_formatting = client.resolved_capabilities.document_formatting
   local attached_buffers_list = table.concat(vim.lsp.get_buffers_by_client_id(client.id), ", ")
   local client_info = {
     fmt("* Name:                      %s", name),
     fmt("* Id:                        [%s]", tostring(id)),
+    fmt("* filetype(s):               [%s]", table.concat(filetypes, ", ")),
     fmt("* Attached buffers:          [%s]", tostring(attached_buffers_list)),
     fmt("* Supports formatting:       %s", tostring(document_formatting)),
   }
@@ -106,7 +108,7 @@ function M.toggle_popup(ft)
 
   local lsp_info = {
     "Language Server Protocol (LSP) info",
-    fmt "* Associated server(s):",
+    fmt "* Active server(s):",
   }
 
   for _, client in pairs(clients) do

+ 5 - 0
lua/lvim/lsp/config.lua

@@ -46,15 +46,20 @@ return {
     "ansiblels",
     "denols",
     "ember",
+    "emmet_ls",
     "eslint",
     "eslintls",
+    "graphql",
     "jedi_language_server",
+    "ltex",
+    "phpactor",
     "pylsp",
     "rome",
     "sqlls",
     "sqls",
     "stylelint_lsp",
     "tailwindcss",
+    "tflint",
     "volar",
   },
 }

+ 1 - 2
lua/lvim/lsp/manager.lua

@@ -42,7 +42,7 @@ end
 -- manually start the server and don't wait for the usual filetype trigger from lspconfig
 local function buf_try_add(server_name, bufnr)
   bufnr = bufnr or vim.api.nvim_get_current_buf()
-  require("lspconfig")[server_name].manager.try_add(bufnr)
+  require("lspconfig")[server_name].manager.try_add_wrapper(bufnr)
 end
 
 ---Setup a language server by providing a name
@@ -78,7 +78,6 @@ function M.setup(server_name, user_config)
       end
       install_notification = false
       requested_server:setup(config)
-      buf_try_add(server_name)
     end)
   else
     -- since it may not be installed, don't attempt to configure the LSP unless there is a custom provider

+ 10 - 7
lua/lvim/lsp/utils.lua

@@ -49,14 +49,17 @@ function M.get_client_capabilities(client_id)
 end
 
 function M.get_supported_filetypes(server_name)
-  -- print("got filetypes query request for: " .. server_name)
-  local configs = require "lspconfig/configs"
-  pcall(require, ("lspconfig/" .. server_name))
-  for _, config in pairs(configs) do
-    if config.name == server_name then
-      return config.document_config.default_config.filetypes or {}
-    end
+  -- temporary workaround: https://github.com/neovim/nvim-lspconfig/pull/1358
+  if server_name == "dockerls" then
+    return { "dockerfile" }
+  end
+  local lsp_installer_servers = require "nvim-lsp-installer.servers"
+  local server_available, requested_server = lsp_installer_servers.get_server(server_name)
+  if not server_available then
+    return {}
   end
+
+  return requested_server:get_supported_filetypes()
 end
 
 return M

+ 5 - 3
tests/config_loader_spec.lua

@@ -1,5 +1,6 @@
 local a = require "plenary.async_lib.tests"
 local config = require "lvim.config"
+local utils = require "lvim.utils"
 
 a.describe("config-loader", function()
   local user_config_path = config:get_user_config_path()
@@ -20,18 +21,19 @@ a.describe("config-loader", function()
     vim.opt.undodir = "/tmp"
     assert.equal(vim.opt.undodir:get()[1], "/tmp")
     config:reload()
-    assert.equal(vim.opt.undodir:get()[1], get_cache_dir() .. "/undo")
+    assert.equal(vim.opt.undodir:get()[1], utils.join_paths(get_cache_dir(), "undo"))
   end)
 
   a.it("should not get interrupted by errors in user-config", function()
     vim.opt.undodir = "/tmp"
     assert.equal(vim.opt.undodir:get()[1], "/tmp")
-    os.execute("echo bad_string_test >> " .. user_config_path)
+    os.execute(string.format("echo 'bad_string_test' >> %s", user_config_path))
     local error_handler = function(msg)
       return msg
     end
     local err = xpcall(config:reload(), error_handler)
     assert.falsy(err)
-    assert.equal(vim.opt.undodir:get()[1], get_cache_dir() .. "/undo")
+    assert.equal(vim.opt.undodir:get()[1], utils.join_paths(get_cache_dir(), "undo"))
+    os.execute(string.format("echo '' > %s", user_config_path))
   end)
 end)

+ 13 - 23
tests/lsp_spec.lua

@@ -44,29 +44,6 @@ a.describe("lsp workflow", function()
     end)
   end)
 
-  a.it("shoud retrieve supported filetypes correctly", function()
-    local ocaml = {
-      name = "ocamlls",
-      filetypes = { "ocaml", "reason" },
-    }
-    local ocaml_fts = require("lvim.lsp.utils").get_supported_filetypes(ocaml.name)
-    assert.True(vim.deep_equal(ocaml.filetypes, ocaml_fts))
-
-    local tsserver = {
-      name = "tsserver",
-      filetypes = {
-        "javascript",
-        "javascriptreact",
-        "javascript.jsx",
-        "typescript",
-        "typescriptreact",
-        "typescript.tsx",
-      },
-    }
-    local tsserver_fts = require("lvim.lsp.utils").get_supported_filetypes(tsserver.name)
-    assert.True(vim.deep_equal(tsserver.filetypes, tsserver_fts))
-  end)
-
   a.it("shoud not include blacklisted servers in the generated templates", function()
     assert.True(utils.is_directory(lvim.lsp.templates_dir))
     require("lvim.lsp").setup()
@@ -77,4 +54,17 @@ a.describe("lsp workflow", function()
       end
     end
   end)
+
+  a.it("shoud only include one server per generated template", function()
+    assert.True(utils.is_directory(lvim.lsp.templates_dir))
+    require("lvim.lsp").setup()
+
+    for _, file in ipairs(vim.fn.glob(lvim.lsp.templates_dir .. "/*.lua", 1, 1)) do
+      local count = 0
+      for _ in io.lines(file) do
+        count = count + 1
+      end
+      assert.equal(count, 1)
+    end
+  end)
 end)

+ 7 - 3
utils/bin/test_runner.sh

@@ -1,15 +1,17 @@
 #!/usr/bin/env bash
 set -e
 
-export LUNARVIM_CONFIG_DIR="${LUNARVIM_CONFIG_DIR:-"$HOME/.config/lvim"}"
 export LUNARVIM_RUNTIME_DIR="${LUNARVIM_RUNTIME_DIR:-"$HOME/.local/share/lunarvim"}"
 
 export LVIM_TEST_ENV=true
 
-rm -f "$LUNARVIM_CONFIG_DIR/plugin/packer_compiled.lua"
+# we should start with an empty configuration
+TEST_BASE_DIR="$(mktemp -d)"
+
+export LUNARVIM_CONFIG_DIR="$TEST_BASE_DIR"
+export LUNARVIM_CACHE_DIR="$TEST_BASE_DIR"
 
 lvim() {
-  # TODO: allow running with a minimal_init.lua
   nvim -u "$LUNARVIM_RUNTIME_DIR/lvim/tests/minimal_init.lua" --cmd "set runtimepath+=$LUNARVIM_RUNTIME_DIR/lvim" "$@"
 }
 
@@ -18,3 +20,5 @@ if [ -n "$1" ]; then
 else
   lvim --headless -c "PlenaryBustedDirectory tests/ { minimal_init = './tests/minimal_init.lua' }"
 fi
+
+rm -rf "$TEST_BASE_DIR"