LuaLS / LuaLS/lua-language-server
Generic type inference breaks for class-style tables with indexed fields (---@class list<T>: { [integer]: T })
Ninguém assumiu esta issue ainda.
- Linguagem predominante
- Lua
- Estrelas
- 4.4k
- Forks
- 442
- Métricas de merge de PRs
- Nenhum PR com merge em 30d
Descrição
### 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
```lua
---@type string[]
local testA = { }
local testB = { 1, 2, 3 }
local testAA = List(testA)
local testBB = List(testB)
local vAA1 = testAA[1] -- expected: string
local vBB1 = testBB[1] -- expected: integer
local vAA2 = testAA:at(1) -- expected: string
local vBB2 = testBB:at(1) -- expected: integer
---@type list
local testCC = List {}
-- newList -> expected: list
local newList = testCC:whereList(function(a) return a == 0 end)
-- front -> expected: number
local front = newList:front()
```
### Actual Behaviour
```lua
---@type string[]
local testA = { }
local testB = { 1, 2, 3 }
local testAA = List(testA)
local testBB = List(testB)
local vAA1 = testAA[1] -- actual: string|
local vBB1 = testBB[1] -- actual: string|
local vAA2 = testAA:at(1) -- actual: unknown
local vBB2 = testBB:at(1) -- actual: unknown
---@type list
local testCC = List {}
-- newList -> actual: list<>
local newList = testCC:whereList(function(a) return a == 0 end)
-- front -> actual: unknown
local front = newList:front()
```
### Reproduction steps
```lua
---@meta
---@generic T
---@param t T[]
---@return list
function List(t)
return listlib:new(t);
end
---@class list: { [integer] : T }
listlib = {}
---@generic T
---@param t T[]
---@return list
function listlib:new(t) end
---@generic T
---@param self list
---@param index integer
---@return T
function listlib:at(index) end
---@generic T
---@param self list
---@return T
function listlib:front() end
---@generic T
---@param self list
---@param predicate fun(a: T): boolean
---@return list
function listlib:whereList(predicate) end
---@type string[]
local testA = { }
local testB = { 1, 2, 3 }
local testAA = List(testA)
local testBB = List(testB)
local vAA1 = testAA[1] -- expected: string, actual: string|
local vBB1 = testBB[1] -- expected: integer, actual: string|
local vAA2 = testAA:at(1) -- expected: string, actual: unknown
local vBB2 = testBB:at(1) -- expected: integer, actual: unknown
---@type list
local testCC = List {}
-- newList -> expected: list, actual: list<>
-- front -> expected: number ,actual: unknown
local newList = testCC:whereList(function(a) return a == 0 end)
local front = newList:front()
```
### Additional Notes
_No response_
### Log File
_No response_
Guia de contribuição
Primeiros passos
- Leia a issue inteira e depois o guia de contribuição do projeto.
- Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
- Faça um fork do repositório e trabalhe em uma branch.
- Abra um pull request que referencie o número da issue.
Direção de pesquisa
Reproduza o exemplo mínimo de Lua na Visual Studio Code extension, começando pelas declarações genéricas de List/listlib e pela anotação de lista no estilo de classe. Rastreie a inferência de tipos para indexed access, at, whereList e front. O trabalho estará concluído quando os tipos inferidos corresponderem aos resultados esperados string, integer e number, em vez de serem unknown ou tipos genéricos não resolvidos.
Escrita pelo modelo de indexação a partir do texto da issue.
Avaliação
- Stack de tecnologia
- lua
- Domínio
- devtools
- Tipo de issue
- Bug
- Dificuldade
- 4/5
- Tempo estimado
- 3-5 dias
- Status de atividade
- Estagnada
- Clareza
- Razoavelmente clara
- Facilidade para iniciantes
- 48/100