LuaLS / LuaLS/lua-language-server

@generic 不验证类型是否一致

未关闭
#3,454 1 条评论 0 个 reaction 已指派 0 人 在 GitHub 查看

还没有人认领这个 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

我给 foov1, v2 标注了同一个 T,因此期望它们类型是一致的

local t1 ---@type TestDerived1
local t2 ---@type TestDerived2

foo(t1, t2)

这应该报错

Actual Behaviour

可实际上没有。因为泛型只对每一个参数进行独立的多态类型检查,都继承同一个父类自然没有报错。

当然,同一个泛型的一致性是完全一致还是多态一致,可以归结为一种设计考虑。当前的逻辑也许不算太坏。

但是,如果再加上返回值,结果就会变得很奇怪。

Image

返回值同样是 T,可是却变成第一个参数的类型了!无论从哪个角度想都不合理。

Reproduction steps

复制上述代码查看悬停类型提示即可

Additional Notes

建议:

校验由 @generic 标注的同一个泛型必须是同一类型

或者:在类型不同时不要推断为第一个类型而是基类类型

Log File

No response

贡献指南

打开贡献指南

从这里开始

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

调研方向

未指定源文件或测试。使用提供的 Lua 代码片段重现该问题,并检查泛型类型检查和返回类型推断路径,然后跟踪一个泛型参数如何跨多个参数进行绑定。当所选择的同类型行为在诊断信息和 hover 结果中得到一致反映,并且项目存在适用的测试位置时加入回归覆盖,即表示完成。

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

评估

技术栈
lua
领域
devtools
Issue 类型
缺陷
难度
4/5
预计耗时
3-5 天
活跃度
活跃
描述清晰度
基本清楚
新手友好度
45/100

把新 issue 发到你的邮箱

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