LuaLS / LuaLS/lua-language-server

Generic type inference breaks for class-style tables with indexed fields (---@class list<T>: { [integer]: T })

Aberta
#3,375 0 comentários 0 reações 0 responsáveis Ver no GitHub

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

Abrir o guia de contribuição

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. 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

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.