LuaLS / LuaLS/lua-language-server

Class generics produce unusable and wrong union types

Ouverte
#3,261 1 commentaire 0 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Langage dominant
Lua
Étoiles
4.4k
Forks
442
Métriques de merge des PR
Aucune PR mergée en 30 j

Description

### How are you using the lua-language-server?

Visual Studio Code Extension (sumneko.lua)

### Which OS are you using?

MacOS, Windows

### What is the issue affecting?

Completion

### Expected Behaviour

Methods `Peek,Push,Pop` have proper type hints

### Actual Behaviour

While types of `a, b, c` are correct the
type hints of methods are unusable with unnecessary union types.

**If `Push` is removed from superclass, then type hints go to normal without unions but still with `` in many places**

```lua
local _lua_setmetatable = setmetatable

Stack = {}

--- @generic T
--- @class Stack : {
--- Pop: (fun(self: Stack): T),
--- Peek: (fun(self: Stack): T),
--- Push: (fun(self: Stack, value: T): Stack),
--- }
--- @field protected _stack any[]
--- @field protected _count integer
Stack.__index = {}

--- Creates a new, empty stack.
--- @generic T
--- @return Stack
function Stack.New()
local this = {
_stack = {},
_count = 0,
}

return _lua_setmetatable(this, Stack)
end

local st = Stack.New() --[[@as Stack<{ num: integer }>]]

local a = st:Peek()
local b = st:Pop()
local c = st:Push({})
```

Image

### Reproduction steps

Analyze specified code in VSCode with luals installed

### Additional Notes

_No response_

### Log File

_No response_

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Piste de recherche

Reproduisez le problème en analysant l’extrait Lua dans VS Code avec lua-language-server installé, en vous concentrant sur les suggestions de complétion pour Stack.New et les méthodes Peek, Pop et Push. Comparez les types inférés de a, b et c avec les suggestions de méthodes attendues sans types union ; le travail est terminé lorsque les méthodes n’affichent plus de types union inutilisables ou superflus, ni d’espaces réservés génériques parasites.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
lua
Domaine
devtools
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Plutôt claire
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.