lua-language-server icon indicating copy to clipboard operation
lua-language-server copied to clipboard

Returning generics with `T<X, Y>`

Open Cassolette opened this issue 3 years ago • 2 comments

Below, I have a generic list that uses fluid interface to return itself for some methods:

--- @class List
local List = {}

--- @generic T : List, V, _
--- @param self T<V, _>
--- @param value V         # Element value to insert
--- @return T<V, _>        # Returning itself (a generic)
function List:insert(value)
    return self           -- Returning itself (a generic)
end

-- test
---@type List<number, nil>
local mylist

local testingType = mylist:insert(1)
-- ^ Testing type is not `List<number, nil>` but literally `T<V, _>`

image

Expected behavior testingType is of type List<number, nil>

I am thinking that this case could be something to look at for the 3.0 update.

(Edit: perfect #1000th issue...)

Cassolette avatar Mar 25 '22 07:03 Cassolette

I think a related issue is with parsing the generic syntax in ---@param tbl T<K, V> - K and V are assigned a type except for T

---@generic T : table, K, V
---@param tbl T<K, V>
---@return T
local function Test(tbl)
end

-- testing
---@type table<number, string>
local tableWithGenerics

local shouldBeTableType = Test(tableWithGenerics)
-- ^ is type `any`

Another issue is that --- @return does not support ---@return T<K, V> or even ---@return V[] (Probably only accepts ---@return V alone)

Cassolette avatar Mar 25 '22 07:03 Cassolette

  • [ ] generic method
  • [x] generic return

sumneko avatar Apr 14 '22 19:04 sumneko