fix(lsp): misleading logs in non-applicable filetypes #35749

Problem:
LSP logs show misleading "cannot start" messages when editing a filetype
NOT listed in the `config.filetypes` field.

    [ERROR][2025-09-13 18:55:56] …/runtime//lua/vim/lsp/log.lua:151
    "cannot start cssls due to config error: …/runtime//lua/vim/lsp.lua:423:
    cmd: expected expected function or table with executable command,
    got table: 0x0104701b18. Info: vscode-css-language-server is not executable"

Solution:
- `can_start`: check `config.filetypes` before checking the rest of the
  config.
This commit is contained in:
Justin M. Keyes
2025-09-13 21:51:06 -04:00
committed by GitHub
parent 5ef567d130
commit 2f78ff816b
2 changed files with 28 additions and 15 deletions

View File

@@ -3,7 +3,6 @@ local n = require('test.functional.testnvim')()
local t_lsp = require('test.functional.plugin.lsp.testutil')
local assert_log = t.assert_log
local buf_lines = n.buf_lines
local command = n.command
local dedent = t.dedent
@@ -278,7 +277,7 @@ describe('LSP', function()
on_exit = function(code, signal)
eq(101, code, 'exit code') -- See fake-lsp-server.lua
eq(0, signal, 'exit signal')
assert_log(
t.assert_log(
pesc([[assert_eq failed: left == "\"shutdown\"", right == "\"test\""]]),
fake_lsp_logfile
)
@@ -6799,6 +6798,7 @@ describe('LSP', function()
it('validates config on attach', function()
local tmp1 = t.tmpname(true)
exec_lua(function()
vim.fn.writefile({ '' }, fake_lsp_logfile)
vim.lsp.log._set_filename(fake_lsp_logfile)
end)
@@ -6808,22 +6808,32 @@ describe('LSP', function()
vim.lsp.config('foo', cfg)
vim.lsp.enable('foo')
vim.cmd.edit(assert(tmp1))
vim.bo.filetype = 'non.applicable.filetype'
end)
-- Assert NO log for non-applicable 'filetype'. #35737
if type(cfg.filetypes) == 'table' then
t.assert_nolog(err, fake_lsp_logfile)
end
exec_lua(function()
vim.bo.filetype = 'foo'
end)
retry(nil, 1000, function()
assert_log(err, fake_lsp_logfile)
t.assert_log(err, fake_lsp_logfile)
end)
end
test_cfg({
filetypes = { 'foo' },
cmd = { 'lolling' },
}, 'cannot start foo due to config error: .* lolling is not executable')
}, 'invalid "foo" config: .* lolling is not executable')
test_cfg({
cmd = { 'cat' },
filetypes = true,
}, 'cannot start foo due to config error: .* filetypes: expected table, got boolean')
}, 'invalid "foo" config: .* filetypes: expected table, got boolean')
end)
it('does not start without workspace if workspace_required=true', function()