LuaLS / LuaLS/lua-language-server

False-positive type error: `vim.cmd` callable table flagged as "table cannot match fun(...)"

Open
#3,272 0 comments 1 reaction 0 assignees View on GitHub

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

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. 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

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.