diff options
| -rw-r--r-- | lua/nvim-lsp-installer/ui/status-win/init.lua | 32 | ||||
| -rw-r--r-- | lua/nvim-lsp-installer/ui/status-win/server_hints.lua | 41 | ||||
| -rw-r--r-- | scripts/autogen_metadata.lua | 6 | ||||
| -rw-r--r-- | tests/minimal_init.vim | 25 | ||||
| -rw-r--r-- | tests/server_spec.lua | 16 | ||||
| -rw-r--r-- | tests/ui_status_win_spec.lua | 49 |
6 files changed, 143 insertions, 26 deletions
diff --git a/lua/nvim-lsp-installer/ui/status-win/init.lua b/lua/nvim-lsp-installer/ui/status-win/init.lua index 3191c6ae..4bc5de4d 100644 --- a/lua/nvim-lsp-installer/ui/status-win/init.lua +++ b/lua/nvim-lsp-installer/ui/status-win/init.lua @@ -5,6 +5,7 @@ local Data = require "nvim-lsp-installer.data" local display = require "nvim-lsp-installer.ui.display" local settings = require "nvim-lsp-installer.settings" local lsp_servers = require "nvim-lsp-installer.servers" +local ServerHints = require "nvim-lsp-installer.ui.status-win.server_hints" local HELP_KEYMAP = "?" local CLOSE_WINDOW_KEYMAP_1 = "<Esc>" @@ -307,7 +308,9 @@ end ---@param servers ServerState[] ---@param props ServerGroupProps local function UninstalledServers(servers, props) - return Ui.Node(Data.list_map(function(server) + return Ui.Node(Data.list_map(function(_server) + ---@type ServerState + local server = _server local is_prioritized = props.prioritized_servers[server.name] local is_expanded = props.expanded_server == server.name return Ui.Node { @@ -317,9 +320,10 @@ local function UninstalledServers(servers, props) settings.current.ui.icons.server_uninstalled, is_prioritized and "LspInstallerHighlighted" or "LspInstallerMuted", }, - { " " .. server.name, "LspInstallerMuted" }, - Data.when(server.uninstaller.has_run, { " (uninstalled)", "Comment" }), - Data.when(server.deprecated, { " deprecated", "LspInstallerOrange" }) + { " " .. server.name .. " ", "LspInstallerMuted" }, + { server.hints, "Comment" }, + Data.when(server.uninstaller.has_run, { " (uninstalled) ", "Comment" }), + Data.when(server.deprecated, { "deprecated ", "LspInstallerOrange" }) ), }, Ui.Keybind(settings.current.ui.keymaps.toggle_server_expand, "EXPAND_SERVER", { server.name }), @@ -361,7 +365,8 @@ end ---@param servers table<string, ServerState> ---@param expanded_server string|nil ---@param prioritized_servers string[] -local function Servers(servers, expanded_server, prioritized_servers) +---@param server_name_order string[] +local function Servers(servers, expanded_server, prioritized_servers, server_name_order) local grouped_servers = { installed = {}, queued = {}, @@ -375,7 +380,8 @@ local function Servers(servers, expanded_server, prioritized_servers) } -- giggity - for _, server in pairs(servers) do + for _, server_name in ipairs(server_name_order) do + local server = servers[server_name] if server.installer.is_running then grouped_servers.installing[#grouped_servers.installing + 1] = server elseif server.installer.is_queued then @@ -443,6 +449,7 @@ local function create_initial_server_state(server) name = server.name, is_installed = server:is_installed(), deprecated = server.deprecated, + hints = tostring(ServerHints.new(server)), metadata = { homepage = server.homepage, install_timestamp_seconds = nil, -- lazy @@ -491,7 +498,12 @@ local function init(all_servers) return Help(state.is_current_settings_expanded, state.vader_saber_ticks) end), Ui.When(not state.is_showing_help, function() - return Servers(state.servers, state.expanded_server, state.prioritized_servers) + return Servers( + state.servers, + state.expanded_server, + state.prioritized_servers, + state.server_name_order + ) end), } end @@ -499,14 +511,20 @@ local function init(all_servers) ---@type table<string, ServerState> local servers = {} + ---@type string[] + local server_name_order = {} for i = 1, #all_servers do local server = all_servers[i] servers[server.name] = create_initial_server_state(server) + server_name_order[#server_name_order + 1] = server.name end + table.sort(server_name_order) + ---@class StatusWinState ---@field prioritized_servers string[] local initial_state = { + server_name_order = server_name_order, servers = servers, is_showing_help = false, is_current_settings_expanded = false, diff --git a/lua/nvim-lsp-installer/ui/status-win/server_hints.lua b/lua/nvim-lsp-installer/ui/status-win/server_hints.lua new file mode 100644 index 00000000..daf5e9b6 --- /dev/null +++ b/lua/nvim-lsp-installer/ui/status-win/server_hints.lua @@ -0,0 +1,41 @@ +---@class ServerHints +---@field server Server +local ServerHints = {} +ServerHints.__index = ServerHints + +function ServerHints.new(server) + return setmetatable({ server = server }, ServerHints) +end + +---@param language string +---@return boolean +function ServerHints:is_language_equal(language) + local match_start, match_end = self.server.name:find(language, 1, true) + -- This is somewhat... arbitrary + return match_start ~= nil + and (match_end - match_start) >= 2 -- the match need to be at least 2 in length + -- match needs to start in the beginning - if it's not, then the total string lengths cannot differ too much + and (match_start == 1 or (match_start < 3 and (math.abs(#self.server.name - #language) < 4))) +end + +function ServerHints:get_hints() + local hints = {} + if self.server.languages then + for _, language in ipairs(self.server.languages) do + if not self:is_language_equal(language) then + hints[#hints + 1] = language + end + end + end + return hints +end + +function ServerHints:__tostring() + local hints = self:get_hints() + if #hints == 0 then + return "" + end + return "(" .. table.concat(hints, ", ") .. ")" +end + +return ServerHints diff --git a/scripts/autogen_metadata.lua b/scripts/autogen_metadata.lua index 5d7db945..44af5526 100644 --- a/scripts/autogen_metadata.lua +++ b/scripts/autogen_metadata.lua @@ -96,11 +96,7 @@ do if #non_deprecated_servers == 1 then local server = non_deprecated_servers[1] - local server_name_similarity_check = server.name:find(language, 1, true) == 1 - if server_name_similarity_check then - -- There's only one server that supports this language, and it's name is similar enough to the language name. - is_candidate = false - end + is_candidate = not vim.startswith(server.name, language) end if is_candidate then diff --git a/tests/minimal_init.vim b/tests/minimal_init.vim index d0fe4e41..35bc2bcb 100644 --- a/tests/minimal_init.vim +++ b/tests/minimal_init.vim @@ -12,6 +12,31 @@ set packpath=$dependencies packloadall +lua <<EOF +local server = require("nvim-lsp-installer.server") +function ServerGenerator(opts) + return server.Server:new(vim.tbl_deep_extend("force", { + name = "dummy", + languages = { "dummylang" }, + root_dir = server.get_server_root_path("dummy"), + homepage = "https://dummylang.org", + installer = function(_, callback, ctx) + ctx.stdio_sink.stdout "Installing dummy!\n" + callback(true) + end + }, opts)) +end + +function FailingServerGenerator(opts) + return ServerGenerator(vim.tbl_deep_extend("force", { + installer = function(_, callback, ctx) + ctx.stdio_sink.stdout "Installing failing dummy!\n" + callback(false) + end + }, opts)) +end +EOF + " Luassert extensions lua require("luassertx") diff --git a/tests/server_spec.lua b/tests/server_spec.lua index 0695710e..53507d27 100644 --- a/tests/server_spec.lua +++ b/tests/server_spec.lua @@ -10,15 +10,9 @@ describe("server", function() lsp_installer.on_server_ready(generic_handler) - local srv = server.Server:new { + local srv = ServerGenerator { name = "on_ready_fixture", root_dir = server.get_server_root_path "on_ready_fixture", - installer = function(_, callback) - callback(true) - end, - default_options = { - cmd = { "my-server" }, - }, } srv:on_ready(on_ready_handler) srv:install() @@ -36,15 +30,9 @@ describe("server", function() lsp_installer.on_server_ready(generic_handler) - local srv = server.Server:new { + local srv = FailingServerGenerator { name = "on_ready_fixture_failing", root_dir = server.get_server_root_path "on_ready_fixture_failing", - installer = function(_, callback) - callback(false) - end, - default_options = { - cmd = { "my-server" }, - }, } srv:on_ready(on_ready_handler) srv:install() diff --git a/tests/ui_status_win_spec.lua b/tests/ui_status_win_spec.lua new file mode 100644 index 00000000..01f06c3a --- /dev/null +++ b/tests/ui_status_win_spec.lua @@ -0,0 +1,49 @@ +local ServerHints = require "nvim-lsp-installer.ui.status-win.server_hints" + +describe("status win server hints", function() + it("should produce valid server hints", function() + local srv = ServerGenerator { + name = "rust_analyzer", + languages = { "rust", "analyz", "totallynotjavascript" }, + } + local hints = ServerHints.new(srv) + assert.equal(vim.inspect { "analyz", "totallynotjavascript" }, vim.inspect(hints:get_hints())) + assert.equal("(analyz, totallynotjavascript)", tostring(hints)) + end) + + it("should not produce server hints", function() + local srv = ServerGenerator { + name = "rust_analyzer", + languages = { "rust" }, + } + local srv2 = ServerGenerator { + name = "cssmodules_ls", + languages = { "css" }, + } + local hints = ServerHints.new(srv) + assert.equal(vim.inspect {}, vim.inspect(hints:get_hints())) + assert.equal("", tostring(hints)) + + local hints2 = ServerHints.new(srv2) + assert.equal(vim.inspect {}, vim.inspect(hints2:get_hints())) + assert.equal("", tostring(hints2)) + end) + + it("should produce server hints even when there's a match if language is short or long", function() + local srv = ServerGenerator { + name = "clangd", + languages = { "c", "c++" }, + } + local srv2 = ServerGenerator { + name = "this_is_a_very_cool_rust_server", + languages = { "rust" }, + } + local hints = ServerHints.new(srv) + assert.equal(vim.inspect { "c", "c++" }, vim.inspect(hints:get_hints())) + assert.equal("(c, c++)", tostring(hints)) + + local hints2 = ServerHints.new(srv2) + assert.equal(vim.inspect { "rust" }, vim.inspect(hints2:get_hints())) + assert.equal("(rust)", tostring(hints2)) + end) +end) |
