LuaLS / LuaLS/lua-language-server

`workspace/symbols` doesn't seem to respect workspaces or rootUri / root_dir

未关闭
#2,456 0 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 Issue。

主要语言
Lua
星标
4.4k
派生
442
PR 合并指标
30 天内没有已合并 PR

描述

### How are you using the lua-language-server?

NeoVim

### Which OS are you using?

MacOS

### What is the issue affecting?

Other

### Expected Behaviour

1. Results should only come from the current project, i.e. that rooted at root_dir, or at the very least only come from the listed workspace folders.
2. All symbols appearing in the files named by the above condition should appear in the results (at least, `document/symbols` should be a subset of `workspace/symbols` for any document in the current project)

### Actual Behaviour

1. Most results come outside root_dir; in fact, most results come from outside any workspace folder, meaning that the results are essentially global.
2. Some expected results from within the current workspace don't appear.

For evidence of (1), here's some results from`vim.lsp.buf.workspace_symbol()`:

```
# current project, which matches root_dir and is a configured workspace
lua/neogit/status.lua|653 col 3| [Variable] vim.o.autochdir

# from my nvim config, which is not the current root_dir but is a configured workspace
/Users/neilvyas/.config/nvim/lua/plugins/modes.lua|61 col 9| [Variable] vim.opt.background

# from random lua files anywhere on my system; from outside of root_dir or any workspace
/Users/neilvyas/.local/share/nvim/mason/packages/lua-language-server/libexec/meta/Lua 5.4 en-us utf8/io.lua|171 col 11| [Class] file*

```

For evidence of (2), we can see that `document/symbols` returns results which `workspace/symbols` does not (this is actually what clued me into this being a possible bug). For example, the following result from `document/symbols`, issued from `lua/neogit/status.lua`, does not appear in `workspace/symbols`:

```
lua/neogit/status.lua|506 col 16| [Function] refresh_status_buffer
```

### Reproduction steps

1. Configure lua_ls using the recommended instructions from `mason.nvim` https://github.com/williamboman/mason.nvim#configuration, `mason-lspconfig.nvim` https://github.com/williamboman/mason-lspconfig.nvim, and `lspconfig.nvim` https://github.com/neovim/nvim-lspconfig.
2. Edit a lua buffer.
3. Issue `vim.lsp.buf.workspace_symbol()`

### Additional Notes

You might think that this issue stems from neovim's LSP client; however, the code related to workspace/symbols is so minimal that I doubt the error arises there: https://github.com/neovim/neovim/blob/v0.8.1/runtime/lua/vim/lsp/handlers.lua#L253

From my cursory investigation of lua_ls's implementation, it seems like the issue might be to do with how `allGlobals` is populated, since this is ultimately what populates workspace/symbols: https://github.com/LuaLS/lua-language-server/blob/f836d90eb629c22219cbcdff9bfcd7f45f1751f3/script/vm/global.lua#L209

What follows are selections from the output of `vim.print(vim.lsp.get_client_by_id(1))`, which shows a bunch of data related to how `lua_ls` is configured by and attached to neovim.

Here, you can see that the root_dir is set properly for the current buffer (editing the neogit plugin), and there are workspaces corresponding to the other buffers I have open (the detour.nvim plugin and editing my neovim configuration, which is written in lua):

image

This seems to be the problem referenced by the only similar issue I found, #1731 , but I think it indicates that, in fact, that issue does not apply any more, and I cannot udnerstand what the resolution in that issue was anyway.

Here, you can see that the workspace related capabilities seem to be setup properly:

image

### Log File

_No response_

贡献指南

打开贡献指南

从这里开始

  1. 先读完整个 Issue,再读项目的贡献指南。
  2. 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
  3. Fork 仓库,在一个分支上完成修改。
  4. 提交 Pull Request,并在描述里引用这个 Issue 编号。

调研方向

从 workspace/symbols 的实现以及 script/vm/global.lua 中引用的 allGlobals 填充开始。使用报告中的 workspace 配置,通过 Neovim 的 vim.lsp.buf.workspace_symbol() 重现该问题,然后将其结果与 document/symbols 进行比较。当结果仅限于已配置的 workspace 范围,并包含 document/symbols 找到的符号时,即视为完成。

由索引模型根据 Issue 内容生成。

评估

技术栈
lua, neovim
领域
developer-experience, tooling
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
停滞
描述清晰度
基本清楚
新手友好度
38/100

把新 issue 发到你的邮箱

精选适合新手参与的 GitHub issue 摘要。