lua-language-server
lua-language-server copied to clipboard
support nil checks on object fields
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,
No idea yet
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
Requires type narrow and cast supporting for fields