Repository navigation
Two definitions for local function variables #2451
Copy link
Copy link
Open
Description
How are you using the lua-language-server?
NeoVim
Which OS are you using?
Linux
What is the issue affecting?
Other
Expected Behaviour
Using vim.lsp.buf.definition() to go to the definition of a local function variable (assigned with the = operator), should give only a single definition at the local variable name.
Actual Behaviour
Using vim.lsp.buf.definition() to go to the definition of a local function variable (assigned with the = operator), gives two definitions on the same line. One is located at the variable name and the other is located at the beginning of the function key word.
Reproduction steps
- Create a lua file with the following content:
local m = function() print "hello world" end
m()- Move the cursor on the
m()function call - Execute the neovim command
:lua vim.lsp.buf.definition()
Additional Notes
No response
Log File
[DEBUG][2023-12-16 17:31:59] .../lua/vim/lsp.lua:1391 "LSP[lua_ls]" "client.request" 1 "textDocument/definition" { position = { character = 0, line = 2 }, textDocument = { uri = "file:///home/tobias/.config/nvim/test.lua" }} <function 1> 147
[DEBUG][2023-12-16 17:31:59] .../vim/lsp/rpc.lua:284 "rpc.send" { id = 1559, jsonrpc = "2.0", method = "textDocument/definition", params = { position = { character = 0, line = 2 }, textDocument = { uri = "file:///home/tobias/.config/nvim/test.lua" } }}
[DEBUG][2023-12-16 17:31:59] .../vim/lsp/rpc.lua:387 "rpc.receive" { id = 1559, jsonrpc = "2.0", result = { { originSelectionRange = { ["end"] = { character = 1, line = 2 }, start = { character = 0, line = 2 } }, targetRange = { ["end"] = { character = 7, line = 0 }, start = { character = 6, line = 0 } }, targetSelectionRange = { ["end"] = { character = 7, line = 0 }, start = { character = 6, line = 0 } }, targetUri = "file:///home/tobias/.config/nvim/test.lua" }, { originSelectionRange = { ["end"] = { character = 1, line = 2 }, start = { character = 0, line = 2 } }, targetRange = { ["end"] = { character = 44, line = 0 }, start = { character = 10, line = 0 } }, targetSelectionRange = { ["end"] = { character = 44, line = 0 }, start = { character = 10, line = 0 } }, targetUri = "file:///home/tobias/.config/nvim/test.lua" } }}
[DEBUG][2023-12-16 17:32:02] .../lua/vim/lsp.lua:1391 "LSP[lua_ls]" "client.request" 1 "textDocument/codeLens" { textDocument = { uri = "file:///home/tobias/.config/nvim/test.lua" }} <function 1> 147
[DEBUG][2023-12-16 17:32:02] .../vim/lsp/rpc.lua:284 "rpc.send" { id = 1560, jsonrpc = "2.0", method = "textDocument/codeLens", params = { textDocument = { uri = "file:///home/tobias/.config/nvim/test.lua" } }}
[DEBUG][2023-12-16 17:32:02] .../vim/lsp/rpc.lua:387 "rpc.receive" { id = 1560, jsonrpc = "2.0"}
[DEBUG][2023-12-16 17:32:02] .../lua/vim/lsp.lua:1391 "LSP[lua_ls]" "client.request" 1 "textDocument/documentHighlight" { position = { character = 0, line = 2 }, textDocument = { uri = "file:///home/tobias/.config/nvim/test.lua" }} <function 1> 147
[DEBUG][2023-12-16 17:32:02] .../vim/lsp/rpc.lua:284 "rpc.send" { id = 1561, jsonrpc = "2.0", method = "textDocument/documentHighlight", params = { position = { character = 0, line = 2 }, textDocument = { uri = "file:///home/tobias/.config/nvim/test.lua" } }}
[DEBUG][2023-12-16 17:32:02] .../vim/lsp/rpc.lua:387 "rpc.receive" { id = 1561, jsonrpc = "2.0", result = { { kind = 3, range = { ["end"] = { character = 7, line = 0 }, start = { character = 6, line = 0 } } }, { kind = 2, range = { ["end"] = { character = 1, line = 2 }, start = { character = 0, line = 2 } } } }}
[TRACE][2023-12-16 17:32:02] ...lsp/handlers.lua:618 "default_handler" "textDocument/documentHighlight" { ctx = '{\n bufnr = 147,\n client_id = 1,\n method = "textDocument/documentHighlight",\n params = {\n position = {\n character = 0,\n line = 2\n },\n textDocument = {\n uri = "file:///home/tobias/.config/nvim/test.lua"\n }\n }\n}', result = { { kind = 3, range = { ["end"] = { character = 7, line = 0 }, start = { character = 6, line = 0 } } }, { kind = 2, range = { ["end"] = { character = 1, line = 2 }, start = { character = 0, line = 2 } } } }}
Reacted by Eze Anyanwu, Artyom Andreev, Xi Xiao, Pete Walsh, Evgeni Chasnovski, Luis Calle, Max Zawisa and Andrew Braxton
Metadata
Metadata
Assignees
Labels
No labels
Activity
eanyanwu commentedon Jan 15, 2024
I have also been experiencing this. Seems very similar to this old ticket.
rish987 commentedon Feb 17, 2024
For neovim users, here's a monkey-patch you can add to your config that should let you get around this until a fix comes around from the lua-language-server side:
fix(nvim): filter out duplicate LSP locations for Trouble
barrettruth commentedon Jan 13, 2026
@tobias-haenel could you please offer some clarification as to why this was closed? still occurring in 2026 and seems like a pretty reasonable bug fix.
also pinging @PeterCardenas for hopefully a status update on the fix?
tobias-haenel commentedon Jan 13, 2026
I had no interest in it anymore. Sorry for the confusion.
PeterCardenas commentedon Jan 14, 2026
last i checked it doesn't work, i'll close the pr to avoid confusion
sparr commentedon Aug 6, 2026
I encountered this bug for a function assigned into a global table. VSCode Go To Definition on the
cinA.c()produces two candidates, both on the previous line, one atcand the other atfunction() end.