LuaLS / LuaLS/lua-language-server
Type inferencing of filter style functions
未关闭
还没有人认领这个 Issue。
enhancement
feat/generic
- 主要语言
- Lua
- 星标
- 4.4k
- 派生
- 442
- PR 合并指标
- 30 天内没有已合并 PR
描述
Given:
---@generic T
---@param f fun(a: T)
---@param t table<any, T>
---@return T[] (table)
local function tbl_filter(f, t)
return t
end
---@type string[]
local s = {'a', 'b', 'c'}
local r1 = tbl_filter(function(a) end, s)
r1 is inferred as unknown[] because a is unknown despite s being known. However, could we infer a from s and force the typechecker to insist a is a string?
If I remove the type from a:
---@generic T
---@param f fun(a)
---@param t table<any, T>
---@return T[] (table)
local function tbl_filter2(f, t)
return t
end
local r2 = tbl_filter2(function(_) end, s)
r2 is now inferred as string[] because only s is used to infer the type.
贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
调研方向
首先复现 issue 中的两个 tbl_filter 示例,并比较推断出的回调参数类型和结果类型。跟踪 language server 的 generic-function 和 callback type-inference 入口;完成的标准是:第一个回调参数从 s 推断为 string,r1 为 string[],并且不兼容的回调类型会被拒绝。
由索引模型根据 Issue 内容生成。
评估
- 技术栈
- lua
- 领域
- devtools
- Issue 类型
- 功能
- 难度
- 4/5
- 预计耗时
- 3-5 天
- 活跃度
- 停滞
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100