aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lua/nvim-lsp-installer/ui/status-win/init.lua32
-rw-r--r--lua/nvim-lsp-installer/ui/status-win/server_hints.lua41
-rw-r--r--scripts/autogen_metadata.lua6
-rw-r--r--tests/minimal_init.vim25
-rw-r--r--tests/server_spec.lua16
-rw-r--r--tests/ui_status_win_spec.lua49
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)