Back to all reviewers

avoid Lua ternary traps

neovim/neovim
Based on 2 comments
Other

Avoid using the `condition and expr1 or expr2` pattern when `expr1` can be `nil` or `false`, as this will always return `expr2` regardless of the condition result. This is a common source of subtle bugs in Lua code.

Null Handling Other

Reviewer Prompt

Avoid using the condition and expr1 or expr2 pattern when expr1 can be nil or false, as this will always return expr2 regardless of the condition result. This is a common source of subtle bugs in Lua code.

The pattern condition and expr1 or expr2 only works correctly when expr1 is guaranteed to be truthy. When expr1 can be nil or false, the or expr2 part will always execute, making the condition meaningless.

Problematic examples:

-- This will always return `enable`, never `nil`
vim.b[bufnr][var] = enable == vim.g[var] and nil or enable

-- This fails when enable is false
bufstate.enabled = enable ~= globalstate.enabled and enable or nil

Safe alternatives:

-- Use explicit if-else
if enable == vim.g[var] then
  vim.b[bufnr][var] = nil
else
  vim.b[bufnr][var] = enable
end

-- Use vim.F.if_nil for nil-specific cases
result = vim.F.if_nil(potentially_nil_value, fallback)

This pattern is particularly dangerous because it appears to work correctly in many cases, making the bug difficult to detect during testing.

2
Comments Analyzed
Other
Primary Language
Null Handling
Category

Source Discussions