LuaLS / LuaLS/lua-language-server

Problem with generics

Open
#911 1 comment 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

enhancement feat/generic
Dominant language
Lua
Stars
4.4k
Forks
442
PR merge metrics
No merged PRs in 30d

Description

I have reported a similar problem before and I understand that it is not simple, but if you solve it, I will be crazy happy!

I'm working on an OOP library and here's a truncated example of the constructor it uses:

---@generic T
---@param t1 T
---@param t2 T
---@return T
function new(t1, t2) end

The first table here is the class from which the instance will inherit, and the second is the additional settings that will be substituted to the instance. So all tables has the same type.

When I call this constructor, the generics work almost correctly - the result of this function has the same type as any argument:

---@class Example1
---@field e1a string
---@field e1b string
local Example1 = {}

---@class Example2
---@field e2a string
---@field e2b string
local Example2 = {}

local e = new(Example1, {}) -- e is Example1
local e = new(Example2, {}) -- e is Example2
local e = new({}, Example1) -- e is Example1
local e = new({}, Example2) -- e is Example2

But the problem is that when I start typing a text between the curly braces in the example above, I get no hints about the class fields. Maybe I'm describing generics wrong? Do you have any idea? Thanks!

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

No source file or test is named. Reproduce the generic constructor example in the Lua language server and inspect how completion is inferred inside the empty table arguments when the first argument is Example1 or Example2. Done means the relevant class fields are suggested in those table literals while preserving the existing inferred result type.

Written by the indexing model from the issue text.

Assessment

Tech stack
lua
Domain
devtools
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.