Acquis 14 - Pedantic Warnings

This manual page contains unstable information and its contents may change at any time.

The -Wpedantic flag enables AST-based warnings that identify Lua idioms which can be improved using Lus features. This flag should ideally only be used during development and be avoided in production as it force-enables AST generation for every chunk, which increases memory usage and slows down code generation.

Usage

lus -Wpedantic script.lus

Warnings are printed to stderr using the standard warning format:

Lua warning: filename:line: message

Warnings

W1: Pledge After Seal

Calling pledge() after pledge("seal") has no effect because permissions are frozen.

pledge("fs")
pledge("seal")
pledge("network")  -- Warning: pledge() after pledge("seal") has no effect

W2: pcall/xpcall Deprecation

References to pcall or xpcall suggest using the catch expression instead (Acquis 1).

local ok, err = pcall(risky)  -- Warning: 'pcall' is deprecated, use 'catch'

Use instead:

local ok, result = catch risky()

W3: Moveable Local Declaration

Local variables that are only used in the immediately following if or while condition can be moved into the condition using assignment syntax (Acquis 3, Acquis 13).

local x = getValue()
if x then          -- Warning: local declaration can be moved to if condition
    process(x)
end

Use instead:

if x = getValue() then
    process(x)
end

W4: And-Chain for Optional Chaining

Multi-level and chains checking for nil can use optional chaining (Acquis 2).

local port = cfg and cfg.server and cfg.server.port
-- Warning: and-chain can use optional chaining: x?.y?.z

Use instead:

local port = cfg?.server?.port

This also applies to nested if x ~= nil checks:

if cfg ~= nil then
    if cfg.server ~= nil then
        print(cfg.server.port)
    end
end
-- Warning: nested nil checks can use optional chaining: x?.y?.z

W5: Manual Table Deconstruction

Pattern of extracting multiple fields from a table can use from syntax (Acquis 4).

local a, b, c = t.a, t.b, t.c
-- Warning: use 'from' destructuring: local ... from t

Use instead:

local a, b, c from t

Combining with -W

The -Wpedantic flag implies -W (enables runtime warnings), so both compile-time pedantic warnings and runtime warn() calls are active.