What it does

Checks for variables that are unused.

Why this is bad

The existence of unused variables could indicate buggy code.


allow_unused_self (default: true) - A bool that determines whether not using self in a method function (function Player:SwapWeapons()) is allowed.

ignore_pattern (default: "^_") - A regular expression for variables that are allowed to be unused. The default allows for variables like _ to be unused, as they shouldn't be used anyway.


local foo = 1


_ prefixing

If you intend to create a variable without using it, replace it with _ or something that starts with _. You'll see this most in generic for loops.

for _, value in ipairs(list) do


Standard libraries can apply an observes field to distinguish an argument from being only written to.

This is so that we can get lints like the following:

local writtenOnly = {}
table.insert(writtenOnly, 1)
warning[unused_variable]: writtenOnly is assigned a value, but never used
  ┌─ example.lua:1:7
1 │ local writtenOnly = {}
  │       ^^^^^^^^^^^
2 │ table.insert(writtenOnly, 1)
  │              ----------- `table.insert` only writes to `writtenOnly`

This only applies when the function call is its own statement. So for instance, this:

local list = {}
print(table.insert(list, 1))

...will not lint. To understand this, consider if table.insert returned the index. Without this check, this code:

local list = {}
local index = table.insert(list, 1)

...would lint list as mutated only, which while technically true, is unimportant considering index is affected by the mutation.

This also requires that the variable be a static table. This:

return function(value)
    table.insert(value, 1)

...will not lint, as we cannot be sure value is unused outside of this.