-
-
Notifications
You must be signed in to change notification settings - Fork 384
Description
Describe the bug
In certain cases, boolean inferred values don't work as expected. This usually happens when calling functions that don't have explicit @return annotations and that return true or false explicitly (e.g. return false).
To Reproduce
Example 1:
---@param int integer
local function x(int)
end
local function y()
if math.random() > 0.5 then
return true
else
return false
end
end
local bool = y()
local should_be_int = bool and 300 or 500
x(should_be_int)
-- Warning: Cannot assign `integer|true` to parameter `integer`.Lua Diagnostics.(param-type-mismatch)should_be_int is inferred as integer|true. If I annotate the function y with @return boolean or if function y is rewritten as return math.random() > 0.5, then should_be_int is correctly deduced as integer.
Example 2:
local function y()
if math.random() < 0.5 then
return true
else
return false
end
end
---@return boolean
local function x()
local bool = true
bool = y()
bool = bool and y()
if bool then
print(1)
end
return bool
-- Warning: The type of the 1 return value is `boolean`, but the actual return is `boolean|true|false`
endThe variable bool is inferred as boolean|true|false which is somehow incompatible with the specified @return. If I remove the @return annotation, or if the y function doesn't explicitly return true/false, or if you change the body of the function x, the warning does not happen.
Expected behavior
The boolean return types should be treated the same in all cases.
Screenshots
I wrote down the warnings in the code snippets, but if you want screenshots let me know.
Environment (please complete the following information):
- OS: Windows 10
- Is WSL remote? No
- Client: VSCode 1.68.1
- lua-language-server version v3.4.2