LuaLS / LuaLS/lua-language-server
Two definitions for local function variables
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?
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 } } } }}
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 at the textDocument/definition entry point and reproduce the report with the Lua snippet in the issue using Neovim's vim.lsp.buf.definition(). Trace why the local function assignment produces both the variable name and function keyword ranges; done means the request returns only the local variable definition.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- lua, neovim
- Domain
- devtools
- Issue type
- Bug
- Difficulty
- 3/5
- Estimated time
- 1-2 days
- Activity status
- Quiet
- Clarity
- Mostly clear
- Newbie friendliness
- 58/100