LuaLS / LuaLS/lua-language-server

support nil checks on object fields

Ouverte
#1,361 3 commentaires 5 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

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

Description

At present a variable's nil check is recognised as meaning the variable can't have a type of nil within the code block, but this doesn't work for object fields.

Setup code:

---@class MapPosition
---@field x integer
---@field y integer

---@class Data
---@field targetPosition MapPosition|nil

---@type Data
local data = {
    targetPosition = nil
}

---@param x MapPosition
local function demandMapPositionClass(x)
end

Object field code that doesn't work as it misses the nil check.

--- Object field nil check
local targetPos  ---@type MapPosition
if data.targetPosition ~= nil then
    targetPos = data.targetPosition -- This has set targetPos to a type of nil or MapPosition. But a nil value can't enter this block.
else
    targetPos = {x = 1, y = 1}
end
demandMapPositionClass(targetPos) -- This warns as targetPos can now contain nil.

Variable code that works correctly with it auto detecting the nil check.

--- Variable nil check
local targetPos2  ---@type MapPosition
local test = data.targetPosition
if test ~= nil then
    targetPos2 = test -- This correctly knows that test can only be of type MapPosition.
else
    targetPos2 = {x = 1, y = 1}
end
demandMapPositionClass(targetPos2)

I can fix the object field check with an @as on the offending line to force it to the right data type, but this isn't as futureproofed for later code changes. Also making a new variable just for this to magically works seems a waste and misleading when reading the code as you'd assume a variable is used later on for a specific purpose and not just to help Sumneko intellisense,

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

Commencez par reproduire le problème avec la configuration Lua et comparez le narrowing de type pour data.targetPosition avec le narrowing pour la variable de test locale. Suivez le chemin d’analyse des types qui gère les vérifications de nil sur les champs d’objet ; le travail est terminé lorsque l’exemple de champ d’objet n’émet plus d’avertissement lorsque targetPos est passé à demandMapPositionClass.

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
45/100

Recevez les nouvelles issues par e-mail

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