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

support nil checks on object fields

Open muppet9010 opened this issue 3 years ago • 1 comments

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,

muppet9010 avatar Jul 20 '22 17:07 muppet9010

No idea yet

sumneko avatar Jul 21 '22 07:07 sumneko

I have a related issue.

I'm not getting any warning for indexing into self.stdout unconditionally (whose type includes | nil).

self.stdout:read_stop()
---@class ...
---@field stdout Pipe | nil

tmillr avatar Feb 26 '23 23:02 tmillr

Requires type narrow and cast supporting for fields

sumneko avatar Feb 27 '23 07:02 sumneko