LuaLS / LuaLS/lua-language-server
support nil checks on object fields
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
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
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- 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