LuaLS / LuaLS/lua-language-server

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

Offen
#3,375 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Vorherrschende Sprache
Lua
Sterne
4.4k
Forks
442
PR-Merge-Kennzahlen
Keine gemergten PRs in 30 T.

Beschreibung

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

---@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<number>
local testCC = List {}

-- newList -> expected: list<number>
local newList = testCC:whereList(function(a) return a == 0 end)

-- front   -> expected: number
local front = newList:front()
Actual Behaviour
---@type string[]
local testA = { }
local testB = { 1, 2, 3 }

local testAA = List(testA)
local testBB = List(testB)

local vAA1 = testAA[1]  -- actual: string|<T>
local vBB1 = testBB[1]  -- actual: string|<T>

local vAA2 = testAA:at(1)  -- actual: unknown
local vBB2 = testBB:at(1)  -- actual: unknown

 ---@type list<number>
local testCC = List {}

-- newList -> actual: list<<T>>
local newList = testCC:whereList(function(a) return a == 0 end)

-- front   -> actual: unknown
local front = newList:front()
Reproduction steps
---@meta

---@generic T
---@param t T[]
---@return list<T>
function List(t)
    return listlib:new(t);
end

---@class list<T>: { [integer] : T }
listlib = {}

---@generic T
---@param t T[]
---@return list<T>
function listlib:new(t) end

---@generic T
---@param self list<T>
---@param index integer
---@return T
function listlib:at(index) end

---@generic T
---@param self list<T>
---@return T
function listlib:front() end

---@generic T
---@param self list<T>
---@param predicate fun(a: T): boolean
---@return list<T>
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|<T>
local vBB1 = testBB[1]  -- expected: integer, actual: string|<T>

local vAA2 = testAA:at(1)  -- expected: string, actual: unknown
local vBB2 = testBB:at(1)  -- expected: integer, actual: unknown

 ---@type list<number>
local testCC = List {}

-- newList -> expected: list<number>, actual: list<<T>>
-- 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

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Reproduziere das minimale Lua-Beispiel in der Visual Studio Code extension, beginnend mit den generischen List/listlib-Deklarationen und der klassenartigen Listenannotation. Verfolge die Typinferenz für indexed access, at, whereList und front. Als abgeschlossen gilt die Aufgabe, wenn die inferierten Typen mit den erwarteten Ergebnissen string, integer und number übereinstimmen, statt unknown oder ungelösten generischen Typen zu entsprechen.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
lua
Bereich
devtools
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Veraltet
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
48/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.