LuaLS / LuaLS/lua-language-server

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

Offen
#3,272 0 Kommentare 1 Reaktion 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Lua
Sterne
4.4k
Forks
442
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginne damit, die Diagnose mit pcall(vim.cmd, "redrawtabline") in einem Neovim-Lua-Puffer zu reproduzieren, und verfolge dann die LuaLS-Diagnosen und die Typinferenz für aufrufbare Tabellen mit __call-Metamethoden. Als erledigt gilt, wenn aufrufbare Tabellen dort akzeptiert werden, wo Funktionswerte erwartet werden, ohne echte Typfehler zu verbergen, und die angegebene Reproduktion keine Diagnose mehr erzeugt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
lua
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
42/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.