LuaLS / LuaLS/lua-language-server
The fallback scope pollutes the workpace environment with extraneous definitions.
還沒有人認領這個 Issue。
- 主要語言
- Lua
- 星號
- 4.4k
- 分支
- 442
- PR 合併指標
- 30 天內沒有已合併 PR
描述
### How are you using the lua-language-server?
NeoVim
### Which OS are you using?
Linux
### What is the issue affecting?
Completion, Diagnostics/Syntax Checking, Hover
### Expected Behaviour
When the workspace configuation contains settings that affect which parts of Lua are available (i.e. the `runtime.version` and `runtime.builtin` settings); the workspace configuration should entirely take precedence over what's loaded with the fallback scope, here are some examples of behaviour I would expect from the server:
The setup is: `runtime.version` set to `Lua 5.2` in the workspace config and left as default, `Lua 5.4` in the server config.
1. Hover:
```lua
string.byte
--[[Should have this hyperlink in the description:
[View documents](http://www.lua.org/manual/5.2/manual.html#pdf-string.byte)
]]
```
2. Completions:
```lua
debug.info(1,
--[[Should show the following completion options:
"n", "S", "l", "t", "u", "f", "L"
]]
```
3. Hover and diagnostics:
```lua
utf8 = {}
smuggledChar = utf8.char
smuggledChar --Hover shouldn't show any description
utf8.char() --Diagnostics should stay quiet on this line, as the utf8 library was added in Lua 5.3 and thus it shouldn't know anything about this function as is.
```
Similar general case, but with the `debug` library disabled via `runtime.builtin` in the workspace settings, but left as is in the server config.
4. Hover, completion and diagnostics:
```lua
debug = {}
smuggledGetinfo = debug.getinfo
smuggledGetinfo --Shouldn't show any description.
debug.getinfo() --Diagnostics should stay quiet on this line.
debug.getinfo(1, --No completion options should be displayed.
```
### Actual Behaviour
For each of the cases above here's what happens instead:
Same setup as described above, `runtime.version` set to `Lua 5.2` in the workspace config and left as default, `Lua 5.4` in the server config:
1. Hover:
```lua
local test = string.byte
--[[Gives this hyperlink:
[View documents](http://www.lua.org/manual/5.4/manual.html#pdf-string.byte)
5.4 is the wrong version of the manual for this workspace environment
]]
```
2. Completions:
```lua
debug.info(1,
--[[Shows the following completion options:
"n", "S", "l", "t", "u", "f", "r", "L", "n", "S", "l", "t", "u", "f", "L"
The "r" option was added in Lua 5.4; what's probably worse is it gives both the Lua 5.4 options and Lua 5.2 options.
]]
```
3. Hover and diagnostics:
```lua
utf8 = {}
smuggledChar = utf8.char
smuggledChar --Hover shows the Lua 5.4 documentation description.
utf8.char() --Diagnostics say this function call is missing an argument and the return value cannot be discarded.
```
Same as in the expected behaviour section, the `debug` library is disabled via `runtime.builtin` in the workspace settings, left as is in the server config.
4. Hover, completion and diagnostics:
```lua
debug = {}
smuggledGetinfo = debug.getinfo
smuggledGetinfo --Shows debug.getinfo's description.
debug.getinfo() --Diagnostics say this function call is missing an argument and the return value cannot be discarded.
debug.getinfo(1,
--[[
Shows the following completion options:
"n", "S", "l", "t", "u", "f", "r", "L"
]]
```
### Reproduction steps
1. Configure `runtime.version` and `runtime.builtin` as described above;
2. Input the code snippets above to reproduce.
That's pretty much it
### Additional Notes
Additionally I tested the above cases on VS Code via VSCodium and was able to reproduce the same behaviour, but for cases 3 and 4 I didn't even have to smuggle the functions into local variables to get it to show the description, in VS Code the hover system was all too happy to show me definitions for functions that shouldn't exist in my environment. This behaviour might seem generally inconsequential for the language server's uses, but this creates some annoying restrictions for customized Lua environments where one might want to overwrite existing definitions for libraries; for example MoonSharp (an embeddable C# Lua interpreter, most commonly used in Unity projects) is only able to provide partial support for some libraries (like `os` and `debug`) on some platforms (again, Unity) and also gives the option to override the libraries; anyone who wishes to provide proper documentation for any changes to the standard libraries has to also get the user to change their server's settings in order to turn a library off entirely so the new definitions can be properly applied without any pollution for the specific workspace.
### Log File
_No response_
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
首先,使用 runtime.version 和 runtime.builtin 的衝突 server 與 workspace 值,重現所提供的 hover、completion 和 diagnostic 片段。追蹤 fallback scope 的載入方式,以及它如何與 workspace 設定進行比較;當 workspace 設定完全抑制不相容的 fallback 定義、文件、診斷和 completion 選項時,即表示完成。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- lua
- 領域
- developer-experience, tooling
- Issue 類型
- 缺陷
- 難度
- 4/5
- 預估耗時
- 3-5 天
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100