LuaLS / LuaLS/lua-language-server
@generic 不验证类型是否一致
未关闭
还没有人认领这个 Issue。
- 主要语言
- Lua
- 星标
- 4.4k
- 派生
- 442
- PR 合并指标
- 30 天内没有已合并 PR
描述
How are you using the lua-language-server?
Visual Studio Code Extension (sumneko.lua)
Which OS are you using?
Windows
What is the issue affecting?
Type Checking
Expected Behaviour
假设有这样的代码:
---@class TestBase
---@class TestDerived1 : TestBase
---@class TestDerived2 : TestBase
---@generic T:TestBase
---@param v1 T
---@param v2 T
local function foo(v1, v2) end
我给 foo 的 v1, v2 标注了同一个 T,因此期望它们类型是一致的
local t1 ---@type TestDerived1
local t2 ---@type TestDerived2
foo(t1, t2)
这应该报错
Actual Behaviour
可实际上没有。因为泛型只对每一个参数进行独立的多态类型检查,都继承同一个父类自然没有报错。
当然,同一个泛型的一致性是完全一致还是多态一致,可以归结为一种设计考虑。当前的逻辑也许不算太坏。
但是,如果再加上返回值,结果就会变得很奇怪。
返回值同样是 T,可是却变成第一个参数的类型了!无论从哪个角度想都不合理。
Reproduction steps
复制上述代码查看悬停类型提示即可
Additional Notes
建议:
校验由 @generic 标注的同一个泛型必须是同一类型
或者:在类型不同时不要推断为第一个类型而是基类类型
Log File
No response
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
未指定源文件或测试。使用提供的 Lua 代码片段重现该问题,并检查泛型类型检查和返回类型推断路径,然后跟踪一个泛型参数如何跨多个参数进行绑定。当所选择的同类型行为在诊断信息和 hover 结果中得到一致反映,并且项目存在适用的测试位置时加入回归覆盖,即表示完成。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- lua
- 领域
- devtools
- Issue 类型
- 缺陷
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 活跃
- 描述清晰度
- 基本清楚
- 新手友好度
- 45/100