LuaLS / LuaLS/lua-language-server
False-positive type error: `vim.cmd` callable table flagged as "table cannot match fun(...)"
Nobody has claimed this yet.
- Dominant language
- Lua
- Stars
- 4.4k
- Forks
- 442
- PR merge metrics
- No merged PRs in 30d
Description
### How are you using the lua-language-server?
NeoVim
### Which OS are you using?
Linux
### What is the issue affecting?
Diagnostics/Syntax Checking
### Expected Behaviour
lua-language-server should recognize callable tables (with a `__call` metamethod) as valid function values. Passing Neovim’s `vim.cmd` to `pcall` should not raise a type error.
### Actual Behaviour
lua-language-server reports a false-positive type error when `vim.cmd` (a callable table in Neovim) is passed to `pcall`:
Cannot assign `table` to parameter `fun(...):...unknown`
Type `table` cannot match `fun(...):...unknown`
### Reproduction steps
1. In Neovim, open a Lua buffer (e.g., `:new | set ft=lua`).
2. Insert the following code:
-- Works at runtime, but LuaLS flags the next line:
pcall(vim.cmd, "redrawtabline")
-- Diagnostic shown by LuaLS:
-- Cannot assign `table` to parameter `fun(...):...unknown`
3. Observe the diagnostic from lua-language-server.
4. Execute the code in Neovim (e.g., `:luafile %`) to confirm it runs without runtime errors.
### Additional Notes
- `vim.cmd` is a callable table provided by Neovim (implemented via `__call` metamethod). Direct calls like `vim.cmd("redrawtabline")` work at runtime. The false-positive only appears when passing `vim.cmd` as a function value (e.g., to `pcall`).
- Workarounds:
-- Wrap in a function
pcall(function() vim.cmd("redrawtabline") end)
-- or use the typed API
pcall(vim.api.nvim_cmd, { cmd = "redrawtabline" }, {})
- Please treat callable tables as functions for the purpose of type checking / inference.
Contributor guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start by reproducing the diagnostic with pcall(vim.cmd, "redrawtabline") in a Neovim Lua buffer, then trace LuaLS diagnostics and type inference for callable tables with __call metamethods. Done means callable tables are accepted where function values are expected without hiding genuine type errors, and the reported reproduction no longer produces a diagnostic.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- lua
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 4/5
- Estimated time
- 3-5 days
- Activity status
- Stale
- Clarity
- Mostly clear
- Newbie friendliness
- 42/100